現場ですぐに役立つ知識を欲するあなたに贈る珠玉のTips集。今回は、UNIX系OSに存在する特殊なファイル属性である「SUID」「SGID」「Sticky」について、セキュリティ上の対策と併せて解説する。
SUIDは危険であるという話を聞いたことがありますが、そもそもSUIDが何なのか分かりません。具体的にSUIDとはどういったものなのでしょうか?
SUIDとは、実行ファイルに設定される特殊な属性を意味します。UNIX系OSには特殊なファイル(ディレクトリ)属性として、SUID、SGID、Stickyの3つが存在します。それぞれについて、具体的な役割を説明していきましょう。
SUID(Set User ID)は実行ファイルに設定される属性です。通常の実行ファイルは実行者の権限で動作しますが、SUIDが設定されていると実行ファイルの所有者の権限で動作します。
SUIDが使用される例としてはpasswdコマンドが挙げられます。パスワードを変更するということは、実際には/etc/shadowファイルを編集することになりますが、一般ユーザーには/etc/shadowファイルを変更する権限はありません。
そこで、passwdコマンドにSUID属性を設定することで、一般ユーザーがpasswdコマンドを実行しても、passwdコマンドの所有者であるrootの権限で/etc/shadowファイルを編集できるようになっています。
SUIDの設定されているファイルは、次のように所有者の実行権限が「s」で表記されます。
# ls -l /usr/sbin | grep ping
-r-sr-xr-x 1 root bin …… ping
また、chmodコマンドなどでSUIDを指定する場合は、次のように「4000」もしくは「u+s」を使用します。
# chmod 4755 myCommand
# chmod u+s myCommand
SGID(Set Group ID)は実行ファイル、もしくはディレクトリに設定される属性で、それぞれ次のように動作が異なります。
SUIDと同じく、実行ファイルは所有グループの権限で動作
そのディレクトリ以下で作成したファイルおよびディレクトリの所有グループは、自動的に親ディレクトリと同じになる
SGIDの設定されているファイルは、次のようにグループの実行権限が「s」で表記されます。
# ls -l /usr/bin | grep wall
-r-xr-sr-x 1 root tty …… wall
また、chmodコマンドなどでSGIDを指定する場合は「2000」もしくは「g+s」を使用します。
# chmod 2755 groupDir
# chmod g+s groupDir
Sticky(Sticky bit)が設定されているディレクトリ以下にあるファイルやディレクトリは、実際のパーミッションに関係なく、ファイルもしくはディレクトリの所有者と、rootユーザーのみが名前の変更と削除を行えます。すべてのユーザーがファイルやディレクトリを作成できるようにしたいが、作成したファイルやディレクトリを他人が消せないようにしたいという場合に使用されます。/tmpが一番分かりやすい例です。
以前は、頻繁に実行されるプログラムにStickyを設定することで、メモリ上にそのプログラムを保存しておく機能がありましたが、仮想メモリ機能が発達したためこの機能は意味をなさなくなりました。ちなみに、Sticky(粘着性のある)という名前はこの機能からそう呼ばれるようになりました。
Stickyの設定されているファイルは、そのほかのユーザーの実行権限が「t」で表記されます。
# ls -l / | grep tmp
drwxrwxrwt 6 root sys …… tmp
また、chmodコマンドなどでSGIDを指定する場合は「1000」、もしくは「u+t」*を使用します。
# chmod 1777 myTmp
# chmod a+rwx,u+t myTmp
SUIDやSGIDを使用すると、一般ユーザーでもrootの権限でプログラムを動作させられるため、SUIDやSGIDが設定されているファイルが攻撃の対象になったり、あるいは何らかの攻撃にSUIDやSGIDを利用されることがあります。そのため、SUID、SGIDが設定されているファイルを把握し、新しく作成されていないかどうかを定期的に監視することをお勧めします。
具体的には、まず、以下のように現在SUID、SGIDがセットされているファイルのリストを作成し、このファイルに対してrootユーザー以外の権限をなしにします。
# ≪find / -perm -4000 -o -perm -2000 > /usr/local/SUID_SGID_LIST 2>
/dev/null≫
# chmod 400 /usr/local/SUID_SGID_LIST
次に、SUID、SGIDが設定されているファイルが増えていないかどうかを確認する、リスト1のようなスクリプトを作成します。
#!/bin/sh
MAIL=kanri@xxx.co.jp
DATE=`date +%Y%m%d`
ORG_LIST_FILE=/usr/local/SUID_SGID_LIST
NEW_LIST_FILE=/tmp/SUID_SGID_LIST_$DATE
/usr/bin/find / -perm -4000 -o -perm -2000 2> /dev/null > $NEW_LIST_FILE
DIFF=`diff $ORG_LIST_FILE $NEW_LIST_FILE`
if [ -n "$DIFF" ]
then
mail $MAIL <<EOF
Your machine may be attacked. Check it immediately.
EOF
fi
rm $NEW_LIST_FILE
最後に、cronを使用してリスト1を定期的に実行します。後記の例では毎日1回、午前4時にチェックスクリプトを実行します。
# crontab -l
0 4 * * * /usr/local/bin/chkSuidSgid.sh > /dev/null 2>&1
Linuxでは「g+t」を使用。
Copyright © ITmedia, Inc. All Rights Reserved.