はじめに
パーミッション
ファイルシステムにおける基本的なセキュリティ機能で、誰が何をできるかを制御する仕組み。
具体的にはファイルやディレクトリに対して読み取り、書き込み、実行といった操作を許可・制限する。
パーミッション | ファイル | ディレクトリ |
---|---|---|
読み取り(read) | ファイルの中身を表示できる | ファイル一覧を表示できる |
書き込み(write) | ファイルの中身を編集できる | ディレクトリ内でファイルを作成・削除できる |
実行(execute) | 実行可能ファイルとして動作させる | ディレクトリ内にアクセス・移動できる |
ファイルの種類
$ ls -l
コマンド実行で出力される先頭文字は、ファイルの種類を表す。
先頭文字 | 意味 |
---|---|
- |
通常のファイル |
d |
ディレクトリ |
l |
シンボリックリンク |
c |
キャラクタデバイス |
b |
ブロックデバイス |
パーミッションを確認する
$ ls -l
$ ls -ld
$ ls -l
-rwxr-xr-x 2 root root 4096 Jan 19 06:39 sample.txt
ファイルの種類+権限 リンク数 所有者 所有グループ ファイルサイズ タイムスタンプ ファイル名
権限は以下の通り、所有者、所有グループ、その他のユーザに対して9文字で区別される。
パーミッションを変更する
パーミッションを変更することができるのは以下のユーザのみ。
- ファイルの所有者
root
ユーザ
ファイルの「所有グループに所属するユーザ」は、パーミッションを変更することができない。
所有グループはパーミッションの変更ができn
$ chmod
change mode
ファイルに付与された権限を変更する。
$ chmod モード ファイル名
モードの記述形式には シンボリック形式 と 数値形式 がある。
権限を変更できるのは root
ユーザと所有者のみ。所有グループに所属するユーザは権限を削除できない。
シンボリック形式
演算子 +
、-
、=
などを使用して設定を行う方法。
$ 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+rwx ファイル名
$ 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
ただし、セキュリティ上の理由でスクリプトファイルに設定した SUID、SGID は無視される。
スクリプトファイルに設定した SUID、SGID は無視される
ディレクトリに設定される場合
通常、新規作成されたファイルやディレクトリは、作成者のプライマリグループが所有グループになる。
SGID がディレクトリに設定されている場合、そのディレクトリ内で作成されるファイルやディレクトリは、自動的に親ディレクトリと同じグループが所有するグループとして設定される。
チームで作業する場合、すべてのファイルを同じグループで管理できる。
SUID はディレクトリに対して効果を持たない。
スティッキービット
sticky=粘着性のある、くっつきやすい
ディレクトリに対して設定することができる特殊なパーミッション。
ファイル削除の権限をファイル所有者のみに制限するために利用される(正確には root
ユーザも削除可能)。
ファイルの削除権限は、通常、そのファイルが格納されている ディレクトリの権限 に依存する。
パーミッションは t
で表現される。
通常 共有ディレクトリ /tmp/
で使われる。
/tmp/
は多くのユーザーが一時ファイルを保存するため、各ユーザーが他人のファイルを削除できないようスティッキービットが利用される。
$ ls -fd /tmp # 「その他ユーザ」の権限が t になっている
drwxrwxrwt 19 root root 4096 Jan 27 11:13 /tmp
スティッキービットが有効なディレクトリでは、以下のルールが適用される。
-
ファイル所有者だけが、ファイルの削除や名前変更を行える(
root
ユーザもできる) -
「その他のユーザー」は、たとえそのディレクトリに書き込み権限があっても、他人が所有するファイルを削除や変更できない
$ chmod +t ディレクトリ名
$ chmod o+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 :グループ名 ファイル名
$ sudo chown -R ユーザ名 ファイル名
$ chgrp
change group
ファイルやディレクトリの所有グループを変更する。
一般ユーザで実行した場合、自身の所属グループへの変更しかできない。
$ sudo chgrp グループ名 ファイル名
$ sudo
super user do
ログイン中のユーザに対して、一時的に管理者(root
)権限を付与してコマンド実行することができる(仕組みは前述の SUID を参照)。
$ sudo コマンド
管理者しか実行できないコマンド操作でも、$ sudo
コマンドを使うことによって一般ユーザが実行できるようになる。
$ sudo -s コマンド
$ sudo -u ユーザ名 コマンド
$ sudo -l
※ $ visudo
を参照
$ visudo
/etc/sudoers
(superuser do + er(~する者) + s(複数形)) ファイルを安全に編集するためのエディタ。
/etc/sudoers
ファイルは root
権限の使用を許可するユーザやグループを設定したり、root
権限を許可したユーザに対して、どのコマンド実行を許可するかを制御するための設定ファイル。
誤って破壊してしまうと $ sudo
コマンドが使えなくなる危険があるため、通常の $ vi
や $ nano
ではなく $ visudo
の使用が推奨されている。
$ sudo visudo
ファイル保存時には自動で構文チェックが行われ、問題がない場合にのみ編集した内容が保存される。
$ su
switch user
別のユーザーに切り替える。
$ su ユーザー名
-
を使用した場合、ログイン中のシェルが初期化され、変更先のユーザのホームディレクトリに移動する。(-
を使用しない場合、ログイン中のシェル環境は変更先のユーザに引き継がれる)
$ su - ユーザー名
ユーザ名を指定しない場合 root
ユーザに切り替わる。
$ su -
-c
オプションで、変更先ユーザ権限でコマンド実行ができる。
$ su -c コマンド root
$ sudo
と $ su
の違い
違い | $ sudo |
$ su |
---|---|---|
認証 | 現在のユーザーパスワードを要求 | 切り替え先のユーザーパスワードを要求 |
効果 | 実行されるコマンドでのみ権限が昇格 | ログインユーザが完全に切り替わる |