Apache mengatakan DocumentRoot tidak ada saat itu

12

Saya menggunakan Webmin untuk membuat Host Virtual berikut:

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

Dan ketika me-restart Apache saya dapatkan

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

Masalahnya, direktori itu TIDAK ADA. Saya menatapnya. pwdmenunjukkan kepada saya bahwa itu adalah direktori saya saat ini, dll. Tidak sulit untuk mengejanya dengan benar. Saya tidak dapat menemukan kesalahan atau peringatan lain di log httpd. apache: apache memiliki direktori dan semua subdirektori / file. Tidak ada symlink atau apapun yang terlibat di sini. Apa yang saya lewatkan atau apa lagi yang harus saya perhatikan untuk mengetahui mengapa ini terjadi?

OS adalah CentOS 6.0

Jake Wilson
sumber
su ke pengguna Apache dan melihat apakah itu dapat mengakses DocumentRoot, yang mungkin memberi Anda beberapa wawasan tentang apa yang dilihat server web. Anda mungkin juga ingin memeriksa direktori lain di sepanjang jalan, meskipun jika itu benar-benar di bawah /var/www/itu seharusnya tidak menjadi masalah
voretaq7

Jawaban:

8

Hal pertama yang muncul di pikiran saya adalah apakah Apache memiliki izin untuk mengakses direktori itu?

Juga, ini: /programming/3948038/apache-says-my-documentroot-directory-doesnt-exist

yrosen
sumber
1
Seperti yang saya katakan, ya direktori dimiliki oleh apache:apache, namun saya mengikuti tautan itu (yang ada di SO untuk beberapa alasan?) Dan memang SELinux adalah masalahnya. SELinux menyebabkan lebih banyak masalah yang tidak baik imo.
Jake Wilson
selinux memang menyebalkan pada awalnya, tetapi jika Anda tahu perintah untuk mengelola akses, itu sebenarnya tidak menakutkan. Ini adalah alat yang baik untuk digunakan setelah Anda terbiasa.
Rilindo
Saya memiliki masalah yang sama (Tidak ada pada symlink), dan menjalankan setenforce 0memperbaikinya, tetapi melihat izin ls-laZ, symlink memiliki izin yang sama dengan file lain yang dapat diakses, selain dari chmod. File-file tersebut adalah -rw-r - r--, dan symlinknya adalah lrwxrwxrwx. Mungkinkah itu alasannya tidak bekerja dengan setenforce 1?
TMH
@JakeWilson SELinux agak membuat frustrasi ketika Anda pertama kali terbiasa. Semakin banyak Anda belajar bagaimana menggunakannya, saya berjanji Anda akan lebih menghargainya.
Spencer Williams
16

Berikut ini adalah pendekatan tutorial untuk kasus SELinux:

Cari tahu apakah SELinux aktif:

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

Jika demikian, beberapa pemeriksaan komparatif mungkin membantu. Misalnya, server memiliki DocumentRoot default di /var/www/html, tetapi kami menginginkannya di tempat lain seperti /path/to/document/root.

Jika SELinux tidak secara aktif mengacaukan sumber daya, ls -dZpada direktori akan muncul sesuatu seperti:

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

Di sisi lain, jika konteks SELinux diterapkan, ls -dZlebih mirip:

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

Jika kita dibandingkan dengan DocumentRoot yang berfungsi, itu akan terlihat seperti:

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

The _rdan _tberhubungan dengan -r( --roledan -t( --type) argumen untuk chconBerikut ini adalah cut-down halaman manual.:

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

Pada tebakan pertama, yang berikut ini sepertinya berhasil, tetapi mungkin tidak.

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

Jika server web masih tidak dapat melihat DocumentRoot, perhatikan bahwa konteks sangat penting untuk kembali ke root:

$ 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

Pada titik ini, server web dapat melihat direktori.

Ya, saya belajar dengan cara yang sulit malam ini.

CATATAN: Penggunaan chcon secara konseptual memiliki kelemahan per dokumentasi RedHat ( 5.6.1. Perubahan Sementara: chcon ) yang menyatakan:

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.

Gunakan semanage dan restorecon untuk membuat perubahan yang lebih permanen. Contoh singkat:

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

Sehubungan dengan restorecon , perhatikan bahwa -F diperlukan untuk mempengaruhi seluruh konteks (yaitu pengguna dan tipe). Juga, -R berarti melakukan perubahan secara rekursif. Argumen -v atau -p dapat menunjukkan kemajuan baik secara verbose atau singkat. Gunakan -FRnv untuk melihat apa yang akan terjadi tanpa benar-benar membuat perubahan.

Setelah semanage digunakan dengan cara ini, dimungkinkan untuk melihat perubahan keamanan lokal dengan perintah seperti:

$ sudo semanage export

Output dari ekspor semanage dapat disimpan dan digunakan oleh impor semanage untuk membuatnya lebih mudah untuk menerapkan satu set perubahan ke berbagai sistem.

CATATAN: Jawaban ini memberikan konteks tipe paling dasar untuk situs. Keamanan bisa jauh lebih terperinci. Misalnya, lihat daftar jenis yang dapat diterapkan ke halaman server web dengan perintah seperti:

$ seinfo -t | grep http

CATATAN: Utilitas seperti semanage dan seinfo mungkin tidak diinstal secara default. Setidaknya pada beberapa distribusi, paket-paket yang diperlukan dapat dinamai seperti ini:

policycoreutils-python
setools-console
kbulgrien
sumber
Detail, bekerja, dan menghemat banyak waktu - terima kasih!
NorthBridge
6

Kedengarannya seperti SELinux. Saya akan menyarankan Anda bekerja dengannya. Lihat di direktori / var / log / audit untuk mengonfirmasi.

Kasus yang lebih buruk, Anda selalu dapat mematikan selinux, seperti disebutkan sebelumnya, tetapi saya sarankan Anda bekerja dengannya. Sebagai contoh, jika saya membuat direktori untuk digunakan dengan Apache, itu tidak akan memiliki konteks yang tepat, seperti disebutkan di sini.

[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

Jadi jika itu terjadi, saya hanya menerapkan konteks dari direktori lain, yang dalam hal ini adalah 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
Rilindo
sumber
0

Gunakan perintah ini di root untuk mengubah konteks keamanan "httpd_sys_content_t" yang memungkinkan Apache untuk mengeksekusi.

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

Gunakan ls -dZ /var/www/whateveruntuk melihat detail peran keamanan

pengguna236790
sumber