パーミッションとは?Linuxの権限の仕組みとchmodによる変更方法

コマンドリファレンス

パーミッション(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)上記以外の全ユーザー
権限記号数値ファイルの場合ディレクトリの場合
読み取りr4内容を閲覧できるファイル一覧を取得できる
書き込みw2内容を編集・削除できるファイルの作成・削除ができる
実行x1プログラムとして実行できるディレクトリに移動(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 755rwxr-xr-x読み書き実行読み・実行読み・実行実行ファイル・公開ディレクトリ
chmod 644rw-r–r–読み書き読み取り読み取り一般ファイル・設定ファイル
chmod 700rwx——全権限なしなし秘密鍵・個人スクリプト
chmod 600rw——-読み書きなしなしSSH秘密鍵・パスワードファイル
chmod 400r——–読み取りなしなしAWS PEMキー・変更禁止ファイル
chmod 664rw-rw-r–読み書き読み書き読み取りグループ共同編集ファイル
chmod 775rwxrwxr-x全権限全権限読み・実行グループ共同開発ディレクトリ
chmod 777rwxrwxrwx全権限全権限全権限※非推奨(セキュリティリスク大)

特殊パーミッション(setuid・setgid・sticky bit)

通常の rwx に加えて、Linux には setuid・setgid・sticky bit という3種類の特殊パーミッションがあります。4桁の数値で指定する場合、1桁目がこの特殊パーミッションに対応します。

種類数値ファイルへの効果ディレクトリへの効果
setuid(SUID)4000実行時に所有者の権限で動作する(効果なし)
setgid(SGID)2000実行時にグループの権限で動作する作成されるファイルのグループが親ディレクトリのグループを継承する
sticky bit1000(効果なし)ファイルを削除できるのは所有者のみになる

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 で権限を絞り込みます。より細かいアクセス制御が必要な場合は、パーミッションに加えて SELinuxAppArmor を併用すると、ファイル単位の権限だけではカバーしきれないプロセス単位の制御を追加できます。

新規ファイルのデフォルトパーミッション(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コマンド」の記事で解説しています。

パーミッションでよくあるトラブル

「Permission denied」と表示されたらどうすればいい?

実行権限が付与されていないスクリプトを実行しようとした場合や、書き込み権限のないファイル・ディレクトリを操作しようとした場合に発生します。まず ls -l で現在の権限と所有者を確認し、必要な権限を chmod で付与するか、chown で所有者を見直します。

chmod 777 はなぜ非推奨なの?

所有者・グループ・その他の全ユーザーに読み書き実行のすべての権限を与えるため、第三者による改ざんや不正なスクリプトの実行を許してしまうセキュリティリスクがあります。動作しないときの応急処置として使うのではなく、必要最小限の権限(多くの場合は755や644)に絞り込むのが基本です。

パーミッションと所有者(オーナー)の違いは?

パーミッションは「所有者・グループ・その他」それぞれに対する読み取り・書き込み・実行の権限設定です。一方、所有者(オーナー)やグループそのものを変更するのは chmod ではなく chown(所有者・グループ変更)や chgrp(グループ変更)の役割です。権限エラーの原因が「権限の値」ではなく「そもそも所有者が違う」ケースもあるため、両方を確認します。

ディレクトリのx(実行)権限には何の意味がある?

ディレクトリの場合、x権限は「そのディレクトリに移動(cd)できる」ことを意味します。r権限だけではファイル一覧は見えても中に入れず、x権限だけではファイル一覧は見えないが個別ファイル名を知っていればアクセスできる、という違いがあります。

chmod 777 を使ってもよい例外的なケースはある?

本番環境での chmod 777 は避けるべきですが、ローカル開発環境の一時ディレクトリでの権限エラーの切り分けや、OSが定期的にクリアする /tmp 以下の共有作業領域、障害調査で権限が原因かを検証する場合など、限定的な用途では例外的に使われることがあります。使用後は必ず 644 や 755 など必要最小限の権限に戻してください。

関連コマンド・関連記事

  • chown : ファイルやディレクトリの所有者・グループを変更
  • chgrp : グループ所有権を変更
  • umask : 新規ファイル作成時のデフォルトパーミッションを制御
  • sudo : root権限で一時的にコマンドを実行
  • ls -l : ファイルのパーミッションを確認

備考

  • 実行権限を付与しないとシェルスクリプトやバイナリは直接実行できません。
  • ディレクトリの場合、x 権限は「ディレクトリに移動できる(cd できる)」ことを意味します。
  • chmod -R を不用意に使うとセキュリティ事故につながる可能性があるため注意が必要です。
  • chmod 777 はすべてのユーザーに全権限を与えるため、本番環境での使用は避けてください。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント