環境: AWS
サーバーソフト: Apache
サーバーサイド: Django
※最初になにがエラーを引き起こしているのかネタバレしますと、SELinuxです。
経緯
PythonのDjangoを使ってサーバーを作っていて、ディレクトリをドキュメントルート以外に設定していたらサーバーにアクセスできなくなりました。
最初にやったこと
Apache側でアクセスを許可しないようになっているかhttpdの設定ファイルを確認しても全部許可されています。
これはこれで問題ですが、設定ファイルが原因ではありませんでした。
次にやったこと
Apacheのエラーログを確認すると、こんなエラーが出ています。
Cannot serve directory /usr/Hoge/directory: No matching DirectoryIndex (index.html) found, and server-generated directory index forbidden by Options directive
Apacheさんがディレクトリにアクセスしようとして失敗していました。
ディレクトリのパーミッションが変わってしまったのかと思い、調べて見ると全ユーザーがアクセス可能な状態になっていました。
これはこれで問題ですが、パーミッションが原因ではないことがわかりました。
原因を特定
原因が分からず、エラーログを元にひたすら原因を探ってみると、SELinuxさんが原因だとわかりました。
SELinuxとは
ざっくり説明しますとアクセス制御を行うためのものです。
もともとパーミッションというユーザーによって行動(読み、書き、実行)権限を許可するものがあるのですが、rootはパーミッションを無視して好き放題することができるので、rootのパスワードが外部に漏れたりすると被害が甚大でした。
そこで、SELinuxさんが最小限の被害に留めてくれるようにしてくれます。
Root権限でも、アクセス制限を行うので大変ありがたいです。
直し方
1.諦めてDocumentルートに戻す
2.SELinuxをPermissiveモード(デバッグモード?)みたいにする
アクセスはできるけど、警告だけは出すという方法です。
setenforce 1
で設定できます。
systemctl restart httpd
でapatchを再起動させるとアクセスできます。
SELinuxを有効にする場合は、
setenforce 0
で出来ます。
3.chcon
コマンドを使ってアクセス権を与える
SELinuxのアクセス権限について設定?できるコマンドです
chcon -R -t httpd_sys_content_t /hoge_directory
注意
これは一時的なやりかたです。
restorecon
コマンドが呼ばれると、元の設定に戻ってしますので時間がある場合は設定ファイルを作りましょう。
まとめ
「なんでドキュメントルート以外で使うんだ」とか「Dockerとかで管理しないのか」などの疑問があるかと思いますが、単なる若気の至りです。