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種類の権限の組み合わせです。

記号英語意味ファイルに対してディレクトリに対して
rread読み取りファイルの内容を読めるディレクトリ内のファイル一覧を見られる
wwrite書き込みファイルを編集・上書きできるディレクトリ内にファイルを作成・削除できる
xexecute実行ファイルをプログラムとして実行できるディレクトリに 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数値パーミッション早見表

よく使うパーミッション一覧

数値記号表記用途
777rwxrwxrwx全ユーザーにフル権限(非推奨)
755rwxr-xr-x一般的な実行ファイル・ディレクトリ
750rwxr-x---グループまでアクセス可能な実行ファイル
700rwx------所有者のみフル権限
666rw-rw-rw-全ユーザーに読み書き(非推奨)
644rw-r--r--一般的なファイル(HTML, CSS, 画像等)
640rw-r-----グループまで読み取り可能なファイル
600rw-------所有者のみ読み書き(秘密鍵など)
555r-xr-xr-x全ユーザーに読み取り+実行(書き込み不可)
444r--r--r--全ユーザーに読み取りのみ
400r--------所有者のみ読み取り

全組み合わせリファレンス

各桁の数値と権限の対応表です。

数値権限説明
0---権限なし
1--x実行のみ
2-w-書き込みのみ
3-wx書き込み+実行
4r--読み取りのみ
5r-x読み取り+実行
6rw-読み取り+書き込み
7rwxフル権限

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値ファイルディレクトリ用途
022644755一般的なデフォルト
027640750セキュア寄り
077600700非常にセキュア
002664775グループ共有向け
# 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パーミッション計算で実際にお試しいただけます。