Linux下Apache与PHP安全相关设置[Linux安全]
本文“Linux下Apache与PHP安全相关设置[Linux安全]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
关于供应大众网络服务的ISP,基于安全性来由,倡议apache和php都利用最小权限的公用设置.
针对特定用户所提出的触及安全性能的特别要求, 可以在不改变全局性的共用设置的情形下,
通过操纵Apache Virtualhost的PHP扩大功效来实现. 只需在呼利用户的Virtualhost的设置
段落中插入php_value,php_admin_value或php_admin_flag指令,便可以使该用户具有与全局
设置差别的权限和行为.
针对Apache的特定虚拟用户举行单独配置的相关语法以下:
php_admin_value name 1|0|string (value掌握具体的参数)
php_admin_flag name on|off (flag掌握on或off,实用于Apache2.20版本)
请注意: 上述针对虚拟用户的设置号令,可以直接设置在单元里面,大概设置在
呼利用户的单元里面.
比方,要将ernest这个用户的register_globals功效翻开,并且将upload_max_filesize调高到
5M,同时关闭safe_mode,但又不影响其他用户,便可以在该用户的VirtualHost里面加以下几行:
php_value upload_max_filesize 5M
php_value register_globals 1
php_value safe_mode 0
php_flag safe_mode Off
php_admin_value safe_mode 0 #(for Apache2.20)
php_admin_flag safe_mode Off #(for Apache2.20)
在php.ini配置文件中的大部份功效,都可以用这种方法来调整,调整后应重新启动apache,然后
便可以在phpinfo中看到中间栏的Local Value同右边栏位的Master Value是差别值.
请注意: 有些参数值的设定办法跟它们在php.ini配置文件中的设置办法大概不一样,比方
上面的”register_globals 1″, 本来在php.ini中应是”register_globals On”.
################################################################################
================================================================================
(1) safe_mode: 以安全情势运行PHP;
——————————————————————————–
在php.ini文件中利用以下选项(这是影响全局的设置):
safe_mode = On (利用安全情势)
safe_mode = Off (关闭安全情势)
PHP的安全情势是为了试图办理同享伺服器(shared-server)的安全问题而专门设立的. 但是
从构造上看, 试图在PHP层面上办理这个问题其实是不公道的, 只是考虑到改正WEB伺服器层
和操作系统层都显得非常的不实际, 因此很多利用者,分外是供应大众网络服务的ISP供应商,
大多都在其服务器中要求以安全情势来运行PHP,用以避免合理用户的跨站读取或越权操作等
危险行为, 以及将非受权用户的恶意行为所造成的影响降到最低范围.
参考网址: http://hk2.php.net/features.safe-mode
在Apache的httpd.conf中VirtualHost的呼应设置办法(这是针对特定用户的设置):
php_admin_flag safe_mode On (利用安全情势)
php_admin_flag safe_mode Off (关闭安全情势)
大概:
php_admin_value safe_mode 1 (利用安全情势)
php_admin_value safe_mode 0 (关闭安全情势)
严重告诫: 假如在全局性设置中已经启用了safe_mode的功效,但又在分外的用户虚拟空间中
关闭该用户的safe_mode的功效,这就等于赐与了该用户特别的权限,答应他不须受safe_mode
的限制而安闲地利用系统的服务,也就是说全部本来被全局性的safe_mode功效所禁止的行为,
比方跨站读取或越权操作等都可以被该用户履行, 这就仿佛在本来安全设防的金库中翻开了
一个可供该用户安闲收支的洞,因此任何利用该用户空间的利用都不再被全局性的safe_mode
保护所限制,当然这就意味著整个系统的安全性都大概会遭到该用户空间的影响,包含大概因
该空间利用的漏洞而招致整个系统被入侵等等. 所以,这样的针对特定用户的特别设置,该当
作为一种特许受权的方法来考虑, 并有必要成立有效的监控机制以避免该用户滥用系统资源,
不然, 一旦该用户变得不再可托任或他的网站程序存在漏洞, 那么您的整体系统所受的影响
就会同完好没有启用safe_mode一模一样.
================================================================================
================================================================================
(2) safe_mode_include_dir: 无需UID/GID查抄的目录
——————————————————————————–
当您按照前面(1)所述之设置启用PHP的安全情势之后,PHP的脚本在运行时就会对全部被操作
的目录以及文件举行针对UID/GID的匹配性查抄: 即查抄被操作目录或文件的UID或GID,能否
同当前PHP脚本文件的UID或GID一样.
但是, 假如您的系统答应用户的PHP脚本拜候大众途径的话(比方很多较旧的Forum或Gallery
程序城市直接引用系统文件来扩大当时PHP还未能支持的功效), 那么这种设置就会造成麻烦.
而利用safe_mode_include_dir设置可以指定某些目录, 当PHP脚本操作这些目录及其子目录
时(该目录必须在include_path中大概用完好途径来包含), 则答应越过UID/GID查抄,即不对
该目录举行UID/GID匹配性查抄.
从PHP4.2.0开始, 这个指令已经可以承受同include_path指令近似的气势, 即用分号离隔的
多个途径, 而从前则只能指订单一个目录. 同open_basedir一样, 它所指定的途径实际上也
是一个字符串的前缀限制,而非针对该目录名称空间的操作.
比方假如指定: “safe_mode_include_dir = /dir/incl”, 那么全部的PHP脚本都将答应肆意
拜候 “/dir/include”和“/dir/incls” 途径(假如它们存在的话). 因此, 假如您但愿将拜候
掌握在一个指定的目录里面, 就必须在上述设置的指定途径的末尾加上一个斜线, 比方:
“safe_mode_include_dir = /dir/incl/”
请注意: VirtualHost会自动担当php.ini中的safe_mode_include_dir设置.
================================================================================
================================================================================
(3) open_basedir: 将用户可操作的文件限制在某目录下;
——————————————————————————–
以下是php.ini中的原文阐明以及默许配置:
; open_basedir, if set, limits all file operations to the defined directory
; and below. This directive makes most sense if used in a per-directory or
; per-virtualhost web server configuration file. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
open_basedir = .
open_basedir可将用户拜候文件的活动范围限制在指定的区域,普通是其家目录的途径,也
可用标记”.”来代表当前目录.注意用open_basedir指定的限制实际上是前缀,而不是目录名.
举例来说: 若”open_basedir = /dir/user”, 那么目录 “/dir/user” 和 “/dir/user1″都是
可以拜候的.所以假如要将拜候限制在仅为指定的目录,请用斜线完毕途径名.比方设置成:
“open_basedir = /dir/user/”
open_basedir也可以同时设置多个目录, 在Windows顶用分号脱离目录,在任何别的系统顶用
冒号脱离目录.当其作用于Apache模块时,父目录中的open_basedir路独自动被担当.
有三种办法可以在Apache中为指定的用户做独立的设置:
(a) 在Apache的httpd.conf中Directory的呼应设置办法:
php_admin_value open_basedir /usr/local/apache/htdocs/
#设置多个目录可以参考以下:
php_admin_value open_basedir /usr/local/apache/htdocs/:/tmp/
(b) 在Apache的httpd.conf中VirtualHost的呼应设置办法:
php_admin_value open_basedir /usr/local/apache/htdocs/
#设置多个目录可以参考以下:
php_admin_value open_basedir /var/www/html/:/var/tmp/
(c) 因为VirtualHost中设置了open_basedir之后, 这个虚拟用户就不会再自动担当php.ini
中的open_basedir设置值了,这就难以到达机动的配置办法, 所以倡议您不要在VirtualHost
中设置此项限制. 比方,可以在php.ini中设置open_basedir = .:/tmp/, 这个设置表示答应
拜候当前目录(即PHP脚本文件所在之目录)和/tmp/目录.
请注意: 若在php.ini所设置的上传文件暂时目录为/tmp/, 那么设置open_basedir时就必须
包含/tmp/,不然会招致上传失利. 新版php则会提醒”open_basedir restriction in effect”
告诫信息, 但move_uploaded_file()函数仍旧可以成功取出/tmp/目录下的上传文件,不知道
这是漏洞还是新功效.
================================================================================
================================================================================
(4) disable_functions: 单独地屏蔽某些函式(常用于禁止普通用户履行系统函数);
——————————————————————————–
这个指令答应你基于安全缘由直接禁止某些肯定的函式(普通是攸关系统安全的函数),比方:
disable_functions = shell_exec,system,exec,passthru,show_source,get_cfg_var
disable_functions承受逗号脱离的函式名列表作为参数, 它不受安全情势的影响,并且只能
设置在php.ini顶用作全局性配置, 不能将其设置在httpd.conf中针对单独用户来举行设置.
从php-4.0.1开始在php.ini里引入了此项功效, 这个功效非常有效, 可以用它禁止用户利用
一些具有潜在的危险性的函数, 比方: passthru,exec,system,popen 等等. 当您在php.ini
中加上 disable_functions = passthru,exec,system,popen 配置后, PHP在履行这些函数
时就只会显示错误提醒: Warning: system() has been disabled for security reasons
下面举个例子来看看这个安全性设置的重要程度:
我们知道PHP脚本可以采取很多perl的特点,比方通过一种叫shell_exec的办法来履行系统的
号令, 只需在一对反引号(“)中包含调用系统号令的script代码, 就可以履行呼应的系统号令.
比方:
$output = `ls /etc -al`;
echo $output;
?>
明显,假如您的系统不加限制的话,那么任何用户都可以通过诸如 `cat /etc/passwd` 这样的
号令攫取系统信息或举行破坏行为. 这关于供应大众服务的ISP供应商来说, 等于是翻开自家
金库大门让全部客户安闲出入, 并且一旦某些客户的PHP程序存在安全漏洞(就目前PHP程序员
的平均水准来看,存在严重的漏洞基本上是不可避免的)的话, 那么只需最初级的黑客都可以
很简单地完好操控您的主机了. 因此一定要避免Linux用户在PHP程序中通过“来履行script
脚本,这可以通过在PHP.INI中设置: disable_functions = shell_exec,system,exec 来禁止
PHP调用相关系统函数.
典型的安全性配置,请参考以下设置:
disable_functions = shell_exec,system,exec,passthru,show_source,get_cfg_var
若答应用户调试程序,则可配置以下:
disable_functions = shell_exec,system,exec,passthru
PHP中一些常用但有安全风险的函数:
unlink,mkdir,touch,fgets,popen,proc_open,link,symlink,phpinfo
倡议: 应兼顾到商业服务的完好性和安全性,请酌情考虑能否禁止利用它们.
请注意: disable_functions选项不能在php.ini文件外部利用,也就是说您无法在httpd.conf
文件中按差别虚拟主机或差别目录的方法来屏蔽大概开启函式.
================================================================================
================================================================================
5) register_globals: 禁止注册全局变量;
——————————————————————————–
register_globals = On (自动注册为全局变量)
register_globals = Off (不可注册为全局变量)
普通情形下,用户都是在HTML网页里通过HTTP协议,来提交GET,POST和COOKIE数据(简称为GPC)
的. 而PHP程序若何得到用户提交的这些变量数据,则还需依靠于php.ini配置中一个有争议的
设置,便是register_globals参数来决意.
顾名思义,register_globals的意思就是注册为全局变量, 所以当设置为On的时刻, 通过页面
传送过来的值就会被直接的注册为全局变量,可以很便利地供应应PHP程序直接利用;而当设置
为Off的时刻,PHP程序要利用网页传送过来的变数,就需求到特定的数组里才能得到它.
在PHP4.3.0今后,register_globals默许情形下被设置为Off; 但是几年前,register_globals
的默许值还是翻开的,所以目前仍然还存在很多需求启用它的程序代码.
请注意: 当设置为 register_globals = Off 之后,不但会影响到PHP若何获得从
的URL
所传送过来的数据,也会影响到PHP获得session和cookie的方法. 当关闭register_globals时,
PHP程序就必须利用呼应的数组来获得session和cookie(比方$_SESSION[]和$_COOKIE). 同时
关于session的处理也有一些改变,比方利用session_register()就显得再也没有必要了,并且
会失效(关于具体的改变请查看PHP手册页的Session handling functions文档之描写).
启用register_globals本身并没有安全风险,但是它为跟踪用户输入和确保利用程序安全增添了
难度. 因为一旦翻开了register_globals,那么在全局名称空间和$_GET,$_POST或$_COOKIE的
数组中,将会自动成立GET,POST和COOKIE传送到PHP脚本的全部变量. 假如您的PHP程序操纵了
这些变量来作安全标识(比方很多程序员喜好用COOKIE值来辨别用户身份),那么任何人都可以
用通过URL所传送的数值来获得并假充用户身份,明显这就不再具有安全性了.
别的,一些粗枝大叶或没有责任心的程序员所写的PHP代码, 比方: ,
也极大概让黑客或恶意利用者有机可乘,使他们得以操纵register_globals的弱点来举行诸如
代码注入或内存溢位等方法的攻击,从而很简单地造成系统性的灾难.
重要提醒: 自PHP4.2.0起,PHP中的选项register_globals的默许值被设为off了,PHP社区鼓舞
大家不要依靠于这个选项,而用别的办法来替换,比方superglobals.
在Apache的httpd.conf中VirtualHost的呼应设置办法:
php_admin_flag register_globals on
大概:
php_admin_value register_globals 1
================================================================================
================================================================================
6) magic_quotes_gpc: 令敏感字元转义
——————————————————————————–
magic_quotes_gpc = On
magic_quotes_gpc = Off
magic_quotes_gpc选项是php中的一个重要的安全设置, 当该选项为ON, 也就是翻开的时刻,
全部从GET,POST,COOKIE传送过来的数据之中的特别字元(如’”等),以及NULL等元字符城市
被自动的加上以实现转义,这个选项使得SQL注入大概插入代码,以及XSS中引入字符串大概
改变程序流程变得越发艰难.
在php.ini配置文件中是默许启用magic_quotes_gpc设置(即为On)的,这相当于自动对所提交
的GET,POST,COOKIE数据利用了addslashes()函数. 假如网站空间关闭了 magic_quotes_gpc
设置, 那么PHP就不会在敏感字元前加上反斜杠(), 即答应表单所提交的内容含有敏感字元,
比方单引号(’)等等, 这就更简单让黑客大概恶意利用者有机会操纵SQL的注入漏洞策动攻击.
当然目前很多具有安全意识的程序员或数据库管理员都晓得若何防备SQL注入攻击,他们普通
会在呼应的程序代码或利用环境中加强安全防备, 但是无论若何, 在系统层级加强安全防备,
始终都应当是LINUX系统管理员的不贰责任.
请注意: PHP程序代码中关于敏感字元的处理,可以用addslashes()来自动在敏感字元前增添
反斜杠, 也可以用函数stripslashes()往复掉反斜线. 别的, 许大都据库本身也供应了针对
这种输入数据的处理功效. 比方在PHP版本的MySQL操作函数中, 就有一个调用数据库来处理
输入数据的函数: mysql_real_escape_string(); 它可将特别字符以及大概惹起数据库操作
出错的字符转义.
在Apache的httpd.conf中VirtualHost的呼应设置办法:
php_admin_flag magic_quotes_gpc on
大概:
php_admin_value magic_quotes_gpc 1
================================================================================
================================================================================
7) allow_url_fopen和allow_url_include: 禁止读取远程文件
——————————————————————————–
allow_url_fopen = On (答应翻开URL文件,预设启用)
allow_url_fopen = Off (禁止翻开URL文件)
allow_url_include = Off (禁止引用URL文件,新版增添功效,预设关闭)
allow_url_include = On (答应引用URL文件,新版增添功效)
allow_url_fopen 这个号令选项启动了URL情势的fopen封装协议, 使得PHP程序可以衔接URL
对象(如远端文件). 预定的封装协议供利用ftp和http协议来衔接远程文件,一些扩大库比方
zlib大概会注册更多的封装协议. allow_url_include预计是下一个PHP版本将要供应的功效,
用来别离fopen和include函数的远端调用,目前PHP5.20已经供应了这个选项.
就性能方面来说,PHP所供应的便利的远程调用确切简化了很多利用, 但假如是从安全角度来看,
答应引用(Include)URL远端资源,使得PHP利用程序的漏洞变得越发简单被操纵, 这种便利性
反而被很多安全研究人员视为一种漏洞(Remote URL Include vulnerabilities), 因此常常
被倡议必须在php.ini配置中禁止利用.
PHP的开辟者筹划在PHP6版本中供应allow_url_include,目前这个功效已经可以在PHP5.20版
中利用. 禁止allow_url_include办理了远端引用(Include)的问题, 同时又让我们还可以在
普通的情形下利用fopen去翻开远端的档案, 而没必要再连累上翻开include函数所带来的风险.
因此在新版PHP中allow_url_fopen选项预设是翻开的,而allow_url_include则预设是关闭的.
但是事实上若从系统角度来看,即便禁止了PHP的allow_url_fopen和allow_url_include功效,
其实也不能完好禁止远端调用及其所带来的安全隐忧,并且它们只是保护了标志为URL的句柄,
也就是说只能影响http(s)和ftp(s)的调用, 但对包含其他标志的远端调用,比方对PHP5.2.0
新版所供应的php和data则无能为力,而这些调用一样会招致注入风险,请参考以下代码:
// The following Include statement will
// include and execute everything POSTed
// to the server
include "php://input";
?>
// The following Include statement will
// include and execute the base64 encoded
// payload. Here this is just phpinfo()
include "data:;base64,PD9waHAgcGhwaW5mbygpOz8+";
?>
当然在LINUX的系统层级上,还有别的办法可用来避免远端调用, 比方利用IPTABLES等防火墙
工具来保护系统,别的PHP利用程序也可以考虑采取curl来读取远程文件.
请注意: 只在PHP4.0.3之后的版本中才可以在php.ini配置文件中利用allow_url_fopen选项,
在PHP4.0.3以及之前的版本, 则只能在编译时通过配置项 –disable-url-fopen-wrapper来
撤消此特点. Windows下的PHP在4.3版本之前,相关函式: include, include_once, require,
require_once 不援助远程文件衔接,在PHP4.3版本之后才可以让这类函式有远端读取的本领.
在Apache的httpd.conf中VirtualHost的呼应设置办法:
php_admin_flag allow_url_fopen Off
php_admin_flag allow_url_include Off
大概:
php_admin_value allow_url_fopen 0
php_admin_value allow_url_include 0
================================================================================
================================================================================
Error handling and logging: 错误掌握和日记
——————————————————————————–
display_errors = On (翻开错误显示)
display_errors = Off (关闭错误显示)
PHP缺省是翻开错误信息显示的,假如把它改成关闭之后, 那么当PHP函数履行时,其错误信息
将不会再显示给用户,这样能在一定程度上避免攻击者从错误信息得知脚本的物理位置,以及
一些别的有效的信息,最少给攻击者的黑箱检测造成一定的障碍.
假如PHP的错误信息对我们自己有效,也可以设置成把它写到日记文件中去,比方:
log_errors = Off (PHP 默许是关闭错误日记的)
log_errors = On (改正成翻开并记录错误日记)
假如翻开了日记记录,接着还需求指定日记文件,即奉告PHP将错误记录到那个文件中去:
;error_log = filename (默许被分号”;”所注释,改正成以下)
error_log = /var/log/php_error.log
就是把filename改成指定文件”/var/log/php_error.log”, 这样设置今后,全部的PHP错误都
将会写到这个日记文件裡去.
在Apache的httpd.conf中VirtualHost的呼应设置办法:
php_admin_flag display_errors Off
大概:
php_admin_value display_errors 0
为便利辨别,可在每个用户的VirtualHost中指定错误日记文件:
ErrorLog logs/mydomain.com-error_log
================================================================================
################################################################################
PHP安全配置典范:
################################################################################
================================================================================
php.ini的安全设置典范:
——————————————————————————–
safe_mode = On
allow_url_fopen = Off
allow_url_include = Off
register_globals = Off
magic_quotes_gpc = On
display_errors = Off
disable_functions = shell_exec,system,exec,passthru,show_source,get_cfg_var
#大概,也可以考虑开放后两个危险系数较低的函数:
disable_functions = shell_exec,system,exec,passthru
open_basedir = .
——————————————————————————–
VirtualHost的一个配置典范:
——————————————————————————–
ServerAdmin webmaster@mydomain
DocumentRoot /home/hosting/mydomain/public_html
ServerName mydomain.com
ServerAlias www.mydomain.com
php_admin_value safe_mode 1
php_admin_value allow_url_fopen 0
php_admin_value allow_url_include 0
php_admin_value register_globals 1
php_admin_value magic_quotes_gpc 1
php_admin_value display_errors 0
php_admin_value open_basedir /home/hosting/mydomain/
ErrorLog logs/mydomain.com-error_log
CustomLog logs/mydomain.com-access_log common
#大概:
ServerAdmin webmaster@mydomain
DocumentRoot /home/hosting/hung25ucom/public_html
ServerName mydomain.com
ServerAlias www.mydomain.com
php_admin_flag safe_mode On
php_admin_flag allow_url_fopen Off
php_admin_flag allow_url_include Off
php_admin_flag register_globals On
php_admin_flag magic_quotes_gpc On
php_admin_flag display_errors Off
php_admin_value open_basedir /home/hosting/mydomain/
ErrorLog logs/mydomain.com-error_log
CustomLog logs/mydomain.com-access_log common
以上是“Linux下Apache与PHP安全相关设置[Linux安全]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |