隨筆-295  評論-26  文章-1  trackbacks-0
          將DocumentRoot設在/var/www/html下可以訪問
          但是將DocumentRoot設在其他目錄(如:/webroot)下就出現Forbidden了。在./etc/httpd/conf/httpd.conf中的相關部分是這樣的:
          Alias /query "/home/query"

          Options Indexes MultiViews
          AllowOverride None

          Order allow,deny
          Allow from all

          但是在瀏覽器中輸入:http://localhost/query/ 時,出現Forbidden:

          Forbidden

          You don't have permission to access /query on this server.

          Additionally, a 403 Forbidden error was encountered while trying to use an ErrorDocument to handle the request.
          Apache/2.0.52 (Red Hat) Server at localhost Port 80


          對于剛使用Redhat Enterprise Linux4 或Fedora Core 2以上/CentOS 4的用戶,一定會為Apache經常無法正常運轉,報以"Permission denied"等錯誤而大為不解,甚至大為惱火。

          其實這是因為這些系統里激活了SELinux,而用戶的apache配置與SELinux的配置策略有抵觸產生的,只有通過適當調整,使apache的配置和訪問符合策略才能正常使用。

          現在下面來分析一下SELinux中有關httpd(apache)的context定義(略有刪節)

          /home/[^/]+/((www)|(web)|(public_html))(/.+)? system_u:object_r:httpd_user_content_t
          /var/www(/.*)? system_u:object_r:httpd_sys_content_t
          /var/www/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_exec_t
          /usr/lib/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_exec_t
          /var/www/perl(/.*)? system_u:object_r:httpd_sys_script_exec_t
          /var/www/icons(/.*)? system_u:object_r:httpd_sys_content_t
          /var/cache/httpd(/.*)? system_u:object_r:httpd_cache_t
          /etc/vhosts -- system_u:object_r:httpd_config_t
          /usr/sbin/httpd -- system_u:object_r:httpd_exec_t
          /usr/sbin/apache(2)? -- system_u:object_r:httpd_exec_t
          /usr/sbin/suexec -- system_u:object_r:httpd_suexec_exec_t
          /var/log/httpd(/.*)? system_u:object_r:httpd_log_t
          /var/log/apache(2)?(/.*)? system_u:object_r:httpd_log_t
          /var/log/cgiwrap.log.* -- system_u:object_r:httpd_log_t
          /var/cache/ssl.*.sem -- system_u:object_r:httpd_cache_t
          /var/cache/mod_ssl(/.*)? system_u:object_r:httpd_cache_t
          /var/run/apache(2)?.pid.* -- system_u:object_r:httpd_var_run_t
          /var/lib/httpd(/.*)? system_u:object_r:httpd_var_lib_t
          /var/lib/php/session(/.*)? system_u:object_r:httpd_var_run_t
          /etc/apache-ssl(2)?(/.*)? system_u:object_r:httpd_config_t
          /usr/lib/apache-ssl(/.*)? -- system_u:object_r:httpd_exec_t
          /usr/sbin/apache-ssl(2)? -- system_u:object_r:httpd_exec_t
          /var/log/apache-ssl(2)?(/.*)? system_u:object_r:httpd_log_t
          /var/run/apache-ssl(2)?.pid.* -- system_u:object_r:httpd_var_run_t
          /var/run/gcache_port -s system_u:object_r:httpd_var_run_t
          /var/lib/squirrelmail/prefs(/.*)? system_u:object_r:httpd_squirrelmail_t
          /usr/bin/htsslpass -- system_u:object_r:httpd_helper_exec_t
          /usr/share/htdig(/.*)? system_u:object_r:httpd_sys_content_t
          /var/lib/htdig(/.*)? system_u:object_r:httpd_sys_content_t

          針對上述的內容,可以對如下的幾個常見問題進行簡單處理:

          1.phpmyadmin在非默認/var/www/html目錄下無法運轉
          通常類似的情況都是在配置了虛擬主機時,訪問/phpmyadmin等提示403訪問拒絕,日志里也提示Permission denied,這是因為phpmyadmin防止的目錄及文件本身屬性不符合context要求。

          假設phpmyadmin放在/web目錄下,那么執行:

          chcon -R -t httpd_user_content_t /web

          則會令/web及其下所有子目錄/文件,包括phpmyadmin文件都獲得了httpd_user_content_t的屬性,如果其傳統的Unix屬性對httpd來說是可讀的話,再重新訪問一下就應該可以了。

          2./home目錄下的虛擬主機無法運轉
          與問題1也是類似的,不過根據上文中context的定義,/home目錄下必須是用戶的$HOME/www或public_html或web目錄才是 httpd_user_content_t類型,因此建議將要作為web頁面的內容放置在用戶的$HOME/www或web或public_html里,并確保其屬性是httpd_user_content_t,使用如下命令查看:

          ls -Z /home/abc/
          drwxr-xr-x abc abc user_u:object_r:user_home_dir_t tmp
          drwxrwxr-x abc abc user_u:object_r:httpd_user_content www

          如不是,則可通過chcon來逐級目錄及文件更改,直至最后能訪問:

          chcon -R -t httpd_user_content_t /home/abc/web
          chcon -t user_home_dir_t /home/abc

          3.CGI程序無法運行
          如果cgi程序放在/var/www/cgi-bin/里也無法執行,遇到403或500錯誤的話,可以檢查cgi 程序的屬性,按SELinux contexts文件里定義的,/var/www/cgi-bin/里必須是httpd_sys_script_exec_t 屬性。通過ls -Z查看,如果不是則通過如下命令更改:

          chcon -t httpd_sys_script_exec_t /var/www/cgi-bin/*.cgi

          如果是虛擬主機里的cgi,則參考問題2使之能正常使用普通的功能后,再通過chcon設置cgi文件的context為httpd_sys_script_exec_t即可。

          4.Setuid/gid 程序無法運行
          例如早期的SqWebMail及qmailadmin等,需要setuid/gid的支持,但在SELinux下這將受到嚴格限制。第一種方法是比較徹底的辦法,能保留系統的安全性,通過:

          audit2allow -l -i /var/log/messages

          將SELinux拒絕的信息轉換為相應的policy allow指令,將這些指令添加到SELinux policy 的src里相應的配置文件,重新生成policy并加載。但這樣做相對比較麻煩。

          另一個方法最簡單,但將使apache得不到保護。首先確定SELinux 類型是targeted的:

          cat /etc/selinux/config|grep SELINUXTYPE

          然后,使apache脫離SELinux保護:

          setsebool -P httpd_disable_trans 1

          然后重啟動apache:

          /etc/init.d/httpd restart

          這樣所有apache強制的檢查都失效,需要setuid/gid的程序可以正常使用。但這樣帶來了增加漏洞的危險,對于迫切需要運行而又很急的情況,本方法是一個最大限度減少系統安全缺失的最后辦法。對于取消SELinux 未必是一個好方法。

          大盤預測 國富論
          posted on 2015-08-15 00:21 華夢行 閱讀(378) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 宜春市| 同仁县| 循化| 桃园市| 南汇区| 灌云县| 大同县| 平陆县| 宜川县| 内乡县| 阜宁县| 东兴市| 孟村| 仪征市| 湘乡市| 乐山市| 临邑县| 象州县| 饶平县| 封开县| 井研县| 祁东县| 株洲县| 莲花县| 北票市| 定西市| 拉萨市| 临清市| 吴江市| 通榆县| 广河县| 郯城县| 和龙市| 化隆| 九江市| 小金县| 卢湾区| 华容县| 定结县| 于田县| 原平市|