在我们开始之前,有必要了解一下我们所要处理的系统。出于演示的需要,我们使用Fedora。然而,这些要点应该适用于Ubuntu版本或其他任何Linux发行版。查看你操作系统发行版的使用手册,即可了解更多信息。

  本文使用的操作系统

7. 上传文件

如果你的应用程序不需要上传任何文件,禁用上传文件的功能有助于提高安全。想禁止用户上传文件,只需要编辑/etc/php.d/目录下的security.ini文件,将file_uploads命令设成OFF。

file_uploads=Off
1
2
3
max_execution_time = 30
max_input_time = 30
memory_limit = 40M

6. 禁用危险的PHP函数

PHP随带用于开发的实用函数,但是也有可能被黑客用来闯入Web应用程序的大量函数。禁用这些函数可以提高总体安全性,并确保你没有受到危险的PHP函数的影响。

为此,你先要编辑php.ini文件。一旦进入该文件,找到disable_functions命令,禁用里面的危险函数。为此,你只要拷贝/粘贴下列代码。

disable_functions =exec,passthru,  
shell_exec,system,proc_open,popen,curl_exec,  
curl_multi_exec,parse_ini_file,show_source

你可以在此()进一步了解禁用危险的PHP函数。

  #11:为PHP安装Suhosin高级保护系统

3. 禁用远程代码执行

远程代码执行是PHP安全系统方面的常见安全漏洞之一。默认情况下,远程代码执行在你的系统上已被启用。“allow_url_fopen”命令允许请求(require)、包括(include)或可识别URL的fopen包装器等函数可以直接访问PHP文件。远程访问通过使用HTTP或FTP协议来实现,会导致系统无力防御代码注入安全漏洞。

为了确保你的系统安全可靠、远离远程代码执行,你可以将该命令设成“Off”,如下所示:

Allow_url_fopen=Off  
allow_url_include=Off
1
allow_url_include=Off

4. 将PHP错误记入日志

加强Web应用程序安全的另一个简单方法就是,不向访客显示错误。这将确保黑客根本无法危及网站的安全性。需要在/etc/php.d/security.ini文件里面进行编辑。

display_errors=Off

现在你可能会想:完成这一步后,“开发人员在没有错误信息的帮助下如何调试?”开发人员可以使用log_errors命令来用于调试。他们只需要在security.ini文件中将log_errors命令设成“On”。

log_errors=On  
error_log=/var/log/httpd/php_scripts_error.log

  #7:关闭远程代码执行

结束语

安全是广大Web开发人员和Linux管理员最关注的问题之一。如果采取了上述要点,你势必可以加强开发环境和PHP
Web应用程序方面的安全。要是你认为我们遗漏了重要的内容,欢迎留言补充。

1
# ls -Z /var/lib/php/
  • 默认的Web服务器:Apache
  • DocumentRoot:/var/www/html
  • PHP配置文件:/etc/php.ini
  • 扩展配置目录:/etc/php.d/
  • 安全文件:/etc/php.d/security.ini

  #6:禁止文件上传

9.控制文件系统访问

默认情况下,PHP可使用fopen()等函数来访问文件。open_basedir命令提供了访问。首先,始终要将open_basedir命令设成/var/www/html目录。将它设成其他任何目录会导致安全问题。

open_basedir="/var/www/html/"

  样例输出:

10. 控制POST大小

我们的最后一个PHP安全要点是控制POST大小函数。HTTP
POST函数使用客户端的浏览器,将数据发送到Web服务器。比如说,用户可能上传证书,然后发送到Web浏览器以便处理。一切都运行顺畅,直到有一天黑客企图发送庞大的文件来耗尽服务器资源。这很可能会导致服务器崩溃或响应缓慢。为了保护服务器远离这个漏洞,就需要设置POST大小。POST大小可以在/etc/php.d/security.ini文件里面加以设置。

post_max_size=1k
1
# chattr +i /var/www/html/file1.php# chattr +i /var/www/html/

