プログラムは(記号)/proc/pid/
リンクを検索してネットワークネームスペースを列挙しますns/net
。プログラムは、ホスト自体の「ルート」ネームスペース(元の初期化)内で実行されます。通常、スキャナー部分をルートとして実行する必要があります。そうしないと、/proc/pid/
他のプロセス情報へのアクセスが制限されます。可能であれば、スキャナをrootとして実行するのを避け、権限を削除する手間も避けたいと思います。
/proc/pid/
root以外のユーザーがスキャナを実行し、ツリー全体を見てネットワークの名前空間リンクを読むことができるように、スキャナにどのLinux機能を設定する必要がありますか?
答え1
何度か試行錯誤の最後に、CAP_SYS_PTRACE
それが実際に必要であることがわかりました。
代わりに、同様の操作を含む必要なアクセス権は提供CAP_DAC_READ_SEARCH
されません。CAP_DAC_OVERRIDE
readlink()
私が見たことは相互に確認することができます:まず、ptrace.c必要な手がかりが提供されます__ptrace_may_access()
。
/* May we inspect the given task?
* This check is used both for attaching with ptrace
* and for allowing access to sensitive information in /proc.
*
* ptrace_attach denies several cases that /proc allows
* because setting up the necessary parent/child relationship
* or halting the specified task is impossible.
*/
第二に、次のnsfs関連の機能があります。proc_ns_readlink()(間接)呼び出し__ptrace_may_access()
。
ついに、プライベート7ネームスペース話す:
このサブディレクトリのシンボリックリンクは次のとおりです。[...]逆参照または読み取り(readlink(2))これらのシンボリックリンクに対する権限は、ptraceアクセスモードPTRACE_MODE_READ_FSCREDSチェックによって制御されます。 ptrace(2) を参照してください。
答え2
正確に言えば、ネットワーク名前空間を入力するにはCAP_SYS_PTRACEとCAP_SYS_ADMINが必要です。例は次のとおりです。
# docker run -it --rm --pid host --cap-add CAP_SYS_PTRACE --cap-add CAP_SYS_ADMIN debian:bullseye-slim bash
root@8b40f2f48808:/# nsenter --net=/proc/1/ns/net bash
また、見ることができますこの回答