目的
防范因为主机没有加固,造成储存在开发服务器中的源代码和测试数据被黑客获取。
范围
本规范适合于开发服务器安全加固配置。
MYSQL
1. 下载位置
MySQL程序的下载,应该从MySQL官方提供的下载页面或者安全平台部第三方软件统一下载前台(建设中)下载。MySQL官网地址为:
http://www.mysql.com/downloads/mysql/
MariaDB则在 https://downloads.mariadb.org/
1.1 下载后的校验
下载的同时,需记录下官方提供的文件hash(推荐MD5)
下载完毕后立即判断下载的文件hash是否与官网提供一致,Linux下可以使用以下命令来判断:
md5sum filepath.tar.gz
2. 安装
Mysql安装时,建议不引入不必要的模块
3. 安全配置
3.1 Mysql启动账户
首先必须要使用独立的受限账户启动Mysql,一般是系统中存用户名和用户组均为mysql的账户,同时把配置文件拷贝到/etc目录。使用mysql来启动mysql服务:
/usr/local/mysql/bin/mysqld_safe –user=mysql &
3.2 Mysql网络控制:
Mysql默认配置为绑定所有的ip,服务器有外网可以被外网访问。为安全起见必须绑定内网ip,不允许外网访问,可编辑配置文件my.cnf,在[mysqld]选项中增加一项:
bind_address = 127.0.0.1
#后面的ip地址代表需要绑定的内网ip地址
3.3 Root账户设置密码
Mysql默认安装后,缺省管理员账户的密码为空,需要对该账户设置密码,可以采用如下办法设置管理员密码:
mysql> use mysql;
mysql> update user set password=password('upassword') where user='root';
mysql> flush privileges;
3.4 删除默认数据库及用户
Mysql初始化后会自动生成空用户和test库,会对数据库安全构成威胁,需要全部删除。可采用如下方法:
mysql>drop database test;
mysql>use mysql;
mysql>delete from db;
mysql>delete from user where not(host=”localhost” and user=”root”);
mysql>flush privileges;
3.5 控制远程连接
由于Mysql是可以远程连接的,需要控制远程连接的范围,如仅内网访问或不允许网络访问。禁止任意远程账户连接。 可以采用如下方式或者通过防火墙来限制mysql的远程访问。
mysql> show grants for username; //显示账户权限
mysql> grant all on dbname.* to 'username'@'ip地址' identified by '密码';
3.6 控制数据库的权限
对于使用web脚本进行交互的数据库,建议建立一个用户只针对某个库有update,select,delete,insert,drop table,create table等权限,减小数据库的用户名和密码被黑客窃取后的影响和损失。控制数据库的权限可参考如下:
Mysql> grant select,insert,update,delete,create,drop privileges
on dbname.* To user1@localhost identified by ‘密码’;
//数据库名,账户及密码需要根据实际情况填写
3.7 禁止其他用户访问数据库文件
数据库文件所在目录不允许未经授权的用户访问,未经授权的用户访问数据库文件仍然会得到数据库的相关数据及信息,需要限制对该目录的访问
# chown –R mysql.mysql /usr/mysql/data
# chmod –R go-rwx /usr/mysql/data
4. 简明Checklist
PHP
1.1 下载位置
PHP程序的下载,应该从PHP官方提供的下载页面下载:
PHP官网下载地址为:http://www.php.net/downloads.php
注意不要下载和使用beta版本。
1.2 下载后的校验
下载的同时,需记录下官方提供的文件hash(推荐MD5)。
下载完毕后立即判断下载的文件hash是否与官网提供一致,Linux下可以使用以下命令来判断:
md5sum filepath.tar.gz
如果md5sum得出的hash与官网提供的不相同,则不能进行安装。
2 安装
php安装时,建议不引入不必要的模块。
3 安全配置
3.1 控制脚本访问权限
PHP默认配置允许php脚本程序访问服务器上的任意文件,为避免php脚本访问不该访问的文件,从一定程度上限制了php木马的危害,需设置php只能访问网站目录或者其他必须可访问的目录。
/data/www/为网站根目录,打开php.ini,安全加固配置方式如下:
open_basedir = /data/www:/tmp
3.2 禁止使用的PHP危险函数
Web木马程序通常利用php的特殊函数执行系统命令,查询任意目录文件,增加修改删除文件等。php木马程序常使用的函数为:dl,eval,assert,exec,popen,system,passthru,shell_exec等。
打开php.ini,安全加固配置方式如下,禁止使用这些危险函数:
disable_functions = dl,assert,exec,popen,system,passthru,shell_exec,proc_close,proc_open,pcntl_exec
4.3 关闭错误消息显示
php在没有连接到数据库或者其他情况下会有提示错误,一般错误信息中会包含php脚本当前的路径信息或者查询的SQL语句等信息,这类信息提供给黑客后,是不安全的,所以服务器建议禁止错误提示。
打开php.ini,安全加固配置方式如下,关闭错误信息显示设置:
display_errors = Off
4.4 开启错误日志记录
在关闭display_errors后能够把错误信息记录下来,便于查找服务器运行的原因,同时也要设置错误日志存放的目录,建议跟webserver的日志放在一起。
打开php.ini,安全加固配置方式如下,打开错误日志记录并设置错误日志存放路径:
log_errors = On
error_log =/data/logs
注意事项:该文件必须允许webserver的用户和组具有写的权限
4.5 禁止访问远程文件
允许访问URL远程资源使得PHP应用程序的漏洞变得更加容易被利用,php脚本若存在远程文件包含漏洞可以让攻击者直接获取网站权限及上传web木马,一般会在php配置文件中关闭该功能,若需要访问远程服务器建议采用其他方式如libcurl库。
打开php.ini,安全加固配置方式如下,禁止访问远程文件:
allow_url_fopen = Off
allow_url_include = Off
4.5 nginx文件解析漏洞防御
如果webserver为nginx, 则须在PHP的配置文件php.ini中配置cgi.fix_pathinfo = 0,防止nginx文件解析漏洞。
4.6PHP(FastCGI)非root权限启动
如果使用FastCGI方式解析PHP,则需要非root权限运行。
1、如果是启动php-cgi进程,则需要su切换到普通用户再启动。
2、如果是启动php-fpm进程,默认配置已是非root运行,不能修改为root运行。
4.7 PHP(FastCGI)监听端口做访问控制
FastCGI 只监听 127.0.0.1
5 简明Checklist
Nginx
1. 下载位置
Nginx软件的下载,应该从Nginx官方提供的下载页面下载。Nginx官网下载地址为:http://nginx.org/en/download.html
需要下载最新稳定版本。注意不要下载beta版本
2. 下载后的校验
下载的同时,需记录下官方提供的文件hash(推荐MD5)
下载完毕后立即判断下载的文件hash是否与官网提供一致,Linux下可以使用以下命令来判断:
md5sum filepath.tar.gz
果md5sum得出的hash与官网提供的不相同,则不能进行安装
3.安装
Nginx安装时,不引入不必要的模块
4.配置
4.1 消除目录浏览漏洞
nginx默认不允许目录浏览,请检查目录浏览的相关配置,确保没有目录浏览漏洞:
检查各个配置文件,确保autoindex的配置为off。
autoindex off
4.2 开启访问日志
开启日志有助于发生安全事件后回溯分析整个事件的原因及定位攻击者
默认情况下,nginx已开启访问日志记录,请在nginx配置文件中确认已开启访问日志
access_log /data/nginx_logs/access.log combined;
4.3 目录安全配置
如果Nginx以nobody用户启动,则黑客通过网站漏洞入侵服务器后,将获得nginx的nobody权限,因此需要确认网站web目录和文件的属主与nginx启动用户不同,防止网站被黑客恶意篡改和删除。网站web目录和文件的属主可以设置为root等(非nginx启动用户)。Web目录权限统一设置为755,web文件权限统一设置为644。只有上传目录等需要可读可写权限的目录可以设置为777 。
但是,黑客可以在777权限目录中上传或者写入web木马,因此应该严格保证777权限的目录没有执行脚本的权限。安全配置如下:
1、对于使用php的业务,在nginx配置文件中添加如下配置,即可禁止log目录执行php脚本:
location ~* ^/data/log/.*\.(php|php5)$ {
deny all;
}
2、对于使用非php的业务(如python、二进制cgi等),则需禁止外部访问777目录,配置用例如下:
Location ~ ^/log/ {
deny all;
}
4.4 管理目录安全配置
对于管理目录,需要做到只允许合法ip可以访问,nginx限制白名单ip访问的配置日下:
location ~ ^/private/ {
allow 192.168.1.0/24;
deny all;
}
管理目录建议启用密码认证,密码认证依靠Web应用自身的认证机制。如果Web应用无认证机制,可启用nginx的密码认证机制,配置如下:
location ^~ /soft/ { location ~ .*\.(php|php5)?$ {
fastcgi_pass unix:/tmp/php-cgi.sock;#这里按照你自己的设置
fastcgi_index index.php; include fcgi.conf;
}
auth_basic "Authorized users only";
auth_basic_user_file 这里写前面脚本返回的文件路径;
4.5 删除默认页面
删除nginx默认首页index.html,业务可以自行创建默认首页代替之。
Nginx存在默认目录: http://127.0.0.1/doc
删除如下配置信息:
location /doc {
root /usr/share;
autoindex on;
allow 127.0.0.1;
deny all;
}
location /images {
root /usr/share;
autoindex off;
}
删除首页index.html后,新建其他首页内容不允许出现如下首页内容:
SSH
1. 修改默认端口
/etc/ssh/sshd_config
Port 22 #把这个端口号改成其他
然后重新启动sshd
service sshd restart
2. 修改root密码
root密码必须包含大小写字母数字和符号,且长度不小于12位
3. 安装file2ban 参考这个文章 https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-centos-7
在不使用 ssh的时候在腾讯云里的安全组里禁用 ssh端口