Linux管理・運用の基本
システム管理者のための実践ガイド
システム管理者のための実践ガイド
このシリーズでは、Linuxのシステム管理や運用で役立つ実践的な知識を解説しています。今回は、システム運用で遭遇することの多い、パーミッション(権限)に関するトラブルに焦点を当てます。
「ファイルが読み込めない」「スクリプトが実行できない」「Webサーバーからファイルにアクセスできない」といった問題は、多くの場合パーミッションが原因です。本記事では、このような状況で「どう調べるか」「どう対処するか」を、具体的なコマンド例を交えながら解説します。パーミッションで「あれ?」と思った時に役立つ、トラブルシューティングのチェックリストとしてご活用ください。
まずは、パーミッションの基本を再確認しておきましょう。ls -lコマンドでファイルやディレクトリの詳細情報を表示すると、以下のような出力が得られます。
$ ls -l /var/www/html
drwxr-xr-x 2 root root 4096 Apr 19 10:00 .
drwxr-xr-x 3 root root 4096 Apr 19 10:00 ..
-rw-r--r-- 1 root root 182 Apr 19 10:00 index.html
この出力の最初の10文字がパーミッション情報です。
| 位置 | 意味 |
|---|---|
| 1文字目 | ファイルタイプ (-:ファイル, d:ディレクトリ, l:シンボリックリンク) |
| 2~4文字目 | 所有者(user)の権限 |
| 5~7文字目 | 所有グループ(group)の権限 |
| 8~10文字目 | その他のユーザー(other)の権限 |
各権限はr(読み込み)、w(書き込み)、x(実行)で表されます。ハイフン(-)はその権限がないことを示します。
例えば、index.htmlの-rw-r--r--は、以下を意味します。
root):読み込み(r)と書き込み(w)が可能root):読み込み(r)のみ可能r)のみ可能この基本を踏まえ、具体的なトラブル対処法を見ていきましょう。
シェルスクリプトやバイナリを実行しようとした際に、bash: ./script.sh: Permission deniedのようなエラーが表示されることがあります。これは実行権限(x)がない場合に発生します。
解決策
実行権限を付与します。
# 権限を確認
$ ls -l script.sh
-rw-r--r-- 1 user user 128 May 12 15:00 script.sh
# 所有者に実行権限を付与
$ chmod u+x script.sh
# 権限が変更されたことを確認
$ ls -l script.sh
-rwxr--r-- 1 user user 128 May 12 15:00 script.sh
# これで実行可能になります
$ ./script.sh
chmodコマンドのオプション
chmodコマンドは、Change Modeの略で、ファイルのパーミッションを変更します。
| 形式 | 意味 | 例 |
|---|---|---|
| 記号モード | [対象][演算子][権限] |
u+x(所有者にx権限を追加) |
対象: u(所有者), g(グループ), o(その他), a(全て) |
g-w(グループからw権限を削除) |
|
演算子: +(追加), -(削除), = (設定) |
o=r(その他にr権限をセット) |
|
| 8進数モード | 3桁の数字で指定 | 755(rwxr-xr-x) |
特に、755や644はよく使われる数字です。
755(rwxr-xr-x):スクリプトや実行ファイル、ディレクトリに設定することが多いです。4+2+1=7)4+0+1=5)644(rw-r--r--):一般的なテキストファイルや設定ファイルに設定することが多いです。4+2+0=6)4+0+0=4)補足:ディレクトリ配下のパーミッションを一括変更したい場合
ディレクトリ以下すべてのファイルとディレクトリのパーミッションを一括で変更したい場合は、-R(再帰的)オプションを使用します。
# ディレクトリ以下すべてのファイルとディレクトリに権限を適用
$ chmod -R 755 /var/www/html/
※ chmod -Rやchown -Rを使用する際は、操作範囲を誤ると意図せぬ権限変更やセキュリティリスクが発生する可能性があります。特に本番環境では十分注意して実行してください。
viやnanoでファイルを保存しようとしたり、rmで削除しようとしたりした際にこのエラーが出た場合、書き込み権限(w)がないことが原因です。
解決策
ファイルの所有者か、書き込み権限を持つユーザーとして操作する必要があります。
sudoを使う:自分のユーザーにsudo権限があれば、sudo viやsudo rmで一時的にroot権限で実行します。chownで所有者を変更する:ファイルの所有者を自分に変更することで、w権限を得て操作できるようになります。# ファイルの所有者を確認
$ ls -l /etc/nginx/nginx.conf
-rw-r--r-- 1 root root 2380 Mar 10 09:30 /etc/nginx/nginx.conf
# rootユーザーが所有しているため、編集できない
$ vi /etc/nginx/nginx.conf
# (編集後、保存しようとするとエラー)
# 編集権限のあるユーザー(ここではroot)としてsudoで操作
$ sudo vi /etc/nginx/nginx.conf
# (保存可能)
また、ディレクトリの書き込み権限がない場合も同様のエラーが発生します。ディレクトリのw権限は「ディレクトリ内のファイルを作成・削除する」ために必要です。
Webサイトを公開した際、「403 Forbidden」エラーが表示されたり、画像が表示されなかったりする場合があります。これは、Webサーバーを実行しているユーザー(例: Apacheのapache、Nginxのnginx)に、ファイルやディレクトリへの読み込み権限(r)や実行権限(x)がないことが原因です。
解決策
Webサーバーがアクセスするファイル・ディレクトリに対して、グループ権限またはその他ユーザー権限を設定します。
# Webサーバーのドキュメントルートの権限を確認
$ ls -ld /var/www/html/
drwxr-xr-x 2 root root 4096 Aug 1 10:00 /var/www/html/
# ディレクトリ自体の権限確認には、-dオプションが便利です
# htmlディレクトリの所有者はroot、グループはroot
# 権限はrwxr-xr-x(所有者:rwx, グループ:r-x, その他:r-x)
# この場合、Webサーバーの実行ユーザーがroot以外でも読み込み・実行できる
問題が発生しがちなのは、パーミッションが厳しすぎる場合です。
$ ls -ld /var/www/html/
drwx------ 2 user user 4096 Aug 1 10:00 /var/www/html/
# この場合、所有者(user)以外はアクセスできないため、Webサーバーはエラーを返す
このような場合、Webサーバーの実行ユーザーをファイルの所有グループに追加するか、その他ユーザーに適切な権限を付与します。
Webサーバーの実行ユーザーを確認するには
# Apacheの場合
$ ps aux | grep httpd
# Nginxの場合
$ ps aux | grep nginx
上記コマンドの出力から、ユーザー名(例:apacheやnginx)を確認しましょう。
グループを追加する例
# ユーザー「nginx」をグループ「user」に追加
$ sudo usermod -aG user nginx
# ※この変更を反映させるには、再ログイン(またはプロセス再起動)が必要です。
# ファイルとディレクトリの所有者とグループを更新
$ sudo chown -R user:user /var/www/html/
# ディレクトリとファイルのパーミッションを設定
# ディレクトリは755(rwxr-xr-x)
$ sudo find /var/www/html -type d -exec chmod 755 {} \;
# ファイルは644(rw-r--r--)
$ sudo find /var/www/html -type f -exec chmod 644 {} \;
ポイント: ディレクトリにはx(実行)権限が必須です。xがないと、そのディレクトリの中に入ったり、中身をリストしたりできません。
上記の対処法を試しても解決しない場合は、さらに特殊な原因が隠れている可能性があります。
lsattrコマンドでiフラグが付いていないか確認しましょう。このフラグが付いているファイルは、rootユーザーでも変更・削除できません。chattr -i [ファイル名]で解除できます。/etc/fstabで設定されたマウントオプションが原因で、書き込みが禁止されている場合があります。※これらの詳細なトラブルについては、各ディストリビューションの公式ドキュメントや専門書も参考にしてください。
Linuxのパーミッション問題は、多くの場合、以下の3つの観点で解決できます。
この関係性を明確にし、ls -lで現在のパーミッションを確認し、chmodやchownで適切に修正することがトラブル解決の鍵となります。
この記事が、パーミッションに関するトラブル解決の一助となれば幸いです。ご覧いただきありがとうございました。 次回は、パーミッションの応用編として「setuid・setgid・stickyビットを理解する」について解説します。