「Permission denied」――Linuxを使っていると、このエラーメッセージに遭遇した経験がある方は多いでしょう。これはLinuxのファイル権限(パーミッション)によるアクセス制御が機能している証拠です。
パーミッションはLinuxのセキュリティを支える基本中の基本です。正しく設定すればシステムを安全に保てますが、設定を誤るとセキュリティホールや動作不良の原因になります。特に中小企業のサーバー管理では、Webアプリケーションのファイル権限設定が不適切なために問題が起きるケースが少なくありません。
本記事では、Linuxのパーミッションの仕組みからchmod・chownコマンドの実践的な使い方まで、実例を交えて初心者向けに解説します。
パーミッションの基本概念
Linuxでは、すべてのファイルとディレクトリに「誰が」「何をできるか」を制御するパーミッション(権限)が設定されています。
3つの権限の種類
Linuxのパーミッションには、以下の3つの権限があります。
| 権限 | 記号 | 数値 | ファイルに対する意味 | ディレクトリに対する意味 |
|---|---|---|---|---|
| 読み取り(Read) | r | 4 | ファイルの内容を読める | ディレクトリの一覧を表示できる |
| 書き込み(Write) | w | 2 | ファイルの内容を変更できる | ファイルの作成・削除ができる |
| 実行(Execute) | x | 1 | プログラムとして実行できる | ディレクトリに移動(cd)できる |
3つの対象者
権限は以下の3つの対象者に対して個別に設定されます。
- 所有者(Owner / User):ファイルの持ち主。記号は「u」
- グループ(Group):ファイルが属するグループのメンバー。記号は「g」
- その他(Others):上記以外のすべてのユーザー。記号は「o」
ユーザーとグループの仕組みの詳細についてはユーザー・グループ管理ガイドをご覧ください。
パーミッションの確認方法
ls -lコマンドでファイルのパーミッションを確認できます。
$ ls -l example.txt
-rw-r--r-- 1 tanaka developers 1024 Mar 22 10:00 example.txt
この出力の読み方を分解してみましょう。
- rw- r-- r--
| | | |
| | | └── その他(Others): r--(読み取りのみ)
| | └── グループ(Group): r--(読み取りのみ)
| └── 所有者(Owner): rw-(読み取り・書き込み)
└── ファイルタイプ(-: 通常ファイル、d: ディレクトリ、l: シンボリックリンク)
この例では、所有者「tanaka」はファイルの読み取りと書き込みが可能で、「developers」グループのメンバーとその他のユーザーは読み取りのみ可能です。Linuxコマンド一覧でlsコマンドの詳しい使い方を確認できます。
数値表記(8進数)による権限の理解
パーミッションは3桁の数値で表現されることもあります。この数値表記は実務で頻繁に使われるため、確実に覚えておきましょう。
数値の計算方法
各権限には数値が割り当てられており、それを合計して表現します。
- 読み取り(r)= 4
- 書き込み(w)= 2
- 実行(x)= 1
- 権限なし(-)= 0
例えば「rwx」は4+2+1=7、「r-x」は4+0+1=5、「r--」は4+0+0=4となります。
よく使われるパーミッションの数値
| 数値 | 記号表記 | 意味 | 主な用途 |
|---|---|---|---|
| 755 | rwxr-xr-x | 所有者:全権限、他:読み取り・実行 | ディレクトリ、実行ファイル |
| 644 | rw-r--r-- | 所有者:読み書き、他:読み取り | 一般的なファイル |
| 600 | rw------- | 所有者のみ読み書き | 秘密鍵ファイル、設定ファイル |
| 700 | rwx------ | 所有者のみ全権限 | .sshディレクトリ |
| 777 | rwxrwxrwx | 全員に全権限(危険) | 原則として使用しない |
| 750 | rwxr-x--- | 所有者:全権限、グループ:読み実行 | チーム共有ディレクトリ |
chmodコマンド:パーミッションの変更
chmod(change mode)は、ファイルやディレクトリのパーミッションを変更するコマンドです。数値指定と記号指定の2つの方法があります。
数値指定(8進数モード)
# ファイルを644に設定
chmod 644 index.html
# ディレクトリを755に設定
chmod 755 /var/www/html/
# SSH秘密鍵を600に設定
chmod 600 ~/.ssh/id_rsa
# シェルスクリプトに実行権限を付与(755)
chmod 755 deploy.sh
記号指定(シンボリックモード)
記号指定は、対象者 + 操作 + 権限の形式で指定します。
# 所有者に実行権限を追加
chmod u+x script.sh
# グループの書き込み権限を削除
chmod g-w config.txt
# その他のすべての権限を削除
chmod o-rwx secret.key
# 全員に読み取り権限を追加
chmod a+r readme.txt
# 所有者に読み書き、グループに読み取りを設定
chmod u=rw,g=r,o= data.csv
再帰的な変更(-Rオプション)
ディレクトリ配下のすべてのファイルとサブディレクトリに対してまとめて変更する場合は、-Rオプションを使います。
# /var/www/html配下すべてを再帰的に変更
chmod -R 755 /var/www/html/
ただし、-Rオプションの使用は慎重に行いましょう。ファイルとディレクトリでは適切なパーミッションが異なるためです。例えば、Webサーバーのコンテンツでは、ディレクトリは755、ファイルは644が一般的です。
# ディレクトリだけ755に設定
find /var/www/html -type d -exec chmod 755 {} \;
# ファイルだけ644に設定
find /var/www/html -type f -exec chmod 644 {} \;
chownコマンド:所有者とグループの変更
chown(change owner)は、ファイルやディレクトリの所有者とグループを変更するコマンドです。
基本的な使い方
# 所有者を変更
sudo chown tanaka file.txt
# 所有者とグループを同時に変更
sudo chown tanaka:developers file.txt
# グループのみ変更
sudo chown :developers file.txt
# 再帰的に変更
sudo chown -R www-data:www-data /var/www/html/
chownコマンドの実行には通常root権限(sudo)が必要です。一般ユーザーが任意のユーザーへ所有権を変更することはセキュリティ上許可されていません。
chgrpコマンド
chgrp(change group)はグループのみを変更する専用コマンドです。
# グループを変更
sudo chgrp developers project/
chown :groupnameと同等の機能ですが、グループの変更のみを行う場合はchgrpのほうが意図が明確です。
実務で使えるパーミッション設定例
実際の業務でよく必要になるパーミッション設定のパターンを紹介します。
Webサーバーの公開ディレクトリ
Nginx(やApache)でWebサイトを公開する場合、Webサーバーの実行ユーザー(通常「www-data」)がファイルを読み取れる必要があります。
# 所有者をWebサーバーユーザーに変更
sudo chown -R www-data:www-data /var/www/html/
# ディレクトリは755、ファイルは644
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;
Nginx環境の構築手順はNginx構築ガイドを参考にしてください。
SSH鍵の権限設定
SSHでは、鍵ファイルの権限が緩すぎるとセキュリティ上の理由で接続が拒否されます。
# .sshディレクトリ
chmod 700 ~/.ssh/
# 秘密鍵
chmod 600 ~/.ssh/id_rsa
# 公開鍵
chmod 644 ~/.ssh/id_rsa.pub
# authorized_keys
chmod 600 ~/.ssh/authorized_keys
SSH接続の設定方法はSSHリモート接続ガイドで詳しく解説しています。
シェルスクリプトの実行権限
シェルスクリプトを作成したら、実行権限を付与する必要があります。
# スクリプトファイルの作成
touch deploy.sh
# 実行権限を付与
chmod 755 deploy.sh
# または所有者のみ実行可能にする
chmod 700 deploy.sh
チームでの共有ディレクトリ
複数のユーザーが共有するプロジェクトディレクトリの設定例です。
# 共有ディレクトリの作成
sudo mkdir /opt/project
# グループを設定
sudo chown root:developers /opt/project
# グループ書き込み可、その他はアクセス不可
sudo chmod 770 /opt/project
# SGIDビットの設定(新規作成ファイルにグループを継承)
sudo chmod g+s /opt/project
特殊なパーミッション:SUID, SGID, スティッキービット
基本の3つの権限に加え、特殊なパーミッションも存在します。知っておくとトラブルシューティングに役立ちます。
SUID(Set User ID)
SUIDが設定された実行ファイルは、実行者ではなくファイル所有者の権限で動作します。典型的な例がpasswdコマンドです。
# SUIDの確認(sが表示される)
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Mar 22 10:00 /usr/bin/passwd
# SUIDの設定
chmod u+s executable
# 数値では4000を加算
chmod 4755 executable
一般ユーザーがpasswdコマンドでパスワードを変更できるのは、SUIDによりroot権限で動作するためです。
SGID(Set Group ID)
ディレクトリにSGIDを設定すると、そのディレクトリ内で新規作成されたファイルやサブディレクトリは、親ディレクトリのグループを自動的に継承します。
# SGIDの設定
chmod g+s /opt/shared/
# 数値では2000を加算
chmod 2775 /opt/shared/
スティッキービット
スティッキービットが設定されたディレクトリでは、ファイルの削除は所有者とrootのみが行えます。/tmpディレクトリに設定されており、他のユーザーの一時ファイルを勝手に削除できないようになっています。
# スティッキービットの確認(tが表示される)
$ ls -ld /tmp
drwxrwxrwt 12 root root 4096 Mar 22 10:00 /tmp
# スティッキービットの設定
chmod +t /shared/
# 数値では1000を加算
chmod 1777 /shared/
パーミッション設定の注意点とセキュリティ
パーミッション設定で、特に注意すべきポイントを整理します。
避けるべき設定
- chmod 777の多用:全ユーザーに全権限を与えるため、セキュリティリスクが極めて高い。トラブル時に安易に777に設定するのは厳禁
- Webサーバーで実行権限不要なファイルに755を設定:HTMLやCSS、画像ファイルに実行権限は不要。644が適切
- root所有でSUID設定:不要なSUID設定は特権昇格攻撃のリスクを生む
umaskの理解
umaskは、新規作成されるファイルやディレクトリのデフォルトパーミッションを制御する仕組みです。
# 現在のumask値を確認
$ umask
0022
# umaskの計算
# ファイルのデフォルト: 666 - 022 = 644 (rw-r--r--)
# ディレクトリのデフォルト: 777 - 022 = 755 (rwxr-xr-x)
umask値は環境変数の設定と合わせて、~/.bashrcなどで調整できます。
セキュリティ強化のために
パーミッション管理はLinuxセキュリティの第一歩です。さらに詳しいセキュリティ対策についてはLinuxセキュリティ強化ガイドを、ファイアウォールとの連携についてはファイアウォール設定ガイドをご覧ください。
まとめ
Linuxのファイル権限(パーミッション)は、システムのセキュリティと正常な動作を支える重要な仕組みです。本記事のポイントを振り返ります。
- パーミッションは「読み取り・書き込み・実行」の3権限を「所有者・グループ・その他」の3対象者に設定する
- 数値表記(644、755など)は実務で頻繁に使われるため、主要なパターンは暗記しておくと効率的
- chmodで権限を変更し、chownで所有者を変更する
- SUID、SGID、スティッキービットなどの特殊パーミッションも理解しておく
- chmod 777のような過剰な権限付与はセキュリティリスクになるため避ける
パーミッションを正しく理解したら、次はシェルスクリプトによる自動化や、ディレクトリ構造の知識と組み合わせて、実務に活かしていきましょう。Linuxの基礎を体系的に学びたい方はLinuxとは?初心者向け解説もご参考ください。
関連記事
AWS CloudFrontでサイト高速化|CDN設定からキャッシュ戦略まで実践解説
AWS CloudWatchで監視・アラート設定|運用担当者のための実践ガイド
AWS CodePipelineでCI/CD構築|コード変更から本番デプロイまでの自動化
AWS Cost Explorerでコスト可視化|ムダを見つけて月額費用を削減する実践術
AWS ECS/Fargateでコンテナ運用|Docker→本番デプロイの実践ガイド
AWS IAMのベストプラクティス|最小権限の原則を実務で実装する方法
AWS RDSの実務ガイド|データベース構築・バックアップ・パフォーマンスチューニング
AWS S3の実務活用ガイド|バケット設計・アクセス制御・コスト最適化の実践