コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
パーミッションと所有者
chmod 777 で動いた、で終わらせる前に
アップロードした画像が表示されない。検索して出てきた chmod -R 777 を打つと表示された。ここで解決にしてしまうと、そのディレクトリは「サーバーに入り込めた者なら誰でも、中のファイルを書き換えられる」状態になります。PHP や CGI が置かれていれば、書き換えた中身をそのまま実行させられます。
777 が何を許したのかを読めるようになれば、必要な分だけ開けられます。
3 種類の相手に、3 種類の許可
ls -l の左端は 10 文字です。先頭の 1 文字は種類(- がファイル、d がディレクトリ)で、残りの 9 文字が 3 文字ずつ 3 組に分かれています。
プレーンテキスト
-rw-r--r-- 1 alice users 240 Aug 20 11:00 memo.txt
^^^ 所有者 alice に許すこと
^^^ 所有グループ users のメンバーに許すこと
^^^ それ以外の全員に許すこと各組は読み・書き・実行の順で、許すなら r w x、許さないなら - が入ります。OS はアクセスのたびに、要求してきた相手が所有者か、グループのメンバーか、それ以外かを判定し、当てはまる 3 文字だけを見ます。
数字表記は、この 3 文字を 2 進数と見なして 8 進数 1 桁に潰したものです。rw- は 110 で 6、r-- は 100 で 4、rwx は 111 で 7。だから上の状態は 644 で、chmod 777 は 3 種類の相手すべてに rwx を与えたことになります。
ターミナル
chmod 644 memo.txt # 所有者だけ書ける。読むのは全員
chmod 600 id_rsa # 所有者だけ読み書き。秘密鍵はこれ以外にしない
chmod 755 deploy.sh # 所有者だけ書ける。実行は全員SSH の秘密鍵が 644 だと、ssh は接続そのものを拒否します。他人に読める場所に鍵を置いている、という理由です。
ディレクトリの x は実行ではない
同じ 3 文字でも、ディレクトリでは意味がずれます。r は中の名前の一覧が取れること、w は中にファイルを作ったり消したりできること、そして x は そのディレクトリを通り抜けられること です。ディレクトリを実行する場面はありません。
ここが噛み合わないと、不思議な症状が出ます。r だけあって x が無いと、ls はできるのに cd も、中のファイルを開くこともできません。逆に x だけあって r が無いと、一覧は取れないのに、名前を正確に知っていればそのファイルは開けます。
もう 1 つ、ファイルを消せるかどうかを決めるのは、そのファイル自身の権限ではなく 親ディレクトリの w です。読み取り専用のファイルでも、親ディレクトリに書き込めるなら消せます。/tmp が誰でも書けるのに他人のファイルは消せないのは、この既定を打ち消す sticky bit が付いているからです。