2026年8月20日
2026年8月20日
Linuxのファイルパーミッションセキュリティ設定|権限の読み方から危険な設定の点検まで
Linux サーバーのファイルパーミッションは、「必要な人に、必要な操作だけを許す」ように所有者・グループ・権限を設計するのが基本です。権限を広げすぎると改ざんや情報漏えいの入口になり、狭めすぎるとサービスが動かなくなります。この記事では、パーミッションの読み方、chmod・chown の使い方、特殊権限(SUID・SGID・スティッキービット)、umask、危険な設定を見つける find コマンド、重要ファイルの推奨値、Web サーバーでの考え方までを順に説明します。
パーミッションの読み方
ls -l で表示される -rw-r--r-- のような文字列が、ファイルのパーミッションです。
$ ls -l /etc/hosts
-rw-r--r-- 1 root root 220 Oct 1 10:00 /etc/hosts
先頭の1文字は種類(- は通常ファイル、d はディレクトリ、l はシンボリックリンク)で、続く9文字が3文字ずつ「所有者」「グループ」「その他」の権限を表します。r は読み取り、w は書き込み、x は実行です。
数値で書くときは r=4、w=2、x=1 を足し合わせます。rw-r--r-- は 6・4・4 なので 644 です。
ディレクトリでは意味が少し変わります。r は中のファイル名の一覧を見る権限、w はファイルの作成・削除・名前変更の権限、x はディレクトリに入る(中のファイルにアクセスする)権限です。つまずきやすいのは、ディレクトリに w があると、そのディレクトリ内のファイルは、ファイル自体の権限にかかわらず削除や置き換えができてしまう点です。ファイルを守りたいなら、置き場所のディレクトリの権限も確認する必要があります。
chmodとchownの使い方
権限は chmod、所有者とグループは chown で変更します。
# 権限を数値で指定
chmod 640 /path/to/file
# 記号で指定(その他から書き込み権限を外す)
chmod o-w /path/to/file
# 所有者とグループを変更
chown deploy:www-data /path/to/file
# ディレクトリ配下を一括で変更する場合は、ファイルとディレクトリを分ける
find /path/to/dir -type d -exec chmod 755 {} +
find /path/to/dir -type f -exec chmod 644 {} +
chmod -R 755 のように再帰的に一括変更すると、ファイルにまで実行権限が付いてしまいます。ディレクトリとファイルで必要な権限は違うため、find で種類を分けて変更するのが安全です。広い範囲を変更する前には、getfacl -R などで現在の権限を書き出して控えておくと、問題が起きたときに戻せます。
777が危険な理由
「動かないので chmod 777 にしたら動いた」という対処はよく見かけますが、避けるべき設定です。777 はサーバー上のすべてのユーザーとプロセスに書き込みを許すため、別のサービスに侵入した攻撃者や、同じサーバーの他の利用者が、ファイルを書き換えたり不正なスクリプトを置いたりできるようになります。
権限エラーが出たときは、まず「どのユーザーで動いているプロセスが、どのファイルに何をしようとして失敗したか」をエラーログで確認し、そのユーザーかグループに必要な権限だけを与えます。プロセスの実行ユーザーは ps aux で確認できます。
特殊権限(SUID・SGID・スティッキービット)
通常の rwx に加えて、3つの特殊な権限があります。
- SUID(4000):実行ファイルに付けると、実行したユーザーではなくファイルの所有者の権限で動きます。
passwdコマンドが一般ユーザーでもパスワードを変更できるのはこの仕組みです。root 所有の SUID ファイルに脆弱性があると権限昇格に使われるため、不要な SUID ファイルは減らすのが原則です。 - SGID(2000):実行ファイルではグループの権限で動き、ディレクトリに付けると、中に作ったファイルがディレクトリのグループを引き継ぎます。複数人で共有するディレクトリに便利です。
- スティッキービット(1000):ディレクトリに付けると、書き込み権限があっても他人のファイルは削除できなくなります。
/tmpがdrwxrwxrwt(1777)になっているのはこのためです。
umaskで新しいファイルの権限を決める
umask は、新しく作るファイルやディレクトリから「外す権限」を指定する値です。多くの環境では 022 が既定で、ファイルは 644、ディレクトリは 755 で作られます。027 にすると、その他のユーザーからは読めない 640 と 750 になります。
# 現在の値を確認
umask
# 現在のシェルだけ変更
umask 027
恒久的に変える場合は、ログインシェルの設定ファイルや、systemd のサービス単位で UMask= を指定する方法があります。システム全体の既定値を変えると、他のサービスが作るファイルにも影響するため、まずは対象のサービスやユーザーに限って変更するのが無難です。
重要ファイルの推奨パーミッション
代表的なファイルの目安は、主なディストリビューションの既定値をもとにすると次のとおりです(2026年10月現在)。ディストリビューションやバージョンによって既定値が異なるものもあるので、変更する前に現状を確認してください。
| 対象 | 目安 | 補足 |
|---|---|---|
| /etc/passwd | 644(root:root) | 一般ユーザーも読む必要がある |
| /etc/shadow | 640(root:shadow)など | Debian・Ubuntu系は640、RHEL系は000が既定 |
| ~/.ssh ディレクトリ | 700 | 本人以外が入れないようにする |
| ~/.ssh/authorized_keys | 600 | 書き込み可能だと sshd が拒否することがある |
| SSH の秘密鍵 | 600 | 緩いとクライアントが鍵の使用を拒否する |
| /etc/ssh/sshd_config | 600 または 644 | 書き込みは root のみに限る |
SSH は権限が緩すぎると接続を拒否する仕組み(StrictModes)を持っているため、鍵認証がうまくいかないときは、ホームディレクトリ自体がグループやその他から書き込み可能になっていないかも確認します。
危険な設定をfindで点検する
定期的に、次のような設定がないかを探します。-xdev は他のファイルシステムをまたがないためのオプションで、/proc などの仮想ファイルシステムを除外できます。
# その他から書き込み可能なファイル
find / -xdev -type f -perm -0002 -ls 2>/dev/null
# その他から書き込み可能で、スティッキービットがないディレクトリ
find / -xdev -type d -perm -0002 ! -perm -1000 -ls 2>/dev/null
# SUID・SGID が付いたファイル
find / -xdev -type f \( -perm -4000 -o -perm -2000 \) -ls 2>/dev/null
# 所有者・グループが存在しないファイル(削除したユーザーの残りなど)
find / -xdev \( -nouser -o -nogroup \) -ls 2>/dev/null
SUID・SGID の一覧は、OS をインストールした直後や正常な状態のときに保存しておき、後で差分を比べると、身に覚えのない追加に気づきやすくなります。見つかったファイルをすぐ消したり権限を変えたりせず、どのパッケージに属しているか(dpkg -S や rpm -qf)を確認してから判断してください。
Webサーバーでの考え方(WordPressを例に)
Web サイトのファイルでは、「Web サーバーや PHP の実行ユーザーが書き込めるファイルを最小限にする」ことが大切です。PHP が書き込めるファイルは、Web アプリケーションの脆弱性を突かれたときに書き換えられる可能性があるからです。
WordPress の場合、一般的な目安はディレクトリ 755、ファイル 644 で、データベースの接続情報を含む wp-config.php は 640 や 600 などに絞ります。ただし、600 にすると PHP の実行ユーザーが所有者でない限り読めなくなるため、所有者と PHP-FPM の実行ユーザーの関係を確認してから設定します。メディアのアップロード先(wp-content/uploads)は PHP からの書き込みが必要です。
管理画面からのプラグイン更新を使うかどうかでも、適切な所有者は変わります。デプロイ用のユーザーがファイルを所有し、Web サーバーのグループには読み取りだけを許す構成は安全性が高い一方、管理画面からの更新はできなくなります。運用の方法に合わせて決めてください。変更はステージング環境で試し、本番ではバックアップを取ってから行います。
ACLや追加の仕組みとの組み合わせ
所有者・グループ・その他の3区分で表しきれない場合は、ACL(setfacl / getfacl)で特定のユーザーやグループに個別の権限を与えられます。ACL が設定されたファイルは ls -l で権限の末尾に + が付くので、見落とさないようにします。
さらに強い制限が必要な場合は、SELinux や AppArmor といった強制アクセス制御を組み合わせると、パーミッション上は許可されていても、プロセスごとにアクセスできる範囲を絞れます。
まとめ
- パーミッションは所有者・グループ・その他 × 読み・書き・実行で決まる。ディレクトリの
wはファイルの削除や置き換えを許す - 一括変更は
findでファイルとディレクトリを分けて行い、777は使わない - SUID・SGID のファイルは一覧を保存しておき、差分を確認する
- umask で新規ファイルの権限を制御する。全体の既定値の変更は影響範囲に注意する
- SSH の鍵やディレクトリは権限が緩いと拒否されるため、
700/600を目安にする - Web サーバーでは、PHP が書き込めるファイルを最小限にし、運用方法に合わせて所有者を設計する