Linuxのアクセス権(パーミッション)を徹底解説|rwxの意味からchmodの使い方まで

Linux

Linuxサーバーや開発環境を使っていると必ず出てくるのがアクセス権(パーミッション)

「Permission denied(許可がありません)」
「このファイルは開けるのに、実行できない」
といったエラーは、ほとんどがアクセス権の設定に原因があります。

Linuxのアクセス権を理解すれば、ファイルが読めない・書けない・実行できないトラブルや、不要な権限を与えてセキュリティが低下するリスクを防げます。

この記事では、Linuxのアクセス権(rwx)の基本構造、権限の確認と変更方法(chmod・chown)、よくあるトラブル例と解決法をわかりやすく解説します。

これを読めば、Linuxのファイル管理が一気にスムーズになりますよ!

スポンサーリンク

Linuxアクセス権の基本概念

アクセス権の構成要素

Linuxのアクセス権は以下の要素で構成されています:

権限の種類(rwx)

記号英語名日本語ファイルでの意味ディレクトリでの意味
rread読み取りファイル内容の読み取りディレクトリ内容の一覧表示
wwrite書き込みファイル内容の変更・削除ファイル作成・削除・名前変更
xexecute実行プログラムとして実行ディレクトリへの移動(cd)

権限の対象者

対象記号説明
所有者u (user)ファイル・ディレクトリの所有者
グループg (group)所有者と同じグループのユーザー
その他o (other)上記以外のすべてのユーザー
すべてa (all)上記3つすべて

パーミッション表記の読み方

ls -l での表示例

ls -l example.txt

出力例

-rwxr-xr-- 1 user1 group1 1024 Mar 15 14:30 example.txt

詳細な解析

ファイルタイプと権限-rwxr-xr--

位置文字意味
1文字目-ファイルタイプ(-:通常ファイル、d:ディレクトリ、l:シンボリックリンク)
2-4文字目rwx所有者の権限(読み・書き・実行)
5-7文字目r-xグループの権限(読み・実行、書き込み不可)
8-10文字目r--その他の権限(読み取りのみ)

その他の情報

  • 1:ハードリンク数
  • user1:所有者名
  • group1:グループ名
  • 1024:ファイルサイズ(バイト)
  • Mar 15 14:30:最終更新日時

ファイルタイプの識別

主要なファイルタイプ

記号ファイルタイプ
通常ファイルテキスト、実行ファイル、画像など
dディレクトリフォルダ
lシンボリックリンクショートカット
cキャラクターデバイス/dev/tty*
bブロックデバイス/dev/sda*
p名前付きパイプFIFO
sソケットネットワーク通信用

実例での確認

# 様々なファイルタイプの確認
ls -la /
ls -la /dev/
ls -la /tmp/

数値表記による権限設定

8進数(オクタル)表記

基本的な数値の意味

数値2進数権限意味
0000---権限なし
1001--x実行のみ
2010-w-書き込みのみ
3011-wx書き込み+実行
4100r--読み取りのみ
5101r-x読み取り+実行
6110rw-読み取り+書き込み
7111rwxすべての権限

よく使われる権限設定

数値権限用途
644rw-r--r--一般的なファイルテキストファイル、設定ファイル
755rwxr-xr-x実行ファイルスクリプト、バイナリ
666rw-rw-rw-共有ファイル一時ファイル
777rwxrwxrwxフルアクセス一時ディレクトリ(非推奨)
600rw-------個人用ファイルSSH秘密鍵、設定ファイル
700rwx------個人用ディレクトリホームディレクトリ

セキュリティを考慮した推奨設定

ファイル用途別推奨権限

ファイル種類推奨権限理由
設定ファイル644管理者のみ編集、他は読み取り
実行スクリプト755所有者のみ編集、他は実行可能
ログファイル644アプリのみ書き込み、管理者は読み取り
データベースファイル600データベースユーザーのみアクセス
SSH秘密鍵600所有者のみアクセス
Webコンテンツ644Webサーバーが読み取り、管理者が編集

chmodコマンドによる権限変更

数値モードでの変更

基本的な使用法

# 基本構文
chmod [権限] [ファイル/ディレクトリ]

# 例:ファイルに644権限を設定
chmod 644 document.txt

