はじめに#
Linuxシステムでは、ファイルやディレクトリへのアクセスを制御する「パーミッション(権限)」の仕組みが非常に重要です。Webサーバーの設定ファイルが誰でも読み書きできる状態だと、セキュリティ上の大きなリスクになります。逆に、権限が厳しすぎるとアプリケーションが正常に動作しません。
本記事では、Linuxファイルパーミッションの基本概念から実践的なコマンド操作まで、体系的に解説します。chmodによる権限変更(数値指定とシンボリック指定の両方)、chown/chgrpによる所有者・グループ変更、そしてsetuid、setgid、スティッキービットといった特殊権限まで網羅しています。
この記事を読み終える頃には、ファイルやディレクトリに適切なパーミッションを設定できるようになり、セキュリティと利便性のバランスを取った運用ができるようになります。
動作確認環境#
本記事のコマンドは以下の環境で動作確認しています。
| 項目 |
内容 |
| 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
|
-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
|
-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
|
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 |
大文字のSやTは、特殊権限は設定されているが通常の実行権限がない状態を示します。
実践的なパーミッション設定例#
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の確認と設定#
実行結果の例:
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: 新規作成ファイルのデフォルト権限制御
パーミッション設定のベストプラクティス#
- 最小権限の原則: 必要最低限の権限のみを付与する
- 777は避ける: 全員に全権限を与えるのはセキュリティリスク
- 秘密情報は600: 秘密鍵やパスワードファイルは所有者のみ読み取り可能に
- 共有ディレクトリにはsetgid: チーム開発で権限問題を防ぐ
- 定期的な監査: 不適切な権限設定がないか定期的にチェック
適切なパーミッション設定は、Linuxシステムのセキュリティと安定運用の基盤です。本記事で学んだ知識を活用し、セキュアで管理しやすいファイル管理を実践してください。
参考リンク#