page counter next up previous contents
Next: 關閉目錄瀏覽 Up: 安全 Apache 2.4 網站 Previous: 網頁存取用戶   Contents   DYWANG_HOME

限制網頁根目錄外的存取

  1. 網站預設根目錄 /var/www/html,限制這個目錄上層檔案的存取,可以避免攻擊存取系統檔案。直接在網址上以 ../ 連結上層目錄也無法跳脫這個目錄,但在 httpd.conf 若設定別名就可連上 /var/www/html 根目錄以外的檔案目錄,下例中 /dyw 指向 /mnt/www,也就是連線 http://kvm6.deyu.wang/dyw 時會讀取 /mnt/www 下的資料。
    [root@kvm3 ~]# vim /etc/httpd/conf/httpd.conf 
    [root@kvm3 ~]# grep alias_module -A35 /etc/httpd/conf/httpd.conf | egrep -v '(#|^$)'
    <IfModule alias_module>
        Alias /dyw "/mnt/www"
        ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
    </IfModule>
    
  2. 此時的最上層目錄 / 設定並沒有限制存取。
    [root@kvm3 ~]# grep '<Directory />' -A5 /etc/httpd/conf/httpd.conf | egrep -v '(#|^$)'
    <Directory />
        AllowOverride none
        Require all granted
    </Directory>
    
  3. 上述設定有風險,不應該做這樣的設定,而是只開放 /mnt/www 就好﹗
    [root@kvm3 ~]# vim /etc/httpd/conf/httpd.conf 
    [root@kvm3 ~]# grep '<Directory />' -A10 /etc/httpd/conf/httpd.conf | egrep -v '(#|^$)'
    <Directory />
        AllowOverride none
        Require all denied
    </Directory>
    <Directory /mnt/www>
        AllowOverride none
        Require all granted
    </Directory>
    
  4. 建立測試目錄 /mnt/www,目錄有一網頁 c.html。
    [root@kvm3 ~]# mkdir /mnt/www
    [root@kvm3 ~]# echo 'abc' > /mnt/www/c.html
    
  5. 重新啟動 httpd 服務。
    [root@kvm3 ~]# systemctl restart httpd.service
    
  6. 連線 http://kvm3.deyu.wang/dyw/c.html,還是回應無法存取。
    [root@kvm3 ~]# curl -s http://kvm3.deyu.wang/dyw/c.html
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>403 Forbidden</title>
    </head><body>
    <h1>Forbidden</h1>
    <p>You don't have permission to access /dyw/c.html
    on this server.</p>
    </body></html>
    
  7. 關閉 SELinux 後可以正常存取 c.html,表示 SELinux 管控。
    [root@kvm3 ~]# setenforce 0
    [root@kvm3 ~]# curl -s http://kvm3.deyu.wang/dyw/c.html
    abc
    
  8. 查看 /mnt/www/ 目錄下的檔案 c.html selinux content 為 mnt_t,/var/www/html 目錄下的檔案 selinux content 為 httpd_sys_content_t
    [root@kvm3 ~]# ll -Z /mnt/www/
    -rw-r--r--. root root unconfined_u:object_r:mnt_t:s0   c.html
    [root@kvm3 ~]# ll -Z /var/www/html/
    -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 aaa.html
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 bbb.html
    drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 confidential
    -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
    -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 webapp.wsgi
    
  9. 將 /mnt/www 目錄及目錄下的所有檔案的 selinux content 都改為 httpd_sys_contetn_t
    [root@kvm3 ~]# semanage fcontext -a -t httpd_sys_content_t "/mnt/www(/.*)?"
    [root@kvm3 ~]# restorecon -Rv /mnt/www
    restorecon reset /mnt/www/c.html context unconfined_u:object_r:mnt_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
    
  10. 開啟 selinux,已可以正常存取 c.html。
    [root@kvm3 ~]# setenforce 1
    [root@kvm3 ~]# curl -s http://kvm3.deyu.wang/dyw/c.html
    abc
    



De-Yu Wang 2020-05-19