LPIC Level1 復習ラジオ 20:パーミッション総復習
音声
目次
パーミッションの基本構造
Linuxのファイルやディレクトリには、所有者、所有グループ、その他の利用者に対するアクセス権が設定されています。
ls -l example.txt
-rw-r----- 1 user1 developers 1200 Jul 11 10:00 example.txt
ls -lの先頭部分を分解すると、次のようになります。
- rw- r-- ---
│ │ │ └─ other:その他の利用者
│ │ └────── group:所有グループ
│ └─────────── user:所有者
└─────────────── ファイル種別
| 位置 | 意味 |
|---|---|
| 1文字目 | ファイル種別。-は通常ファイル、dはディレクトリ、lはシンボリックリンクなど |
| 2~4文字目 | 所有者、userの権限 |
| 5~7文字目 | 所有グループ、groupの権限 |
| 8~10文字目 | その他、otherの権限 |
権限の対象は、記号では次の文字で表します。
| 記号 | 対象 |
|---|---|
u |
user。ファイルの所有者 |
g |
group。ファイルの所有グループに属する利用者 |
o |
other。所有者にも対象グループにも該当しない利用者 |
a |
all。u、g、oのすべて |
どの権限欄が使われるか
概念的には、アクセスするプロセスの実効UIDが所有者と一致すれば所有者の権限、該当するグループに一致すればグループの権限、それ以外ならotherの権限が使われます。
三つの欄から最も許可が多いものを選ぶわけではありません。所有者として判定された場合は、たとえotherの方が広い権限でも、所有者欄が使われます。
rootや適切なLinux capabilitiesを持つプロセスは、一部の通常の権限検査を超えて操作できる場合があります。
ファイルとディレクトリのrwx
r、w、xは、対象が通常ファイルかディレクトリかによって意味が変わります。
通常ファイル
| 権限 | 数値 | 主な意味 |
|---|---|---|
r |
4 | ファイルの内容を読み取る |
w |
2 | ファイルの内容を変更する |
x |
1 | プログラムやスクリプトとして実行する |
実行権限が付いていても、内容が有効な実行形式や適切なシバンを持つスクリプトでなければ、正常に実行できるとは限りません。
ディレクトリ
| 権限 | 主な意味 |
|---|---|
r |
ディレクトリ内の名前の一覧を読み取る |
w |
ディレクトリエントリを作成、削除、名前変更する |
x |
ディレクトリを通過し、名前を指定して中の項目へアクセスする |
ディレクトリのxは、検索権限や通過権限とも説明されます。パスの途中にある各ディレクトリを通過するには、通常そのディレクトリのxが必要です。
組み合わせによる違い
- ディレクトリに
rがありxがない:名前一覧を取得できても、項目の属性確認や中への通常アクセスが制限される - ディレクトリに
xがありrがない:名前を一覧取得できなくても、名前を知っていれば項目へアクセスできる場合がある - ディレクトリに
wがありxがある:項目の作成、削除、名前変更が可能になる場合がある
削除を決めるのは親ディレクトリ
ファイルを削除できるかどうかは、通常、ファイル自身のwよりも、そのファイルを含む親ディレクトリのwとxが重要です。
ls -ld work/
ls -l work/file.txt
ファイルが読み取り専用でも、親ディレクトリに必要な権限があれば削除できる場合があります。反対に、ファイルへ書き込めても、親ディレクトリの権限がなければ削除や名前変更はできません。
数値表記
パーミッションは、r=4、w=2、x=1として、所有者、グループ、その他ごとに合計して表せます。
| 数値 | 記号 | 意味 |
|---|---|---|
| 0 | --- | 権限なし |
| 1 | --x | 実行のみ |
| 2 | -w- | 書き込みのみ |
| 3 | -wx | 書き込みと実行 |
| 4 | r-- | 読み取りのみ |
| 5 | r-x | 読み取りと実行 |
| 6 | rw- | 読み取りと書き込み |
| 7 | rwx | 読み取り、書き込み、実行 |
代表例
| 数値 | 記号 | 代表的な用途 |
|---|---|---|
644 |
rw-r--r-- |
所有者だけが編集し、他は読み取り可能な通常ファイル |
600 |
rw------- |
所有者だけが読み書きする秘密情報など |
755 |
rwxr-xr-x |
所有者が変更し、他も通過または実行できるディレクトリや実行ファイル |
750 |
rwxr-x--- |
所有者とグループだけが利用するディレクトリなど |
700 |
rwx------ |
所有者専用のディレクトリや実行ファイル |
先頭の0
0644
0755
04755
先頭の0は、シェルコマンドの引数として常に必須というわけではありませんが、権限値が8進数であることを分かりやすくします。プログラミング言語や設定形式では、表記規則が異なることがあります。
特殊権限を含む4桁表記
通常の3桁の前へ、SUID、SGID、Sticky Bitを表す桁を追加できます。
| 数値 | 特殊権限 |
|---|---|
| 4 | SUID |
| 2 | SGID |
| 1 | Sticky Bit |
4755 SUID + 755
2755 SGID + 755
1777 Sticky Bit + 777
6755 SUID + SGID + 755
chmod
chmodは、ファイルやディレクトリのモードビットを変更します。数値形式とシンボル形式があります。
数値形式
chmod 644 file.txt
chmod 755 script.sh
chmod 700 private-dir
数値形式は、指定した所有者、グループ、その他の権限をまとめて設定します。
シンボル形式
chmod u+x script.sh
chmod g-w file.txt
chmod o-r secret.txt
chmod a=r file.txt
chmod u=rw,g=r,o= file.txt
| 演算子 | 意味 |
|---|---|
+ |
指定した権限を追加する |
- |
指定した権限を削除する |
= |
指定対象の権限を、その内容へ置き換える |
chmod a=r file.txtは、すべての対象を読み取りだけにします。既存の書き込み権限や実行権限も外れるため、=の動作に注意します。
複数の変更
chmod u=rw,g=r,o= file.txt
chmod u+x,g-w,o-r file.txt
複数のシンボル指定は、カンマで区切れます。
Xの利用
chmod -R u=rwX,go=rX project/
大文字のXは、対象がディレクトリである場合、または既に誰かの実行権限がある通常ファイルの場合に実行権限を設定します。
ディレクトリを再帰的に読み取り可能にしつつ、すべての通常ファイルへ無条件に実行権限を付けたくない場合に役立ちます。
再帰処理
chmod -R 755 directory/
chmod -R u+rwX,go-rwx directory/
-Rは配下を再帰的に変更します。ただし、通常ファイルとディレクトリへ同じ数値を設定すると、不要な実行権限が付いたり、必要な通過権限が失われたりします。
参照ファイルと同じ権限
chmod --reference=source.txt target.txt
GNU chmodでは、別のファイルと同じモードへ設定できます。
chownとchgrp
chownは所有者や所有グループを変更し、chgrpは所有グループを変更します。
所有者の変更
sudo chown user2 file.txt
所有者とグループを同時に変更
sudo chown user2:developers file.txt
sudo chown user2.developers file.txt
GNU chownではドット形式も扱えますが、利用者名にドットを含められる環境もあるため、通常はコロン形式が分かりやすくなります。
グループだけを変更
chown :developers file.txt
chgrp developers file.txt
配下を再帰的に変更
sudo chown -R user2:developers project/
-Rは配下の多数のファイルへ影響します。対象パスを取り違えると、システムやアプリケーションが動作しなくなることがあります。
現在の所有情報を確認する
ls -l file.txt
stat file.txt
id user2
getent group developers
ls -l:所有者、グループ、権限を一覧で確認stat:UID、GID、数値と記号のモードなどを詳しく確認id:利用者のUID、主グループ、補助グループを確認getent group:グループ情報を名前サービスも含めて確認
権限変更後の特殊ビット
所有者変更や権限変更によって、セキュリティ上の理由からSUIDやSGIDが解除される場合があります。特殊ビットを含むファイルでは、変更後にls -lやstatで再確認します。
一般利用者が所有者を自由に変更できると、利用量の計算や権限管理を回避できるため、所有者変更は通常、特権が必要です。グループ変更にも、所有関係や所属グループに基づく制限があります。
umask
umaskは、新しく作成されるファイルやディレクトリの初期パーミッションから、許可しない権限ビットを外すためのマスクです。
umask
umask -S
umask -p
umask:現在のマスクを数値形式で表示umask -S:結果として許可される権限をシンボル形式で表示umask -p:bashで再入力しやすい形式で表示
代表的な考え方
一般的なコマンドは、通常ファイルを最大666、ディレクトリを最大777として作成しようとし、そこからumaskで指定されたビットを外します。
umask 022
通常ファイル:666 から 022 のビットを外す → 644
ディレクトリ:777 から 022 のビットを外す → 755
| umask | 通常ファイルの代表結果 | ディレクトリの代表結果 |
|---|---|---|
002 |
664 |
775 |
022 |
644 |
755 |
027 |
640 |
750 |
077 |
600 |
700 |
umaskは単純な10進数の引き算ではなく、ビットを無効にする処理です。例えば、実行権限を要求していない通常ファイルへ、umaskによって実行権限が追加されることはありません。
設定と確認
old_umask=$(umask)
umask 077
touch secret.txt
mkdir private-dir
ls -ld secret.txt private-dir
umask "$old_umask"
umaskは現在のシェル実行環境へ設定されます。子プロセスは親のumaskを継承しますが、子シェル側で変更しても、通常は親シェルへ戻って反映されません。
既存ファイルには影響しない
umaskを変更しても、既に存在するファイルやディレクトリの権限は変わりません。既存の権限変更にはchmodを使います。
例外と注意
実際の初期権限は、作成プログラムが要求するモード、umask、親ディレクトリのデフォルトACLなどによって決まります。デフォルトACLが設定されている場合は、単純な666や777との組み合わせだけでは説明できないことがあります。
SUID
SUID、Set User IDは、実行ファイルに設定する特殊権限です。対応する実行形式を起動したとき、プロセスの実効UIDを、そのファイルの所有者へ変更して動作させる仕組みです。
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root ... /usr/bin/passwd
この例では、所有者の実行位置がxではなくsになっています。
設定方法
chmod u+s program
chmod 4755 program
解除方法
chmod u-s program
chmod 0755 program
sとS
| 表示 | 意味 |
|---|---|
s |
SUIDと所有者の実行権限が両方設定されている |
S |
SUIDは設定されているが、所有者の実行権限がない |
chmod 4644 program
ls -l program
-rwSr--r-- ... program
大文字のSは、特殊ビットがあるものの、対応する実行権限がない状態を示します。
利用目的
一般利用者が、本来は所有者だけに許可された限定的な処理を、プログラムの制御下で実行するために利用されます。
ただし、SUIDプログラムに脆弱性があると、所有者の権限が悪用される可能性があります。SUIDを安易に独自スクリプトへ付けるのではなく、必要性、実行形式、所有者、書き込み権限を慎重に確認します。
Linuxでは、スクリプトのSUIDは通常、安全上の理由から期待どおりには機能しません。また、ファイルシステムがnosuidでマウントされている場合など、SUIDが無効化されることがあります。
SGID
SGID、Set Group IDは、通常ファイルとディレクトリで役割が異なります。
実行ファイルのSGID
実行ファイルへSGIDを設定すると、実行時のプロセスの実効GIDが、そのファイルの所有グループになります。
chmod g+s program
chmod 2755 program
ディレクトリのSGID
ディレクトリへSGIDを設定すると、その中に新しく作成されるファイルやディレクトリが、親ディレクトリのグループを引き継ぐようになります。
sudo chown root:project shared/
chmod 2775 shared/
ls -ld shared/
共同作業用ディレクトリで、作成者ごとの主グループではなく、共通のプロジェクトグループを維持するために使われます。
新しく作成されるサブディレクトリは、通常SGIDビットも引き継ぎます。一方、ファイルに付くグループの書き込み権限などは、作成プログラム、umask、デフォルトACLの影響を受けます。
解除方法
chmod g-s program
chmod g-s shared/
chmod 0755 program
sとS
| 表示 | 意味 |
|---|---|
s |
SGIDとグループの実行権限が両方設定されている |
S |
SGIDは設定されているが、グループの実行権限がない |
chmod 2644 program
ls -l program
-rw-r-Sr-- ... program
共有ディレクトリの例
sudo groupadd project
sudo mkdir -p /srv/project
sudo chown root:project /srv/project
sudo chmod 2770 /srv/project
この例では、所有者とprojectグループだけが利用でき、新規項目はprojectグループを継承します。複数利用者で編集する場合は、利用者のグループ所属、umask、必要に応じてデフォルトACLも確認します。
Sticky Bit
Sticky Bitは、主に複数利用者が書き込める共有ディレクトリで、他人のファイルを勝手に削除または名前変更しにくくするために使われます。
ls -ld /tmp
drwxrwxrwt ... /tmp
/tmpでは、多くの利用者が項目を作成できます。しかしSticky Bitがあるため、通常、項目の削除や名前変更は、その項目の所有者、ディレクトリの所有者、または適切な特権を持つプロセスに制限されます。
設定方法
chmod +t shared/
chmod 1777 shared/
解除方法
chmod -t shared/
chmod 0777 shared/
tとT
| 表示 | 意味 |
|---|---|
t |
Sticky Bitとotherの実行権限が両方設定されている |
T |
Sticky Bitは設定されているが、otherの実行権限がない |
chmod 1766 shared/
ls -ld shared/
drwxrw-rwT ... shared/
大文字のTは、Sticky Bitがあるものの、otherの実行、つまり通過権限がない状態を表します。
Sticky Bitだけで秘密になるわけではない
Sticky Bitは、主に削除や名前変更を制限します。他人のファイルを読めるか、内容を書き換えられるかは、それぞれのファイルやディレクトリの通常の権限、ACLなどで決まります。
共有ディレクトリを安全に設計する場合は、Sticky Bitだけでなく、所有グループ、SGID、umask、ACLを目的に応じて組み合わせます。
実践的な確認と注意点
1. パス全体の権限を確認する
namei -l /srv/project/data/file.txt
対象ファイルだけに十分な権限があっても、親ディレクトリのどこかにxがなければ到達できません。namei -lは、パスを構成する各要素の所有者と権限を確認するのに便利です。
2. 所有者とグループ所属を確認する
ls -l file.txt
stat -c '%A %a %U %G %n' file.txt
id
id user1
getent group developers
権限文字だけでなく、アクセスする利用者がどのUID、GID、補助グループで動いているかを確認します。新しいグループ所属が既存のログインセッションへ反映されていない場合は、再ログインなどが必要です。
3. ディレクトリ自身を表示する
ls -ld directory/
ls -l directory/
ls -l directory/は中身を表示します。ディレクトリ自身の所有者や権限を見る場合は、-dを付けます。
4. 数値表記を確認する
stat -c '%A %a %n' file.txt directory/
%Aは記号形式、%aは8進数形式の権限を表示します。
5. ACLの有無を確認する
ls -l file.txt
getfacl file.txt
ls -lの権限表示の後ろに+が付いている場合、追加のACLが設定されている可能性があります。通常のrwxだけで説明できない場合はgetfaclを確認します。
6. マウントオプションを確認する
findmnt -no TARGET,OPTIONS /path/to/file
mount | grep ' /mountpoint '
noexec、nosuid、読み取り専用などのマウント設定によって、モードビットがあっても実行や特殊権限が制限される場合があります。
7. 権限不足を段階的に切り分ける
whoami
id
namei -l /path/to/file
stat /path/to/file
getfacl /path/to/file
findmnt -no OPTIONS /path/to/file
いきなりchmod 777を実行せず、利用者、グループ、パス上のディレクトリ、ACL、マウント設定の順に確認します。
よくある症状
| 症状 | 主な確認点 |
|---|---|
| ファイルは読めるのにディレクトリへ入れない | パス上のディレクトリのx |
| ファイルが読み取り専用なのに削除できた | 親ディレクトリのwとx |
chmod +xでも実行できない |
内容、シバン、インタープリタ、noexec、改行コード |
| グループ権限があるのに利用できない | 実際のグループ所属、再ログイン、ACL、親ディレクトリ |
| 新規ファイルの権限が想定と違う | umask、作成プログラムの指定、デフォルトACL |
| SUIDやSGIDが消えた | chownやchmod後の再確認、ファイルシステムの制限 |
| 共有ディレクトリで他人のファイルを消せる | Sticky Bitの有無 |
30秒チェック
-rwxr-x---の所有者、グループ、その他の数値は、それぞれ何でしょうか。- ディレクトリの
r、w、xは、それぞれ主に何を許可するでしょうか。 chmod g-w file.txtは、どの権限をどの対象から外すでしょうか。- umaskが
027の場合、一般的な通常ファイルとディレクトリの初期権限は何になるでしょうか。 - SUID、SGID、Sticky Bitの数値は、それぞれ何でしょうか。
- SGIDを設定したディレクトリ内で、新規項目のグループは通常どうなるでしょうか。
drwxrwxrwtの末尾のtは何を表すでしょうか。- ファイルへ書き込み権限がなくても削除できる場合があるのは、削除が主にどこの権限で決まるためでしょうか。
答えを表示
- 所有者7、グループ5、その他0。数値表記は
750 rは名前一覧、wは項目の作成・削除・名前変更、xは通過と名前指定アクセス- 所有グループから書き込み権限を外す
- 通常ファイルは代表的に
640、ディレクトリは750 - SUIDは4、SGIDは2、Sticky Bitは1
- 親ディレクトリの所有グループを引き継ぐ
- Sticky Bitとotherの実行権限が設定されている
- 親ディレクトリの書き込み権限と実行権限で決まるため
要約
- Linuxの基本権限は、所有者、所有グループ、その他の三つの対象へ設定されます。
ls -lの先頭1文字はファイル種別、その後の9文字は所有者、グループ、その他の権限です。- アクセス判定では、該当する所有者、グループ、その他の欄が使われ、最も広い欄を選ぶわけではありません。
- 通常ファイルの
rwxは読み取り、書き込み、実行を表します。 - ディレクトリの
rwxは名前一覧、項目の作成・削除・名前変更、通過を表します。 - ファイルの削除や名前変更は、主に親ディレクトリの
wとxで決まります。 - 数値表記では
r=4、w=2、x=1を対象ごとに合計します。 chmodは数値形式またはシンボル形式でモードビットを変更します。- 再帰的な権限変更では、通常ファイルとディレクトリへ必要な権限が異なることに注意します。
chownは所有者やグループ、chgrpはグループを変更します。- umaskは新規項目の初期権限から指定ビットを外し、既存ファイルの権限は変更しません。
- 一般的にumask
022では、通常ファイルは644、ディレクトリは755になります。 - SUIDは実行時の実効UID、実行ファイルのSGIDは実効GIDに関係します。
- ディレクトリのSGIDは、新規項目へ親ディレクトリのグループを継承させます。
- Sticky Bitは、共有ディレクトリで他人の項目を削除または名前変更しにくくします。
- 特殊権限はSUIDが4、SGIDが2、Sticky Bitが1で、通常権限の前へ付けます。
sやtが大文字の場合、特殊ビットはあるものの、対応する実行権限がありません。- 権限問題では、所有者、グループ所属、パス上の各ディレクトリ、ACL、umask、マウント設定を順番に確認します。
- 原因確認をせずに
chmod 777で回避せず、必要最小限の権限を設定します。
参考資料
- GNU Coreutils Manual
- GNU Coreutils Manual:Mode Structure
- GNU Coreutils Manual:Symbolic Modes
- GNU Coreutils Manual:Numeric Modes
- GNU Coreutils Manual:chmod invocation
- GNU Coreutils Manual:chown invocation
- GNU Coreutils Manual:chgrp invocation
- GNU Coreutils Manual:Directory Setuid and Setgid
- GNU Bash Manual:Bourne Shell Builtins
- chmod(1) — Linux manual page
- chown(1) — Linux manual page
- chmod(2) — Linux manual page
- chown(2) — Linux manual page
- umask(2) — Linux manual page
- open(2) — Linux manual page
- execve(2) — Linux manual page
- inode(7) — Linux manual page
- acl(5) — Linux manual page
- POSIX.1-2024:chmod
- POSIX.1-2024:umask