SUIDとはUNIX処方箋

現場ですぐに役立つ知識を欲するあなたに贈る珠玉のTips集。今回は、UNIX系OSに存在する特殊なファイル属性である「SUID」「SGID」「Sticky」について、セキュリティ上の対策と併せて解説する。

» 2008年04月08日 01時50分 公開
[ITmedia]

SUIDは危険であるという話を聞いたことがありますが、そもそもSUIDが何なのか分かりません。具体的にSUIDとはどういったものなのでしょうか?


SUIDとは、実行ファイルに設定される特殊な属性を意味します。UNIX系OSには特殊なファイル(ディレクトリ)属性として、SUID、SGID、Stickyの3つが存在します。それぞれについて、具体的な役割を説明していきましょう。

SUID

 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

 SGID(Set Group ID)は実行ファイル、もしくはディレクトリに設定される属性で、それぞれ次のように動作が異なります。

  • 実行ファイルにSGIDが設定された場合

 SUIDと同じく、実行ファイルは所有グループの権限で動作

  • ディレクトリにSGIDが設定された場合

 そのディレクトリ以下で作成したファイルおよびディレクトリの所有グループは、自動的に親ディレクトリと同じになる

 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(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
リスト1 SUID、SGIDが設定されているファイルが増えていないかどうかを確認するスクリプト(chkSuidSqid.sh)

 最後に、cronを使用してリスト1を定期的に実行します。後記の例では毎日1回、午前4時にチェックスクリプトを実行します。

# crontab -l

0 4 * * * /usr/local/bin/chkSuidSgid.sh > /dev/null 2>&1


このページで出てきた専門用語

「u+t」

Linuxでは「g+t」を使用。


関連キーワード

UNIX | セキュリティ | UNIX処方箋


Copyright © ITmedia, Inc. All Rights Reserved.