Apacheは、DocumentRootが存在するときに存在しないと言います


12

Webminを使用して、次の仮想ホストを作成しました。

<VirtualHost *:80>
        DocumentRoot "/var/www/whatever"
        ServerName whatever.ourdomain
        <Directory "/var/www/whatever">
                allow from all
                Options +Indexes
        </Directory>
</VirtualHost>

そして、Apacheを再起動すると

Starting httpd: Warning: DocumentRoot [/var/www/whatever] does not exist

問題は、ディレクトリが絶対に存在するということです。私はそれを見つめています。pwd現在のディレクトリなどが表示されます。正確につづるのはそれほど難しくありません。httpdログに他のエラーや警告が見つかりません。apache:apacheは、ディレクトリとすべてのサブディレクトリ/ファイルを所有します。ここには、シンボリックリンクなどは一切関係ありません。何が欠けているのか、なぜそうなのかを判断するために他に何を検討すべきですか?

OSはCentOS 6.0です


Apacheユーザーにsuを実行し、ApacheユーザーがにアクセスできるDocumentRootかどうかを確認します。これにより、Webサーバーが見ているものについての洞察が得られる場合があります。パスに沿って他のディレクトリを確認することもできますが、それが本当に/var/www/それらの下にある場合は問題になりません
-voretaq7

回答:


8

頭に浮かんだ最初のことは、Apacheがそのディレクトリにアクセスする許可を持っているかどうかです。

また、これ:https : //stackoverflow.com/questions/3948038/apache-says-my-documentroot-directory-doesnt-exist


1
私が言ったように、はい、ディレクトリはによって所有されていますがapache:apache、そのリンクをたどり(何らかの理由でSOにありますか?)、実際にSELinuxが問題でした。SELinuxはより良い問題を引き起こすより多くの問題を引き起こします。
ジェイクウィルソン

selinuxは最初は迷惑ですが、アクセスを管理するためのコマンドを知っていれば、実際にはそれほど面倒ではありません。慣れたらすぐに使えるツールです。
リリンド

私は同じ問題を抱えており(シンボリックリンクには存在しません)、それをsetenforce 0修正して実行しましたが、パーミッションを見るls-laZと、シンボリックリンクはchmodを除いて、アクセスできる他のファイルと同じパーミッションを持っています。ファイルは-rw-r--r--で、シンボリックリンクはlrwxrwxrwxです。それがsetenforce 1で動作しない理由でしょうか?
TMH

@JakeWilson SELinuxは、最初に慣れたときにはかなりイライラします。あなたがそれを使用する方法を学ぶほど、私はあなたがそれをもっと感謝することを約束します。
スペンサーウィリアムズ

16

SELinuxの場合のチュートリアルアプローチは次のとおりです。

SELinuxがアクティブかどうかを確認します。

 $ sestatus
 SELinux status:                 enabled
 SELinuxfs mount:                /selinux
 Current mode:                   enforcing
 Mode from config file:          enforcing
 Policy version:                 24
 Policy from config file:        targeted

その場合、いくつかの比較チェックが役立つ場合があります。たとえば、サーバーにはデフォルトのDocumentRootがありますが、の/var/www/htmlような別の場所に配置する必要があります/path/to/document/root

SELinuxがリソースを積極的にいじっていない場合ls -dZ、ディレクトリには次のようなものが表示されます。

$ ls -dZ /path/to/document/root
? /path/to/document/root/

一方、SELinuxコンテキストが適用される場合、ls -dZ次のようになります。

$ ls -dZ /path/to/document/root
drwxrws--x+ cfgadm cfgadmin system_u:object_r:file_t:s0 /path/to/document/root

作業中のDocumentRootと比較すると、次のようになります。

$ ls -dZ /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html

_r_tに関連する-r--role-t--type引数)chconここでは、カットダウンのmanページです。:

NAME
   chcon - change file security context

SYNOPSIS
   chcon [OPTION]... CONTEXT FILE...
   chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
   chcon [OPTION]... --reference=RFILE FILE...

DESCRIPTION
   Change the security context of each FILE to CONTEXT.  With --reference,
   change the security context of each FILE to that of RFILE.

   --reference=RFILE
          use RFILE's security context rather than  specifying a CONTEXT value

   -R, --recursive
          operate on files and directories recursively

最初は、次のように見えるかもしれませんが、うまくいかないかもしれません。

$ sudo chcon -R -t httpd_sys_content_t /path/to/document/root

それでもWebサーバーがDocumentRootを表示できない場合は、コンテキストがルートまでさかのぼって重要であることに注意してください。

$ sudo chcon -R -t httpd_sys_content_t /path/to/document
$ sudo chcon -R -t httpd_sys_content_t /path/to
$ sudo chcon -R -t httpd_sys_content_t /path

この時点で、Webサーバーはディレクトリを見ることができます。

はい、今夜は苦労しました。

注:chconの使用には、概念的にRedHatのドキュメント(5.6.1。一時的な変更:chcon)ごとに次のような欠点があります。

The chcon command changes the SELinux context for files. However, changes
made with the chcon command do not survive a file system relabel, or the
execution of the restorecon command.

semanagerestoreconを使用して、より永続的な変更を加えます。簡単な例:

 $ sudo semanage fcontext --add -t httpd_sys_content_t -s system_u \
     "/path/to/document/root(/.*)?"
 $ sudo restorecon -FR /path/to/document/root

restoreconに関しては、コンテキスト全体(つまり、ユーザーとタイプ)に影響を与えるために-Fが必要であることに注意してください。また、-Rは再帰的に変更を行うことを意味します。引数-vまたは-pは、詳細形式または簡潔形式で進行状況を表示できます。-FRnvを使用して、実際に変更を加えずに何が起こるかを確認します。

一度semanageは、このように使用され、のようなコマンドを使用してローカルセキュリティ変更を表示することが可能です。

$ sudo semanage export

semanageエクスポートの出力を保存してsemanageインポートで使用すると、さまざまなシステムに一連の変更を簡単に適用できます。

注:この回答は、サイトの最も基本的なタイプコンテキストを提供します。セキュリティはさらに細かくすることができます。たとえば、次のようなコマンドを使用して、Webサーバーページに適用できるタイプのリストを参照してください。

$ seinfo -t | grep http

注:semanageseinfoなどのユーティリティは、デフォルトではインストールされない場合があります。少なくとも一部のディストリビューションでは、必要なパッケージの名前は次のようになります。

policycoreutils-python
setools-console

詳細、機能し、多くの時間を節約します-ありがとう!
ノースブリッジ14

6

SELinuxのように聞こえます。/ var / log / auditディレクトリを確認して確認します。

さらに悪いことに、前述のようにselinuxをいつでもオフにできますが、代わりに使用することをお勧めします。たとえば、Apacheで使用するディレクトリを作成する場合、ここで説明したように、適切なコンテキストがありません。

[root@amp23140 www]# ls -Z
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 error
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 icons
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 whatever

その場合、コンテキストを別のディレクトリ(この場合はhtml)から適用するだけです:

[root@amp23140 www]# chcon whatever --reference=html
[root@amp23140 www]# ls -lZ
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 error
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 icons
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 whatever

0

rootでこのコマンドを使用して、Apacheの実行を許可する「httpd_sys_content_t」のセキュリティコンテキストを変更します。

chcon -R -h -t httpd_sys_content_t /var/www/whatever

ls -dZ /var/www/whatever詳細セキュリティロールの表示に使用

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.