通常、Unix(または特にLinux)プログラムは、ICMP_ECHO("ping")を使用してルータのアクセシビリティを確認するなどの操作を実行できません。誰でもスーパーユーザーとして実行またはsetuid ルートまたは適切なPOSIX機能を備えている必要があります。明らかに、setuidまたはPOSIX機能をバイナリに適用するには、すべてのオペレーティングシステムにスーパーユーザー介入が必要です。
開発環境にCAP_SETFCAP機能がある場合は、少なくともローカル操作に関する限り、ビルドするプログラムに適切なPOSIX機能を設定できる必要があります。
ケン・トンプソンに敬意を表します信頼に関する考え論文によると、すべてのライブラリの静的リンクを仮定すると、原則として各プログラムソースモジュールに指紋を作成し、それをオブジェクトとバイナリに伝播して、特定のバイナリが特定のセットで構築されたことを証明する監査証跡を提供できる必要があります。資源になる。したがって、新しく作成されたIDEのコピーを承認するように求める管理者は、IDEが独自に生成するプログラムでのみ機能を設定し、文書化されていないコードを通過できるように悪意のあるユーザーが変更できないことを自分で満たすことができなければなりませんします。たとえば、起動オプションを setcap のプライベートコピーとして使用します。
ここでの問題は、最も成熟した開発環境(例:ラザルス統合開発環境)は独自にビルドされる可能性があるため、ローカル管理者がCAP_SETFCAPで証明できるクリーンなコピーを祝福すると、悪意のあるユーザーがそれを再構築してマルウェアを含め、CAP_SETFCAPを直接適用してローカルシステムのセキュリティを損なう可能性があります。
他のCAP_SETFCAPまたは上位セット機能のいずれかによって新しく生成されたプログラムに伝播できないように、POSIX CAP_SETFCAP機能をバイナリファイルに適用できますか?
答え1
setcap
アクティブ化したばかりのユーザーに使用をスケジュールするには、ここにsudo
機能を追加する必要はありません。ただします。
信頼できるユーザーについて知っている場合は、この機能を使用するには2つのオプションがあります。また、自分が能力あるように見せたい場合は、パッケージファイルなどを含む3番目のオプションも含めました。
- ローカルコピーを作成して
setcap
公開グループ(建築者)ユーザーに許可された機能を提供します。これは、このグループのユーザーメンバーが正しく機能することを信頼します。
$ cp $(which setcap) ./builder-setcap
$ sudo chgrp builders ./builder-setcap
$ chmod 0750 ./builder-setcap
$ sudo ./builder-setcap cap_setfcap=p ./builder-setcap
- 使用継承可能
builder-setcap
権限で実行できる人を制限するファイル機能です。実際に実行時にその権限を取得するには、別の手順が必要です(いずれかの方法で実行中のユーザーがプロセスを事前に取得します)。継承可能capsh
または同じ能力pam_cap.so
)。このメカニズムはビルドシステムの周りのラッパーです。次のように進みますcapsh
。
$ cp $(which setcap) ./builder-setcap
$ sudo chgrp builders ./builder-setcap
$ chmod 0750 ./builder-setcap
$ sudo ./builder-setcap cap_setfcap=i ./builder-setcap
$ sudo capsh --user=$(whoami) --inh=cap_setfcap --
... $ # in this shell cap_setfcap is available to ./builder-setcap
- 3番目のメカニズムは、ユーザーの名前空間コンテナを使用することです。そのようなコンテナの中には、誤った特権概念と誤った概念があります。根ユーザー。この環境では、権限のないユーザー根このコンテナに対して単に次を呼び出すことで、
setcap
間違った機能を提供できます。
$ unshare -Ur
... $ id
uid=0(root) gid=0(root) groups=0(root),65534(nobody)
... $ cp $(which setcap) builder-setcap
... $ ./builder-setcap cap_setfcap=p ./builder-setcap
最後に、ファイル機能はコンテナ内で機能しますが、コンテナを終了した後は機能します。機能が有効になっているファイルには実際には機能がありません。
... $ exit
$ getcap -n ./builder-setcap
./builder-setcap cap_setfcap=p [rootid=1000]
ここのパラメータは、-n
ユーザーの名前空間のルートIDを表します。名前空間の外側には、ファイルに実際にファイル機能がないことがわかります。
$ ./builder-setcap -r builder-setcap
unable to set CAP_SETFCAP effective capability: Operation not permitted
あなたが望むものに対する最も実現可能なアプローチは、機能的にアプローチ2と同じビルド呼び出しラッパーを直接作成し、アプローチsudo capsh --user=$(whoami) --inh=cap_setfcap -- -c 'exec builder'
2に従ってバイナリを準備することです。builder-setcap
もちろん、builder-setcap
特定の機能を付与し、他の機能を付与したくない場合は、独自のバージョンを作成して、付与したいファイル機能をフィルタリングすることもできます。完全なコードの複雑さsetcap
は次のとおりです。かなり小さい。
答え2
数年前も同様の問題がありました。
従業員は、ローカルネットワークプロトコルの使用に関する統計を生成する任務を担当しています。彼はPythonを使ってPACKET_RAWを使ってパケットを読みます。
ただし、PACKETを使用するにはCAP_NET_RAWが必要です。
CAP_NET_RAWをPythonに提供することは、他の人がその特権から利益を得るために絶対禁物です。従業員にsudoを提供することも後輩の従業員であるため、禁忌です。
私の解決策は、このために特別にランチャーを書くことでした。ランチャーにはCAP_NET_RAW権限があり、AmbientセットでCAP_NET_RAWを使用してPythonを起動します。ランチャーの所有者はrootであり、特定のユーザーだけが実行でき、他の人は読むことができません。
ランチャーはうまく機能しますが、安全性の設計を検討したことはありません。