はじめに

Linuxシステムでは、ファイルやディレクトリへのアクセスを制御する「パーミッション(権限)」の仕組みが非常に重要です。Webサーバーの設定ファイルが誰でも読み書きできる状態だと、セキュリティ上の大きなリスクになります。逆に、権限が厳しすぎるとアプリケーションが正常に動作しません。

本記事では、Linuxファイルパーミッションの基本概念から実践的なコマンド操作まで、体系的に解説します。chmodによる権限変更(数値指定とシンボリック指定の両方)、chown/chgrpによる所有者・グループ変更、そしてsetuidsetgid、スティッキービットといった特殊権限まで網羅しています。

この記事を読み終える頃には、ファイルやディレクトリに適切なパーミッションを設定できるようになり、セキュリティと利便性のバランスを取った運用ができるようになります。

動作確認環境

本記事のコマンドは以下の環境で動作確認しています。

項目 内容
OS Ubuntu 24.04 LTS
シェル bash 5.3
カーネル Linux 6.8
coreutils 9.7

WSL2やVirtualBox上のLinux環境、その他の主要ディストリビューション(AlmaLinux 9、Debian 12等)でも同様に動作します。

パーミッションの基本概念

所有者・グループ・その他とは

Linuxでは、すべてのファイルとディレクトリに「誰がアクセスできるか」を定義する3つのカテゴリがあります。

graph LR
    subgraph ファイル
        F[example.txt]
    end
    subgraph アクセス権限
        U[所有者<br/>Owner]
        G[グループ<br/>Group]
        O[その他<br/>Others]
    end
    F --> U
    F --> G
    F --> O
カテゴリ 説明
所有者(Owner) ファイルを作成したユーザー、または所有権を持つユーザー userA
グループ(Group) ファイルに関連付けられたグループに属するユーザー developers
その他(Others) 上記以外のすべてのユーザー 全ユーザー

ファイルの所有者とグループはls -lコマンドで確認できます。

1
ls -l example.txt

実行結果の例:

1
-rw-r--r-- 1 userA developers 1024 Jan  7 10:00 example.txt

この出力では、userAが所有者、developersがグループです。

読み取り・書き込み・実行権限(rwx)

各カテゴリ(所有者・グループ・その他)に対して、3種類の権限を設定できます。

権限 記号 ファイルへの効果 ディレクトリへの効果
読み取り r(read) ファイルの内容を読める ディレクトリ内のファイル一覧を表示できる
書き込み w(write) ファイルの内容を変更できる ディレクトリ内にファイルを作成・削除できる
実行 x(execute) ファイルをプログラムとして実行できる ディレクトリに移動(cd)できる

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

ls -lの出力の先頭10文字がパーミッション情報を表します。

1
-rwxr-xr-- 1 userA developers 4096 Jan  7 10:00 script.sh
graph TB
    subgraph パーミッション文字列
        T["-"]
        U1["r"]
        U2["w"]
        U3["x"]
        G1["r"]
        G2["-"]
        G3["x"]
        O1["r"]
        O2["-"]
        O3["-"]
    end
    T -->|ファイルタイプ| TYPE["- : 通常ファイル<br/>d : ディレクトリ<br/>l : シンボリックリンク"]
    U1 -->|所有者| OWNER["rwx : 読み書き実行可"]
    G1 -->|グループ| GROUP["r-x : 読み取り実行可"]
    O1 -->|その他| OTHERS["r-- : 読み取りのみ"]
位置 意味 上記例での値
1文字目 ファイルタイプ(-:通常ファイル、d:ディレクトリ、l:シンボリックリンク) -(通常ファイル)
2-4文字目 所有者の権限(rwx) rwx(読み書き実行可)
5-7文字目 グループの権限(rwx) r-x(読み取り実行可)
8-10文字目 その他の権限(rwx) r--(読み取りのみ)

権限がない場合は-(ハイフン)で表示されます。

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

chmod(change mode)コマンドは、ファイルやディレクトリのパーミッションを変更するためのコマンドです。数値指定とシンボリック指定の2つの方法があります。

数値指定(8進数モード)

数値指定では、各権限を数値で表し、3桁の8進数でパーミッションを設定します。

権限と数値の対応

権限 数値
読み取り(r) 4
書き込み(w) 2
実行(x) 1
権限なし 0

各カテゴリの権限は、これらの数値を足し合わせて表現します。

権限組み合わせ 計算式 数値
rwx 4 + 2 + 1 7
rw- 4 + 2 + 0 6
r-x 4 + 0 + 1 5
r– 4 + 0 + 0 4
-wx 0 + 2 + 1 3
-w- 0 + 2 + 0 2
–x 0 + 0 + 1 1
0 + 0 + 0 0

基本的な使用例

