セキュリティ上の理由(アドレスのランダム化など)は、すべてのユーザーがカーネルの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
と特定のグループがログを読み取ることができる単純な古いカーネルパッチがあります。