Apache nói DocumentRoot không tồn tại khi nó tồn tại


12

Tôi đã sử dụng Webmin để tạo Máy chủ ảo sau:

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

Và khi khởi động lại Apache, tôi nhận được

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

Vấn đề là, thư mục hoàn toàn KHÔNG tồn tại. Tôi đang nhìn chằm chằm vào nó. pwdcho tôi thấy đó là thư mục hiện tại của tôi, vv Không khó để đánh vần đúng. Tôi không thể tìm thấy bất kỳ lỗi hoặc cảnh báo nào khác trong nhật ký httpd. apache: apache sở hữu thư mục và tất cả các thư mục con / tập tin. Không có bất kỳ liên kết hoặc bất cứ điều gì liên quan ở đây. Tôi còn thiếu gì hay tôi nên xem xét điều gì khác để xác định lý do tại sao?

HĐH là CentOS 6.0


gửi cho người dùng Apache và xem liệu nó có thể truy cập được không DocumentRoot, điều đó có thể cung cấp cho bạn cái nhìn sâu sắc về những gì máy chủ web đang nhìn thấy. Bạn cũng có thể muốn kiểm tra các thư mục khác dọc theo đường dẫn, mặc dù nếu nó thực sự /var/www/không phải là vấn đề
voretaq7

Câu trả lời:


8

Điều đầu tiên xuất hiện trong đầu tôi là Apache có được phép truy cập vào thư mục đó không?

Ngoài ra, đây: /programming/3948038/apache-says-my-documentroot-directory-doesnt-exist


1
Như tôi đã nói, có thư mục được sở hữu bởi apache:apache, tuy nhiên tôi đã theo liên kết đó (đó là trên SO vì một số lý do?) Và thực sự TỰ TIN là vấn đề. SELinux gây ra nhiều vấn đề hơn là imo tốt.
Jake Wilson

Selinux ban đầu rất khó chịu, nhưng nếu bạn biết các lệnh để quản lý quyền truy cập, nó thực sự không đáng ngại. Đó là một công cụ tốt để sử dụng một khi bạn đã quen với nó.
Rilindo

Tôi gặp vấn đề tương tự (Không tồn tại trên symlink) và đang chạy setenforce 0nó, nhưng nhìn vào các quyền ls-laZ, symlink có các quyền giống như các tệp khác mà nó có thể truy cập, ngoài chmod. Các tệp là -rw-r - r-- và symlink là lrwxrwxrwx. Đó có thể là lý do nó không hoạt động với setenforce 1?
TMH

@JakeWilson SELinux khá bực bội khi bạn lần đầu làm quen với nó. Bạn càng học cách sử dụng nó, tôi hứa bạn sẽ đánh giá cao nó hơn nhiều.
Spencer Williams

16

Đây là một cách tiếp cận hướng dẫn cho trường hợp SELinux:

Tìm hiểu xem SELinux có hoạt động không:

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

Nếu vậy, một số kiểm tra so sánh có thể giúp đỡ. Chẳng hạn, một máy chủ có DocumentRoot mặc định tại /var/www/html, nhưng chúng tôi muốn nó ở một nơi khác như thế /path/to/document/root.

Nếu SELinux không chủ động gây rối với tài nguyên, ls -dZtrên thư mục sẽ hiển thị một cái gì đó như:

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

Mặt khác, nếu bối cảnh SELinux được áp dụng, ls -dZtrông giống như:

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

Nếu chúng ta so sánh với DocumentRoot đang hoạt động, nó sẽ trông giống như:

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

Các đối số _r_tliên quan đến -r( --role-t( --type) đến chcon. Đây là trang người đàn ông:

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

Đầu tiên, những điều sau đây có vẻ hiệu quả, nhưng có thể không.

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

Nếu máy chủ web vẫn không thể xem DocumentRoot, hãy lưu ý rằng bối cảnh hoàn toàn quan trọng đối với 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

Tại thời điểm này, máy chủ web có thể xem thư mục.

Vâng, tôi đã học được cách khó khăn tối nay.

LƯU Ý: Việc sử dụng chcon về mặt khái niệm có một nhược điểm trên mỗi tài liệu RedHat ( 5.6.1. Thay đổi tạm thời: chcon ) nêu rõ:

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.

Sử dụng semanagerestorecon để thực hiện các thay đổi lâu dài hơn. Một ví dụ ngắn gọn:

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

Liên quan đến restorecon , lưu ý rằng -F là bắt buộc để ảnh hưởng đến toàn bộ bối cảnh (tức là người dùng và loại). Ngoài ra, -R có nghĩa là thay đổi đệ quy. Các đối số -v hoặc -p có thể hiển thị tiến trình theo kiểu dài dòng hoặc ngắn gọn. Sử dụng -FRnv để xem điều gì sẽ xảy ra mà không thực sự thay đổi.

Khi semanage được sử dụng theo cách này, có thể xem các thay đổi bảo mật cục bộ bằng một lệnh như:

$ sudo semanage export

Đầu ra của xuất khẩu semanage có thể được lưu và sử dụng bằng cách nhập semanage để giúp áp dụng một tập hợp các thay đổi cho các hệ thống khác nhau dễ dàng hơn.

LƯU Ý: Câu trả lời này cung cấp ngữ cảnh loại cơ bản nhất cho trang web. Bảo mật có thể chi tiết hơn nhiều. Ví dụ: xem danh sách các loại có thể áp dụng cho các trang máy chủ web với lệnh như:

$ seinfo -t | grep http

LƯU Ý: Các tiện ích như semanageseinfo có thể không được cài đặt theo mặc định. Ít nhất là trên một số bản phân phối, các gói bắt buộc có thể được đặt tên giống như thế này:

policycoreutils-python
setools-console

Chi tiết, hoạt động và tiết kiệm rất nhiều thời gian - cảm ơn bạn!
NorthBridge

6

Nghe có vẻ như SELinux. Tôi sẽ đề nghị bạn làm việc với nó. Xem trong thư mục / var / log / Audit để xác nhận.

Trường hợp tệ hơn, bạn luôn có thể tắt selinux, như đã lưu ý trước đó, nhưng tôi khuyên bạn nên làm việc với nó thay thế. Chẳng hạn, nếu tôi tạo một thư mục để sử dụng với Apache, nó sẽ không có ngữ cảnh phù hợp, như đã lưu ý ở đây.

[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

Vì vậy, nếu điều đó xảy ra, tôi chỉ áp dụng bối cảnh từ một thư mục khác, trong trường hợp này là 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

Sử dụng lệnh này trong root để thay đổi bối cảnh bảo mật của http http_s_s__entent_t, cho phép Apache thực thi.

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

Sử dụng ls -dZ /var/www/whateverđể xem chi tiết vai trò bảo mật

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.