Linuxのファイル、ディレクトリの権限管理

さて、今回は基本に立ち返ってLinux(とUNIX)におけるファイルやディレクトリの権限管理について書きたいと思います(今更ですが・・・)。user、group、otherに対するrwxについてはもはや説明不要だと思うので、ポイントとしてはSUID、SGID、Stickyについて。さて、まずはLinuxにおける権限許可属性のおさらい。許可属性の構造は以下のようになっている。


型の種類

上述の型は、以下のように分類される。これについては、もうお馴染みのものばかりですね。

表示 8進数 説明
- 010 一般のファイル
d 004 ディレクト
l 012 シンボリックリンクファイル
c 002 文字型デバイスファイル
d 006 ブロック方デバイスファイル
s 014 ソケット
p 001 名前つきパイプ

というわけで、ここからは今回紹介したい3つの要素について、以下で説明。

set userID(SUID)ビット

/bin/lsファイルのように、実行許可属性のあるファイルはファイル名を指定しただけでで実行可能。この際、起動されたプロセスは起動したユーザのIDがつけられ、プロセス管理に使用される。だが、SUIDビットをセットすると、プロセスにはファイル所有者のIDが付加される。例えばスーパーユーザ所有の実行ファイルにSUIDビットを立てておくと、一般ユーザが起動してもスーパーユーザのIDが付与され、そのプロセスはスーパーユーザしか書き込み権限のないファイルに対しても書き込みが可能になる。

set groupID(SGID)ビット

機能はSUIDと同じ。ただしSGIDビットはプロセスのグループIDに影響する。SGIDビットがセットされているファイルを起動すると、プロセスにはファイルを所有するユーザのグループIDが付加される。SGIDがセットされたファイルをls -lで表示すると、モード表示の7文字目、所有グループに対する実行許可部分がs(小文字)になる。ただし、このファイルに所有者グループの実行権限がない場合にはS(大文字)が表示される。

Stickyビット

ディレクトリにstickyビットがセットされている場合、そのディレクトリ内のファイル消去や名前変更は、ファイル所有者かスーパーユーザ、またはディレクトリ所有者しか行えない。通常、他のユーザ(other)にも書き込み権限が与えられているディレクトリでは、ファイル自体の許可属性に関わらず他のユーザのファイルを削除可能。しかし、stickyビットがセットされているディレクトリではそれが許可されなくなる。例えば/tmpディレクトリは全ユーザが共有するディレクトリであり、誰でも書き込みが可能だが、stickyビットをセットしておけば他のユーザの一時ファイルを操作ミスで消してしまうことを防止できる。stickyビットがセットされたファイルをls -l表示すると、モードの10文字目、その他ユーザに対する実行許可部分がt(小文字)になる。ただし、ファイルにその他ユーザの実行権限がにない場合にはT(大文字)になる。