Apache, DocumentRoot'un mevcut olduğunda mevcut olmadığını söylüyor


12

Webmin'i aşağıdaki Sanal Ana Bilgisayarı oluşturmak için kullandım:

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

Ve Apache'yi yeniden başlatırken

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

Mesele şu ki, dizin kesinlikle var. Tam bakıyorum. pwdbana şu anki dizinimi gösterir, vb. Doğru hecelemek o kadar da zor değil. Httpd günlüklerinde başka hata veya uyarı bulamıyorum. apache: apache dizinin ve tüm alt dizinlerin / dosyaların sahibidir. Burada herhangi bir sembolik veya herhangi bir şey yoktur. Neyin eksik olduğunu veya bunun neden olduğunu belirlemek için başka nelere bakmalıyım?

İşletim Sistemi CentOS 6.0


su için Apache kullanıcısına gidin ve DocumentRootweb sunucusunun gördükleri hakkında bir fikir verebilir. Ayrıca, yolun altındaki diğer dizinleri de kontrol etmek isteyebilirsiniz, ancak bu gerçekten altındaysa /var/www/bir sorun olmamalı
voretaq7

Yanıtlar:


8

Aklıma ilk gelen şey Apache'nin bu dizine erişim izni var mı?

Ayrıca, bu: /programming/3948038/apache-says-my-documentroot-directory-doesnt-exist


1
Dediğim gibi, evet dizin sahibi apache:apache, ancak bu bağlantıyı izledim (bir nedenle SO?) Ve gerçekten SELinux sorun oldu. SELinux daha iyi sorunlara neden olur.
Jake Wilson

selinux ilk başta sinir bozucu, ancak erişimi yönetmek için komutları biliyorsanız, aslında göz korkutucu değildir. Alıştıktan sonra kullanmak için iyi bir araçtır.
Rilindo

Ben aynı sorun vardı (Bir symlink üzerinde yok) ve çalışan setenforce 0sabit, ama izinleri bakarak ls-laZ, symlink chmod dışında erişebileceği diğer dosyalarla aynı izinlere sahiptir. Dosyalar -rw-r - r-- ve sembolik lrwxrwxrwx. Setenforce 1 ile çalışmamasının nedeni bu olabilir mi?
TMH

@JakeWilson SELinux, ilk alıştığınız zaman oldukça sinir bozucudur. Nasıl kullanacağınızı daha fazla öğrenirseniz, çok daha fazla takdir edeceğinize söz veriyorum.
Spencer Williams

16

İşte SELinux vakasına öğretici bir yaklaşım:

SELinux'un aktif olup olmadığını öğrenin:

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

Eğer öyleyse, bazı karşılaştırmalı kontroller yardımcı olabilir. Örneğin, bir sunucunun varsayılan DocumentRoot değeri vardır /var/www/html, ancak başka bir yerde istiyoruz /path/to/document/root.

SELinux kaynakla aktif olarak uğraşmıyorsa ls -dZ, dizinde şöyle bir şey gösterilir:

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

Öte yandan, SELinux bağlamları uygulanırsa, ls -dZdaha çok benzer:

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

Çalışan bir DocumentRoot ile karşılaştırırsak, şöyle görünür:

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

Ve _rile _tilgili -r( --roleve -t( --type) bağımsız değişkenleri ile ilgilidir 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

İlk başta, aşağıdakiler işe yarayabilir, ancak işe yaramayabilir.

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

Web sunucusu yine de DocumentRoot'u göremiyorsa, içeriğin köküne kadar tamamen önemli olduğunu unutmayın:

$ 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

Bu noktada, web sunucusu dizini görebilir.

Evet, bu gece zor yolu öğrendim.

NOT: Chcon kullanımının kavramsal olarak RedHat belgelerine ( 5.6.1. Geçici Değişiklikler: chcon ) göre aşağıdakileri gösteren bir dezavantajı vardı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.

Daha kalıcı değişiklikler yapmak için semanage ve restorecon'u kullanın . Kısa bir örnek:

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

Restorecon ile ilgili olarak , tüm bağlamı (yani kullanıcı ve tip) etkilemek için -F gerektiğini unutmayın . Ayrıca, -R özyineli olarak değişiklik yapmak anlamına gelir. -V veya -p bağımsız değişkenleri , ayrıntılı veya kısa bir şekilde ilerleme gösterebilir. Herhangi bir değişiklik yapmadan ne olacağını görmek için -FRnv kullanın .

Bir kez semanage bu şekilde kullanıldığında, şu komutu kullanarak yerel güvenlik değişikliklerini görüntülemek mümkündür:

$ sudo semanage export

Semanage dışa aktarımının çıktısı, çeşitli sistemlere bir dizi değişikliğin uygulanmasını kolaylaştırmak için semanage ithalatı tarafından kaydedilebilir ve kullanılabilir .

NOT: Bu yanıt, bir site için en temel tür bağlamını sağlar. Güvenlik çok daha ayrıntılı olabilir. Örneğin, aşağıdaki gibi bir komutla web sunucusu sayfalarına uygulanabilecek türlerin listesine bakın:

$ seinfo -t | grep http

NOT: Semanage ve seinfo gibi yardımcı programlar varsayılan olarak yüklenmeyebilir. En azından bazı dağıtımlarda, gerekli paketler şu şekilde adlandırılabilir:

policycoreutils-python
setools-console

Ayrıntılı, çalışır ve çok zaman kazandırır - teşekkür ederim!
NorthBridge

6

SELinux gibi geliyor, onunla çalışmanızı öneririm. Onaylamak için / var / log / audit dizinine bakın.

Daha da kötüsü, daha önce belirtildiği gibi selinux'u her zaman kapatabilirsiniz, ancak bununla çalışmanızı öneririm. Örneğin, Apache ile kullanmak için bir dizin oluşturacak olsaydım, burada belirtildiği gibi doğru içeriğe sahip olmayacaktır.

[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

Bu durumda, ben sadece bu durumda html olan başka bir dizinden bağlam uygulamak:

[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

Apache'nin çalışmasına izin veren “httpd_sys_content_t” güvenlik içeriğini değiştirmek için bu komutu kökten kullanın.

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

ls -dZ /var/www/whateverGüvenlik rollerinin ayrıntılarını görüntülemek için kullanın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.