新しいデプロイ後、画像だけ403になった。ファイルは存在する。瀬名はNginx設定を見たが、律は親ディレクトリを辿った。
途中のディレクトリに実行権限がない。ファイル自体が読めても、そこまで辿れなかった。
`namei -l /path/to/file`
原因は一目で分かった。二人は必要最小限の権限に直し、デプロイ時のumaskも確認した。
「目的地だけ開いてても、道が閉じてたら入れない」
律が言う。
瀬名は頷いた。
「それ、会話にもありますね」
律は少しだけ目をそらした。
「瀬名さんは、たまに道を探すのがうまいです」
褒め言葉にしては、声が静かだった。
人物紹介
瀬名悠真
- 男性、30代
- サーバ運用・インフラ担当
- 手は動くが、初動で少し焦りやすい
久坂律
- 女性、30代
- 監視、自動化、ログ解析、運用設計に強い
- 冷静で、原因調査の順序を大事にする
用語メモ
LinuxなどのUNIX系OSでは、目的のファイル自体に読み取り権限(r)があっても、そこに至るまでの「途中のディレクトリ」に実行権限(x)が1つでも欠けているとファイルを開けません。 ディレクトリの実行権限(x)は「その中を通り抜ける(移動・アクセスする)権利」を意味するためです。 [1]
この権限の不整合を視覚的に一発で突き止められるコマンドが
namei -l /path/to/file です。ディレクトリの実行権限(x)の役割
- 読み取り権限(r): ディレクトリ内のファイル名一覧を取得できる(
lsができる)。 - 書き込み権限(w): ディレクトリ内にファイルを作ったり消したりできる。
- 実行権限(x): そのディレクトリを通り抜けて、配下のファイルやサブディレクトリにアクセスできる(
cdやパスの通過ができる)。 [1, 2, 3, 4]
ファイルが
r(読める)状態でも、途中のディレクトリが --x または r-x になっていないと、システムはそこから先へ進めず「Permission denied」になります。namei -l コマンドが強力な理由通常、
しかし、
ls -ld コマンドでは指定したファイルそのものの権限しか見えません。しかし、
namei -l を使うと、ルートディレクトリ(/)から目的のファイルに至るまでのすべての階層の権限を一覧で表示してくれます。出力例と見方
例えば、
/home/user/secret/data.txt というファイルを読みに行きたいとします。bash
$ namei -l /home/user/secret/data.txt
f: /home/user/secret/data.txt
drwxr-xr-x root root /
drwxr-xr-x root root home
drwx------ user user user
drwxr-xr-x user user secret
-rw-r--r-- user user data.txt
コードは注意してご使用ください。
上記の見方は以下の通りです。
- 左端の文字:
dはディレクトリ、-(またはf)は通常のファイルを示します。 - 文字列:
rwxr-xr-xなどが割り当てられている権限です。 - 右端:各階層のパーツ名です。 [1]
どこで「辿れなくなっている」かを見つける
もし別のユーザーがこのファイル(
data.txt)を読もうとした場合、ファイルの権限は -rw-r--r--(その他ユーザーも読める)ですが、user ディレクトリの権限が drwx------(所有者以外は何もできない)になっています。 [1]この時、
namei -l を実行すると、user ディレクトリのその他ユーザー(末尾3文字)が ---\ になっていることが一目でわかり、「あ、ここでブロックされているんだな」と原因を特定できます。解決方法
途中のディレクトリを通り抜けられるようにするには、該当するディレクトリに実行権限(x)を付加します。
- 特定のディレクトリを全ユーザーが通り抜けられるようにする:
bash
chmod o+x /home/userコードは注意してご使用ください。(※
o+xは「その他一般ユーザー(others)に実行権限を追加する」という意味です) [1]
