
Linux chmodを完全解説:ファイルパーミッションをわかりやすく
📷 Pixabay / PexelsLinux chmodを完全解説:ファイルパーミッションをわかりやすく
8進数表記(755、644)とシンボリックモード(u+x)をついに理解。よく使うパーミッションパターンとセキュリティの注意点も解説。
はじめに
Linuxシステムのすべてのファイルとディレクトリには、誰が読み取り、書き込み、または実行できるかを決定するパーミッションのセットがあります。これらのパーミッションを理解することは、Webサーバーの管理、アプリケーションのデプロイ、または開発マシンでのファイル整理など、Linuxを使用するうえで基本となる知識です。
chmodコマンドはこれらのパーミッションを変更するための主要なツールです。一見シンプルに見えますが、chmodには十分な深みがあるため、経験豊富な開発者でも時々リファレンスを参照することがあります。本ガイドでは、基本的な概念から高度な特殊パーミッションまで、Linuxファイルパーミッションとchmodコマンドについて知っておくべきすべてを解説します。
Linuxファイルパーミッションを理解する
Linuxのファイルパーミッションは、3種類のアクセス権と3つのユーザーカテゴリを基に構成されています。
3つのパーミッション種別
- 読み取り(r):ファイルの内容を表示、またはディレクトリの内容をリスト表示する。
- 書き込み(w):ファイルを変更・削除、またはディレクトリ内のファイルを追加・削除する。
- 実行(x):プログラムやスクリプトとしてファイルを実行、または
cdでディレクトリに移動する。
3つのユーザーカテゴリ
- 所有者(u):ファイルを所有するユーザー。デフォルトでは作成したユーザーです。
- グループ(g):ファイルに割り当てられたグループ。このグループのすべてのユーザーがグループパーミッションを共有します。
- その他(o):所有者でもなく、ファイルのグループにも属さない、システム上の他のすべてのユーザー。
Linuxシステムの各ファイルは、厳密に1人の所有者を持ち、厳密に1つのグループに属し、これら3つのカテゴリそれぞれに対してパーミッションセットが定義されています。
パーミッション文字列の読み方
ターミナルでls -lを実行すると、次のような出力が表示されます:
ls -l
-rwxr-xr-- 1 alice developers 4096 Mar 22 10:30 deploy.sh
drwxr-x--- 2 alice developers 4096 Mar 22 10:30 config/
最初の列がパーミッション文字列です。10文字で構成され、以下のように分解されます:
d rwx r-x r--
| | | |
| | | +-- その他のパーミッション(読み取りのみ)
| | +------ グループのパーミッション(読み取り + 実行)
| +---------- 所有者のパーミッション(読み取り + 書き込み + 実行)
+------------- ファイル種別(d = ディレクトリ、- = 通常ファイル、l = シンボリックリンク)
各位置はパーミッション文字か、パーミッションが付与されていないことを示すダッシュ(-)です。いくつかの例を示します:
| パーミッション文字列 | 意味 |
|---|---|
-rw-r--r-- | 所有者は読み取り・書き込み可能。グループとその他は読み取りのみ。 |
-rwxr-xr-x | 所有者はフルアクセス。グループとその他は読み取りと実行が可能。 |
drwx------ | ディレクトリ。所有者のみが読み取り、書き込み、移動可能。 |
-rw------- | 所有者のみが読み取りと書き込み可能。他の誰もアクセス不可。 |
-rwxrwxrwx | 全員がフルアクセス。一般的にセキュリティリスク。 |
8進数(数値)表記
8進数表記では、パーミッションを3桁の数値で表し、各桁がそれぞれ所有者、グループ、その他に対応します。各桁はパーミッション値の合計です:
| 値 | パーミッション |
|---|---|
| 4 | 読み取り(r) |
| 2 | 書き込み(w) |
| 1 | 実行(x) |
| 0 | パーミッションなし |
各ユーザーカテゴリについてこれらの値を足し合わせます。例えば:
- 7 = 4 + 2 + 1 = 読み取り + 書き込み + 実行(rwx)
- 6 = 4 + 2 = 読み取り + 書き込み(rw-)
- 5 = 4 + 1 = 読み取り + 実行(r-x)
- 4 = 4 = 読み取りのみ(r--)
- 0 = パーミッションなし(---)
chmod 755は以下を意味します:
7 = rwx(所有者:読み取り + 書き込み + 実行)
5 = r-x(グループ:読み取り + 実行)
5 = r-x(その他:読み取り + 実行)
すべての桁値のクイックリファレンスを示します:
0 = --- (パーミッションなし)
1 = --x (実行のみ)
2 = -w- (書き込みのみ)
3 = -wx (書き込み + 実行)
4 = r-- (読み取りのみ)
5 = r-x (読み取り + 実行)
6 = rw- (読み取り + 書き込み)
7 = rwx (読み取り + 書き込み + 実行)
パーミッション文字列と8進数値の間をすばやく変換したい場合は、chmodカリキュレーターを使用してください。
シンボリック表記
シンボリック表記は文字と演算子を使ってパーミッションを変更します。パーミッションセット全体を指定する必要がないため、特定の変更をする際により直感的な場合が多いです。
構文
chmod [誰に][演算子][パーミッション] ファイル
誰に:
u-- 所有者(user)g-- グループo-- その他a-- すべて(所有者 + グループ + その他)
演算子:
+-- パーミッションを追加--- パーミッションを削除=-- パーミッションを正確に設定
パーミッション:
r-- 読み取りw-- 書き込みx-- 実行
シンボリックモードの例
# 所有者に実行パーミッションを追加
chmod u+x script.sh
# グループとその他から書き込みパーミッションを削除
chmod go-w config.yml
# 全員に読み取り専用を設定
chmod a=r readme.txt
# グループに読み取りと実行を追加
chmod g+rx shared-tool
# その他のすべてのパーミッションを削除
chmod o= private.key
# 全員に実行を追加し、その他の書き込みを削除
chmod a+x,o-w deploy.sh
# 所有者をrwx、グループをrx、その他を何もなしに設定
chmod u=rwx,g=rx,o= project-dir
シンボリック表記は、他のパーミッションに影響を与えずにパーミッションの1つの側面だけを変更したい場合に特に便利です。例えば、chmod u+x script.shは他のパーミッションを変更せずに所有者に実行パーミッションを追加します。
よく使うchmodパターン
実際のLinux管理において、特定のパーミッションパターンが繰り返し登場します。最も重要なものと使用するタイミングを説明します。
644 -- 標準ファイル
chmod 644 index.html
# 所有者:読み取り + 書き込み | グループ:読み取り | その他:読み取り
これはほとんどの通常ファイルのデフォルト設定です。所有者はファイルを編集でき、他の全員は読み取りのみです。HTMLファイル、機密でない設定ファイル、一般的なドキュメントに使用します。
755 -- 実行ファイルとディレクトリ
chmod 755 deploy.sh
chmod 755 /var/www/html
# 所有者:フルアクセス | グループ:読み取り + 実行 | その他:読み取り + 実行
アクセス可能にする必要があるスクリプト、バイナリ、ディレクトリの標準パーミッションです。所有者はフルコントロールを持ち、その他は読み取りと実行(ディレクトリの場合はトラバース)はできますが変更はできません。
700 -- プライベートディレクトリ
chmod 700 ~/.ssh
# 所有者:フルアクセス | グループ:なし | その他:なし
所有者のみがファイルやディレクトリにアクセスできます。~/.sshやプライベートな設定ディレクトリなど、機密性の高いディレクトリに必須です。
600 -- プライベートファイル
chmod 600 ~/.ssh/id_rsa
chmod 600 .env
# 所有者:読み取り + 書き込み | グループ:なし | その他:なし
所有者のみがファイルを読み取り・書き込みできます。他の誰もアクセスできません。SSHプライベートキー、シークレットを含む環境ファイル、認証情報を含むファイルに必要です。
444 -- 全員に読み取り専用
chmod 444 LICENSE
# 所有者:読み取り | グループ:読み取り | その他:読み取り
所有者を含め誰もファイルを変更できません(最初にパーミッションを変更しない限り)。ライセンスファイルやロックされた設定など、誤って編集されるべきでないファイルに便利です。
777 -- 全員にフルアクセス
chmod 777 /tmp/shared-workspace
# 所有者:フル | グループ:フル | その他:フル
すべてのユーザーが読み取り、書き込み、実行できます。本番環境では避けてください。 システム上の任意のユーザーまたはプロセスがファイルを変更・削除できるため、重大なセキュリティリスクです。分離された開発環境や一時的なデバッグシナリオのみで使用してください。
クイックリファレンステーブル
| 8進数 | 文字列 | 典型的な用途 |
|---|---|---|
644 | -rw-r--r-- | 通常ファイル(HTML、CSS、画像) |
755 | -rwxr-xr-x | スクリプト、バイナリ、Webディレクトリ |
700 | -rwx------ | プライベートディレクトリ(~/.ssh) |
600 | -rw------- | プライベートキー、.envファイル、認証情報 |
444 | -r--r--r-- | 読み取り専用ファイル、ライセンス |
664 | -rw-rw-r-- | グループ共同作業ファイル |
775 | -rwxrwxr-x | グループ共同作業ディレクトリ |
777 | -rwxrwxrwx | 本番環境では避ける |
chmodコマンドの構文とオプション
chmodの完全な構文は次のとおりです:
chmod [オプション] モード ファイル...
主要なオプション
# ディレクトリとその内容にパーミッションを再帰的に適用
chmod -R 755 /var/www/html
# 変更された各ファイルの詳細な出力を表示
chmod -v 644 *.html
# 変更があった場合のみ出力を表示
chmod -c u+x scripts/*.sh
# エラーメッセージを抑制
chmod -f 600 missing-file
# 参照ファイルのパーミッションをコピー
chmod --reference=source.conf target.conf
実用的な例
# スクリプトを実行可能にする
chmod +x backup.sh
# SSHディレクトリとその内容を保護
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/authorized_keys
# Webサーバーのファイルパーミッションを設定
chmod -R 644 /var/www/html/*.html
chmod -R 755 /var/www/html/cgi-bin/
# 設定ファイルを制限
chmod 600 /etc/myapp/database.yml
# ディレクトリ内のすべてのシェルスクリプトを実行可能にする
chmod u+x scripts/*.sh
# 本番設定への書き込みアクセスを削除
chmod a-w /etc/nginx/nginx.conf
細かい制御のためのfindとの組み合わせ
同じツリー内でファイルとディレクトリに異なるパーミッションを設定するパターンがよく使われます:
# ディレクトリを755、ファイルを644に再帰的に設定
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
# シェルスクリプトのみを実行可能にする
find /opt/scripts -name "*.sh" -exec chmod u+x {} \;
# すべての設定ファイルからワールド読み取りパーミッションを削除
find /etc/myapp -type f -exec chmod o-r {} \;
このアプローチはchmod -Rよりも精密です。異なるパーミッションセットが必要なことが多いファイルとディレクトリを区別できるためです。
特殊パーミッション
標準の読み取り、書き込み、実行ビット以外に、Linuxは3種類の特殊パーミッションをサポートしています。これらは標準の3桁の前に付加される4番目の8進数として表されます。
Setuid(4)
実行ファイルに設定すると、ファイルは実行するユーザーではなく、ファイルの所有者のパーミッションで実行されます。
chmod 4755 /usr/bin/special-tool
chmod u+s /usr/bin/special-tool
典型的な例はpasswdコマンドです。rootが所有する/etc/shadowを変更する必要があります。setuidビットにより、任意のユーザーがその特定の目的のためにrootレベルのファイルアクセスでpasswdを実行できます。
ls -lの出力では、setuidファイルは所有者の実行ビットの代わりにsが表示されます:
-rwsr-xr-x 1 root root 63960 Feb 10 12:00 /usr/bin/passwd
Setgid(2)
ディレクトリに適用すると、その中に作成される新しいファイルは作成ユーザーのプライマリグループではなく、ディレクトリのグループを継承します。実行ファイルではグループメンバーシップについてsetuidと同様に機能します。
chmod 2775 /opt/team-project
chmod g+s /opt/team-project
これは共有プロジェクトディレクトリに非常に有効です。setgidがないと、チームメンバーが作成する各ファイルは個人のグループに属し、コラボレーションが困難になります。
drwxrwsr-x 2 root developers 4096 Mar 22 10:30 /opt/team-project
グループの実行ポジションにsがあることに注目してください。
スティッキービット(1)
ディレクトリに設定すると、他のユーザーがディレクトリへの書き込みアクセス権を持っていても、ファイルの所有者(またはroot)のみがその中のファイルを削除・リネームできます。
chmod 1777 /tmp
chmod +t /tmp
/tmpディレクトリが最も一般的な例です。誰でも/tmpにファイルを作成できますが、他のユーザーのファイルを削除することはできません。ls -lの出力では、スティッキービットはその他の実行ポジションにtとして表示されます:
drwxrwxrwt 15 root root 4096 Mar 22 10:30 /tmp
特殊パーミッションのまとめ
| パーミッション | 8進数 | シンボル | ファイルへの影響 | ディレクトリへの影響 |
|---|---|---|---|---|
| Setuid | 4000 | u+s | ファイル所有者として実行 | 標準的な影響なし |
| Setgid | 2000 | g+s | ファイルグループとして実行 | 新しいファイルはグループを継承 |
| スティッキービット | 1000 | +t | 標準的な影響なし | 所有者のみファイルを削除可能 |
セキュリティのベストプラクティス
いくつかの原則に従うことで、日常業務に支障をきたさずにシステムのセキュリティを維持できます。
最小権限の原則を適用する
タスクに必要な最小限のパーミッションのみを付与してください。ファイルが読み取りだけで十分な場合は、書き込み可能にしないでください。スクリプトが所有者によってのみ実行される必要がある場合は、グループやその他に実行権限を付与しないでください。
# 良い例:最小限のパーミッション
chmod 600 .env
chmod 700 ~/.ssh
# 悪い例:過度に寛容
chmod 777 .env
chmod 755 ~/.ssh
本番環境でのchmod 777使用を避ける
本番システムでchmod 777を使用する正当な理由はほとんどありません。何かがそれを必要としているように見える場合、根本的な問題は通常、パーミッション問題ではなく、設定が誤ったユーザー、グループ、または所有権にあります。パーミッションを緩める前にchownやchgrpで所有権を修正してください。
機密ファイルをすぐに保護する
SSHキー、APIトークン、環境ファイル、データベース認証情報は常に600または最大でも640にする必要があります。OpenSSHを含む多くのツールは、キーファイルに過度に寛容な設定がある場合、動作を拒否します。
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_ed25519
chmod 600 .env
chmod 600 /etc/myapp/secrets.yml
コラボレーションにグループを使用する
「その他」のパーミッションを広げる代わりに、専用グループを作成し、関連ユーザーを追加し、グループパーミッションを使用してください。共有ディレクトリにsetgidビットを組み合わせることで、新しいファイルが自動的に正しいグループを継承します。
# 適切なグループパーミッションで共有ディレクトリを作成
sudo groupadd webteam
sudo usermod -aG webteam alice
sudo usermod -aG webteam bob
sudo mkdir /var/www/project
sudo chown root:webteam /var/www/project
sudo chmod 2775 /var/www/project
パーミッションを定期的に監査する
本番サーバーでは、危険なパーミッションを持つファイルを定期的に確認してください:
# すべてのワールド書き込み可能ファイルを検索
find / -type f -perm -o+w 2>/dev/null
# すべてのsetuidファイルを検索(権限昇格の可能性があるベクター)
find / -type f -perm -4000 2>/dev/null
# 所有者なしのファイルを検索(孤立ファイル)
find / -nouser -o -nogroup 2>/dev/null
セキュアなumaskを設定する
umaskは新しく作成されるファイルとディレクトリのデフォルトパーミッションを定義します。022のumaskはファイルに644、ディレクトリに755をもたらします。より制限的な027のumaskはファイルに640、ディレクトリに750を与え、デフォルトで「その他」が新しいファイルにアクセスできなくなります。
# 現在のumaskを確認
umask
# セッションに制限的なumaskを設定
umask 027
# ~/.bashrcまたは~/.zshrcに追加して永続化
echo "umask 027" >> ~/.bashrc
chmod vs. chown vs. chgrp
これら3つのコマンドは関連していますが、異なる目的を果たします:
| コマンド | 目的 | 例 |
|---|---|---|
chmod | ファイルパーミッションを変更 | chmod 755 script.sh |
chown | ファイル所有者を変更(オプションでグループも) | chown alice:devs file.txt |
chgrp | ファイルグループを変更 | chgrp webteam index.html |
アクセス問題をトラブルシューティングする際は、所有権(ls -l)とパーミッションの両方を確認することから始めてください。多くの場合、解決策はchmodでパーミッションを緩めるのではなく、chownで所有権を変更することです。
chmodカリキュレーターの使用
シンボリック表記と8進数表記の間の手動変換は、慣れれば簡単ですが、新しいサーバーをセットアップしたり複雑なパーミッションセットを確認したりする際には面倒なことがあります。chmodカリキュレーターを使用して、視覚的にパーミッションを切り替え、対応する8進数値、シンボリック表記、および結果のchmodコマンドを即座に確認してください。setuid、setgid、スティッキービットなどの特殊パーミッションの確認に特に便利です。
まとめ
Linuxファイルパーミッションは、システムセキュリティの基本的な柱の1つです。chmodコマンドを使えば、システム上のすべてのファイルとディレクトリにアクセス、変更、実行できる人を正確に制御できます。8進数とシンボリック表記を理解し、最小権限の原則を適用し、グループを効果的に使用することで、利便性を損なわずにセキュアな環境を維持できます。
重要なルールを覚えておいてください:機密ファイルは600または700に制限する、実行ファイルと公開ディレクトリには755を使用する、本番環境では777を完全に避ける、そしてパーミッションを定期的に監査する。これらの実践を行うことで、Linuxシステムは機能的かつセキュアになります。