1
2
3
4
5
6
7
8
# 所有者のみ読み書き可能(rw-------)
chmod 600 secret.txt

# 所有者は全権限、グループと他者は読み取りのみ(rwxr--r--)
chmod 744 script.sh

# 全員が読み書き実行可能(rwxrwxrwx)- セキュリティ上非推奨
chmod 777 example.txt

よく使われるパーミッションパターン

数値 権限表記 用途
755 rwxr-xr-x 実行可能なスクリプト、ディレクトリ
644 rw-r–r– 一般的な設定ファイル、HTMLファイル
600 rw——- 秘密鍵、パスワードファイル
700 rwx—— 所有者専用の実行ファイル・ディレクトリ
775 rwxrwxr-x グループメンバーで共有するディレクトリ
664 rw-rw-r– グループメンバーで編集するファイル

シンボリック指定

シンボリック指定では、対象と操作と権限を組み合わせて指定します。

構文

1
chmod [対象][操作][権限] ファイル名

対象の指定

記号 意味
u 所有者(user)
g グループ(group)
o その他(others)
a 全員(all)= u + g + o

操作の指定

記号 意味
+ 権限を追加する
- 権限を削除する
= 権限を指定した内容に設定する

基本的な使用例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 所有者に実行権限を追加
chmod u+x script.sh

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

# その他の全権限を削除
chmod o-rwx private.txt

# 全員に読み取り権限を付与
chmod a+r readme.txt

# 所有者とグループに読み書き権限を設定
chmod ug=rw shared.txt

# 複数の設定をカンマで区切って指定
chmod u+x,g-w,o-rwx script.sh

再帰的な権限変更(-Rオプション)

ディレクトリ内のすべてのファイルとサブディレクトリに対して権限を変更する場合は、-Rオプションを使用します。

1
2
3
4
5
# projectディレクトリ以下すべてに755を設定
chmod -R 755 project/

# シンボリック指定での再帰的変更
chmod -R u+rwX,go+rX,go-w project/

X(大文字のX)は特殊な権限で、ディレクトリまたは既に実行権限を持つファイルにのみ実行権限を付与します。これにより、ディレクトリにはxを付与しつつ、通常ファイルには付与しないという設定が可能です。

chmodのオプション一覧

オプション 説明
-R, –recursive ディレクトリとその中身を再帰的に変更
-v, –verbose 処理したファイルごとに結果を表示
-c, –changes 変更があったファイルのみ表示
-f, –silent, –quiet エラーメッセージを抑制
–reference=RFILE 指定したファイルと同じ権限に設定

chownコマンドによる所有者変更

chown(change owner)コマンドは、ファイルやディレクトリの所有者とグループを変更するためのコマンドです。

基本構文

1
chown [オプション] [所有者][:グループ] ファイル名

使用例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 所有者をuserBに変更
chown userB file.txt

# 所有者とグループを同時に変更
chown userB:developers file.txt

# グループのみを変更(所有者を省略)
chown :developers file.txt

# 所有者を変更し、グループをその所有者のログイングループに変更
chown userB: file.txt

再帰的な所有者変更

ディレクトリ内のすべてのファイルとサブディレクトリの所有者を変更する場合は、-Rオプションを使用します。

1
2
# projectディレクトリ以下すべての所有者を変更
chown -R userB:developers project/

chownのオプション一覧

オプション 説明
-R, –recursive ディレクトリとその中身を再帰的に変更
-v, –verbose 処理したファイルごとに結果を表示
-c, –changes 変更があったファイルのみ表示
-f, –silent, –quiet エラーメッセージを抑制
-h, –no-dereference シンボリックリンク自体を変更(参照先ではなく)
–reference=RFILE 指定したファイルと同じ所有者・グループに設定
–from=現在の所有者:グループ 現在の所有者・グループが一致する場合のみ変更

注意事項

chownコマンドでファイルの所有者を変更するには、通常root権限(またはsudo)が必要です。一般ユーザーは自分が所有するファイルの所有者を変更することはできません(セキュリティ上の理由)。

1
2
3
4
5
6
# 一般ユーザーでは権限エラーになる
chown otheruser file.txt
# chown: changing ownership of 'file.txt': Operation not permitted

# sudoを使用して実行
sudo chown otheruser file.txt

chgrpコマンドによるグループ変更

chgrp(change group)コマンドは、ファイルやディレクトリのグループのみを変更するためのコマンドです。機能的にはchown :グループ名と同等ですが、グループ変更に特化したシンプルな構文を提供します。

基本構文

1
chgrp [オプション] グループ ファイル名

使用例

1
2
3
4
5
# グループをdevelopersに変更
chgrp developers file.txt

# 再帰的にグループを変更
chgrp -R developers project/

chgrpのオプション一覧

