
非ルート ユーザー ( nicollet
) に、Apache2 によって開始されたプロセスを検出してシグナルを送信する機能を与えたいと思います (これらのプロセスは FastCGI スクリプトであり、シグナルはキャッシュを空にするように指示します)。プロセスは Web ユーザー ( www-data
) が所有しており、Debian 不安定版で実行しています。
nicollet
ユーザーにそれらのプロセスを表示させる方法が見つかりません。
プロセスは実行中であり、root
との両方で確認できますwww-data
。
root@linux-01:~# ps -Af | grep baryton
www-data 17649 17648 0 10:27 ? 00:00:00 baryton
www-data 28145 1 0 Nov01 ? 00:00:12 baryton --bot
root 18701 18700 0 10:46 pts/0 00:00:00 grep baryton
root@linux-01:~#
nicollet
ただし、自分のユーザーで同じコマンドを実行しても何も返されません。
nicollet@linux-01:~$ ps -Af | grep baryton
nicollet 18704 18703 0 10:46 pts/0 00:00:00 grep baryton
nicollet@linux-01:~$
を使用して上記のクエリを実行する実行可能ファイルを作成しようとしましたsystem()
。これは に属しwww-data
、setuid ビットが設定されています。
root@linux-01:~# which setuid-update
/usr/local/bin/setuid-update
root@linux-01:~# ls -l /usr/local/bin/setuid-update
-rwsr-xr-x 1 www-data www-data 11046 Nov 2 10:27 /usr/local/bin/setuid-update
root@linux-01:~#
しかし、私は同じ状況を観察しました。プロセスは と によって表示されますがroot
、www-data
では表示されませんnicollet
。
root@linux-01:~# setuid-update
www-data 17649 17648 0 10:27 ? 00:00:00 baryton
www-data 28145 1 0 Nov01 ? 00:00:13 baryton --bot
www-data 18712 18711 0 10:46 pts/0 00:00:00 sh -c ps -Af | grep baryton
www-data 18714 18712 0 10:46 pts/0 00:00:00 grep baryton
root@linux-01:~# su nicollet
nicollet@linux-01:~$ setuid-update
www-data 18716 18715 0 10:46 pts/0 00:00:00 sh -c ps -Af | grep baryton
www-data 18717 18716 0 10:46 pts/0 00:00:00 grep baryton
nicollet@linux-01:~$
最も驚くべきことは、grep
プロセスは確かにwww-data
(setuid 実行可能ファイルから開始されているため) 実行されており、表示されるものの、baryton
プロセスは表示されないことです。
ここで何が起こっているのでしょうか?ではそれらのプロセスを表示できるps
のにwww-data
、によって起動されたときにps
setuid 実行可能ファイルとして実行できるのはなぜでしょうか?www-data
nicollet
答え1
何年も前から、カーネル レベルで通常のユーザー アカウントが自分のプロセスのみを参照できるように制限することが可能でした。この制限は、grsecurity、SELinux、およびその他のセキュリティ フレームワークで可能でしたが、ディストリビューションではデフォルトで一般的に使用されていません。
私はしばらくの間 Debian の不安定なブランチを試していません (Lenny を実行しています) が、おそらく最近カーネル構成でそのスイッチがオンになったのでしょう。それはあなたが観察しているのとまったく同じ効果を引き起こします - setuid 実行可能ファイルであっても元の uid (nicollet) は依然として認識されており、EUID (実効 uid) のみが変更されます。