安全问题是Web开发中非常重要的,本篇文章主要描述Web环境配置时候应该注意的安全问题,避免因web配置的不严谨导致危害进一步扩大(漏洞大部分是由应用程序导致)。
基础环境
centos 6.x
php 5.3
PHP安全配置
/etc/php.ini
<pre>
display_errors = Off
expose_php = Off
enable_dl = Off
disable_functions= eval,passthru,exec,system,chroot,scandir,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,ini_set,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru
</pre>
php-fpm 安全配置
/etc/php-fpm.conf或/etc/php-fpm.d/www.conf
<pre>
php_flag[display_errors] = off
</pre>
Nginx 安全配置
nginx.conf 里面的http域
<pre>
server_tokens off;
</pre>
Linux 运行用户安全建议
每个服务都使用单独的linux 用户组/用户启动,千万不能使用root用户运行,每个服务对应的用户:
- nginx:nginx
- php-fpm:nobody
- mysqld:mysqld
- memcached:memcached
检查/etc/passwd ,禁止web服务用户使用bash登陆
监听端口配置
如非必要,所有服务的监听ip限定为内网或localhost(若使用socket方式则忽略这一步骤),避免在公网上暴露服务端口。
- php-fpm服务:/etc/php-fpm.d/www.conf文件
<pre>
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
</pre> - mysql:
mysql的服务端口,在配置数据库用户时候设置,一般设置为内网ip - memcached服务:
memcached的服务端口,一般设置为内网ip
应用程序文件和目录权限
- 根据访问和web读写,将程序目录分离开:源码目录(source)、数据目录(data)、静态文件目录(static)等,方便权限和访问控制;
- 使用非root用户上传和管理应用程序文件;
- 仅将需要web读写的目录和文件设置为 chown -R data/ nobody:nobody;
- 仅将需要shell执行的文件,设为指定的shell运行用户并设定为可执行(chmod u+x),举例:chown command.php webManager:webManager
应用程序目录web访问限制
- 配置nginx.conf 对于上传(附件、数据)目录无执行权限,并且通过nginx禁止脚本的访问
<pre>
禁止upload、data、static目录 执行任何脚本
location ~* /(upload|data|static)[/.]*/.*\.(php|php5|asp|aspx|jsp|sh){
deny all;
}
</pre>
- 配置nginx.conf 对程序源码目录(无须直接访问源码的程序架构,通过./index.php 作为入口)无执行权限
<pre>
禁止源码目录被web访问
location ~* /(protected|source)/{
deny all;
}
</pre>
整理于2014/05