オプション 説明
-R, –recursive ディレクトリとその中身を再帰的に変更
-v, –verbose 処理したファイルごとに結果を表示
-c, –changes 変更があったファイルのみ表示
-f, –silent, –quiet エラーメッセージを抑制
-h, –no-dereference シンボリックリンク自体を変更
–reference=RFILE 指定したファイルと同じグループに設定

chownとchgrpの使い分け

操作 chownの書き方 chgrpの書き方
グループのみ変更 chown :developers file.txt chgrp developers file.txt
再帰的にグループ変更 chown -R :developers dir/ chgrp -R developers dir/

グループのみを変更する場合は、chgrpの方が意図が明確で可読性が高くなります。一方、所有者とグループを同時に変更する場合はchownを使用します。

特殊権限(setuid、setgid、スティッキービット)

通常のrwx権限に加えて、Linuxには3つの特殊権限があります。これらは高度なアクセス制御を可能にしますが、誤った設定はセキュリティリスクにつながるため、慎重に扱う必要があります。

setuid(Set User ID)

setuidが設定された実行ファイルは、実行時にファイルの所有者の権限で動作します。これにより、一般ユーザーでも一時的に特権操作が可能になります。

代表的な例:passwdコマンド

1
ls -l /usr/bin/passwd

実行結果:

1
-rwsr-xr-x 1 root root 68208 Jan  7 10:00 /usr/bin/passwd

所有者の実行権限がsになっていることに注目してください。これがsetuidの印です。passwdコマンドはroot所有ですが、一般ユーザーが実行しても/etc/shadow(root権限が必要)を更新できます。

setuidの設定方法

1
2
3
4
5
# 数値指定(先頭に4を追加)
chmod 4755 program

# シンボリック指定
chmod u+s program

setuidの確認

1
2
# setuidが設定されたファイルを検索
find /usr/bin -perm -4000 -type f

setgid(Set Group ID)

setgidは、ファイルとディレクトリで異なる動作をします。

実行ファイルの場合

setgidが設定された実行ファイルは、実行時にファイルのグループの権限で動作します。

1
2
3
4
5
# 数値指定(先頭に2を追加)
chmod 2755 program

# シンボリック指定
chmod g+s program

ディレクトリの場合(より重要)

setgidが設定されたディレクトリ内で作成されたファイルやディレクトリは、親ディレクトリのグループを継承します。これはチーム開発での共有ディレクトリに非常に有用です。

1
2
3
4
# 共有ディレクトリの作成例
sudo mkdir /opt/shared-project
sudo chown :developers /opt/shared-project
sudo chmod 2775 /opt/shared-project
1
ls -ld /opt/shared-project

実行結果:

1
drwxrwsr-x 2 root developers 4096 Jan  7 10:00 /opt/shared-project

グループの実行権限がsになっていることで、setgidが設定されていることがわかります。

setgidディレクトリの動作確認

1
2
3
4
# developersグループのユーザーでファイルを作成
cd /opt/shared-project
touch myfile.txt
ls -l myfile.txt

実行結果:

1
-rw-rw-r-- 1 userA developers 0 Jan  7 10:00 myfile.txt

作成者のプライマリグループに関係なく、ファイルのグループがdevelopersになります。

スティッキービット(Sticky Bit)

スティッキービットは主にディレクトリに設定され、そのディレクトリ内のファイルを所有者(またはディレクトリの所有者、root)以外が削除・リネームできなくする制限を追加します。

代表的な例:/tmpディレクトリ

1
ls -ld /tmp

実行結果:

1
drwxrwxrwt 10 root root 4096 Jan  7 10:00 /tmp

その他の実行権限がtになっていることがスティッキービットの印です。/tmpは全ユーザーが書き込み可能ですが、スティッキービットにより他人のファイルは削除できません。

スティッキービットの設定方法

1
2
3
4
5
# 数値指定(先頭に1を追加)
chmod 1777 shared-directory

# シンボリック指定
chmod +t shared-directory

特殊権限の数値まとめ

4桁の数値でパーミッションを指定する場合、先頭の1桁が特殊権限を表します。

数値 特殊権限
4 setuid
2 setgid
1 スティッキービット

複数の特殊権限を組み合わせる場合は、数値を足し合わせます。

1
2
3
4
5
# setuid + setgid(4 + 2 = 6)
chmod 6755 program

# setgid + スティッキービット(2 + 1 = 3)
chmod 3777 directory

特殊権限の表示パターン

ls -lでの表示は、通常の実行権限との組み合わせで変わります。

状態 所有者(u) グループ(g) その他(o)
特殊権限あり + 実行権限あり s s t
特殊権限あり + 実行権限なし S S T

大文字のSTは、特殊権限は設定されているが通常の実行権限がない状態を示します。

実践的なパーミッション設定例

Webサーバーのドキュメントルート

