権限とパーミッション:chmod・chown を理解する
Linux を使い始めて「Permission denied」というエラーに悩まされたことはないでしょうか。
パーミッション(権限)の仕組みを理解すれば、このエラーの原因が一目でわかるようになります。
本記事では、所有者・グループ・その他の3段階の権限体系から始め、chmod・chown・sudo の実践的な使い方まで解説します。
パーミッションの読み方
ls -l で表示されるパーミッション文字列を解読しましょう。
-rwxr-xr-- 1 youhei staff 4096 Jun 17 10:00 script.sh
先頭の10文字が権限を表しています。
- rwx r-x r--
│ │ │ │
│ │ │ └── その他(other): 読み取りのみ
│ │ └────── グループ(group): 読み取り + 実行
│ └────────── 所有者(user): 読み取り + 書き込み + 実行
└───────────── ファイル種別(- = 通常, d = ディレクトリ, l = シンボリックリンク)
r・w・x の意味
| 記号 | 意味(ファイル) | 意味(ディレクトリ) |
|---|---|---|
r | 内容を読める | 一覧(ls)できる |
w | 内容を書き込める | ファイルを追加・削除できる |
x | 実行できる | cd で入れる |
数値表現(8進数)
パーミッションは chmod に数値で渡すことが多く、慣れると便利です。
| 記号 | 数値 |
|---|---|
r | 4 |
w | 2 |
x | 1 |
これを組み合わせて「所有者・グループ・その他」の順に3桁で表します。
rwxr-xr-- = 7 5 4 = 754
rw-r--r-- = 6 4 4 = 644
rwx------ = 7 0 0 = 700
chmod でパーミッションを変更する
数値指定(一番確実)
chmod 644 document.txt # 所有者: rw-, グループ: r--, その他: r--
chmod 755 script.sh # 所有者: rwx, グループ: r-x, その他: r-x
chmod 600 id_rsa # SSH秘密鍵は所有者のみ読み書き可
chmod 700 private/ # ディレクトリを自分だけがアクセスできるよう制限
記号指定(部分的な変更に便利)
chmod +x script.sh # 全員に実行権限を追加
chmod -w readonly.txt # 全員の書き込み権限を削除
chmod u+x,g-w file.txt # 所有者に実行追加、グループから書き込み削除
chmod o= secret.txt # その他のすべての権限を削除
再帰的に変更する
chmod -R 755 public/ # ディレクトリ以下全てに適用
ただし、ファイルとディレクトリで適切な権限が異なる場合が多いため、
-R の使いすぎには注意しましょう。
chown で所有者を変更する
# 所有者を変更
sudo chown alice file.txt
# 所有者とグループを同時に変更
sudo chown alice:developers file.txt
# グループのみ変更
sudo chown :developers file.txt
# または
sudo chgrp developers file.txt
# 再帰的に変更
sudo chown -R www-data:www-data /var/www/html
注意:
chownは通常sudoが必要です。他のユーザーへの譲渡は root 権限が必要なためです。
sudo:一時的に root 権限を借りる
sudo(Super User DO)は、一時的に root 権限でコマンドを実行するツールです。
sudo apt update # root として apt update を実行
sudo systemctl restart nginx # nginx を再起動
sudo -i # root シェルに切り替え(注意して使う)
sudo -u alice command # alice ユーザーとしてコマンドを実行
sudo の設定ファイル(sudoers)
誰が何を sudo できるかは /etc/sudoers で管理されています。
直接編集せず、visudo コマンドを使うことが推奨されます(構文チェックが入るため)。
sudo visudo
よく使われる設定例:
# ユーザー youhei がパスワードなしで sudo できる設定
youhei ALL=(ALL) NOPASSWD:ALL
# developers グループが特定コマンドのみ実行できる設定
%developers ALL=(ALL) /usr/bin/systemctl restart nginx
よくある落とし穴
SSH 秘密鍵のパーミッション
SSH 接続時に「permissions are too open」と怒られたら:
chmod 600 ~/.ssh/id_rsa
chmod 700 ~/.ssh/
Web サーバーのファイル権限
Nginx/Apache が読めない場合、www-data(またはサーバーの実行ユーザー)が読み取れる権限になっているか確認します。
# Web 公開ディレクトリの典型的な設定
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
スクリプトが実行できない
$ ./deploy.sh
bash: ./deploy.sh: Permission denied
# 解決: 実行権限を付与
chmod +x deploy.sh
SUID・SGID・スティッキービット(応用)
特殊なパーミッションビットも存在します。
| ビット | 数値 | 効果 |
|---|---|---|
| SUID | 4xxx | 実行時に所有者の権限で動く(/usr/bin/passwd など) |
| SGID | 2xxx | 実行時にグループ権限で動く / ディレクトリ内のファイルが同グループを継承 |
| スティッキービット | 1xxx | ディレクトリ内のファイルを所有者のみ削除可能(/tmp など) |
# /tmp のパーミッション確認(スティッキービット)
ls -ld /tmp
# drwxrwxrwt ... /tmp ← 末尾の t がスティッキービット
# passwd コマンドの SUID
ls -l /usr/bin/passwd
# -rwsr-xr-x ... /usr/bin/passwd ← s が SUID
まとめ
パーミッションは最初は難しく感じますが、rwx の3文字と「所有者・グループ・その他」の3段階を覚えれば体系が掴めます。
- 644 は「自分だけ書き込める、みんな読める」ファイルの標準設定
- 755 は「自分だけ書き込める、みんな読み実行できる」スクリプト・ディレクトリの標準設定
- SSH 鍵は 600、ディレクトリは 700
これらを基準に、必要に応じて chmod と chown で調整していくのがコツです。
連載は今回で一区切りです。ターミナル → systemd → 権限管理と、Linux 日常操作の基盤が揃いました。
次のステップとしては、シェルスクリプト入門やネットワーク設定(ip コマンド・ファイアウォール)などに挑戦してみてください。