SUID、SGID
passwd コマンドを使うことで、一般ユーザーは自分自身のパスワードを変更することができる。シャドウパスワードを利用していない場合は、パスワードの変更は /etc/passwd ファイルに保存される。
ここで /etc/passwd ファイルの所有者及びアクセス権は以下のようになっている。
$ ls -l /etc/passwd
-rw-r--r-- 1 root root 1220 May 13 21:42 /etc/passwd
所有者は root であり、root 自身しか書き込みができないことになる。
なぜ、passwd コマンドを一般ユーザーが実行した場合に、その結果が /etc/passwd ファイルに保存されるのか。
$ ls -l `which passwd`
-rwsr-xr-x 1 root root 26688 Sep 10 2015 /usr/bin/passwd
上記を見ると、所有者のアクセス権限は rws となっている。これは、実行権を持っているユーザーによりプログラムが実行された場合には、ファイルの所有者の権限で実行されることを意味している。
これを SUID (Set User ID) という。
passwd コマンドの場合、このファイルの所有者である root の権限で実行されるため、/etc/passwd ファイルに書き込むことができる。
3 桁のアクセス権表記で s を表現するには 4000 を加えれば良い。/usr/bin/passwd の場合は、-rwsr-xr-x = 4755 となる。
以下は指定したファイルに SUID を設定する例。(元々実行権限を持っていないファイルの場合大文字の S が表示される)
$ chmod u+s files.tar.gz
$ ls -l files.tar.gz
-rwSrw-r-- 1 ec2-user ec2-user 54477 May 14 23:21 files.tar.gz
また、グループのアクセス権が適用されるように設定することも可能で、それを SGID (Set Group ID) という。
その場合は 3 桁のアクセス権表記に 2000 を加えれば良い。
$ chmod 6664 files.tar.gz
$ ls -l files.tar.gz
-rwSrwSr-- 1 ec2-user ec2-user 54477 May 14 23:21 files.tar.gz
スティッキービット
/tmp のアクセス権は以下のようになっている。
$ ls -ld /tmp
drwxrwxrwt 3 root root 4096 May 14 03:21 /tmp
その他のユーザーの実行権限が t となっているが、これはスティッキービットと呼ばれる。
スティッキービットが設定されたディレクトリでは、書き込み権限があっても、自分以外のユーザーが所有するファイルを削除することはできない。/tmp はどのユーザーも書き込みが可能だが、スティッキービットにより、自分以外のユーザーが作成したファイルを削除できなくなる。
スティッキービットを数値で表記する場合は、3 桁のアクセス権表記に 1000 を加える。
$ chmod o+t sampledir/
$ ls -ld sampledir/
drwxrwxr-t 2 ec2-user ec2-user 4096 May 15 00:02 sampledir/
デフォルトのアクセス権
ファイルやディレクトリを作成したときに設定されるアクセス権は umask 値で決定される。ファイルは 666 から、ディレクトリは 777 から umask 値を引いた値がデフォルトのアクセス権として適用される。
umask 値の確認や設定は umask コマンドで行える。
$ umask
0002
上記の場合、ファイルを作成したときのアクセス権は 664 (=666-002)、ディレクトリを作成した場合は 775 (=777-002) となる。
次の例では umask 値を 027 にしている。
$ umask 027
$ touch testfile
$ mkdir testdir
$ ls -l testfile
-rw-r----- 1 ec2-user ec2-user 0 May 15 00:06 testfile
$ ls -ld testdir/
drwxr-x--- 2 ec2-user ec2-user 4096 May 15 00:06 testdir/