PHP是使用最广泛的脚本编程语言之一。市场份额颇能说明其主导地位。PHP
7已推出,这个事实让这种编程语言对当前的开发人员来说更具吸引力。尽管出现了一些变化,但是许多开发人员对PHP的未来持怀疑态度。一个原因是PHP的安全。

图片 1

PHP的安全是广大开发人员担心的主要问题。虽然PHP提供从里到外的可靠安全,但是需要由开发人员正确地落实这些安全机制。我们在本文中将为Linux管理员介绍几个PHP安全要点。这些要点将帮助你确保Web应用程序安全,并确保从长远来看正常运行。

  或

这些技巧将保护你的网站,避免不同类型的常见攻击,比如SQL注入、XSS、跨站请求伪造攻击、eval()和文件上传等攻击。可在此()查看常见攻击列表。

  除此之外,建议把allow_url_include也取消掉:

5. 合理控制资源

为了确保应用程序的安全,控制资源很重要。为了确保适当的执行和安全,你就要对PHP脚本执行予以限制。此外,还应该对花在解析请求数据上的时间予以限制。如果执行时间受到控制,脚本使用的内存等其他资源也应该会得到相应配置。所有这些度量指标可通过编辑security.ini文件来加以管理。

# set in seconds  
max_execution_time = 25  
max_input_time = 25  
memory_limit = 30M
1
2
3
4
5
6
<Directory /var/www/html>
     <LimitExcept GET POST>
         Order allow,deny
     </LimitExcept>
 ## Add rest of the config goes here... ##
 </Directory>

2. 限制PHP信息泄露

平台泄露关键信息司空见惯。比如说,PHP会泄露一些信息,比如版本以及它安装到服务器上的事实。这可以通过expose_php命令来实现。为了防止泄露,你需要在/etc/php.d/security.ini中将该命令设成off。

expose_php=Off

如果你需要了解版本及其状态,只要针对网站地址运行一个简单的Curl命令就可以获得该信息。

Curl - I http://www.livecoding.tv/index.php

之前的命令会返回下列信息:

HTTP/1.1 200 OK 
X-Powered-By: PHP/7.0.10  
Content-type: text/html; charset=UTF-8
1
$ curl -I http://www.cyberciti.biz/index.php

不妨仔细看一下我们系统环境的几个关键文件。你的文件应该类似或对应于下列:

  不要把PHP错误信息输出给所用用户。编辑/etc/php.d/security.ini,如下修改:

8. 保持版本最新

开发人员在24/7不间断地工作,给你使用的技术打上补丁。PHP也是一样。由于它有一个开源社区,补丁和修正版定期发布。更新版还为首日漏洞及其他安全漏洞提供了安全补丁。如果你注重应用程序的安全性,就要始终确保你的PHP解决方案是最新版本。另外,给其他相关技术打上最新的补丁可以确保最大限度的安全。

  #21:安装Mod_security

1. 删除不必要的模块

PHP随带内置的PHP模块。它们对许多任务来说很有用,但是不是每个项目都需要它们。只要输入下面这个命令,就可以查看可用的PHP模块:

# php - m

一旦你查看了列表,现在可以删除不必要的模块。减少模块的数量有助于提高你所处理的Web应用程序的性能和安全。

  #16:Session路径

1
drwxrwx---. root apache system_u:object_r:httpd_var_run_t:s0 session

  在Chroot Jail下运行Apache /
PHP可以最小化可能受到的损失,使其局限于文件系统下的一小块。可以使用一般的chroot来配置Apache:chroot
kind of setup with
Apache。不过我建议使用FreeBSD
jails、XEN,KVM或OpenVZ虚拟化。

  #25:把服务分离到不同的服务器或虚拟机

  样例输出

  PHP有大量可用于入侵服务器的函数,如使用不当则会成为漏洞。如下取消这些函数:

