'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で確認してから次に進みましょう。