UNIX/Linux及びシェルにおいてファイルモードビットにおけるファイルパーミッションビットのシンボリックモード/symbolic modeについては、lsコマンドで確認することができます。
$ ls -l
-rwxr-xr-x ..........
lsコマンドを-lオプション付きでこのように実行した時の最初の10ビット(正確には先頭の1ビットを除く9ビット)にディレクトリやファイルごとのパーミッション設定状況が表示され、先頭の1ビットはファイルの種類を表し、他にもありますが、例えばdであればディレクトリ、-であれば通常のファイルです。
lsの詳細な表示結果は省略しますが、[-rwxr-xr-x]の内、先頭の[-]部を除いた9つの[r,w,x,-]それぞれがパーミッションビットと呼ばれるものです。
この9つの[r,w,x,-]の組み合わせは、3つ(3ビット)のファイルパーミッションビットのセットが3つある状態を表わしていて、この例では、[rwx]、[r-x]、[r-x]ということになります。
この3組の[rwx]、[r-x]、[r-x]は、その順にユーザー(user)、グループ(group)、その他(other)のパーミッションビットが表現されることになっています。
更に[r,w,x,-]は、ファイルの場合
【ファイルの場合】
[r] (read)が「読み取り権限」
[w] (write)が「書き込み権限」
[x] (おそらくexe/exec/executive/executor)が「実行権限」
[-] 何も設定されていない
という意味でファイルとディレクトリのパーミッションは、見た目は同じですが、意味が若干異なりディレクトリでは、
【ディレクトリの場合】
[r] :ファイル一覧(ls)権限
[w] :ディレクトリ・ファイルの作成・削除・ディレクトリ名変更権限
[x] :ファイル検索・走査(cd)権限
[-] 何も設定されていない
*[r]/[w]は、[r]ならlsできる上、[w]は既知のファイルを指定した、読み取りや編集も可
*[r]/[w]/[x]いずれか1つ設定されていれば、[r]ならlsできる上、他も既知なら、実行ファイルの実行も可
という意味です。
これは、コマンドラインからでもスクリプトからも同様で、セキュリティ面では、これだけで十分というわけではないものの必須の管理で、こうしたディレクトリのパーミッション状態とファイルのパーミッション状態とを組み合わせることでディレクトリおよびファイルの適切な保護を行うことができます。
[r] => 4
[w] => 2
[x] => 1
また、パーミッションの状態は、8進数で表現される数値で[755]や[644]等という絶対モード/absolute modeで表現されることも多いのですが、シンボリックモードと8進数値モード/octal mode(絶対モード)には、このような関係があり、権限はこの8進数値を便宜上10進数と見立てて加減算したものと同じになり(なるようにr,w,xにそれぞれ4,2,1を割り当てたと考えられ)ます。
10進加算 | 8進数 | symbolic | 読み取り/書き込み/実行権限 |
---|---|---|---|
4+2+1= | 7 | [rwx] | 全ての権限がある |
4+2+0= | 6 | [rw-] | 読み取りと書き込み権限があって実行権限がない |
4+0+1= | 5 | [r-x] | 読み取りと実行権限があって書き込み権限がない |
4+0+0= | 4 | [r--] | 読み取り権限だけある |
0+2+1= | 3 | [-wx] | 書き込みと実行権限があって読み取り権限がない |
0+2+0= | 2 | [-w-] | 書き込み権限だけある |
0+0+1= | 1 | [--x] | 実行権限だけある |
0+0+0= | 0 | [---] | 何も権限がない |
このようにセット方法にsymbolic mode/octal modeの2種類があるファイルパーミッションモードビットは、ファイルモードビットの1つですが、ファイルモードビットにはもう1つ特殊モードビットがあります。
特殊モードビットとはsetuid/setgid/sticky bitのことを指します。
-rwxr-xr-s
↑
-rwxr-xr-x
-rwxr-xr-S
↑
-rwxr-xr--
-rwxr-sr-x
↑
-rwxr-xr-x
setuidはセットしたユーザーの権限で、setgidはセットしたグループの権限でそのファイルを扱うことを指定するコマンドで、setuidをセットした場合、ファイルパーミッションビットの[user]の実行ビットに当たるビット、setgidをセットした場合、[group]の実行ビットに当たるビットに小文字の[s]が、実行ビット[x]が立っていないファイルにsetuidされた(実行ファイルとして無効な)ものには大文字の[S]が表示されます。
但し、setuid/setgidは、必要なシーンも有用なシーンもあるものの、セキュリティ上、危険も伴います。
例えば実行ファイルに対しては普段許可されていないファイルでも時にこうして一時的なroot権限をも持たせることができてしまい実行できてしまいますから、UNIXやLinuxによっては、特にシェルスクリプトなどのインタプリタの実行ファイルにおける設定については完全に無視するケースも多く、利用できるOSであってもその設定には細心の注意が必要です。
ちなみにこれは、suコマンドでもrootパスワードさえ知っていれば誰でも、sudoコマンドでは予め許可されているユーザーであれば当該ユーザーがrootパスワードを要することなくrootとして振る舞うことができてしまうので、デフォルトではなんら制約がかかっていない状態であることが多いと思われるsuコマンドでは一定の制限をかけておく必要が、sudoコマンドでは許可するユーザーを慎重に決定する必要があります。
-rwxr-tr-x
↑
-rwxr-xr-x
-rwxr-Tr-x
↑
-rwxr--r-x
また、sticky bitをセットした場合、(otherのという意味ではないですが、それに当たる)最後のビットに[t]、その他のユーザーに実行権限がない場合にはotherの[x]実行ビットに当たる(実際は先と同じ)ビットに[T]が表示されます(xビットが立っているか否かに無関係)。
sticky bitは「実行ファイル」と「ディレクトリ」にのみ有効で、実行ファイルに適用して実行後もプログラムの命令を物理的なメモリ空間であるスワップ領域に保持させ実行速度を上げる為に、またディレクトリに適用してディレクトリ内のファイル名変更や削除できるユーザーを限定し、ファイル所有者、ディレクトリの所有者、スーパーユーザー以外に認めない為の設定としてあります。
このことからsticky bitはディレクトリに対して適用する為に採用されることは今尚多くなっています。
逆に実行ファイルへのsticky bitのセットについては、近年、当時に比べればメモリが大容量なものでも相当に安価になり、スワップ領域を使用するまでもなく、より速く読み出すことができる仮想メモリ空間に余裕があり、空いているということも珍しくなく、そこに保持できることも多くなったので、わざわざsticky bitを実行ファイルにセットして実行速度を下げる必要はないはずなので過去の物となっていると言っても過言ではなく、この目的の為に利用できるUNIXは激減、あってもユーザーが利用しない、Linuxに至ってはこのケースの機能として存在しないのが現状のようです。
パーミッションを設定するコマンドにはumaskとchmodがあります。
ファイル所有権を変更するコマンドにはchownとchgrpがあります。