Chroot環境でpingコマンドを使用するにはどうすればよいですか?
$ ping 8.8.8.8
ping: icmp open socket: Operation not permitted
現在、CentOを使用していますが、理想的には、すべてのchroot環境で機能するソリューションが必要です。
Linuxでは、ping
をrootとして実行する必要があります(生のIPソケットをバインドする必要があるため、通常のユーザーはUDPとTCPしか実行できません)。 setuidrootになるように設計されています。 chroot内のコピーがsetuidrootではないようです。権限を修正します。
chown root:root /bin/ping; chmod u+srwx,go=rx /bin/ping
Chrootには、setuid(またはsetgid)である必要のある他のコマンド、特にsu
とSudo
がある場合があることに注意してください。
この回答は、jailのような制限のあるものではなく、chrootを想定していることに注意してください。
指摘されているように、ping
には生のIPソケットをバインドするためのアクセス許可が必要です。従来、setuid
は、通常のユーザーが使用できるようにするために使用されてきました。ただし、機能(POSIX 1003.1e、capabilities(7))を使用すると、最小限の機能セットを選択的に有効にして、潜在的な脆弱性によるセキュリティへの影響を制限できます。
ping
には機能CAP_NET_RAW
が必要です。バイナリへのパスが/usr/bin/ping
であるとすると、ツールsetcap
を使用して機能を設定できます。
setcap cap_net_raw+ep /usr/bin/ping
getcap
を使用して、結果を確認します。
getcap /usr/bin/ping
出力は次のようになります
/ usr/bin/ping = cap_net_raw + ep
ping
が機能するはずです。
これらのバイナリがパスに存在する限り、chroot内でpingまたはgnuツールチェーンの他の部分を使用しても問題はありません。これらのコマンドにアクセスできない場合は、環境変数を確認する必要があります。