Linuxパーミッションの基本
Linuxでは、すべてのファイルとディレクトリに**アクセス権限(パーミッション)**が設定されています。パーミッションは「誰が」「何をできるか」を制御する仕組みで、サーバーのセキュリティの根幹をなします。
ls -l コマンドでファイルの詳細を表示すると、先頭にパーミッション情報が表示されます。
$ ls -l
-rwxr-xr-- 1 user group 1024 Mar 23 10:00 script.sh
drwxr-x--- 2 user group 4096 Mar 23 10:00 mydir/
先頭の -rwxr-xr-- がパーミッション表記です。この文字列の意味を理解することが、chmod を使いこなす第一歩です。
rwx(読み・書き・実行)の意味
パーミッションは3種類の権限の組み合わせです。
| 記号 | 英語 | 意味 | ファイルに対して | ディレクトリに対して |
|---|---|---|---|---|
r | read | 読み取り | ファイルの内容を読める | ディレクトリ内のファイル一覧を見られる |
w | write | 書き込み | ファイルを編集・上書きできる | ディレクトリ内にファイルを作成・削除できる |
x | execute | 実行 | ファイルをプログラムとして実行できる | ディレクトリに cd で移動できる |
3つのユーザーカテゴリ
パーミッションは3つのカテゴリごとに設定されます。
| カテゴリ | 記号 | 説明 |
|---|---|---|
| Owner(所有者) | u | ファイルの所有ユーザー |
| Group(グループ) | g | ファイルの所有グループに属するユーザー |
| Others(その他) | o | 上記以外の全ユーザー |
パーミッション表記の読み方
-rwxr-xr-- を分解すると次のようになります。
- rwx r-x r--
│ │ │ │
│ │ │ └── Others: 読み取りのみ
│ │ └─────── Group: 読み取り+実行
│ └──────────── Owner: 読み取り+書き込み+実行
└─────────────── ファイル種別(- = 通常ファイル, d = ディレクトリ)
数値(8進数)表記
chmodコマンドでは、パーミッションを3桁の数値で指定するのが一般的です。各権限に数値が割り当てられています。
| 権限 | 数値 |
|---|---|
| 読み取り(r) | 4 |
| 書き込み(w) | 2 |
| 実行(x) | 1 |
| なし(-) | 0 |
カテゴリごとに権限の数値を合計し、3桁で表します。
rwx = 4 + 2 + 1 = 7
r-x = 4 + 0 + 1 = 5
r-- = 4 + 0 + 0 = 4
rwxr-xr-- → 754
chmod数値パーミッション早見表
よく使うパーミッション一覧
| 数値 | 記号表記 | 用途 |
|---|---|---|
777 | rwxrwxrwx | 全ユーザーにフル権限(非推奨) |
755 | rwxr-xr-x | 一般的な実行ファイル・ディレクトリ |
750 | rwxr-x--- | グループまでアクセス可能な実行ファイル |
700 | rwx------ | 所有者のみフル権限 |
666 | rw-rw-rw- | 全ユーザーに読み書き(非推奨) |
644 | rw-r--r-- | 一般的なファイル(HTML, CSS, 画像等) |
640 | rw-r----- | グループまで読み取り可能なファイル |
600 | rw------- | 所有者のみ読み書き(秘密鍵など) |
555 | r-xr-xr-x | 全ユーザーに読み取り+実行(書き込み不可) |
444 | r--r--r-- | 全ユーザーに読み取りのみ |
400 | r-------- | 所有者のみ読み取り |
全組み合わせリファレンス
各桁の数値と権限の対応表です。
| 数値 | 権限 | 説明 |
|---|---|---|
0 | --- | 権限なし |
1 | --x | 実行のみ |
2 | -w- | 書き込みのみ |
3 | -wx | 書き込み+実行 |
4 | r-- | 読み取りのみ |
5 | r-x | 読み取り+実行 |
6 | rw- | 読み取り+書き込み |
7 | rwx | フル権限 |
chmodコマンドの使い方
数値モード
# 基本構文
chmod [数値] [ファイル/ディレクトリ]
# ファイルに644を設定
chmod 644 index.html
# ディレクトリに755を設定
chmod 755 public/
# 再帰的に変更(ディレクトリ配下すべて)
chmod -R 755 /var/www/html/
シンボリックモード
数値の代わりに、記号で権限を追加・削除・設定することもできます。
# 基本構文
chmod [who][operator][permission] [ファイル]
# who: u(owner), g(group), o(others), a(all)
# operator: +(追加), -(削除), =(設定)
# permission: r, w, x
実行例:
# 所有者に実行権限を追加
chmod u+x script.sh
# グループから書き込み権限を削除
chmod g-w config.yml
# その他のユーザーの権限をすべて削除
chmod o= secret.txt
# 全ユーザーに読み取り権限を付与
chmod a+r readme.txt
# 所有者に読み書き、グループとその他に読み取りのみ
chmod u=rw,go=r document.txt
# 複数の指定をカンマで区切る
chmod u+x,g+r,o-rwx deploy.sh
数値モードとシンボリックモードの使い分け
| 場面 | 推奨モード | 例 |
|---|---|---|
| 権限を完全にリセットしたい | 数値 | chmod 644 file |
| 一部の権限だけ変更したい | シンボリック | chmod g+w file |
| スクリプトで一括設定 | 数値 | chmod 755 *.sh |
| 実行権限だけ付けたい | シンボリック | chmod +x script.sh |
実践的な設定パターン
Webサーバー(Apache/Nginx)
# ドキュメントルート
chmod 755 /var/www/html/
# HTMLファイル・画像ファイル
chmod 644 /var/www/html/*.html
chmod 644 /var/www/html/images/*.jpg
# CGI/PHPスクリプト
chmod 755 /var/www/html/cgi-bin/*.cgi
# 設定ファイル(外部アクセス不可)
chmod 640 /etc/nginx/nginx.conf
chmod 640 /etc/apache2/apache2.conf
# .htaccess
chmod 644 /var/www/html/.htaccess
# アップロードディレクトリ(Webサーバーが書き込む)
chmod 775 /var/www/html/uploads/
SSHと鍵ファイル
SSH鍵のパーミッションは厳格に設定する必要があります。パーミッションが緩いと接続が拒否されます。
# .ssh ディレクトリ
chmod 700 ~/.ssh/
# 秘密鍵
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_ed25519
# 公開鍵
chmod 644 ~/.ssh/id_rsa.pub
# authorized_keys
chmod 600 ~/.ssh/authorized_keys
# known_hosts
chmod 644 ~/.ssh/known_hosts
# SSH設定ファイル
chmod 600 ~/.ssh/config
重要: SSHの秘密鍵に 600 以外の権限を設定すると、次のようなエラーが発生します。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/user/.ssh/id_rsa' are too open.
WordPressなどのCMS
# ディレクトリ: 755
find /var/www/wordpress/ -type d -exec chmod 755 {} \;
# ファイル: 644
find /var/www/wordpress/ -type f -exec chmod 644 {} \;
# wp-config.php(データベース接続情報を含む)
chmod 600 /var/www/wordpress/wp-config.php
# uploads ディレクトリ(メディアアップロード用)
chmod 775 /var/www/wordpress/wp-content/uploads/
Git フックスクリプト
# Git hookに実行権限を付与
chmod +x .git/hooks/pre-commit
chmod +x .git/hooks/post-merge
# カスタムスクリプト全般
chmod 755 scripts/*.sh
cronジョブのスクリプト
# cronで実行するスクリプト
chmod 700 /home/user/cron/backup.sh
chmod 700 /home/user/cron/cleanup.sh
特殊パーミッション(setuid, setgid, sticky bit)
通常のrwx以外にも、3つの特殊パーミッションがあります。
setuid(4000)
ファイルを所有者の権限で実行する。主にroot権限が必要なコマンドに使われます。
# passwdコマンドにはsetuidが設定されている
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Mar 23 10:00 /usr/bin/passwd
# ^-- s がsetuidを示す
# setuidを設定
chmod 4755 /usr/local/bin/special-command
chmod u+s /usr/local/bin/special-command
setgid(2000)
ファイルをグループの権限で実行する。ディレクトリに設定すると、配下に作られるファイルが自動的にそのグループに属します。
# 共有ディレクトリにsetgidを設定
chmod 2775 /var/shared/
chmod g+s /var/shared/
# 配下に作られるファイルは自動的にsharedグループに属する
sticky bit(1000)
ディレクトリに設定すると、ファイルの所有者以外が削除できなくなる。/tmp ディレクトリに設定されています。
$ ls -ld /tmp
drwxrwxrwt 12 root root 4096 Mar 23 10:00 /tmp
# ^-- t がsticky bitを示す
# sticky bitを設定
chmod 1777 /var/shared/tmp/
chmod +t /var/shared/tmp/
4桁表記
特殊パーミッションを含めた4桁表記のまとめです。
chmod 4755 → setuid + rwxr-xr-x
chmod 2755 → setgid + rwxr-xr-x
chmod 1777 → sticky + rwxrwxrwx
chmod 6755 → setuid + setgid + rwxr-xr-x
セキュリティのベストプラクティス
最小権限の原則
必要最低限の権限だけを付与するのが鉄則です。
# 悪い例: 777 を使う(全ユーザーがなんでもできる)
chmod 777 /var/www/app/
# 良い例: 必要な権限だけ付与
chmod 755 /var/www/app/ # ディレクトリ
chmod 644 /var/www/app/index.html # 静的ファイル
chmod 600 /var/www/app/.env # 秘密情報
777は使わない
777 は全ユーザーに全権限を与える設定です。トラブルシューティング時に安易に chmod 777 をするのは危険です。
| パーミッション | リスク |
|---|---|
777 | 誰でもファイルを改ざん・削除できる |
666 | 誰でもファイルを上書きできる |
755 | 他者は読み取り+実行のみ(安全) |
644 | 他者は読み取りのみ(安全) |
秘密情報ファイルの保護
# 環境変数ファイル
chmod 600 .env
chmod 600 .env.production
# データベース設定
chmod 600 config/database.yml
# APIキー・シークレット
chmod 600 credentials.json
# SSL証明書の秘密鍵
chmod 600 /etc/ssl/private/server.key
定期的な権限チェック
# 書き込み可能なファイルを検索(セキュリティ監査)
find /var/www/ -perm -o+w -type f
# setuid/setgid が設定されたファイルを検索
find / -perm /6000 -type f 2>/dev/null
# 所有者がいないファイルを検索
find / -nouser -o -nogroup 2>/dev/null
umask — デフォルトパーミッションの設定
新しいファイルやディレクトリを作成したとき、デフォルトのパーミッションは umask によって決まります。
# 現在のumask値を確認
$ umask
0022
# umaskの計算方法
# ファイルのデフォルト: 666 - umask = 666 - 022 = 644
# ディレクトリのデフォルト: 777 - umask = 777 - 022 = 755
| umask値 | ファイル | ディレクトリ | 用途 |
|---|---|---|---|
022 | 644 | 755 | 一般的なデフォルト |
027 | 640 | 750 | セキュア寄り |
077 | 600 | 700 | 非常にセキュア |
002 | 664 | 775 | グループ共有向け |
# umaskを変更(セッション中のみ)
umask 027
# 永続化するには ~/.bashrc に追記
echo 'umask 027' >> ~/.bashrc
よくあるトラブルと対処法
Permission denied エラー
$ ./script.sh
bash: ./script.sh: Permission denied
# 原因: 実行権限がない
# 対処:
chmod +x script.sh
Webサーバーでファイルが表示されない
# 原因: Webサーバー(www-data等)に読み取り権限がない
# 対処:
chmod 644 /var/www/html/index.html
chown www-data:www-data /var/www/html/index.html
ファイルをアップロードできない
# 原因: アップロード先ディレクトリにWebサーバーの書き込み権限がない
# 対処:
chmod 775 /var/www/html/uploads/
chown www-data:www-data /var/www/html/uploads/
chmodが効かない(ファイルシステムの制約)
FAT32やNTFSなどのファイルシステムではLinuxのパーミッションがサポートされていません。USBメモリやWindows共有フォルダでchmodが効かない場合は、マウントオプションで対処します。
オンラインツールでパーミッションを計算
数値とシンボリック表記の変換や、設定すべきパーミッションの確認にはchmodパーミッション計算ツールが便利です。チェックボックスで権限を選ぶだけでchmodコマンドを自動生成でき、初心者でも迷わずパーミッションを設定できます。
まとめ
Linuxのパーミッション管理は、サーバーセキュリティの基本です。
押さえておくべきポイント:
- パーミッションは r(読み取り)・w(書き込み)・x(実行) の3種類
- Owner・Group・Others の3カテゴリそれぞれに権限を設定する
- 数値表記は r=4, w=2, x=1 の合計で3桁(例:
755) - 最小権限の原則: 必要な権限だけを付与する
777は原則として使わない — セキュリティリスクが高い- SSH秘密鍵は
600必須。緩い権限だと接続が拒否される - Webサーバーでは ディレクトリ
755、ファイル644が基本 - 秘密情報(.env, 秘密鍵等)は
600に設定する umaskでデフォルトパーミッションを制御できる
パーミッションの設定で迷ったら、chmodパーミッション計算ツール をぜひご活用ください。
この記事の内容はAssistyのパーミッション計算で実際にお試しいただけます。