Linux下Apache与PHP安全相关设置
对于提供公共网络服务的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 1php_value safe_mode 0
php_flag safe_mode Offphp_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设置.
- 最新评论