#SUID
Linuxでは、ユーザはUIDと呼ばれるID番号で管理されている。一時的に別のUIDのユーザに変更できる機能のことをSUID(Set User ID)という。SUIDで一般ユーザがroot権限でファイルを実行できる。
※通常の実行ファイルは実行者の権限で動作するが、SUIDが設定されていると実行ファイルの所有者権限で動作させられる。
SUIDの使用例をみる。例えばパスワード変更は、/etc/shadowファイルを編集する必要があるが、このファイルの変更権限は一般ユーザにはない。しかし、パスワード変更コマンド(passwd)にはSUIDが設定されているため、一般ユーザがpasswdコマンドを実行した場合においても、passwdコマンドの所有者であるroot権限で実行できる。なおSUIDが設定されているファイル(プログラム)においては所有者の実行権限が「s」と表記される。
$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 25980 Feb 22 2012 /usr/bin/passwd
上のコマンド結果では所有者(root)のアクセス権は「rws」となっており、実行権が「s」であることがわかる。つまり、このコマンドを実行可能なアクセス権を有する一般ユーザーによりプログラムが実行された場合はこのファイルの所有者(root)の権限で実行できることを意味する。
アクセス権を決定するchmodコマンドでSUIDを設定する場合は、アクセス権表記に「4000」を加算する。つまり元が755(rwx r-x r-x)のファイルの場合は「4755」と設定する。すると 「rws r-x r-x」となる。
chmodによるアクセス権の設定は数値で定義する方法と、3つの記号(u+s)を用いた方法の2種類ある。
# 実行例 : test.txt ファイルのアクセス権を「 rws r-x r-x 」にする設定
$ chmod 4755 test.txt |
# 実行例 : test.txt ファイルのアクセス権が変更前「 755 」である値を、変更後に「 4755 」とする設定 (SUID)
$ chmod u+s test.txt |
#SGID
SGIDはグループ権限で動作する。SUIDの場合は、所有者権限の実行権限が「s」となるが、SGIDではグループの実行権限が「s」となる。chmodコマンドでSGIDを設定する場合、アクセス権表記に「2000」を加算する。文字列の場合には(g+s)を定義
# 実行例 : test.txt ファイルのアクセス権を「 rwx r-s r-x 」にする設定
$ chmod 2755 test.txt |
# 実行例 : test.txt ファイルのアクセス権が変更前「 755 」である値を、変更後に「 2755 」とする設定 (SUID)
$ chmod g+s test.txt |
#スティッキービット(Sticky Bit)
Sticky Bitが設定されたディレクトリ以下のファイルとディレクトリは、実際に設定したアクセス権に関係なくて、所有者とrootユーザのみが名前の変更と削除を行える。このスティッキービットが使用されるケースは「全ユーザがファイルを作成できるが作成したファイルを他人がファイル名の変更や削除できないようにしたい」場合に利用する。例えば/tmpディレクトリにはスティッキービットが設定済み。
スティッキービットでは他のユーザの実行権限が「t」となる。chomodコマンドでスティッキービットを設定する場合、アクセス権表記に1000を加算する。文字列の場合は3つの記号(o+t)を定義
# 実行例 : testディレクトリのアクセス権を「 rwx rwx rwt 」にする設定
$ chmod 1777 test|
# 実行例 : testディレクトリのアクセス権が変更前「 777 」である値を、変更後に「 1777 」とする設定 (SUID)
$ chmod o+t test|
#SUID/SGID/StickyBitの違い
比較項目 | 実行権限の設定対象 | 加算するアクセス権の表記 | 加算するアクセス権の表記(3つの記号) |
---|---|---|---|
SUID | 所有者 | 4000 | u+s |
SGID | グループ | 2000 | g+s |
StickyBit | その他のユーザ | 1000 | o+t |
#umaskコマンド
umaskコマンドは、umask値の確認とumask値の設定を行うコマンド。新規作成したファイルやディレクトリのアクセス権はファイルの場合「666」からumask値を引いた値、ディレクトリの場合「777」からumask値を引いた値となる。rootユーザのumask値のデフォルト値は「0022」。従い、新規に作成されるファイルのアクセス権は644(666-022=644)となり、新規作成のディレクトリのアクセス権は755(777-022=755)
# umack値の確認
$ umask
#umask値を0022から、0027に変更する設定
$ umask 0027
#このumask値が適用されるユーザが作成した新規ファイルのアクセス権は(-rw r-- ---)となる。
#chown/chgrpコマンド
chownコマンドはファイルやディレクトリの所有者を変更するコマンド。root権限のユーザのみ実行できる。
chgrpコマンドはファイルやディレクトリの所属するグループを変更するコマンド。
オプション | 説明 |
---|---|
-R | 指定したディレクトリ以下の全てのファイルの所有者の変更 |
# test.txtファイルの所有者を「tom」に変更
$ chown tom test.txt
# test.txtファイルの所有者を「tom」に変更、グループを「group1」に変更
$ chown tom:group1 test.txt
# test.txtファイルのグループを「tom」に変更
$ chgrp group1 test.txt