'chmod'コマンドによるLinuxファイルパーミッションの徹底解説
シンボリックモードと数値モード、安全なデフォルト設定、再帰的な変更、特殊なパーミッションビットを使ったchmodの使い方を学びます。
「chmod」コマンドでLinuxファイル権限をマスターする
Linuxのファイル権限は、誰がファイルを読み取り、変更、または実行できるかを決定します。スクリプトが実行できない、Webサーバーがファイルを読み取れない、秘密鍵が「開きすぎ」として拒否される場合、chmodが解決策の一部となることがよくあります。
chmodコマンドはパーミッションビットを変更します。u+xのような読みやすいシンボリックモードや、755のようなコンパクトな数値モードを使用できます。
パーミッション文字列を読み取る
ls -lを実行して、ファイルのタイプと権限を確認します:
ls -l deploy.sh
出力例:
-rwxr-xr-- 1 app deploy 1200 May 23 10:00 deploy.sh
最初の文字はファイルタイプです。通常のファイルは-で始まり、ディレクトリはd、シンボリックリンクはlで始まります。
次の9文字は3つの権限グループです:
- ユーザー:ファイルの所有者。
- グループ:ファイルのグループに属するメンバー。
- その他:他のすべてのユーザー。
各グループは以下を持つことができます:
r:ファイルの内容を読み取る、またはディレクトリ内の名前を一覧表示する。w:ファイルを変更する、またはディレクトリ内のエントリを作成・削除・名前変更する。x:ファイルを実行する、またはディレクトリをトラバースする。
ディレクトリの実行権限は重要です。ディレクトリにxがないと、そのディレクトリに入ったり、名前で中のファイルにアクセスしたりできません(他の場所でメタデータを一覧表示できたとしても)。
小さな変更にはシンボリックモードを使う
シンボリック構文は次のようになります:
chmod [who][operator][permissions] path
whoには、ユーザーはu、グループはg、その他はo、すべてはaを指定できます。演算子は、追加する+、削除する-、正確に設定する=です。
所有者がスクリプトを実行できるようにする:
chmod u+x deploy.sh
グループが共有ファイルを編集できるようにする:
chmod g+w shared_document.txt
グループとその他から書き込み権限を削除する:
chmod go-w config.yml
その他を読み取り専用に設定し、既存の権限を置き換える:
chmod o=r project_plan.txt
シンボリックモードは、指定したビットだけを変更するため便利です。
完全な権限セットには数値モードを使う
数値モードは、ユーザー、グループ、その他の権限を1つのコマンドで設定します。各権限には値があります:
- 読み取り:
4 - 書き込み:
2 - 実行:
1
各グループの値を合計します:
| モード | 意味 |
|---|---|
7 |
rwx |
6 |
rw- |
5 |
r-x |
4 |
r-- |
0 |
--- |
通常のテキストファイルを所有者は読み書き可能、その他は読み取り専用に設定:
chmod 644 important_file.txt
通常のディレクトリを所有者が管理でき、その他が入って読み取れるように設定:
chmod 755 public_assets
秘密鍵を所有者のみ読み書き可能にロックダウン:
chmod 600 private_key.pem
一時的なテスト環境でリスクを理解している場合を除き、777は避けてください:
chmod 777 scratch
777は、ローカルのすべてのユーザーがパスを読み取り、書き込み、実行またはトラバースできるようにします。共有システムでは、これはほとんど許容されません。
ファイルとディレクトリを異なる方法で扱う
ファイルとディレクトリは通常、異なるモードが必要です。ファイルは644、ディレクトリは755がよく使われます。これを無差別に実行すると、すべてのファイルが実行可能になります:
chmod -R 755 web_root/
Webディレクトリの場合、より安全なパターンは次のとおりです:
find web_root -type d -exec chmod 755 {} +
find web_root -type f -exec chmod 644 {} +
その後、実際に必要なスクリプトにのみ実行権限を追加します:
chmod 755 web_root/scripts/deploy.sh
特殊なパーミッションビットは慎重に使う
数値モードには、特殊ビット用の先頭の4桁目を含めることができます:
| 値 | 名前 | 一般的な効果 |
|---|---|---|
4 |
SetUID | 実行可能ファイルがファイル所有者の実効ユーザーIDで実行される。 |
2 |
SetGID | 実行可能ファイルがファイルグループの実効グループIDで実行される;ディレクトリの場合、新しいエントリがディレクトリのグループを継承する。 |
1 |
スティッキービット | ディレクトリでは、ユーザーは自分が所有するファイル、ディレクトリ所有者が所有するファイル、またはrootが削除できるファイルのみを削除できる。 |
共有プロジェクトディレクトリにSetGIDビットを設定して、新しいファイルがディレクトリグループを継承するようにする:
chmod 2770 shared_group_files
共有書き込み可能ディレクトリにスティッキービットを設定する:
chmod 1777 /srv/shared-upload
典型的な例は/tmpで、これはワールド書き込み可能ですが、スティッキービットで保護されています。
実行可能ファイルのSetUIDとSetGIDには注意してください。プログラムが書き込み可能、設計が不十分、または安全でない入力を受け入れる場合、深刻な権限昇格のリスクを生み出す可能性があります。多くのUnix系システムでは、セキュリティ上の理由からスクリプトのSetUIDを無視します。
結果を確認する
権限を変更した後、確認します:
ls -ld web_root web_root/index.html
数値モードが必要な場合はstatを使用します:
stat -c '%a %n' web_root/index.html
macOSでは、statの形式が異なります:
stat -f '%Lp %N' web_root/index.html
まとめ
1つの権限を追加または削除したい場合は、シンボリックchmodを使用します。完全なモードを正確に設定したい場合は、数値chmodを使用します。再帰的な変更は注意して扱い、ファイルとディレクトリを分離し、ls -lまたはstatで確認してから次に進みましょう。