Linuxのファイル権限と所有者の基本
Linuxでは、ファイルやディレクトリごとに所有者、グループ、アクセス権限が設定されています。権限は主に「所有者」「グループ」「その他のユーザー」の3単位で考えます。アクセス権限には、読み取り(r)、書き込み(w)、実行(x)があります。ファイルの実行権限はプログラムの実行などに関係し、ディレクトリの実行権限は、その中のファイルやサブディレクトリへアクセスするための検索権限として働きます。
必要以上に広い権限を与えると、意図しないユーザーやプロセスから変更される可能性があります。まずは必要な操作を整理し、最小限の権限を設定するのが基本です。
ls -lで所有者と権限を確認する
変更前には、対象パスの現在の状態を確認します。GNU Coreutilsのlsマニュアルでは、lsの長形式表示でファイル情報を確認できます。
# ファイルやディレクトリの内容を長形式で表示
ls -l /path/to/target
# ディレクトリ自身の情報を表示
ls -ld /path/to/directory
# 期待される見方の例(実際の値は環境によって異なる)
# -rw-r--r-- 1 alice developers 1234 Jan 1 12:00 example.txt
# ││││││││ │ │
# ││││││││ │ └─ グループ
# ││││││││ └────── 所有者
# └─────────────── ファイル種別と権限確認する項目は、実行ユーザー、対象パス、ファイル種別、所有者、グループ、現在の権限、必要な操作です。lsでディレクトリを指定すると中身が表示されるため、ディレクトリ自身を確認したい場合はls -ldを使います。
chmodでアクセス権限を変更する
chmodは、ファイルやディレクトリのアクセス権限を変更するコマンドです。記号指定では、u(所有者)、g(グループ)、o(その他)、a(全ユーザー)と、追加(+)、削除(-)、設定(=)を組み合わせます。GNU Coreutilsのchmodマニュアルでは、記号指定や数値指定、再帰指定などが説明されています。
# 所有者に実行権限を追加
chmod u+x script.sh
# グループとその他のユーザーから書き込み権限を削除
chmod go-w config.php
# 数値指定で、所有者は読み書き、他は読み取りにする
chmod 644 example.txt
# 期待される状態の例
# -rw-r--r-- ... example.txt
# 注意:配下全体を変更する場合は対象パスを確認してから実行
# chmod -R 755 /path/to/target記号指定は「既存の権限に対して何を変えるか」を表しやすく、数値指定は最終状態を短く指定しやすい方法です。変更後はls -lで確認し、動作しないからといって安易に777を設定しないようにします。
chownで所有者とグループを変更する
chownは所有者、または所有者とグループを変更するコマンドです。chgrpはグループだけを変更するため、役割を分けて考えると混乱しにくくなります。
# 所有者だけを変更
sudo chown appuser /path/to/file
# 所有者とグループを変更
sudo chown appuser:appgroup /path/to/file
# グループだけを変更
sudo chgrp appgroup /path/to/file
# 配下をまとめて変更する例。実行前に対象を必ず確認する
sudo chown -R appuser:appgroup /path/to/directory
# 変更後の確認
ls -ld /path/to/directory
ls -l /path/to/directorychownで所有者を変更しても、読み取り・書き込み・実行の権限が自動的に適切になるとは限りません。所有者、グループ、モード権限は別々に確認してください。-Rによる再帰的な変更は影響範囲が大きいため、対象パスを限定して使います。
WordPressやDockerの権限トラブルを確認する手順
最初に、エラーメッセージ、対象パス、どの操作で失敗したか、処理を実行しているユーザーを確認します。WordPressでは、更新、画像アップロード、キャッシュ生成など、どの処理に書き込みが必要なのかを切り分けます。WordPress公式ドキュメントでも、wp-contentなどへの書き込み可否が機能に影響する場合が説明されています。WordPress公式のファイル権限ガイド
# 実行ユーザーを確認
id
# ホスト側の所有者・権限を確認
ls -ld ./wordpress ./wordpress/wp-content
# Dockerコンテナ内の実行ユーザーとパスを確認
# コンテナ名やパスは自分の構成に置き換える
docker exec <container-name> id
docker exec <container-name> ls -ld /var/www/html /var/www/html/wp-content
# マウント設定を確認
docker inspect <container-name>
# 期待される確認内容
# - ホストとコンテナで対象パスが対応しているか
# - 処理を実行するユーザーが書き込み可能か
# - マウントが読み取り専用になっていないかDockerのバインドマウントでは、ホスト側のファイルやディレクトリをコンテナ内へマウントします。ホスト側の所有者・権限、コンテナ内の実行ユーザー、マウント先のパス、読み取り専用設定を組み合わせて確認してください。Docker公式ドキュメントでは、バインドマウントは既定で書き込み可能で、ro指定によって読み取り専用にできると説明されています。Docker公式のバインドマウント документаーション
原因を確認せずに全体へchmod -Rやchown -Rを実行したり、権限を一律に広げたりするのは避けます。対象を限定して変更し、最後にls、id、docker inspectなどで意図した状態になったか検証しましょう。