|
1.
誰でも読めるということ
一般ユーザに、設定ファイルやパスワードへのアクセス権を持たせるべきではありません。
アタッカーが、データベースやWebサイトからパスワードを盗み出し、
それを使ってデータを改変したり、ひどい場合には、データを削除することがあります。
そのため、ファイルパーミッションを適切に設定することが重要になります。
rootだけが使用するファイルであれば、パーミッションを0600に設定し、
chownを用いて適切なユーザにファイルを割り当てて下さい。
1.
誰でも/どのグループでも書き込めるということ
コード表示 1.1: 誰でも書き込めるファイルとディレクトリを検出する |
# find / -type f \( -perm -2 -o -perm -20 \) -exec ls -lg {} \; 2>/dev/null >writable.txt
# find / -type d \( -perm -2 -o -perm -20 \) -exec ls -ldg {} \; 2>/dev/null >>writable.txt
|
これにより、所有者グループもしくは他のユーザにも書き込み権限が割り当てられている全ファイルのパーミッションに関して、
膨大なリストが作成されるはずです。パーミッションをチェックし、
どのユーザでも書き込めるファイルに対し/bin/chmod o-wを実行し、
他のユーザから書き込み権限を削除して下さい。
1.
SUID/SGIDファイル
SUIDもしくはSGIDビットがセットされたファイルは、
所有するユーザもしくはグループ権限で実行されるのであり、
ファイルを実行したユーザの権限で実行されるわけではありません。
通常、これらのビットは、システム管理時にrootとして実行されるべきファイルで用いられます。
これらのファイルにより、ローカル環境でroot権限が乗っ取られることにもなりかねません(もし、
セキュリティホールが存在すれば)。
これらは危険であり、SUIDもしくはSGIDビットがセットされたファイルは、
必ず回避されるぺきです。これらのファイルを使用しないのであれば、
chmod 0を実行するか、
もしくは関連するパッケージをunmergeすべきです(equeryを使用して、
属するパッケージをチェックして下さい。まだインストールしていなければ、
単にemerge gentoolkitとタイプするだけです)。別の方法としては、
chmod -sを実行して、SUIDビットを単に削除して下さい。
コード表示 1.1: setuidファイルを検出する |
# find / -type f \( -perm -004000 -o -perm -002000 \) -exec ls -lg {} \; 2>/dev/null >suidfiles.txt
|
これにより、全てのSUID/SGIDファイルに関してリスト化されたファイルが作成されます。
コード表示 1.1: setuidバイナリのリスト |
/bin/su
/bin/ping
/bin/mount
/bin/umount
/var/qmail/bin/qmail-queue
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/crontab
/usr/bin/chage
/usr/bin/expiry
/usr/bin/sperl5.6.1
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/procmail
/usr/bin/suidperl
/usr/lib/misc/pt_chown
/usr/sbin/unix_chkpwd
/usr/sbin/traceroute
/usr/sbin/pwdb_chkpwd
|
デフォルトでは、Gentoo Linuxは、それほど多くのSUIDファイルを含みません
(これは、何をインストールしたかにもよりますが)。しかし、
上記のようなリストを実行結果から取得するかもしれません。
多くのコマンドは一般ユーザから使用されるべきではなく、rootからのみ使用されるべきです。
ping、mount、umount、chfn、chsh、newgrp、suidperl、
pt_chown、そしてtracerouteに対し、chmod -sを実行し、
SUIDビットを削除して下さい。なお、su、qmail-queue、
もしくはunix_chkpwdに対しては、該当ビットを削除しないで下さい。
これらのファイルに対し、setuidを削除するとsuできなくなり、
メールを受信できなくなります。該当ビットを削除することで(そうしても、問題無い場合)、
一般ユーザ(もしくは、アタッカー)が、
これらのファイルを通してrootアクセス権を取得できる可能性を排除します。
筆者のシステムにおけるSUIDファイルは、su、passwd、
gpasswd、qmail-queue、unix_chkpwd、
そしてpwdb_chkpwdのみです。但し、Xを動かしているなら、
より多くのSUIDファイルが必要となるかもしれません。なぜなら、
Xでは、SUIDで昇格するアクセス権が必要になるからです。
1.
SUID/SGIDバイナリとハードリンク
ファイルは、指し示すリンクが全く無い場合のみ、
削除されたと考えられます。これは、
奇妙な考え方だと思われるかもしれませんが、以下のようなファイル名を考えて下さい。
/usr/bin/perlが、実際にはデータが格納されるinodeに対するリンクです。
いくつものリンクが、そのファイルを指し示しているかもしれず、それら全てが消えるまで、
そのファイルは存在することになります。
ユーザが、nosuidやnoexecでマウントされていないパーティションに、
アクセスできるのであれば(例えば、/tmp、/home、
もしくは/var/tmpが、分割されたパーティションでなければ)、
SUIDもしくはSGIDバイナリに対して、
ユーザがハードリンクを作成しないよう注意すべきです。そうしなければ、
Portageアップデート後、ユーザが古いバージョンにまだアクセスできてしまうでしょう。
警告:
Portageから残っているハードリンクに関して警告を受け取り、
SUID/SGIDファイルの実行を許可されたパーティションに、ユーザが書き込める場合は、
このセクションを注意深く読んで下さい。
プログラムのバージョンを古いままにさせることで、ユーザの内1人が、
アップデートを巧みに逃れようとしているかもしれません。
ユーザが自身のSUIDファイルを作成できなかったり、
ダイナミックローダを使用し(noexecでマウントされているパーティション)プログラムを実行できるのみであれば、
心配しなくても大丈夫です。
|
注意:
ファイルに対しリンクを作成する場合、ユーザにはファイルの読み取り権限は必要ありません。
必要なのは、そのファイルを含むディレクトリへの読み取り権限だけです。
|
ファイルが、どれくらいリンクを持っているのか確認するには、statコマンドを使用できます。
コード表示 1.1: Statコマンド |
$ stat /bin/su
File: `/bin/su'
Size: 29350 Blocks: 64 IO Block: 131072 regular file
Device: 900h/2304d Inode: 2057419 Links: 1
Access: (4711/-rws--x--x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2005-02-07 01:59:35.000000000 +0000
Modify: 2004-11-04 01:46:17.000000000 +0000
Change: 2004-11-04 01:46:17.000000000 +0000
|
複数のリンクからなるSUID/SGIDファイルを検出するには、findを使用できます。
コード表示 1.1: 複数のリンクからなるSUID/SGIDバイナリファイルを検出する |
$ find / -type f \( -perm -004000 -o -perm -002000 \) -links +1 -ls
|
|