Linux & IT ノート

権限とパーミッション:chmod・chown を理解する

管理人 約8分で読めます

Linux を使い始めて「Permission denied」というエラーに悩まされたことはないでしょうか。 パーミッション(権限)の仕組みを理解すれば、このエラーの原因が一目でわかるようになります。 本記事では、所有者・グループ・その他の3段階の権限体系から始め、chmodchownsudo の実践的な使い方まで解説します。

パーミッションの読み方

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 に数値で渡すことが多く、慣れると便利です。

記号数値
r4
w2
x1

これを組み合わせて「所有者・グループ・その他」の順に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・スティッキービット(応用)

特殊なパーミッションビットも存在します。

ビット数値効果
SUID4xxx実行時に所有者の権限で動く(/usr/bin/passwd など)
SGID2xxx実行時にグループ権限で動く / ディレクトリ内のファイルが同グループを継承
スティッキービット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

これらを基準に、必要に応じて chmodchown で調整していくのがコツです。

連載は今回で一区切りです。ターミナル → systemd → 権限管理と、Linux 日常操作の基盤が揃いました。 次のステップとしては、シェルスクリプト入門やネットワーク設定(ip コマンド・ファイアウォール)などに挑戦してみてください。