LoginSignup
8
5

More than 3 years have passed since last update.

ドキュメントルート以外でアクセスするようにしたらアクセスできなくなった。

Last updated at Posted at 2018-04-26

環境: 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とかで管理しないのか」などの疑問があるかと思いますが、単なる若気の至りです。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5