1
disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

  下面的样例则是阻挡所有Apache用户的传出连接,只允许smtp服务及spam识别API服务通过:

  #23:使用防火墙限制传出连接

1
2
3
# cd /etc/php.d/
 # mv gd.{ini,disable}
 # <span style="text-decoration: underline;">/sbin/service httpd restart</span>
1
# chown -R apache:apache /var/www/html/
1
2
3
4
5
6
7
HTTP/1.1 200 OK
 X-Powered-By: PHP/5.3.3
 Content-type: text/html; charset=UTF-8
 Vary: Accept-Encoding, Cookie
 X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;string-contains=wikiToken;string-contains=wikiLoggedOut;string-contains=wiki_session
 Last-Modified: Thu, 03 Nov 2011 22:32:55 GMT
 ...
1
$ php -v

  #19:Apache、PHP、MySQL配置文件的写入保护

  #13:PHP Fastcgi / CGI – cgi.force_redirect管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
///////////////
 / ISP/Router /
 //////////////
   \
    |
    Firewall
      \
       |
      +------------+
      | LB01       |
      +------------+                 +--------------------------+
                   |                 | static.lan.cyberciti.biz |
                   +-----------------+--------------------------+
                                     | phpcgi1.lan.cyberciti.biz|
                                     +--------------------------+
                                     | phpcgi2.lan.cyberciti.biz|
                                     +--------------------------+
                                     | mysql1.lan.cyberciti.biz |
                                     +--------------------------+
                                     | mcache1.lan.cyberciti.biz|
                                     +--------------------------+
1
/sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner vivek -p tcp --dport 80 -m state --state NEW,ESTABLISHED  -j ACCEPT
1
2
; Enable cgi.force_redirect for security reasons in a typical *Apache+PHP-CGI/FastCGI* setup
 cgi.force_redirect=On

  查看日志文件可以让你知道服务器正在承受何种攻击,并分析当前安全级别是否足够。启用审查服务用于系统审查,可审查SELinux时间,验证事件,文件修改,账号修改等。建议使用Linux
System Monitoring Tools来监控Web服务器。

1
# rm /etc/php.d/sqlite3.ini

  详细参考:Red Hat SELinux
guide

  现在可以配置Apache、Lighthttpd或Nginx
Web服务调用运行在127.0.0.1:9000的FastCGI。

1
2
3
4
5
6
7
## A few Examples ##
 # Do not allow to open files in /etc/
 SecFilter /etc/
 
 # Stop SQL injection
 SecFilter "delete[[:space:]]+from"
 SecFilter "select.+from"

  #17:保证PHP,软件及操作系统更新到最新

  基于PHP的应用面临着各种各样的攻击:

  # 单位:秒

1
2
3
PHP 5.3.3 (cli) (built: Oct 24 2011 08:35:41)
 Copyright (c) 1997-2010 The PHP Group
 Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
allow_httpd_anon_write --> off
allow_httpd_mod_auth_ntlm_winbind --> off
allow_httpd_mod_auth_pam --> off
allow_httpd_sys_script_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> on
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_read_user_content --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_tmp_exec --> off
httpd_tty_comm --> on
httpd_unified --> on
httpd_use_cifs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off

  #20:使用Linux安全拓展(如SELinux)

  取消Apache cgi支持可以输入:

  从性能与安全性的角度考虑,我建议使用PHP时减少不必要的模块。例如上面的sqlite3是不必要的。那么可以通过删除或重命名/etc/php.d/sqlite3.ini文件来取消它:

1
2
log_errors=On
error_log=/var/log/httpd/php_scripts_error.log

  #1:知彼

