ロリポップの事件が話題になっていますが、「『当社のパーミッションの設定不備を利用』されたことが原因」とのことです。 ここでは、備忘録を兼ねて Unix 系システムのパーミッションについてまとめてみたいと思います。
Unix 系パーミッションの基本
Wikipedia に詳しくまとまっているので、ここで細かくは書きませんが、「ユーザー=自分 (u)」、「グループ (g)」、「その他 (o)」の 3つのクラスに分けて管理しているというのがポイントです。 それと「リード (r)」、「ライト (w)」、「実行 (x)」ですね。
まず、わかりにくいのが、あるファイルにアクセスするためにディレクトリにどのパーミッションを設定すれば良いかです。 アクセスするには、そのファイルのフルパスのディレクトリ階層を辿っていく途中の全てのディレクトリに x が必要です。
つまり、自分のホームディレクトリのパーミッションを確認して x があるのが u (自分) のみであれば他のユーザーから (サブディレクトリ含めて) ホームディレクトリ以下にあるファイルにアクセスされることはありません。 該当ファイル (例えば wp-config.php) のパーミッションだけを見てもアクセス可能かどうかはわからないのです。
なお、ディレクトリに設定された r はそのディレクトリに存在するファイル名一覧を取得するためのパーミッションで、各ファイルの内容にアクセスできるかどうかとは関係ありません。
705 というパーミッション
某共有レンタルサーバーを契約して使ってみて最初に違和感を覚えたのは、ホームディレクトリのパーミッションが 705 になっていることでした。 以下のようになっているわけです。
drwx---r-x 11 blogger323 users 1024 Jul 13 19:33 ./
「その他 (o)」に「リード (r)」と「実行 (x)」が許可されているので、普通の感覚だと「あれ? ホームディレクトリが公開されてる?」と思うわけです。 しかし、これは共有レンタルサーバーであるが故の設定だったのです。 「グループ (g)」で許可がなければ「その他 (o)」が許可されていても同じグループのユーザーはアクセスが拒否されます。 この共有レンタルサーバーのユーザーは全て users グループのみに所属するよう設定されているのでしょう。 「同じグループには許可しないけれど、他のグループならばリードと実行オッケー!」というとトリッキーな感じがしますが、そう考えてみると納得できます。
では何故そこまでして「その他」にパーミッションを与えるのでしょう? 通常 Apache などのデーモン (サービス) は root でない、そのアプリケーション固有のランタイムユーザーID、グループID で実行されています。 そのため、それらのサービスがファイルにアクセスするために許可が必要なのです。 このようなときは私の感覚だとグループを使ってアクセス制御しそうになるのですが、共有サーバーではそれが難しいので「その他」に許可しているのです。
アプリケーションの設定
ファイルシステムのアクセス制御だけを考えるならばここまでで十分なのですが、実際にはサービス経由のアクセスも考慮する必要があります。 Apache サービスがファイルにアクセスできるので、Apache 経由で他のユーザーがアクセスできるようになっていないか、すなわち Apache の設定についても考慮が必要となるのです。
ロリポップの件ではここにも問題があったようで、SymLinksIfOwnerMatch が未設定だったためシンボリックリンク経由で他のユーザーのファイルを読み出せていたようです (参考)。
ロリポップの wp-config.php が 400 な件
ロリポップでは suEXEC を導入していて CGI の実行権限は各ユーザーの権限となるようです (参考)。 であれば、今回の対応で変更したように wp-config.php のパーミッションはオーナーのみアクセス可能な 400 で十分ということになります。
ついでの宣伝
今回は濡れ衣を着せられた WordPress ですが、テーマやプラグインは信頼できるところから入手したものでない限り使ってはなりません。 ブラウザの管理画面から新しいテーマやプラグインが導入できるということは WordPress、すなわち Apache サービスがファイルを書き換えることができるということです。 もちろん、WordPress はデータベースのデータの読み書きも可能です。 ということは WordPress で動作するテーマやプラグインに悪意のあるコードが含まれている場合はもちろん、脆弱性が含まれる場合も悲惨な結果を招いてしまいます。
ちなみに私はそうとうメジャーなものと自分で開発したもの (その1、その2) のみ使うようにしています。
あれ、タイトルが?
404 の話になってないし。ま、いっか…w