パーミッション
ファイルシステムにおける基本的なセキュリティ機能で、誰が何をできるかを制御する仕組み。
具体的にはファイルやディレクトリに対して読み取り、書き込み、実行といった操作を許可・制限する。
パーミッションを確認する / $ ls
パーミッションは、ファイルやディレクトリの情報を確認する $ ls
コマンドによって確認することができる。
$ ls -l
$ ls -ld
出力される情報は以下の構成になっている。
$ ls -l
-rwxr-xr-x 2 root root 4096 Jan 19 06:39 sample.txt
ファイルの種類+権限 リンク数 所有者 所有グループ ファイルサイズ タイムスタンプ ファイル名
権限は以下の通り、所有者、所有グループ、その他のユーザに対して9文字で区別される。
ファイルの種類
$ ls -l
コマンド実行で出力される先頭文字は、ファイルの種類を表す。
先頭文字 | 意味 |
---|---|
- |
通常のファイル |
d |
ディレクトリ |
l |
シンボリックリンク |
c |
キャラクタデバイス |
b |
ブロックデバイス |
ファイルとディレクトリのパーミッションの違い
パーミッション | ファイル | ディレクトリ |
---|---|---|
読み取り(read) | ファイルの中身を表示できる | ファイル一覧を表示できる |
書き込み(write) | ファイルの中身を編集できる | ディレクトリ内でファイルを作成・削除できる |
実行(execute) | 実行可能ファイルとして動作させる | ディレクトリ内にアクセス・移動できる |
$ chmod
change mode
ファイルに付与された権限を変更する。
$ chmod モード ファイル名
モードの記述形式には シンボリック形式 と 数値形式 がある。
シンボリック形式
演算子 +
、-
、=
などを使用して設定を行う方法。
$ chmod [対象][演算子][権限] ファイル名
シンボリック形式 | 説明 |
---|---|
対象 |
u :所有者(user)g :グループ(group)o :その他ユーザ(other)a :すべてのユーザ(all) |
演算子 |
+ :追加- :削除= :設定 |
権限 |
r :読み取り(read)w :書き込み(write)x :実行(execute)s :SUID、SGIDt :スティッキービット
|
$ chmod u+x ファイル名
$ chmod g-w ファイル名
$ chmod o=r ファイル名
権限を設定する対象を指定しない場合、 a
(すべてのユーザ)として扱われる。
$ chmod +x ファイル名
,
を使うと複数同時に操作ができる。
$ chmod u+r,g-w,o+x ファイル名
数値形式
数値で設定する場合、所有者、グループ、その他ユーザの権限をそれぞれ数値で表現する。
シンボリック形式とは異なり、設定したい対象が一つでも、三者すべての権限を指定する必要がある。
$ chmod [所有者][グループ][その他ユーザ] ファイル名
権限 | 数値 | ファイル |
---|---|---|
r |
4 |
読み取り(read) |
w |
2 |
書き込み(write) |
x |
1 |
実行(execute) |
s |
4xxx |
SUID |
s |
2xxx |
SGID |
t |
1xxx |
スティッキービット |
権限は数値の 合計値 で表現する。
rwx → 4 (r) + 2 (w) + 1 (x) = 7
rw- → 4 (r) + 2 (w) + 0 (-) = 6
r-- → 4 (r) + 0 (-) + 0 (-) = 4
$ chmod 755 ファイル名
$ chmod 644 ファイル名
$ chmod 000 ファイル名
SUID / SGID
Set User ID / Set Group ID
実行可能ファイルやディレクトリに設定できる特殊なパーミッション。
s
で表現される。
$ chmod u+s ファイル名
$ chmod u+s ディレクトリ名
$ chmod g+s ファイル名
$ chmod g+s ディレクトリ名
数値は以下のように表現される。
SUID の場合 → 最上位の 4
SGID の場合 → 最上位の 2
$ chmod 4755 ファイル名
$ chmod 4755 ディレクトリ名
$ chmod 2755 ファイル名
$ chmod 2755 ディレクトリ名
シンボリックリンク、デバイスファイルなどには効果を持たない。
実行可能ファイルに設定される場合
通常、実行可能ファイルを実行したとき、当然だがファイルは実行者の権限で実行される。
一方、実行可能ファイルが SUID 権限を持つ場合、そのファイルは実行者の権限ではなく、ファイルを所有するユーザの権限 で実行される。
同様に、実行可能ファイルが SGID 権限を持つ場合、ファイルを所有するグループの権限 で実行される。
主にシステム管理に必要な操作を通常のユーザーが行う際に使用される、
例えば $ sudo
によって操作するファイルは、ファイルの所有者権限(root
ユーザ)で実行される。
$ which sudo
/usr/bin/sudo
$ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 335120 Jan 19 06:39 /usr/bin/sudo
他にも /etc/passwd
ファイル(一般ユーザには書き込み権限がない)に保存されたパスワードを変更する $ passwd
コマンド も SUID 権限で動作している。
$ ls -l /etc/passwd
-rw-r--r-- 1 root root 3010 Jan 19 06:29 /etc/passwd
$ which passwd
/usr/bin/passwd
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 Jan 19 06:39 /usr/bin/passwd
ディレクトリに設定される場合
通常、新規作成されたファイルやディレクトリは、作成者のプライマリグループが所有グループになる。
SGID がディレクトリに設定されている場合、そのディレクトリ内で作成されるファイルやディレクトリは、自動的に親ディレクトリと同じグループが所有するグループとして設定される。
チームで作業する場合、すべてのファイルを同じグループで管理できる。
SUID はディレクトリに対して効果を持たない。
スティッキービット
sticky=粘着性のある、くっつきやすい
ディレクトリ内のファイルを削除または名前変更できる権限を制限するための特殊な権限。
t
で表現される。
通常は、共有ディレクトリ(/tmp
)で使われる。
/tmp
は多くのユーザーが一時ファイルを保存するために使用するディレクトリで、各ユーザーが他人のファイルを削除できないようスティッキービットが利用される。
$ ls -fd /tmp
drwxrwxrwt 19 root root 4096 Jan 27 11:13 /tmp
スティッキービットが有効なディレクトリでは、以下のルールが適用される。
- ファイルの所有者だけが、削除や名前変更を行える
- ディレクトリの所有者や
root
ユーザも、削除や名前変更できる - その他のユーザーは、たとえそのディレクトリに書き込み権限があっても、他人が所有するファイルを削除や変更できない
$ chmod +t ディレクトリ名
$ chmod 1755 ディレクトリ名
この仕組みにより、共有ディレクトリ内での誤操作や悪意ある操作を防ぐことができる。
sticky=粘着性のある、くっつきやすい
初期のUNIXシステムには、実行中のプログラムがメモリに収まらないとき、そのバイナリ(実行可能ファイル)をディスクのスワップ領域に退避することがあった。ファイルにスティッキービットを設定してスワップ領域に「張り付けておく」ことで、実行後もそのバイナリ(実行可能ファイル)がキャッシュのように保持され、次回実行時にディスクから再ロードする必要がなくなり、起動が高速化された。
$ umask
ファイルやディレクトリ作成時のデフォルト権限を確認、変更する。
umask
値 と呼ばれる値を使用する。
ファイルやディレクトリには、デフォルト設定できる最大の権限が存在し、umask
値は、これら最大権限から「どの権限を取り除くか」を表わす。
-
最大権限
- ファイル:
666
(rw-rw-rw-
) - ディレクトリ:
777
(rwxrwxrwx
)
- ファイル:
つまり、umask
値に指定した部分は「削除する権限」になる。umask
値が 0
の場合、何も権限を削除しない。
新しい権限 = 最大権限 - umask値
$ umask
0002
# 実際の権限(umask値 - 最大権限 = 実際の権限)
# ファイル 666 - 002 = 664
# ディレクトリ 777 - 002 = 775
$ umask -S
$ umask umask値
$ chown
change owner
ファイルやディレクトリの所有者・所有グループを変更する。実行には root
権限が必要。
$ sudo chown ユーザ名:グループ名 ファイル名
グループ名の記載は省略できる。
$ sudo chown ユーザ名 ファイル名
所有グループのみの変更もできる。
$ sudo chown :グループ名 ファイル名
$ chgrp
change group
ファイルやディレクトリの所有グループを変更する。
一般ユーザで実行した場合、自身の所属グループへの変更しかできない。
$ sudo chgrp グループ名 ファイル名
$ sudo
super user do
ログイン中のユーザに対して、一時的に管理者(root
)権限を付与してコマンド実行することができる(仕組みは前述の SUID を参照)。
$ sudo コマンド
管理者しか実行できないコマンド操作でも、$ sudo
コマンドを使うことによって一般ユーザが実行できるようになる。
$ sudo -s コマンド
$ sudo -u ユーザ名 コマンド
$ su
switch user
別のユーザーに切り替える。
$ su ユーザー名
-
を使用した場合、ログイン中のシェルが初期化され、変更先のユーザのホームディレクトリに移動する。(-
を使用しない場合、ログイン中のシェル環境は変更先のユーザに引き継がれる)
$ su - ユーザー名
ユーザ名を指定しない場合 root
ユーザに切り替わる。
$ su -
-c
オプションで、変更先ユーザ権限でコマンド実行ができる。
$ su -c コマンド root
$ sudo
と $ su
の違い
違い | $ sudo |
$ su |
---|---|---|
認証 | 現在のユーザーパスワードを要求 | 切り替え先のユーザーパスワードを要求 |
効果 | 実行されるコマンドでのみ権限が昇格 | ログインユーザが完全に切り替わる |