パーミッション(permission)とは、Linux・macOS などの Unix 系 OS で、ファイルやディレクトリに対して「誰が・何を・できるか」を制御するアクセス権限のことです。所有者(user)・グループ(group)・その他(others)の3者ごとに、読み取り(r)・書き込み(w)・実行(x)の3種類の権限を割り当てる仕組みで管理されています。
パーミッションを変更するコマンドが chmod(change mode)です。本記事ではパーミッションの仕組みから、ls -l での確認方法、chmod による変更方法、実務でよく使う数値パターンまでを整理します。
パーミッションとは:所有者・グループ・その他の3区分
Linux のパーミッションは 所有者(user)・グループ(group)・その他(others) の3区分で管理され、それぞれに 読み取り(r=4)・書き込み(w=2)・実行(x=1) の権限が設定されています。
| 区分 | 記号 | 対象 |
|---|---|---|
| 所有者 | u(user) | ファイルを作成した/所有するユーザー |
| グループ | g(group) | ファイルの所有グループに属するユーザー |
| その他 | o(others) | 上記以外の全ユーザー |
| 権限 | 記号 | 数値 | ファイルの場合 | ディレクトリの場合 |
|---|---|---|---|---|
| 読み取り | r | 4 | 内容を閲覧できる | ファイル一覧を取得できる |
| 書き込み | w | 2 | 内容を編集・削除できる | ファイルの作成・削除ができる |
| 実行 | x | 1 | プログラムとして実行できる | ディレクトリに移動(cd)できる |
ls -l でパーミッションを確認する
現在のパーミッションは ls -l コマンドで確認できます。
$ ls -l script.sh
-rwxr-xr-x 1 user group 1234 Jun 8 10:00 script.sh
|||└──── その他: r-x(読み取り・実行)
||└───── グループ: r-x(読み取り・実行)
|└────── 所有者: rwx(読み取り・書き込み・実行)
└─────── ファイル種別: -(通常ファイル)、d(ディレクトリ)
先頭の1文字(- または d)はファイル種別(-: 通常ファイル、d: ディレクトリ)を示し、続く9文字が所有者・グループ・その他の順で3文字ずつパーミッションを表しています。
$ ls -l
-rw-r--r-- 1 user group 100 Jun 8 10:00 config.txt # 644
-rwxr-xr-x 1 user group 200 Jun 8 10:00 deploy.sh # 755
-rw------- 1 user group 1679 Jun 8 10:00 id_rsa # 600
drwxr-xr-x 2 user group 4096 Jun 8 10:00 public_html/ # 755(ディレクトリ)
パーミッションの2つの表記方法
数値(8進数)指定
r=4・w=2・x=1 の合計値を、所有者 / グループ / その他 の順で3桁の数値にして指定します。例: chmod 754 file.txt
- 所有者:
7(rwx = 4+2+1) - グループ:
5(r-x = 4+1) - その他:
4(r– = 4)
記号指定
対象(u 所有者 / g グループ / o その他 / a 全員)と演算子(+ 追加 / - 削除 / = 上書き)を組み合わせて指定します。
chmod u+x script.sh→ 所有者に実行権限を付与chmod go-r file.txt→ グループ・その他から読み取り権限を削除chmod a=r file.txt→ 全員の権限を読み取り専用に設定
パーミッションを変更する:chmodコマンド
パーミッションの変更には chmod(change mode)コマンドを使用します。
chmod [オプション] モード ファイル...
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
| (なし) | 権限を変更 | chmod 644 file.txt |
-R | ディレクトリ以下を再帰的に変更 | chmod -R 755 /var/www/html |
-c | 変更があった場合のみ報告 | chmod -c 644 file.txt |
-v | 詳細な情報を表示 | chmod -v 755 script.sh |
--reference=FILE | 参照ファイルと同じ権限に設定 | chmod --reference=ref.txt target.txt |
頻出パターン早見表
実務で頻繁に使う chmod の数値パターンを一覧にまとめました。迷ったときはこの表をすぐに参照してください。
| コマンド | パーミッション | 所有者 | グループ | その他 | 主な用途 |
|---|---|---|---|---|---|
chmod 755 | rwxr-xr-x | 読み書き実行 | 読み・実行 | 読み・実行 | 実行ファイル・公開ディレクトリ |
chmod 644 | rw-r–r– | 読み書き | 読み取り | 読み取り | 一般ファイル・設定ファイル |
chmod 700 | rwx—— | 全権限 | なし | なし | 秘密鍵・個人スクリプト |
chmod 600 | rw——- | 読み書き | なし | なし | SSH秘密鍵・パスワードファイル |
chmod 400 | r——– | 読み取り | なし | なし | AWS PEMキー・変更禁止ファイル |
chmod 664 | rw-rw-r– | 読み書き | 読み書き | 読み取り | グループ共同編集ファイル |
chmod 775 | rwxrwxr-x | 全権限 | 全権限 | 読み・実行 | グループ共同開発ディレクトリ |
chmod 777 | rwxrwxrwx | 全権限 | 全権限 | 全権限 | ※非推奨(セキュリティリスク大) |
特殊パーミッション(setuid・setgid・sticky bit)
通常の rwx に加えて、Linux には setuid・setgid・sticky bit という3種類の特殊パーミッションがあります。4桁の数値で指定する場合、1桁目がこの特殊パーミッションに対応します。
| 種類 | 数値 | ファイルへの効果 | ディレクトリへの効果 |
|---|---|---|---|
| setuid(SUID) | 4000 | 実行時に所有者の権限で動作する | (効果なし) |
| setgid(SGID) | 2000 | 実行時にグループの権限で動作する | 作成されるファイルのグループが親ディレクトリのグループを継承する |
| sticky bit | 1000 | (効果なし) | ファイルを削除できるのは所有者のみになる |
setuid(SUID)の設定と確認
SUID が設定されたファイルを実行すると、実行者ではなく所有者の権限で動作します。代表例は /usr/bin/passwd で、所有者 root として動作するため一般ユーザーが自分のパスワードを変更できます。
chmod 4755 /usr/local/bin/myapp # setuid + 755
chmod u+s myapp # 記号指定でSUIDを付ける
ls -l myapp
# -rwsr-xr-x 1 root root 12345 Jun 9 myapp(所有者のxがsになる)
sticky bit の設定(/tmp など共有ディレクトリで使用)
sticky bit は共有ディレクトリで他のユーザーのファイルを誤って削除できないよう保護する設定で、/tmp にはデフォルトで設定されています。
chmod 1777 /tmp/shared_dir # sticky bit + 777
chmod +t /tmp/shared_dir # 記号指定で sticky bit を付ける
ls -ld /tmp
# drwxrwxrwt 12 root root 4096 Jun 9 /tmp(その他のxがtになる)
chmodの実行例
ファイルに実行権限を付与
chmod +x script.sh
数値で権限を変更
chmod 644 file.txt
(所有者: 読み書き、グループとその他: 読み取りのみ)
ディレクトリ配下を一括変更
chmod -R 755 /var/www/html
(所有者: 読み書き実行、グループとその他: 読み実行)
所有者にのみ実行権限を付与
chmod u+x script.sh
参照ファイルと同じ権限を適用
chmod --reference=ref.txt target.txt
エラー例(存在しないファイル)
chmod 644 missing.txt
出力例:
chmod: cannot access 'missing.txt': No such file or directory
よくある実務ケース
シェルスクリプトへの実行権限付与
作成したシェルスクリプトは初期状態では実行権限がありません。chmod +x で実行可能にしてから実行します。
# スクリプトを作成
cat > deploy.sh << 'EOF'
#!/bin/bash
echo "Deploying..."
EOF
# 実行権限を付与(所有者・グループ・その他すべてに)
chmod +x deploy.sh
# 所有者にのみ実行権限を与えたい場合
chmod 700 deploy.sh
# 実行
./deploy.sh
実行権限がない状態で実行しようとすると Permission denied エラーが発生します。
Webサーバーのパーミッション設定
Nginx / Apache でのWebサーバー運用では、セキュリティを維持しながら適切な権限を設定することが重要です。一般的な推奨設定は以下の通りです。
# ディレクトリ: 755(所有者は全権限、グループ・その他は読み・実行)
chmod -R 755 /var/www/html
# HTMLファイル: 644(所有者は読み書き、グループ・その他は読み取り)
find /var/www/html -type f -name "*.html" -exec chmod 644 {} \;
# PHPファイル: 644
find /var/www/html -type f -name "*.php" -exec chmod 644 {} \;
# ファイルとディレクトリを分けて一括設定する場合
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
Webサーバーのプロセスユーザー(www-data / nginx など)がファイルを読めるように、グループ権限の読み取り(r)は必ず付けておきます。設定ファイルや .env など秘密情報を含むファイルは chmod 600 で保護してください。
SSHキーのパーミッション設定
SSH 秘密鍵は権限が広すぎると接続が拒否されます。適切な権限を設定しておきましょう。
# .ssh ディレクトリ: 700(所有者のみアクセス可)
chmod 700 ~/.ssh
# SSH秘密鍵: 600(所有者のみ読み書き)
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_ed25519
# SSH公開鍵: 644
chmod 644 ~/.ssh/id_rsa.pub
# authorized_keys: 600
chmod 600 ~/.ssh/authorized_keys
パーミッションが緩い場合、SSH接続時に WARNING: UNPROTECTED PRIVATE KEY FILE! と警告が表示され、接続に失敗します。
設定ファイルのセキュリティ保護
パスワードや API キーを含む設定ファイルは、所有者のみ読み書き可能にしてセキュリティを確保します。
# 設定ファイル(パスワード・APIキー含む): 600
chmod 600 .env
chmod 600 config/database.yml
# 読み取り専用にして誤編集を防ぐ: 400
chmod 400 /etc/important-config.conf
# AWS PEMキー(EC2接続用): 400
chmod 400 my-key-pair.pem
権限の定期監査(最小権限の原則)
パーミッションは一度設定して終わりではなく、必要最小限の権限に保たれているかを定期的に見直すことが重要です(最小権限の原則)。特に「その他(others)」に書き込み権限が付いたままのディレクトリがないかは、find コマンドで一括チェックできます。
find /var/www -type d -perm -o+w -ls
「others」が書き込み可能なディレクトリが一覧表示されるので、不要なものは chmod で権限を絞り込みます。より細かいアクセス制御が必要な場合は、パーミッションに加えて SELinux や AppArmor を併用すると、ファイル単位の権限だけではカバーしきれないプロセス単位の制御を追加できます。
新規ファイルのデフォルトパーミッション(umask)
ファイルやディレクトリを新規作成した際のデフォルトパーミッションは umask の設定値によって決まります。ファイルは基準値666、ディレクトリは基準値777から umask の値を差し引いた権限で作成されます。
$ umask
0002
$ touch newfile.txt && ls -l newfile.txt
-rw-rw-r-- 1 user group 0 Jun 8 10:00 newfile.txt
$ mkdir newdir && ls -ld newdir
drwxrwxr-x 2 user group 4096 Jun 8 10:00 newdir
umask の詳細な設定方法は「umaskコマンド」の記事で解説しています。
パーミッションでよくあるトラブル
実行権限が付与されていないスクリプトを実行しようとした場合や、書き込み権限のないファイル・ディレクトリを操作しようとした場合に発生します。まず ls -l で現在の権限と所有者を確認し、必要な権限を chmod で付与するか、chown で所有者を見直します。
所有者・グループ・その他の全ユーザーに読み書き実行のすべての権限を与えるため、第三者による改ざんや不正なスクリプトの実行を許してしまうセキュリティリスクがあります。動作しないときの応急処置として使うのではなく、必要最小限の権限(多くの場合は755や644)に絞り込むのが基本です。
パーミッションは「所有者・グループ・その他」それぞれに対する読み取り・書き込み・実行の権限設定です。一方、所有者(オーナー)やグループそのものを変更するのは chmod ではなく chown(所有者・グループ変更)や chgrp(グループ変更)の役割です。権限エラーの原因が「権限の値」ではなく「そもそも所有者が違う」ケースもあるため、両方を確認します。
ディレクトリの場合、x権限は「そのディレクトリに移動(cd)できる」ことを意味します。r権限だけではファイル一覧は見えても中に入れず、x権限だけではファイル一覧は見えないが個別ファイル名を知っていればアクセスできる、という違いがあります。
本番環境での chmod 777 は避けるべきですが、ローカル開発環境の一時ディレクトリでの権限エラーの切り分けや、OSが定期的にクリアする /tmp 以下の共有作業領域、障害調査で権限が原因かを検証する場合など、限定的な用途では例外的に使われることがあります。使用後は必ず 644 や 755 など必要最小限の権限に戻してください。
関連コマンド・関連記事
chown: ファイルやディレクトリの所有者・グループを変更chgrp: グループ所有権を変更umask: 新規ファイル作成時のデフォルトパーミッションを制御sudo: root権限で一時的にコマンドを実行ls -l: ファイルのパーミッションを確認
備考
- 実行権限を付与しないとシェルスクリプトやバイナリは直接実行できません。
- ディレクトリの場合、
x権限は「ディレクトリに移動できる(cd できる)」ことを意味します。 chmod -Rを不用意に使うとセキュリティ事故につながる可能性があるため注意が必要です。chmod 777はすべてのユーザーに全権限を与えるため、本番環境での使用は避けてください。
参考
- manページ: man7.org chmod(1)
- GNU Coreutils: https://www.gnu.org/software/coreutils/

コメント