あなたの質問の多くの詳細は、avahi-daemon
私が最近見たに等しく適用できると思います。(ただし、別の詳細を見逃したかもしれません)。chrootでavahi-daemonを実行すると、avahi-daemonが危険にさらされた場合に多くの利点があります。これらには以下が含まれます。
- ユーザーのホームディレクトリを読み取ったり、個人情報を盗んだりすることはできません。
- / tmpに書き込むことで他のプログラムのバグを悪用することはできません。このようなバグには少なくとも1つのカテゴリがあります。例:https : //www.google.co.uk/search? q = tmp+race+security+ bug
- chrootの外部にあるUNIXソケットファイルを開くことはできません。他のデーモンがメッセージをリッスンおよび読み取りしている可能性があります。
ポイント3は、dbusなどを使用していない場合に特に便利です。avahi-daemonはdbusを使用するため、chroot内からでもシステムdbusにアクセスできるようにします。システムdbusでメッセージを送信する機能が必要ない場合、その機能を拒否することは非常に優れたセキュリティ機能です。
systemdユニットファイルで管理する
avahi-daemonが書き直された場合、セキュリティのためにsystemdに依存する可能性があることに注意してくださいProtectHome
。chrootでは保証されない追加の保護とともに、これらの保護を追加のレイヤーとして追加するavahi-daemonへの変更を提案しました。ここで提案したオプションの完全なリストを見ることができます:
https://github.com/lathiat/avahi/pull/181/commits/67a7b10049c58d6afeebdc64ffd2023c5a93d49a
avahi-daemonがchroot自体を使用しなかった場合に使用できる制限がさらにあるようです。その一部はコミットメッセージに記載されています。しかし、これがどれだけ当てはまるのかわかりません。
私が使用した保護は、デーモンがUNIXソケットファイルを開くことを制限していないことに注意してください(上記のポイント3)。
別のアプローチは、SELinuxを使用することです。ただし、Linuxディストリビューションのサブセットにアプリケーションを結び付けることになるでしょう。ここでSELinuxを積極的に考えた理由は、SELinuxがプロセスがdbus上で持つアクセスをきめ細かく制限するためです。たとえば、systemd
メッセージを送信できるようにするために必要なバス名のリストに含まれていないことをしばしば期待できると思います:-)。
「chroot / setuid / umask / ...よりも安全なsystemdサンドボックスを使用する場合、私は疑問に思っていました。」
要約:なぜ両方ではないのですか?上記を少しデコードしてみましょう:-)。
ポイント3について考えた場合、chrootを使用するとより多くの制限が提供されます。ProtectHome =とその友人は、chrootほど制限的であろうとさえしません。(たとえば、名前付きsystemdオプションblacklistsはどれも、/run
unixソケットファイルを配置する傾向があります)。
chrootは、ファイルシステムへのアクセスを制限することは非常に強力ですが、Linux上のすべてがファイルであるとは限らないことを示しています:-)。ファイルではない他のものを制限できるsystemdオプションがあります。これは、プログラムが危険にさらされている場合に役立ちます。利用可能なカーネル機能を減らして、脆弱性を悪用しようとする可能性があります。たとえば、avahi-daemonはbluetoothソケットを必要とせず、Webサーバーも:-)。したがって、AF_BLUETOOTHアドレスファミリへのアクセスを許可しないでください。RestrictAddressFamilies=
オプションを使用して、AF_INET、AF_INET6、および場合によってはAF_UNIXをホワイトリストに追加してください。
使用する各オプションのドキュメントをお読みください。一部のオプションは他のオプションと組み合わせてより効果的であり、一部のオプションはすべてのCPUアーキテクチャで利用できるわけではありません。(CPUが悪いからではなく、そのCPUのLinuxポートがうまく設計されていなかったからです。私は思う)。
(ここに一般的な原則があります。拒否したいものではなく、許可したいもののリストを書くことができればより安全です。chrootを定義することで、アクセスが許可されたファイルのリストが得られ、あなたがブロックしたいと言っているよりも/home
)。
原則として、setuid()の前に同じ制限をすべて自分で適用できます。systemdからコピーできるのは、すべてコードだけです。ただし、systemdユニットオプションは非常に記述しやすく、標準形式であるため、読みやすく、確認しやすいものでなければなりません。
そのman systemd.exec
ため、ターゲットプラットフォームのサンドボックスセクションを読むことを強くお勧めします。しかし、可能な限り最も安全な設計が必要な場合は、プログラムでも同様に試してみるchroot
(そして、root
特権を落とす)ことを恐れません。ここにはトレードオフがあります。を使用すると、設計全体にいくつかの制約が課せられます。chrootを使用する設計が既にあり、必要なことを実行しているようであれば、それは非常に素晴らしいことです。chroot