Linux ファイルパーミッションの解説
すべてのLinuxシステムは、ファイルパーミッションを使用して、誰がファイルを読み取り、書き込み、または実行できるかを制御します。設定を誤ると、正当なユーザーをロックアウトするか、機密ファイルを露出させることになります。このガイドでは、Linuxのファイル所有権とパーミッションの仕組み、パーミッション文字列の読み方、およびchmodとchownを使用したパーミッションの変更方法について説明します。
重要なポイント
- すべてのファイルには所有者、グループ、および3つのクラス(所有者、グループ、その他)のパーミッションセットがあります。
- パーミッショントリプレットは
r(読み取り)、w(書き込み)、x(実行)を使用し、ファイルとディレクトリで動作が異なります。 chmodを使用してパーミッションを変更し(シンボリックまたは8進数)、chownを使用して所有権を変更します。umask値は、新しく作成されるファイルとディレクトリのデフォルトパーミッションを制御します。- 特殊ビット(setuid、setgid、sticky)とPOSIX ACLは、標準モデルでは対応できないケースを処理します。
Linuxファイルの所有権とパーミッションの構造
Linux上のすべてのファイルとディレクトリには、以下が割り当てられています:
- 所有者(ユーザーアカウント)
- グループ(ユーザーのセット)
- 3つのクラスに対するパーミッションセット: 所有者、グループ、その他
プロセスがファイルにアクセスしようとすると、カーネルはこれらのクラスを順番にチェックします — 最初に所有者、次にグループ、そしてその他 — 最初に一致したところで停止します。クラスは相互排他的です: あなたが所有者である場合、グループビットがより寛容であっても、所有者ビットのみが適用されます。
Linuxでのrwxパーミッションの読み方
ls -lを実行してパーミッションを表示します:
$ ls -l
-rw-r--r-- 1 alice developers 4017 Jun 1 10:00 config.conf
drwxr-x--- 2 alice developers 68 Jun 1 10:00 project/
最初の文字はファイルタイプです(-は通常ファイル、dはディレクトリ、lはシンボリックリンク)。次の9文字は3つのパーミッショントリプレットです:
rw- r-- r--
↑ ↑ ↑
所有者 グループ その他
各トリプレットは3つのビットを使用します: r(読み取り)、w(書き込み)、x(実行)。-はそのパーミッションが設定されていないことを意味します。
注意: パーミッション文字列の最後に
+が表示される場合(例:-rw-r--r--+)、そのファイルにはPOSIX ACLが適用されています。標準のls -lではこれらの追加ルールは表示されません —getfaclを使用して検査してください。
各パーミッションビットの実際の動作
ファイルの場合:
| ビット | 効果 |
|---|---|
r | ファイルの内容を読み取る(cat、cp) |
w | ファイルを変更または上書きする |
x | ファイルをプログラムまたはスクリプトとして実行する |
ディレクトリの場合:
| ビット | 効果 |
|---|---|
r | ディレクトリエントリ(ファイル名)を一覧表示する |
w | 内部のファイルを作成、名前変更、または削除する |
x | ディレクトリをトラバースする(cd、パスでファイルを開く) |
ディレクトリの実行ビットはしばしば誤解されています。これがないと、読み取りパーミッションがあっても、ディレクトリにcdできず、パスで内部のファイルにアクセスすることもできません。
chmodを使用したLinuxファイルパーミッションの変更方法
chmodは、シンボリックモードと数値(8進数)モードの両方を受け付けます。
シンボリックモード:
chmod u+x script.sh # 所有者に実行権限を追加
chmod go-w config.conf # グループとその他から書き込み権限を削除
chmod u=rwx,g=rx,o= app/ # すべてのクラスに正確なパーミッションを設定
chmod -R u=rwX,g=rX,o=rX /var/www/html # 再帰的: 大文字のXはディレクトリと既に実行権限を持つファイルに実行権限を設定
数値(8進数)モード — 各桁はr=4、w=2、x=1の合計:
chmod 644 config.conf # 所有者 rw、グループ r、その他 r
chmod 750 script.sh # 所有者 rwx、グループ rx、その他 なし
chmod 700 ~/.ssh # 所有者のみ — SSHディレクトリに適切
Discover how at OpenReplay.com.
chownを使用したファイル所有権の変更方法
chownは所有者、グループ、または両方を変更します:
chown alice config.conf # 所有者のみを変更
chown alice:developers config.conf # 所有者とグループを変更
chown -R www-data:www-data /var/www # 再帰的な所有権変更
umaskによるデフォルトパーミッションの設定方法
新しいファイルはオープンなパーミッションで開始しません。umask値は、システムデフォルト(通常、ファイルは666、ディレクトリは777)からビットをマスクアウトします。022のumaskは644のファイルと755のディレクトリを生成します — これはLinuxサーバーで最も一般的なデフォルトです。
親ディレクトリにデフォルトACLが設定されている場合、純粋にumaskに依存するのではなく、それらのACLルールが継承されます。
umask # 現在のumaskを表示
umask 027 # より厳格なデフォルトを設定: ファイル 640、ディレクトリ 750
特殊パーミッションビット: setuid、setgid、スティッキービット
これらは特定のユースケースのために標準モデルを拡張します:
- setuid (4xxx): 実行可能ファイルがファイル所有者の権限で実行されます。
/usr/bin/passwdのようなシステムバイナリで使用されます。カスタムスクリプトでは危険 — 避けてください。 - setgid (2xxx) ディレクトリの場合: 新しいファイルは作成者のプライマリグループではなく、ディレクトリのグループを継承します。共有プロジェクトディレクトリに便利です。
- スティッキービット (1xxx) ディレクトリの場合: ファイル所有者、ディレクトリ所有者、またはrootのみが内部のファイルを削除できます。
/tmpで標準です。
chmod 2775 /shared/project # 共有ディレクトリにsetgid
chmod 1777 /tmp # スティッキービット — デフォルトで既に設定済み
従来のパーミッションを超えて: ACLとセキュリティモジュール
標準のrwxパーミッションはほとんどのユースケースをカバーしますが、限界があります。グループメンバーシップを変更せずに特定のユーザーにアクセスを許可する必要がある場合は、setfaclとgetfaclを介してPOSIX ACLを使用してください。SELinuxまたはAppArmorを実行しているシステムでは、セキュリティモジュールポリシーが標準パーミッションの上に適用されます — ファイルはUNIXレイヤーで誰でも読み取り可能でも、SELinuxポリシーによってブロックされる可能性があります。
クイックリファレンス: 一般的なパーミッションパターン
| モード | シンボリック | 一般的な用途 |
|---|---|---|
644 | rw-r--r-- | Webサーバー設定ファイル、公開コンテンツ |
755 | rwxr-xr-x | ディレクトリ、実行可能スクリプト |
700 | rwx------ | ホームディレクトリ、SSHキーディレクトリ |
600 | rw------- | 秘密鍵ファイル(~/.ssh/id_rsa) |
2775 | rwxrwsr-x | 共有グループディレクトリ |
1777 | rwxrwxrwt | /tmpのような誰でも書き込み可能なディレクトリ |
まとめ
Linuxファイルパーミッションは、一貫性のある予測可能なモデルに従います。所有者/グループ/その他の構造、rwxビット、およびchmodとchownの適用方法を理解すれば、任意のファイルまたはディレクトリを正しく保護するための基礎が得られます。3クラスモデルが十分に細かくない場合は、ACLを使用してください — そして常に最小権限の原則を念頭に置いてください。
よくある質問
777を設定すると、システム上のすべてのユーザーに読み取り、書き込み、実行のパーミッションが付与されます。すべてのアクセス障壁を取り除く一方で、任意のユーザーまたは侵害されたプロセスがファイルを変更または削除できることも意味します。ファイルが正しく機能するために必要な最小限のパーミッションを常に割り当ててください。
chmodはファイルで許可されるアクション(読み取り、書き込み、実行)を変更します。chownはファイルの所有者と所属するグループを変更します。通常、最初にchownを使用して適切な所有者とグループを割り当て、次にchmodを使用して各クラスに適切なパーミッションビットを設定します。
一覧表示には読み取り(r)ビットが必要ですが、ディレクトリに入るには実行(x)ビットが必要です。ディレクトリにrがあってもxがない場合、lsでファイル名を見ることはできますが、cdで入ることも、パスで内部のファイルを開くこともできません。これを修正するには、chmodで実行ビットを追加してください。
小文字のxの代わりに大文字のXを使用してchmodを実行してください。大文字のXフラグは、ディレクトリと既に少なくとも1つの実行ビットが設定されているファイルにのみ実行権限を設定します。例えば、chmod -R u=rwX,g=rX,o=rX /pathは、通常のファイルを実行不可のままにしながら、ディレクトリに実行権限を適用します。
Gain control over your UX
See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.