今号では、前回紹介しきれなかったファイルのパーミッションについて、もう少し深堀りして見ていきます!<br/ >
パーミッションの変更方法
ファイルやディレクトリのパーミッションは、chmod コマンドで変更することができます。
chmod コマンドでは、読み取り・書き込み・実行 の権限を、Owner (所有者)・グループ・他のユーザに対して設定できます。
パーミッションの指定方法には 2種類あり、記号 (アルファベット) もしくは数値 (8進数) で指定することができます。
①記号で指定する場合
各権限を、下記のようにあらわします。
- 読み取り:r
- 書き込み:w
- 実行:x
ユーザの種類を、下記のようにあらわします。
- Owner:u
- グループ:g
- その他のユーザ:o
- 全員 (u + g + o):a
さらに、権限を付与する場合は +、権限を削除する場合は -、権限を完全に指定する場合は = を使用します。
■ 例1:Owner (u) に実行 (x) 権限を付与 (u+x)
$ chmod u+x test.txt
■ 例2:グループ (g) とその他のユーザ (o) から書き込み (w) 権限を削除 (go-w)
$ chmod go-w test.txt
■ 例3:全員 (a) に読み取り (r) 権限のみを付与 (a=r)
$ chmod a=r test.txt
②数値で指定する場合
各権限を、下記のようにあらわします。
- 読み取り:4
- 書き込み:2
- 実行:1
■ 例4:Owner に読み取り・書き込み・実行権限を付与、グループとその他のユーザには読み取り・実行権限を付与 (chmod 755)
$ chmod 755 test.txt
- Owner (所有者):読み取り・書き込み・実行 (4 + 2 + 1 = 7)
- グループ:読み取り・実行 (4 + 1 = 5)
- 他のユーザ:読み取り・実行 (4 + 1 = 5)
■ 例5:Owner に読み取り・書き込み権限を付与、グループとその他のユーザには読み取り権限のみ付与 (chmod 644)
$ chmod 644 test.txt $ ls -l test.txt -rw-r--r--. 1 ykaino ykaino-group 0 Mar 24 12:00 test.txt
- Owner (所有者):読み取り・書き込み (4 + 2 = 6)
- グループ:読み取りのみ (4)
- 他のユーザ:読み取りのみ (4)
のように、それぞれ権限が付与されます。
特殊なパーミッション
上記でご紹介した読み取り (r)・書き込み (w)・実行 (x) に加え、特定の要件がある場合に使用する「特別な権限」について説明します。
- SetUID (s):実行時「実行したユーザ」ではなく、「所有者の権限」で動作する
- SetGID (s):実行時「グループの権限」で動作する。ディレクトリの場合、中に作成されるファイルのグループが親ディレクトリと同じになる
- Sticky Bit (t):ディレクトリに指定すると、所有者以外は中のファイルを削除できないようになる
■ SetUID の使用例
ユーザが自分の権限ではできない操作を、一時的に「所有者の権限」で実行できるようになります。
例えば、パスワードの変更 (passwd コマンド) は、実行時 /etc/shadow を変更する必要がありますが、この操作は root しかできないため、passwd コマンド (/usr/bin/passwd) に SetUID を設定することで可能にしています。
下記の様に、Owner の実行権限が s になっています。
$ ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 33544 Dec 13 2019 /usr/bin/passwd
■ SetGID の使用例
ディレクトリに設定すると、中に誰がファイルを作成してもすべて親ディレクトリのグループが設定されます。
例えば、特定のディレクトリ配下をチームの共有ディレクトリとする場合に便利です。
下記の様に、グループの実行権限が s になっています。
$ chmod g+s share_directory/ $ ls -ld share_directory/ drwxrwsr-x. 2 ykaino ykaino 6 Apr 13 20:09 share_directory/
■ Sticky Bit の使用例
他のユーザがアクセス可能なファイルやディレクトリを、誤って削除しないようにするために使用します。
例えば、/tmp ディレクトリでは誰でもファイルを作成できますが、所有者しか削除できないようになっています。
下記の様に、その他のユーザの実行権限が t になっています。
$ ls -ld /tmp drwxrwxrwt. 8 root root 172 Apr 13 20:05 /tmp