WEB ページが見れない

解いた人:momom-i

参照した問題・解説のサイト:WEB ページが見れない

使用環境・ツール

  • apache

問題文でされた操作

  1. apacheのDocumentRootを/var/www/htmlから/home/user/htmlに変更
  2. $curl http://127.0.0.1/home.htmlを実行

バグの内容

webサーバ上で$curl http://127.0.0.1/home.htmlをすると403エラーが返ってくる

理想の終了状態

  1. webサーバ上で$curl http://127.0.0.1/home.htmlをするとページが返ってくる。
  2. 再起動後も問題が解決している

考えられる原因

  • 権限がない
  • ドキュメントルートを宣言してるhttpd.confの記述に問題あり

解決方法

  • home.htmlの読み取り権限を付与
  • ドキュメントルートまでのディレクトリにも読み取り権限を付与
  • httpd.confのDirectoryセクションの設定で/home/user/htmlなどのパスがRequire all deniedになっていたら変更する
  • SELinuxの無効化 getenforceコマンドを打ってEnforcingと出る場合は、有効になっているらしい
setenforce 0

上記のコマンドを打つことで一時的に無効化することができるが、サーバの再起動後も無効化し続けるには、/etc/selinux/configにおいて、SELINUX=enforcingと書かれているところをSELINUX=disabledとする

  • SELinuxの有効化の状態で/home/user/htmlhttpd_sys_content_tタイプを付与 SELinuxはもしユーザが乗っ取られても、例えばhttpd_sys_content_tというタイプがファイルやディレクトリについていたら、httpdが実行するスクリプトでの読み込みしか許可しないので安全だよ〜という風に強固なセキュリティを提供するツールである。
ls -Z

まず上のコマンドで現在のディレクトリのSELinuxのタイプを確認することができる。

chconコマンドで一時的な付与ができるが、今回は再起動しても付与した状態にしたいので、 chconコマンドでも、実行後新たにrestoreconでタイプ再付与などしない限り、付与状態が続く。が、永続的に付与する場合は以下のコマンドの通りにする。

semanage fcontext -a -t httpd_sys_content_t /home/user/html
restorecon -RF /home/user/html

(https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security-enhanced_linux/sect-security-enhanced_linux-selinux_contexts_labeling_files-persistent_changes_semanage_fcontext 参照)

※参考※

  • ドキュメントルート:
    リクエストに対してどのファイルを送信するかを決定するときの Apache のデフォルトの動作は、リクエストの URL-Path (URL のホスト名と ポート番号の後に続く部分) を取り出して設定ファイルで指定されている DocumentRoot の最後に追加する、というものです。ですから、 DocumentRoot の下のディレクトリやファイルがウェブから見える基本のドキュメントの木構造を なします。(参考URLより)

  • SELinux:
    通常のパーミッションなどで防ぎきれないセキュリティを提供するもの。有効化していると余計な挙動をすることもあって、無効化することも多いらしいヨ。詳しいことは公式参考URLへ。(結構難しそう)

  • ドキュメントルート参考URL

  • [SELinux参考URL]

    1. https://eng-entrance.com/linux-selinux
    2. https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security-enhanced_linux/chap-security-enhanced_linux-working_with_selinux#sect-Security-Enhanced_Linux-Working_with_SELinux-SELinux_Packages (公式)

解説

  1. エラーログを見る (さっきの回答でログを確認すること忘れてた〜〜)
(13)Permission denied: [client 127.0.0.1:45546] AH00035: access to /home.html denied
  1. /home/user/htmlに一般ユーザの実行権を与える
sudo chmod o+x -R /home/user/html
  1. 再びエラーログを見る
SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
  1. SELinuxコンテキストのラベル付けをする
sudo chcon -R -t httpd_sys_content_t /home/user/html

(今回は無効化はなしという制約があったっぽい。semanage & restoreconコマンドの方でも○みたい。) chconはSELinuxコンテキスト変更のコマンド(参考) -R: ディレクトリの変更 -t: タイプの変更。タイプとはSELinuxが定めているパーミッション制御方法のこと!httpd_sys_content_tの詳細は上に書いてあって、他のタイプについては、ここ

  1. またまたエラーログを見る
[authz_core:error] [pid 18739] [client 127.0.0.1:45548] AH01630: client denied by server configuration: /home/user/html/home.html
  1. /etc/httpd/conf/httpd.confに追記する
<Directory "/home/user/html">
    AllowOverride None
        # Allow open access:
    Require all granted
</Directory>
7. curl成功
※変更後のapache再起動は省略してるWEB ページが見れない