1
2
3
4
# Apacheの場合(www-dataユーザー・グループ)
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
sudo chmod -R 644 /var/www/html/*.html

SSH秘密鍵の適切な権限

1
2
3
4
5
6
7
8
# SSH秘密鍵は所有者のみ読み取り可能にする(必須)
chmod 600 ~/.ssh/id_rsa

# SSH公開鍵
chmod 644 ~/.ssh/id_rsa.pub

# .sshディレクトリ
chmod 700 ~/.ssh

SSHでは鍵ファイルの権限が適切でないと接続が拒否されます。

開発チーム共有ディレクトリ

1
2
3
4
5
6
7
8
# 共有ディレクトリの作成
sudo mkdir -p /opt/project
sudo groupadd developers
sudo chown root:developers /opt/project
sudo chmod 2775 /opt/project

# 新規ファイルのデフォルト権限をumaskで調整
umask 002

setgidにより、チームメンバーが作成したファイルは自動的にdevelopersグループになります。

ログファイルの権限

1
2
3
4
5
# アプリケーションログ(所有者が読み書き、他は読み取りのみ)
chmod 644 /var/log/myapp/app.log

# セキュリティ関連ログ(所有者のみアクセス可)
chmod 600 /var/log/myapp/security.log

umaskによるデフォルト権限の制御

umaskは、新規作成されるファイルやディレクトリのデフォルトパーミッションを制御します。umaskで指定した値が「差し引かれる」形でパーミッションが決まります。

umaskの確認と設定

1
2
# 現在のumask値を確認
umask

実行結果の例:

1
0022

umaskとデフォルトパーミッションの関係

種類 ベース権限 umask 0022 結果
ファイル 666 666 - 022 644 (rw-r–r–)
ディレクトリ 777 777 - 022 755 (rwxr-xr-x)
1
2
3
4
5
6
# umaskを設定(現在のシェルセッションのみ)
umask 027

# この設定では
# ファイル: 666 - 027 = 640 (rw-r-----)
# ディレクトリ: 777 - 027 = 750 (rwxr-x---)

永続的に設定する場合は、~/.bashrc/etc/profileに記述します。

パーミッションのトラブルシューティング

よくあるエラーと対処法

Permission denied

1
bash: ./script.sh: Permission denied

原因と対処:

1
2
3
4
5
6
7
8
# 実行権限がない場合
chmod +x script.sh

# 読み取り権限がない場合
chmod +r file.txt

# ディレクトリへのアクセス権がない場合
chmod +x directory/

Operation not permitted

1
chown: changing ownership of 'file.txt': Operation not permitted

原因: root権限が必要な操作を一般ユーザーで実行しようとしている。

1
2
# sudoを使用
sudo chown newowner file.txt

パーミッションの確認コマンド

1
2
# 詳細なファイル情報を表示
stat file.txt

実行結果の例:

1
2
3
4
5
6
7
8
  File: file.txt
  Size: 1024            Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d      Inode: 123456      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   userA)   Gid: ( 1000/   userA)
Access: 2026-01-07 10:00:00.000000000 +0900
Modify: 2026-01-07 10:00:00.000000000 +0900
Change: 2026-01-07 10:00:00.000000000 +0900
 Birth: -

特殊権限が設定されたファイルの検索

1
2
3
4
5
6
7
8
# setuidが設定されたファイル
find / -perm -4000 -type f 2>/dev/null

# setgidが設定されたファイル
find / -perm -2000 -type f 2>/dev/null

# 書き込み権限が全員にあるファイル(セキュリティリスク)
find / -perm -002 -type f 2>/dev/null

まとめ

本記事では、Linuxファイルパーミッションの仕組みとコマンド操作について解説しました。

習得した内容

  • 基本概念: 所有者・グループ・その他の3カテゴリと、読み取り(r)・書き込み(w)・実行(x)の3権限
  • chmod: 数値指定(755など)とシンボリック指定(u+x など)によるパーミッション変更
  • chown/chgrp: ファイルの所有者とグループの変更(root権限が必要)
  • 特殊権限: setuid、setgid、スティッキービットの役割と設定方法
  • umask: 新規作成ファイルのデフォルト権限制御

パーミッション設定のベストプラクティス

  1. 最小権限の原則: 必要最低限の権限のみを付与する
  2. 777は避ける: 全員に全権限を与えるのはセキュリティリスク
  3. 秘密情報は600: 秘密鍵やパスワードファイルは所有者のみ読み取り可能に
  4. 共有ディレクトリにはsetgid: チーム開発で権限問題を防ぐ
  5. 定期的な監査: 不適切な権限設定がないか定期的にチェック

適切なパーミッション設定は、Linuxシステムのセキュリティと安定運用の基盤です。本記事で学んだ知識を活用し、セキュアで管理しやすいファイル管理を実践してください。

参考リンク