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 เป็นเจ้าของไดเรกทอรีและไดเรกทอรีย่อย / ไฟล์ทั้งหมด ไม่มีการเชื่อมโยงหรืออะไรที่เกี่ยวข้องกับที่นี่ ฉันจะพลาดอะไรไปหรือควรจะพิจารณาอะไรอีก

ระบบปฏิบัติการคือ CentOS 6.0


su สำหรับผู้ใช้ Apache และดูว่าสามารถเข้าถึงได้DocumentRootหรือไม่ซึ่งอาจให้ข้อมูลเชิงลึกเกี่ยวกับสิ่งที่เว็บเซิร์ฟเวอร์เห็น คุณอาจต้องการตรวจสอบไดเรกทอรีอื่น ๆ ตามเส้นทางแม้ว่ามัน/var/www/จะไม่เป็นปัญหา
ก็ตาม

คำตอบ:


8

สิ่งแรกที่ผุดขึ้นในใจของฉันคือ Apache มีสิทธิ์เข้าถึงไดเรกทอรีนั้นหรือไม่?

นอกจากนี้: /programming/3948038/apache-says-my-documentroot-directory-doesnt-exist


1
อย่างที่ฉันบอกว่าใช่ไดเรกทอรีเป็นเจ้าของapache:apacheแต่ฉันไปตามลิงค์นั้น (นั่นคือใน SO ด้วยเหตุผลบางอย่าง?) และแน่นอน SELinux เป็นปัญหา SELinux ทำให้เกิดปัญหามากขึ้นว่า imo ดี
Jake Wilson

selinux นั้นน่ารำคาญในตอนแรก แต่ถ้าคุณรู้ว่าคำสั่งในการจัดการการเข้าถึงมันเป็นเรื่องที่ไม่น่ากลัว มันเป็นเครื่องมือที่ดีที่จะใช้เมื่อคุณคุ้นเคยกับมัน
Rilindo

ฉันมีปัญหาเดียวกัน (ไม่มีอยู่ใน symlink) และเรียกใช้setenforce 0แก้ไข แต่การดูที่สิทธิ์ls-laZsymlink มีสิทธิ์เช่นเดียวกับไฟล์อื่น ๆ ที่สามารถเข้าถึงได้นอกเหนือจาก chmod ไฟล์คือ -rw-r - r-- และ symlink คือ lrwxrwxrwx นั่นอาจเป็นเหตุผลว่าทำไมมันไม่ทำงานกับ setenforce 1
TMH

@JakeWilson SELinux ค่อนข้างน่าผิดหวังเมื่อคุณคุ้นเคยกับมันเป็นครั้งแรก ยิ่งคุณเรียนรู้วิธีการใช้งานมากขึ้นฉันสัญญาว่าคุณจะประทับใจมากยิ่งขึ้น
Spencer Williams

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นี่คือการตัดลงหน้าคน.

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

หากเว็บเซิร์ฟเวอร์ยังมองไม่เห็น 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

ณ จุดนี้เว็บเซิร์ฟเวอร์สามารถดูไดเรกทอรี

ใช่ฉันเรียนรู้วิธีที่ยากในคืนนี้

หมายเหตุ: การใช้chcon conceptually มีข้อเสียต่อเอกสาร 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.

ใช้semanageและrestoreconเพื่อทำการเปลี่ยนแปลงเพิ่มเติมอย่างถาวร ตัวอย่างสั้น ๆ :

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

สำหรับการคืนค่าโปรดทราบว่า-Fจำเป็นต้องมีผลกับบริบททั้งหมด (เช่นผู้ใช้และประเภท) นอกจากนี้-Rหมายถึงการเปลี่ยนแปลงแบบวนซ้ำ อาร์กิวเมนต์-vหรือ-pสามารถแสดงความคืบหน้าในแบบ verbose หรือ terse ใช้-FRnvเพื่อดูว่าจะเกิดอะไรขึ้นหากไม่มีการเปลี่ยนแปลงใด ๆ

เมื่อใช้semanageด้วยวิธีนี้คุณสามารถดูการเปลี่ยนแปลงความปลอดภัยในเครื่องได้ด้วยคำสั่งเช่น:

$ sudo semanage export

ผลลัพธ์ของการส่งออก semanageอาจถูกบันทึกและใช้โดยการนำเข้า semanageเพื่อให้ง่ายต่อการใช้ชุดของการเปลี่ยนแปลงกับระบบต่าง ๆ

หมายเหตุ: คำตอบนี้ให้บริบทประเภทพื้นฐานที่สุดสำหรับไซต์ ความปลอดภัยอาจมีความละเอียดมากยิ่งขึ้น ตัวอย่างเช่นดูรายการประเภทที่สามารถใช้กับหน้าเว็บเซิร์ฟเวอร์ด้วยคำสั่งเช่น:

$ seinfo -t | grep http

หมายเหตุ: ยูทิลิตี้เช่นsemanageและseinfoอาจไม่ได้รับการติดตั้งโดยค่าเริ่มต้น อย่างน้อยในการแจกแจงแพคเกจที่จำเป็นอาจมีชื่อดังนี้:

policycoreutils-python
setools-console

รายละเอียดทำงานและประหยัดเวลาได้มาก - ขอบคุณ!
NorthBridge

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

ใช้คำสั่งนี้ในรูทเพื่อเปลี่ยนบริบทความปลอดภัยของ“ httpd_sys_content_t” ซึ่งอนุญาตให้ Apache เรียกใช้งาน

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.