dmesgをグループに制限できますか?

dmesgをグループに制限できますか?

セキュリティ上の理由(アドレスのランダム化など)は、すべてのユーザーがカーネルのdmesgを読むことを許可しないことが合理的であることを知っています。 Linuxでは、次のコマンドを使用してdmesgをrootユーザーに制限できますsysctl -w kernel.dmesg_restrict = 1

このsysctlはdmesgを使用したい人にプレフィックスを追加することを強制します。sudoこれは私にとって問題です。

私はその間に何かが欲しかった。私のコンピュータ上の特定のユーザーアカウントがsudolessなしでdmesgにアクセスできるようにしたいのですが、Apacheなどのデーモンやwww-dataなどの非ユーザーアカウントはそうではありません。

理想的には、dmesgアクセスは特定のグループ(たとえばadm)に制限されます。

最もきれいな方法は何ですか?


脚注:

1私はsudoという概念が好きですが、それは4文字の単語でなければならないと思います。賢い人々は他のどれも十分でないまれな場合のための完全なニックネームとしてそれを賢く使用します。残念なことに、人々は二度考えずにsudoを使って多くの日常的な仕事をするのを見ています。人々がsudoを過度に使用する習慣を持つことは、潜在的なカーネルアドレス漏洩よりも深刻なセキュリティ問題です。

²いくつかのソリューション(例:chmod 4750 /bin/dmesg


修正する:Ikkachuの解決策を受け入れましたが、setcap今後のLinuxバージョンでは、より明確で一般的な回答が必要です。おそらく、0(全員)と1(ルートのみ)の間のdmesg_restrictの3番目のsysctl設定を使用すると、システム管理者は信頼できるグループを指定できます。

ベストアンサー1

dmesg「sudoless」がコマンドラインに何かを書くことができるという意味であれば、最も簡単な解決策はsudoを/bin/dmesg呼び出すスクリプトを作成し、sudoパスワードを入力せずにsudoを実行するように設定することです。

したがって、次のようになります。

echo 'username ALL = NOPASSWD:/bin/dmesg  ' >> /etc/sudoers
cat <<'EOF' > ./dmesg
#!/bin/sh
sudo /bin/dmesg "$@"
EOF
chmod +x ./dmesg

./dmesg次に、パスのどこかに置きます。

カーネルメッセージバッファを介さずに直接読み取ることができる他のプログラムがない場合は、setuidを/bin/dmesg設定するのにも/bin/dmesg同じ制限があります。単にsetuidを実行するよりもそれを実行する方が安全ですsudo

ちなみに、読もうとしても権限を変更しても/dev/kmsg動作しません。システムコールdmesgに戻ります。syslog(2)


それだけでは十分でなければできます。能力。 sysctlはdmesg_restrictログ読み取りを使用するプロセスに制限するため、CAP_SYSLOGこれを設定するだけです。

したがって、次のようになります。

# cp /bin/dmesg /bin/dmesg.capable 
# chown .adm /bin/dmesg.capable
# chmod 710 /bin/dmesg.capable
# setcap cap_syslog=ep /bin/dmesg.capable

このグループのユーザーはログを見ることができますadm/bin/dmesg.capable

しかし、これらの機能は主にアクセス制御システムの残りの部分を迂回する方法を提供するため、悪名高い。もちろん、完全なルートとして実行するCAP_SYSLOGよりも権限を与える方が良いかもしれません。dmesg


他のお気に入りのオプションには、SELinuxseccompと特定のグループがログを読み取ることができる単純な古いカーネルパッチがあります。

おすすめ記事