# 例:スクリプトに実行権限を付与
chmod 755 script.sh

複数ファイルの一括変更

# 複数ファイルを同時に変更
chmod 644 file1.txt file2.txt file3.txt

# ワイルドカードの使用
chmod 644 *.txt
chmod 755 *.sh

# ディレクトリ内すべてのファイル
chmod 644 /path/to/directory/*

再帰的な権限変更

# ディレクトリとその中身すべてを変更
chmod -R 755 /path/to/directory

# ファイルとディレクトリを区別して設定
find /path/to/directory -type f -exec chmod 644 {} \;
find /path/to/directory -type d -exec chmod 755 {} \;

シンボリックモードでの変更

基本的な操作子

操作子意味
+権限を追加chmod u+x file
権限を削除chmod g-w file
=権限を設定(他をクリア)chmod o=r file

対象者の指定

# 所有者に実行権限を追加
chmod u+x script.sh

# グループから書き込み権限を削除
chmod g-w document.txt

# その他のユーザーにすべての権限を削除
chmod o-rwx private_file.txt

# すべてのユーザーに読み取り権限を追加
chmod a+r public_file.txt

複雑な権限設定例

# 所有者にフル権限、グループに読み取り+実行、その他に読み取りのみ
chmod u=rwx,g=rx,o=r script.sh

# 複数の操作を同時実行
chmod u+x,g-w,o-rwx file.txt

# 条件付き権限設定
chmod u+x,go-rwx secret_script.sh

特殊な権限設定

Setuid(SUID)

# SetuidビットON(4000を追加)
chmod 4755 /usr/bin/passwd

# 表示例:-rwsr-xr-x
# sは実行権限があるときのSetuid表示

Setgid(SGID)

# SetgidビットON(2000を追加)
chmod 2755 /shared/directory

# 表示例:drwxr-sr-x
# sは実行権限があるときのSetgid表示

Sticky bit

# Sticky bitON(1000を追加)
chmod 1777 /tmp

# 表示例:drwxrwxrwt
# tは実行権限があるときのSticky bit表示

chownとchgrpによる所有者変更

chownコマンドの使用法

基本的な所有者変更

# 所有者のみ変更
sudo chown newuser file.txt

# 所有者とグループを同時変更
sudo chown newuser:newgroup file.txt

# グループのみ変更(所有者は変更しない)
sudo chown :newgroup file.txt

実用的な例

# Webサーバー用ファイルの所有者設定
sudo chown www-data:www-data /var/www/html/index.html

# ログファイルの所有者をsyslogに変更
sudo chown syslog:adm /var/log/application.log

# ユーザーのホームディレクトリ所有者修正
sudo chown -R user1:user1 /home/user1

chgrpコマンド

グループのみの変更

# 基本的なグループ変更
sudo chgrp developers project_file.py

# 再帰的なグループ変更
sudo chgrp -R www-data /var/www/project

所有者情報の確認

詳細な所有者情報表示

# 基本的な確認
ls -l file.txt

# 数値IDでの表示
ls -ln file.txt

# ユーザーとグループの詳細情報
stat file.txt

# 現在のユーザー・グループ確認
id
whoami
groups

実践的なトラブルシューティング

よくあるエラーと解決法

Permission denied エラー

エラー例1:ファイル実行時

./script.sh
# bash: ./script.sh: Permission denied

原因と解決

# 現在の権限確認
ls -l script.sh
# 出力例:-rw-r--r-- 1 user group 123 Mar 15 14:30 script.sh

# 実行権限追加
chmod +x script.sh
# または
chmod 755 script.sh

エラー例2:ディレクトリアクセス時

cd /restricted/directory
# bash: cd: /restricted/directory: Permission denied

原因と解決

# ディレクトリ権限確認
ls -ld /restricted/directory

# 実行権限(移動権限)が必要
sudo chmod +x /restricted/directory

ファイル編集・削除エラー

エラー例

echo "new content" > readonly_file.txt
# bash: readonly_file.txt: Permission denied

原因と解決

# 権限確認
ls -l readonly_file.txt
# 出力例:-r--r--r-- 1 user group 123 Mar 15 14:30 readonly_file.txt

# 書き込み権限追加
chmod u+w readonly_file.txt

セキュリティ関連のトラブル

過度に緩い権限設定

問題のある設定例

# 危険:すべてのユーザーに書き込み権限
chmod 777 important_config.conf

# 危険:秘密鍵が他ユーザーから読み取り可能
chmod 644 ~/.ssh/id_rsa

安全な設定への修正

# 設定ファイルの適切な権限
chmod 644 important_config.conf

# SSH秘密鍵の適切な権限
chmod 600 ~/.ssh/id_rsa

SSHキー関連の権限問題

SSH接続エラー

ssh user@server
# Warning: Unprotected private key file!

解決方法

# SSH関連ファイルの適切な権限設定
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/known_hosts
chmod 600 ~/.ssh/config

高度なアクセス権管理

umaskによるデフォルト権限設定

umaskの確認と設定

# 現在のumask確認
umask

# umaskを8進数で表示
umask -S

# umaskの設定(例:022)
umask 022

umaskの計算方法

計算例

  • デフォルトファイル権限:666
  • デフォルトディレクトリ権限:777
  • umask:022

結果

  • ファイル:666 – 022 = 644
  • ディレクトリ:777 – 022 = 755

恒久的なumask設定

# ~/.bashrcに追加
echo "umask 022" >> ~/.bashrc

# システム全体での設定
sudo vim /etc/profile
# または
sudo vim /etc/bash.bashrc

ACL(Access Control List)

ACLの基本概念

通常のLinux権限の拡張機能で、より細かい権限制御が可能:

ACLの確認

# ACLをサポートしているか確認
getfacl filename

# ファイルシステムでACLが有効か確認
mount | grep acl

ACLの設定例

# 特定ユーザーに読み取り権限を付与
setfacl -m u:username:r filename

# 特定グループに書き込み権限を付与
setfacl -m g:groupname:rw filename

# ACLエントリの削除
setfacl -x u:username filename

# すべてのACLを削除
setfacl -b filename

特殊なアクセス権シナリオ

Webサーバー環境での権限設定

# Apache用ディレクトリ設定
sudo chown -R www-data:www-data /var/www/html
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;

# アップロードディレクトリ(書き込み可能)
sudo chmod 755 /var/www/html/uploads
sudo chown www-data:www-data /var/www/html/uploads

データベース環境での権限設定

# MySQL データディレクトリ
sudo chown -R mysql:mysql /var/lib/mysql
sudo chmod 750 /var/lib/mysql
sudo find /var/lib/mysql -name "*.frm" -exec chmod 660 {} \;
sudo find /var/lib/mysql -name "*.MYD" -exec chmod 660 {} \;
sudo find /var/lib/mysql -name "*.MYI" -exec chmod 660 {} \;

スクリプトでの権限管理自動化

権限確認スクリプト

#!/bin/bash
# check_permissions.sh - ファイル権限チェックスクリプト

check_file_permission() {
    local file="$1"
    local expected_perm="$2"
    
    if [ ! -e "$file" ]; then
        echo "ERROR: $file が存在しません"
        return 1
    fi
    
    actual_perm=$(stat -c "%a" "$file")
    
    if [ "$actual_perm" = "$expected_perm" ]; then
        echo "OK: $file の権限は正しく設定されています ($actual_perm)"
    else
        echo "WARNING: $file の権限が不正です (実際: $actual_perm, 期待: $expected_perm)"
    fi
}

# 使用例
check_file_permission "/etc/passwd" "644"
check_file_permission "/etc/shadow" "640"
check_file_permission "/tmp" "1777"

権限修正スクリプト

#!/bin/bash
# fix_permissions.sh - 権限修正スクリプト

# Webアプリケーション用権限修正
fix_webapp_permissions() {
    local web_root="$1"
    
    echo "Webアプリケーション権限を修正中: $web_root"
    
    # 所有者をwww-dataに変更
    sudo chown -R www-data:www-data "$web_root"
    
    # ディレクトリは755、ファイルは644に設定
    sudo find "$web_root" -type d -exec chmod 755 {} \;
    sudo find "$web_root" -type f -exec chmod 644 {} \;
    
    # 実行可能ファイルには実行権限を付与
    sudo find "$web_root" -name "*.sh" -exec chmod 755 {} \;
    sudo find "$web_root" -name "*.pl" -exec chmod 755 {} \;
    sudo find "$web_root" -name "*.py" -exec chmod 755 {} \;
    
    echo "権限修正完了"
}

# 使用例
fix_webapp_permissions "/var/www/html"

セキュリティ監査スクリプト

#!/bin/bash
# security_audit.sh - セキュリティ監査スクリプト

echo "=== セキュリティ監査開始 ==="

# 危険な権限を持つファイルを検索
echo "1. 危険な権限(777)を持つファイル:"
find / -type f -perm 777 2>/dev/null | head -10

echo "2. SUIDビットが設定されたファイル:"
find / -type f -perm -4000 2>/dev/null | head -10

echo "3. 他ユーザーが書き込み可能なファイル:"
find / -type f -perm -002 2>/dev/null | head -10

echo "4. グループが書き込み可能なファイル:"
find / -type f -perm -020 2>/dev/null | head -10

echo "5. ホームディレクトリの権限確認:"
ls -ld /home/*

echo "=== セキュリティ監査完了 ==="

ベストプラクティスとセキュリティ

セキュアな権限設定の原則

最小権限の原則

基本的な考え方

  • 必要最小限の権限のみを付与
  • 定期的な権限の見直し
  • 不要になった権限の即座な削除

実装例

# 悪い例:過度に緩い権限
chmod 777 /shared/documents

# 良い例:必要最小限の権限
chmod 775 /shared/documents
chgrp developers /shared/documents

権限の階層化

ユーザーとグループの適切な管理

# 開発プロジェクト用のグループ作成
sudo groupadd developers
sudo groupadd testers
sudo groupadd admins

# ユーザーをグループに追加
sudo usermod -a -G developers user1
sudo usermod -a -G testers user2

# プロジェクトディレクトリの権限設定
sudo chown -R root:developers /opt/project
sudo chmod -R 775 /opt/project

定期的なセキュリティチェック

月次セキュリティ監査

#!/bin/bash
# monthly_security_check.sh

REPORT_FILE="/var/log/security_audit_$(date +%Y%m).log"

{
    echo "=== Monthly Security Audit - $(date) ==="
    
    echo "1. Files with dangerous permissions (777):"
    find / -type f -perm 777 2>/dev/null
    
    echo "2. SUID files:"
    find / -type f -perm -4000 2>/dev/null
    
    echo "3. SGID files:"
    find / -type f -perm -2000 2>/dev/null
    
    echo "4. World-writable files:"
    find / -type f -perm -002 2>/dev/null
    
    echo "5. SSH key permissions:"
    find /home -name ".ssh" -exec ls -ld {} \; 2>/dev/null
    find /home -name "id_*" -exec ls -l {} \; 2>/dev/null
    
} >> "$REPORT_FILE"

まとめ

Linuxのアクセス権(パーミッション)について、重要なポイントをまとめます:

基本的な理解

  • rwx権限:読み取り、書き込み、実行の3つの基本権限
  • 3つの対象:所有者、グループ、その他のユーザー
  • 数値表記:8進数での権限指定(644、755など)
  • シンボリック表記:記号での権限変更(u+x、g-wなど)

実用的なコマンド

  • 確認ls -lstatgetfacl
  • 変更chmod(権限)、chown(所有者)、chgrp(グループ)
  • 設定umask(デフォルト権限)、setfacl(ACL)

セキュリティの要点

  • 最小権限の原則:必要最小限の権限のみ付与
  • 定期的な監査:危険な権限設定の検出
  • 適切な所有者設定:サービス専用ユーザーの活用
  • 特殊権限の注意:SUID、SGID、Sticky bitの慎重な使用

よくある問題と対処

  • Permission denied:権限不足による実行・アクセス拒否
  • セキュリティリスク:過度に緩い権限設定
  • SSH接続問題:不適切なSSHキー権限
  • Webサーバー問題:不適切なWebファイル権限

トラブル予防

  • 権限確認の習慣化:ファイル作成後の権限チェック
  • スクリプト化:権限設定の自動化
  • ドキュメント化:権限設定ルールの明文化
  • 教育・訓練:チームメンバーへの権限管理教育

コメント

タイトルとURLをコピーしました