基本的なパーミッション:読み取り・書き込み・実行

Linuxのすべてのファイル・ディレクトリには、「所有者(owner)」「所有グループ(group)」「その他(other)」の3つの主体に対して、それぞれ「読み取り(r)」「書き込み(w)」「実行(x)」の権限が設定されています。ls -lで表示される-rwxr-xr--のような文字列が、この設定を表しています。

-rwxr-xr--  1 alice developers  1234  9月  6 10:00 script.sh
位置対象この例での値
1文字目ファイル種別(-=通常ファイル、d=ディレクトリ、l=シンボリックリンク等)-(通常ファイル)
2〜4文字目所有者(owner)の権限rwx(読み取り・書き込み・実行すべて可)
5〜7文字目所有グループ(group)の権限r-x(読み取り・実行のみ可)
8〜10文字目その他(other)の権限r--(読み取りのみ可)

ディレクトリに対するx(実行権限)は、そのディレクトリ内を検索し、名前を指定してファイルやディレクトリにアクセスする(cdを含む)ための権限です。ディレクトリの内容を一覧表示するには、通常はr(読み取り権限)も必要です。

パーミッションを変更する:chmod

chmodは、ファイル・ディレクトリのパーミッションを変更するコマンドです。シンボリックモードと数値(8進数)モードの2通りの指定方法があります。

シンボリックモード

[対象][演算子][権限]という形式で指定します。

記号意味
u・g・o・a対象(所有者・グループ・その他・全員)
+・-・=演算子(権限の追加・削除・完全な指定)
r・w・x権限(読み取り・書き込み・実行)
chmod u+x script.sh        # 所有者に実行権限を追加する
chmod go-w file.txt        # グループとその他から書き込み権限を削除する
chmod a=r file.txt         # 全員を読み取り専用にする

数値(8進数)モード

r=4、w=2、x=1として、対象ごとに合計した3桁(または特殊権限を含む4桁)の数値で指定します。

chmod 755 script.sh    # 所有者rwx(7)、グループr-x(5)、その他r-x(5)
chmod 644 file.txt      # 所有者rw-(6)、グループr--(4)、その他r--(4)

所有者・グループを変更する:chown、chgrp

コマンド役割
chown 新しい所有者 ファイルファイルの所有者を変更する
chown 新しい所有者:新しいグループ ファイル所有者と所有グループを同時に変更する
chgrp 新しいグループ ファイル所有グループのみを変更する
chown alice file.txt           # 所有者をaliceに変更する
chown alice:developers file.txt  # 所有者とグループを同時に変更する
chgrp developers file.txt        # グループのみをdevelopersに変更する

-Rオプションを付けると、ディレクトリ以下を再帰的に変更できます。

グループを使ってアクセスを許可する

複数のユーザーに同じファイルへのアクセスを許可したい場合、個々のユーザーに権限を与えるのではなく、共有用のグループを作成し、そのグループにファイルの所有グループを設定した上で、グループの権限(rwxのグループ部分)を適切に設定するという方法が使われます。これにより、ファイルの所有者本人を除く、そのグループに所属するユーザーはグループ権限に従ってファイルにアクセスできます。

特殊なアクセスモード:SUID、SGID、スティッキービット

通常のrwxとは別に、3つの特殊な権限ビットがあります。数値モードでは、通常の3桁の前にもう1桁(4=SUID、2=SGID、1=スティッキービット)を追加して指定します。

ビット対象効果
SUID(Set User ID、4)実行可能ファイル実行時に、実効ユーザーIDが実行したユーザーではなくファイルの所有者になる(例:passwdコマンドが一般ユーザーでも/etc/shadowを更新できるのはこの仕組みによる)。Linuxでは通常、スクリプトに設定したSUIDは有効にならない。
SGID(Set Group ID、2)実行可能ファイル実行時に、実効グループIDが実行したユーザーのグループではなくファイルの所有グループになる。Linuxでは通常、スクリプトに設定したSGIDは有効にならない。
SGID(ディレクトリの場合)ディレクトリそのディレクトリ内に新しく作成されたファイル・ディレクトリの所有グループが、作成したユーザーの主グループではなく、親ディレクトリの所有グループを自動的に引き継ぐ
スティッキービット(1)主にディレクトリそのディレクトリ内のファイルを、ファイルの所有者・ディレクトリの所有者以外は削除・rename できないようにする(rootなど必要な特権を持つユーザーを除く。例:/tmpディレクトリ)
chmod 4755 /usr/bin/some_tool    # SUIDを設定する(例:4+7+5+5)
chmod 2775 /shared/project       # SGIDを設定する(共有ディレクトリでよく使われる)
chmod 1777 /tmp                  # スティッキービットを設定する(/tmpの典型的な設定)

シンボリックモードでは、chmod u+s ファイル(SUID)、chmod g+s ファイル(SGID)、chmod +t ディレクトリ(スティッキービット)のように指定します。

SUID/SGIDが設定されたファイルの監査

SUIDやSGIDが設定された実行可能ファイルは、悪用されると意図しない権限昇格につながる可能性があるため、セキュリティ上、システム内にどのファイルにこれらのビットが設定されているかを定期的に把握しておくことが重要です。findコマンドの-perm条件を使うと、これらのファイルを検索できます。

find / -perm -4000 -type f 2> /dev/null    # SUIDが設定された通常ファイルを検索する
find / -perm -2000 -type f 2> /dev/null    # SGIDが設定された通常ファイルを検索する

-perm -4000は「4000(SUIDビット)が少なくとも設定されている」ことを意味し、他のパーミッションビットの値は問いません。心当たりのないSUID/SGID付きファイルが見つかった場合は、意図した設定かどうかを確認することが推奨されます。

ファイル作成時の既定権限を決める:umask

新しくファイル・ディレクトリを作成するプログラムは、通常、ファイルには666(rw-rw-rw-)、ディレクトリには777(rwxrwxrwx)という作成モードを指定します。そこからumaskで指定したビットをマスクした権限が、実際の初期権限になります。

umask          # 現在のumask値を表示する
umask 022      # umaskを022に設定する

例えば、umaskが022の場合、新規作成されるファイルの権限は666から022で1となっているビットを除いた644、ディレクトリは777から022で1となっているビットを除いた755になります。

umask値新規ファイルの権限新規ディレクトリの権限
022644(rw-r--r--)755(rwxr-xr-x)
002664(rw-rw-r--)775(rwxrwxr-x)

umaskはchmodのように直接権限を指定するのではなく、既定の権限から取り除くビットを指定するマスクである点を理解しておく必要があります。