后端服务器安全检查清单
Linux
禁止SSH空密码用户登录 SSH服务配置
禁止SSH空密码用户登录
加固建议
编辑文件/etc/ssh/sshd_config
,将PermitEmptyPasswords
配置为no
:
PermitEmptyPasswords no
设置密码失效时间身份鉴别
设置密码失效时间,强制定期修改密码,减少密码被泄漏和猜测风险,使用非密码登陆方式(如密钥对)请忽略此项。
加固建议
使用非密码登陆方式如密钥对,请忽略此项。
在 /etc/login.defs
中将 PASS_MAX_DAYS
参数设置为 60-180之间,如:
PASS_MAX_DAYS 90
需同时执行命令设置root密码失效时间:
chage --maxdays 90 root
设置密码修改最小间隔时间身份鉴别
设置密码修改最小间隔时间,限制密码更改过于频繁
加固建议
在 /etc/login.defs
中将 PASS_MIN_DAYS
参数设置为7-14之间,建议为7
:
PASS_MIN_DAYS 7
需同时执行命令为root用户设置:
chage --mindays 7 root
设置SSH空闲超时退出时间服务配置
设置SSH空闲超时退出时间,可降低未授权用户访问其他用户ssh会话的风险
加固建议
编辑/etc/ssh/sshd_config
,将ClientAliveInterval
设置为300到900,即5-15分钟,将ClientAliveCountMax
设置为0-3之间。
ClientAliveInterval 600
ClientAliveCountMax 2
密码复杂度检查身份鉴别
检查密码长度和密码是否使用多种字符类型
加固建议
编辑/etc/security/pwquality.conf
,把minlen
(密码最小长度)设置为8-32位,把minclass
(至少包含小写字母、大写字母、数字、特殊字符等4类字符中等3类或4类)设置为3或4。如:
minlen=10
minclass=3
检查密码重用是否受限制身份鉴别
强制用户不重用最近使用的密码,降低密码猜测攻击风险
加固建议
在/etc/pam.d/password-auth
和/etc/pam.d/system-auth
中password sufficient pam_unix.so
这行的末尾配置remember
参数为5-24之间,原来的内容不用更改,只在末尾加了remember=5
。
nginx
检查Nginx进程启动账号
Nginx进程启动账号状态,降低被攻击概率
加固建议
修改Nginx进程启动账号:
- 打开
conf/nginx.conf
配置文件; - 查看配置文件的user配置项,确认是非
root
启动的; - 如果是
root
启动,修改成nobody
或者nginx
账号;
备注:修改完配置文件之后需要重新启动Nginx。
Nginx后端服务指定的Header隐藏状态服务配置
隐藏Nginx后端服务X-Powered-By头
加固建议
隐藏Nginx后端服务指定Header的状态: 1、打开conf/nginx.conf
配置文件; 2、在http下配置proxy_hide_header
项; 增加或修改为 proxy_hide_header X-Powered-By; proxy_hide_header Server;
隐藏Nginx服务的Banner服务配置
Nginx服务的Banner隐藏状态
加固建议
Nginx后端服务指定的Header隐藏状态隐藏Nginx服务Banner的状态:
- 打开
conf/nginx.conf
配置文件; - 在server栏目下,配置
server_tokens
项server_tokens off;
如出现多项不支持,执行ln <conf_path> /etc/nginx/nginx.conf
Nginx SSL协议的加密策略进行加固
加固建议
Nginx SSL协议采用TLSv1.2:
- 打开
conf/nginx.conf
配置文件(或主配置文件中的inlude文件); - 配置
server {
...
ssl_protocols TLSv1.2;
...
}
备注:配置此项请确认nginx支持OpenSSL,运行nginx -V 如果返回中包含built with OpenSSL则表示支持OpenSSL。 如不支持,可能需要增加配置ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 如果尚未配置ssl协议,请尽快配置(参考连接https://www.nginx.cn/doc/optional/ssl.html)
mySQL
确保没有用户配置了通配符主机名身份鉴别
避免在主机名中只使用通配符,有助于限定可以连接数据库的客户端,否则服务就开放到了公网
加固建议
执行SQL更新语句,为每个用户指定允许连接的host范围。
登录数据库,执行use mysql;
;
执行语句select user,Host from user where Host='%';
查看HOST为通配符的用户;
删除用户或者修改用户host字段,删除语句:DROP USER 'user_name'@'%';
。更新语句:update user set host = <new_host> where host = '%';
。
执行SQL语句:
OPTIMIZE TABLE user;
flush privileges;
删除’test’数据库服务配置
测试数据库可供所有用户访问,并可用于消耗系统资源。删除测试数据库将减少MySQL服务器的攻击面。
加固建议
登录数据库执行以下SQL语句删除test数据库:
DROP DATABASE test;
flush privileges;
确保配置了log-error选项安全审计
启用错误日志可以提高检测针对mysql和其他关键消息的恶意尝试的能力,例如,如果错误日志未启用,则连接错误可能会被忽略。
加固建议
编辑Mysql配置文件<conf_path>/my.cnf
,在[mysqld_safe]
段落中配置log-error
参数,<log_path>
代表存放日志文件路径,如:/var/log/mysqld.log
,并重启mysql服务:
log-error=<log_path>
禁用local-infile选项访问控制
禁用local_infile选项会降低攻击者通过SQL注入漏洞器读取敏感文件的能力
加固建议
编辑Mysql配置文件<conf_path>/my.cnf,在[mysqld] 段落中配置local-infile参数为0,并重启mysql服务:
local-infile=0
禁用symbolic-links选项服务配置
禁用符号链接以防止各种安全风险
加固建议
编辑Mysql配置文件<conf_path>/my.cnf
,在[mysqld]
段落中配置symbolic-links=0
,5.6及以上版本应该配置为skip_symbolic_links=yes
,并重启mysql服务。
Redis
##禁止监听在公网 访问控制
Redis监听在0.0.0.0
,可能导致服务对外或内网横向移动渗透风险,极易被黑客利用入侵。
加固建议
在redis的配置文件redis.conf
中配置如下: bind 127.0.0.1
或者内网IP,然后重启redis
Redis未授权访问身份鉴别
Redis端口对外开放并且没有配置认证选项,未授权用户除了可直接获取数据库中所有信息,造成严重的信息泄露外,还可以通过未授权访问漏洞入侵攻击系统。
加固建议
可以使用以下方法修复: 1.为Redis服务配置认证,在配置文件redis.conf中requirepass 配置复杂密码,然后重启redis。
- 在Redis的配置文件redis.conf中配置如下:
bind 127.0.0.1
,只允许本机访问,然后重启redis
##禁止使用root用户启动 访问控制
使用root权限去运行网络服务是比较有风险的(nginx和apache都是有独立的work用户,而redis没有)。redis crackit 漏洞就是利用root用户的权限来替换或者增加authorized_keys,来获取root登录权限的
加固建议
使用root切换到redis用户启动服务:
useradd -s /sbin/nolog -M redis
sudo -u redis /<redis-server-path>/redis-server /<configpath>/redis.conf 2&1>/dev/null &
限制redis 配置文件访问权限 文件权限
因为redis密码明文存储在配置文件中,禁止不相关的用户访问改配置文件是必要的,设置redis配置文件权限为600,
加固建议
执行以下命令修改配置文件权限:
chmod 600 /<filepath>/redis.conf
修改默认6379端口 服务配置
避免使用熟知的端口,降低被初级扫描的风险
加固建议
编辑文件redis的配置文件redis.conf
,找到包含port的行,将默认的6379修改为自定义的端口号,然后重启redis
禁用或者重命名危险命令 入侵防范
Redis中线上使用keys *命令,也是非常危险的。因此线上的Redis必须考虑禁用一些危险的命令,或者尽量避免谁都可以使用这些命令,Redis没有完整的管理系统,但是也提供了一些方案。
加固建议
修改 redis.conf 文件,添加
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command KEYS ""
rename-command SHUTDOWN ""
rename-command DEL ""
rename-command EVAL ""
然后重启redis。 重命名为"" 代表禁用命令,如想保留命令,可以重命名为不可猜测的字符串,如: rename-command FLUSHALL joYAPNXRPmcarcR4ZDgC
打开保护模式 访问控制
redis默认开启保护模式。要是配置里没有指定bind和密码,开启该参数后,redis只能本地访问,拒绝外部访问。
加固建议
redis.conf安全设置: # 打开保护模式 protected-mode yes
开启redis密码认证,并设置高复杂度密码 身份鉴别
redis在redis.conf
配置文件中,设置配置项requirepass
, 开户密码认证。 redis因查询效率高,auth这种命令每秒能处理9w次以上,简单的redis的密码极容易为攻击者暴破。
加固建议
打开redis.conf
,找到requirepass
所在的地方,修改为指定的密码,密码应符合复杂性要求:
- 长度8位以上
- 包含以下四类字符中的三类字符: 英文大写字母(A 到 Z) 英文小写字母(a 到 z) 10 个基本数字(0 到 9) 非字母字符(例如 !、$、#、%、@、^、&)
- 避免使用已公开的弱口令,如:
abcd.1234
、admin@123
等
再去掉前面的#
号注释符,然后重启redis