apacheでシンボリックリンクがForbiddenになる時は「SymLinksIfOwnerMatch」を疑おう
先日、とあるサーバーで、共通のディレクトリを各ユーザーがシンボリックリンクで読み込む、という構造のサイトを作った。
Aサーバーでは上手く言ったのだが、BサーバーではAccess Forbiddenエラーが出てしまった。
Forbidden
You don’t have permission to access /directory/ on this server.
Apache/2.2.3 (Red Hat) DAV/2 mod_auth_pgsql/2.0.3 PHP/5.2.17 mod_python/3.2.8 Python/2.4.3 mod_ssl/2.2.3 OpenSSL/0.9.8e-fips-rhel5 SVN/1.6.11 mod_perl/2.0.4 Perl/v5.8.8 Server at dacelo.info Port 80
「You don’t have permission to access」=「アクセス権がない」とのことで、試しにリンク元のディレクトリをリンク先のユーザーに合わせてみたら表示された。
パーミッションをchmodで777にするなどでは解決できなかった。
http.confでの「SymLinksIfOwnerMatch」
httpd.confを見てみると、シンボリックリンクに関する設定が変更されていた。
A.SymLinksIfOwnerMatch
<Directory /home/dacelo/public_html> AllowOverride All Options Indexes SymLinksIfOwnerMatch </Directory> |
この設定だと、シンボリックリンクがそのディレクトリの所有者(owner)に適合(Match)しないと表示されない、ということになる。
シンボリックリンクをユーザー間で有効にする通常の設定はこちら。
B.FollowSymLinks
<Directory /home/dacelo/public_html> AllowOverride All Options Indexes FollowSymLinks </Directory> |
(FollowSymLinks=シンボリックリンクをフォローする)
Aの場合は、例えばroot権限の重要なディレクトリにWeb上でシンボリックリンクが貼られたりすることがなくなるので、セキュリティ的には向上しますが、パフォーマンスが低下します。また、そもそもシンボリックリンクを使いたいときには困ってしまいます。
広告
Bの場合は便利ですが、上記理由からセキュリティ面ではちょっと不安があります。また、アクセスのたびにファイルやディレクトリーがシンボリックされているかどうかチェックするためにlstat 関数が実行されるので、パフォーマンスが若干低下します。
また、最近ロリポップ!サーバーへの攻撃で、シンボリックリンクの設定が利用された、という事例もありましたので注意したいところです。
ロリポップの共有 Web サービス下のサイト改ざん事件で、 攻撃手法の一つとして 「他ユーザー所有のファイルへのシンボリックリンクを自分のコンテンツディレクトリ下に作り、Apache HTTPD 経由でアクセスする」手順が利用されたらしい。
Apache HTTPD: `Options -FollowSymLinks` は不完全 – ダメ出し Blog”
技術メモ更新。apacheでシンボリックリンクがForbiddenになる時は「SymLinksIfOwnerMatch」を疑おう | Weblogy
apacheでシンボリックリンクがForbiddenになる時は「SymLinksIfOwnerMatch」を疑おう – Weblogy