1
file_uploads=Off
1
# yum update
  • XSS:对PHP的Web应用而言,跨站脚本是一个易受攻击的点。攻击者可以利用它盗取用户信息。你可以配置Apache,或是写更安全的PHP代码(验证所有用户输入)来防范XSS攻击
  • SQL注入:这是PHP应用中,数据库层的易受攻击点。防范方式同上。常用的方法是,使用mysql_real_escape_string()对参数进行转义,而后进行SQL查询。
  • 文件上传:它可以让访问者在服务器上放置(即上传)文件。这会造成例如,删除服务器文件、数据库,获取用户信息等一系列问题。你可以使用PHP来禁止文件上传,或编写更安全的代码(如检验用户输入,只允许上传png、gif这些图片格式)
  • 包含本地与远程文件:攻击者可以使远程服务器打开文件,运行任何PHP代码,然后上传或删除文件,安装后门。可以通过取消远程文件执行的设置来防范
  • eval():这个函数可以使一段字符串如同PHP代码一样执行。它通常被攻击者用于在服务器上隐藏代码和工具。通过配置PHP,取消eval()函数调用来实现
  • Sea-surt Attack(Cross-site request
    forgery,CSRF。跨站请求伪造):这种攻击会使终端用户在当前账号下执行非指定行为。这会危害终端用户的数据与操作安全。如果目标终端用户的账号用于管理员权限,整个Web应用都会收到威胁。

  确认这个路径在/var/www/html之外,且不可被其他系统用户访问:

  可以配置Red Hat / CentOS / Fedora
Linux通过Email发送yum的包更新提醒,或是Debian / Ubuntu
Linux下的apticron发送提醒。又或通过cron计划任务进行更新。

  当此特性被启用,mysql_connect()和mysql_pconnect()会忽略传入的所有参数。与此同时,你需要在代码上做些相应的修改。第三方以及开源应用,如Wordpress,在sql.safe_mode下可能无法正常工作。同时建议关闭5.3.x版本的PHP的magic_quotes_gpc过滤,因为它简单粗暴又没效率。使用mysql_escape_string()以及自定义的过滤函数会更好一些

  执行下面指令可以查看当前PHP所编译的模块

  在不同的服务器或虚拟机下运行不同的网络服务,这可以减少被入侵对其他服务的影响。例如,一个攻击者入侵了Apache,那就可以访问同一服务器下的其他服务(如MySQL,email服务等)。但在上述例子中则不会:

1
2
3
session.save_path="/var/lib/php/session"
 ; Set the temporary directory used for storing files when doing file upload
 upload_tmp_dir="/var/lib/php/session"

  open_basedir会限制PHP的运行目录,例如通过fopen()之类的函数可访问的目录。如果访问的目录不在open_basedir之内,PHP会拒绝该访问。不要使用软链接作为工作区。例如,只允许访问/var/www/html而非/var/www、/tmp或/etc目录:

  可以通过spawn-fcgi来生成phpcgi用户的远程或本地FastCGI进程(前提是有这个用户):

  #3:防止PHP信息泄漏

  PHP是广泛使用的开源服务端脚本语言。通过HTTP或HTTPS协议,Apache
Web服务允许用户访问文件或内容。服务端脚本语言的错误配置会导致各种问题。因此,PHP应该小心使用。以下是为系统管理员准备的,安全配置PHP的25个实践事例。

  HTTP POST通常作为请求的一部分,被客户端用于向Apache
Web服务器发送数据,如上传文件或提交表单。攻击者会尝试发送超大的POST请求去消耗服务器的资源。如下编辑/etc/php.d/security.ini限制POST的最大大小:

1
# apt-get update && apt-get upgrade

  启用则是:

  注:ls
-Z会显示SELinux的安全信息,如文件模式,user,group,安全信息,文件名等。

  #10:资源控制(DoS控制)

1
magic_quotes_gpc=Off

  #18:限制文件及目录访问

  样例输出:

  如用户的确需要上传文件,那么把它启用,而后限制PHP接受的最大文件大小:

  PHP
Session用户提供数据保存功能,以便后续访问。这可以使应用可定制性更强,提升吸引力。所有Session相关的数据会被保存在session.save_path中。RHEL/CentOS/Fedora
Linux的默认设置如下:

相关文章