废话不多说,直接上菜~~~
Linux 安全基线检查
检查系统空密码账户
描述:检查系统空密码账户
加固建议:为用户设置一个非空密码,或者执行passwd -l <username>
锁定用户
禁止SSH空密码用户登录
描述:禁止SSH空密码用户登录
加固建议:编辑文件/etc/ssh/sshd_config
,将PermitEmptyPasswords
配置为no
vim /etc/ssh/sshd_config
PermitEmptyPasswords no
确保密码到期警告天数为7或更多
描述:确保密码到期警告天数为7或更多
加固建议:在/etc/login.defs
中将PASS_WARN_AGE
参数设置为7-14之间,建议为7
vim /etc/login.defs
PASS_WARN_AGE 7
# 执行命令使root用户设置生效:
[root@localhost ~]# chage --warndays 7 root
确保SSH MaxAuthTries设置为3到6之间
描述:设置较低的Max AuthTrimes参数将降低SSH服务器被暴力攻击成功的风险。
加固建议:在/etc/ssh/sshd_config
中取消MaxAuthTries
注释符号#,设置最大密码尝试失败次数3-6,建议为4
vim /etc/ssh/sshd_config
MaxAuthTries 4
设置SSH空闲超时退出时间服务配置
描述:设置SSH空闲超时退出时间,可降低未授权用户访问其他用户ssh会话的风险
加固建议:编辑/etc/ssh/sshd_config
,将ClientAliveInterval
设置为300到900,即5-15分钟,将ClientAliveCountMax
设置为0-3之间。
vim /etc/ssh/sshd_config
ClientAliveInterval 600
ClientAliveCountMax 2
确保rsyslog服务已启用
描述:确保rsyslog服务已启用,记录日志用于审计
加固建议:运行以下命令启用rsyslog服务
[root@localhost ~]# systemctl enable rsyslog
[root@localhost ~]# systemctl start rsyslog
确保SSH LogLevel设置为INFO服务配置
描述:确保SSH LogLevel设置为INFO,记录登录和注销活动
加固建议:编辑/etc/ssh/sshd_config
文件以按如下方式设置参数(取消注释)
vim /etc/ssh/sshd_config
LogLevel INFO
访问控制配置文件的权限设置
描述:访问控制配置文件的权限设置
加固建议:运行以下4条命令
[root@localhost ~]# chown root:root /etc/hosts.allow
[root@localhost ~]# chown root:root /etc/hosts.deny
[root@localhost ~]# chmod 644 /etc/hosts.deny
[root@localhost ~]# chmod 644 /etc/hosts.allow
设置用户权限配置文件的权限
描述:设置用户权限配置文件的权限
加固建议:执行以下5条命令
[root@localhost ~]# chown root:root /etc/passwd /etc/shadow /etc/group /etc/gshadow
[root@localhost ~]# chmod 0644 /etc/group
[root@localhost ~]# chmod 0644 /etc/passwd
[root@localhost ~]# chmod 0400 /etc/shadow
[root@localhost ~]# chmod 0400 /etc/gshadow
开启地址空间布局随机化入侵防范
描述:它将进程的内存空间地址随机化来增大入侵者预测目的地址难度,从而降低进程被成功入侵的风险
加固建议:在/etc/sysctl.conf
或/etc/sysctl.d/*
文件中设置以下参数并执行立即生效命令
vim /etc/sysctl.conf
kernel.randomize_va_space = 2
# 执行命令设置立即生效:
[root@localhost ~]# sysctl -w kernel.randomize_va_space=2
确保root是唯一的UID为0的帐户
描述:除root以外其他UID为0的用户都应该删除,或者为其分配新的UID
加固建议:除root以外其他UID为0的用户都应该删除,或者为其分配新的UID
#查看命令
[root@localhost ~]# cat /etc/passwd | awk -F: '($3 == 0) { print $1 }'|grep -v '^root$'
密码复杂度检查身份鉴别
描述:检查密码长度和密码是否使用多种字符类型
加固建议:编辑/etc/security/pwquality.conf
,把minlen(密码最小长度)设置为8-32位,把minclass(至少包含小写字母、大写字母、数字、特殊字符等4类字符中等3类或4类)设置为3或4
vim /etc/security/pwquality.conf
minlen=10
minclass=3
检查密码重用是否受限制
描述:强制用户不重用最近使用的密码,降低密码猜测攻击风险
加固建议:在/etc/pam.d/password-auth
和/etc/pam.d/system-auth
中password sufficient pam_unix.so
这行的末尾配置remember
参数为5-24之间,原来的内容不用更改,只在末尾加了remember=5
。
设置密码失效时间
描述:设置密码失效时间,强制定期修改密码,减少密码被泄漏和猜测风险,使用非密码登陆方式(如密钥对)请忽略此项。
加固建议:使用非密码登陆方式如密钥对,请忽略此项。在/etc/login.defs
中将PASS_MAX_DAYS
参数设置为60-180之间
vim /etc/login.defs
PASS_MAX_DAYS 90
# 需同时执行命令设置root密码失效时间:
[root@localhost ~]# chage --maxdays 90 root
设置密码修改最小间隔时间
描述:设置密码修改最小间隔时间,限制密码更改过于频繁
加固建议:在/etc/login.defs
中将PASS_MIN_DAYS参数设置为7-14之间,建议为7
vim /etc/login.defs
PASS_MIN_DAYS 7
# 需同时执行命令为root用户设置:
[root@localhost ~]# chage --mindays 7 root
Nginx安全基线检查
检查是否配置Nginx账号锁定策略
描述:
1.执行系统命令passwd -S nginx
来查看锁定状态,出现Password locked证明锁定成功
2.默认符合,修改后才有(默认已符合)
3.执行系统命令passwd -l nginx
进行锁定
加固建议:
配置Nginx账号登录锁定策略:Nginx服务建议使用非root用户(如nginx,nobody)启动,并且确保启动用户的状态为锁定状态。可执行passwd -l <Nginx启动用户>
如:passwd -l nginx
来锁定Nginx服务的启动用户。命令passwd -S <用户>
如:passwd -S nginx
可查看用户状态。修改配置文件中的nginx启动用户修改为nginx或nobody 如:user nobody;
检查Nginx进程启动账号
描述:Nginx进程启动账号状态,降低被攻击概率
加固建议:修改Nginx进程启动账号
1.打开conf/nginx.conf配置文件
2.查看配置文件的user配置项,确认是非root启动的
3.如果是root启动,修改成nobody或者nginx账号
4.修改完配置文件之后需要重新启动Nginx
确保NGINX配置文件权限为644
描述:把控配置文件权限以抵御外来攻击
加固建议:修改Nginx配置文件权限:执行chmod 644 <conf_path>
来限制Nginx配置文件的权限(<conf_path>为配置文件的路径,如默认安装目录/conf/nginx.conf
或者/etc/nginx/nginx.conf)
针对Nginx SSL协议进行安全加固
描述:Nginx SSL协议的加密策略进行加固
加固建议:Nginx SSL协议采用TLSv1.2,配置此项请确认nginx支持OpenSSL,运行nginxv -V
如果返回中包含built with OpenSSL
则表示支持OpenSSL。如果不支持,请重新编译nginx
vim conf/nginx.conf
server {
...
ssl_protocols TLSv1.2;
...
}
任意文件读取入侵防范
描述:一些隐藏文件或文件夹任意读取泄露
加固建议:对一些特殊目录进行特殊定义,最好不要存在
vim conf/nginx.conf
#配置拒绝访问
location /.svn {
deny all;
}
# 配置认证用户密码
location /admin {
index index.php;
try_files $uri $uri/ /index.php$is_args$args;
auth_basic "Hello,Sir! Please enter the authentication!";
auth_basic_user_file /etc/nginx/conf.d/htpasswd;
}
Nginx后端服务指定的Header隐藏状态
描述:隐藏Nginx后端服务X-Powered-By头
加固建议:隐藏Nginx后端服务指定Header的状态
vim conf/nginx.conf
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
隐藏Nginx服务的Banner
描述:Nginx服务的Banner隐藏状态
加固建议:Nginx后端服务指定的Header隐藏状态隐藏Nginx服务Banner的状态,在server栏目下,配置server_tokens项server_tokens off;
确保已禁用自动索引模块
描述:自动索引模块处理以斜杠字符结尾的请求。此功能启用目录列表,这在攻击者侦察中可能很有用,因此应将其禁用
加固建议:搜索Nginx配置文件以查找autoindex指令egrep -i '^\s*autoindex\s+' <main_config_path> egrep -i '^\s*autoindex\s+' <sub_config_path>
在location下删除或者修改为autoindex off;
Nginx 的 WEB 访问日志记录状态
描述:应为每个核心站点启用access_log指令。默认情况下启用。
加固建议:开启Nginx的WEB访问日志记录
1.打开conf/nginx.conf
配置文件,含主配置文件中 include 项包含的子配置文件;
2.在 http 下配置access_log项:access_log logs/host.access.log main;
3.并在主配置文件,及主配置文件下的include文件中 删除off项或配置为适当值
MySQL安全基线检查
确保 MYSQL_PWD 环境变量未设置
描述:MYSQL_PWD 环境变量的使用意味着 MYSQL 凭证的明文存储,极大增加 MySQL 凭据泄露风险
加固建议:删除系统环境变量中MySQL密码(MYSQL_PWD)配置
禁用 symbolic-links 选项
描述:禁用符号链接以防止各种安全风险
加固建议:编辑Mysql配置文件/etc/my.cnf
,在[mysqld]段落中配置symbolic-links=0
,5.6及以上版本应该配置为skip_symbolic_links=yes
,并重启mysql服务
匿名登录检查
描述:检查 MySQL 服务是否允许匿名登录
加固建议:登录 MySQL 数据库,执行以下命令删除匿名账户
[root@localhost ~]# mysql
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> delete from user where user='';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
确保没有用户配置了通配符主机名
描述:避免在主机名中只使用通配符,有助于限定可以连接数据库的客户端,否则服务就开放到了公网
加固建议:执行SQL更新语句,为每个用户指定允许连接的host范围
[root@localhost ~]# mysql
mysql> use mysql;
Database changed
mysql> select user,Host from user where Host='%';
+-------+------+
| user | Host |
+-------+------+
| mingo | % |
+-------+------+
1 row in set (0.00 sec)
删除语句:DROP user 'user_name'@'%';
更新语句:update user set host = <new_host> where host = '%';
确保 log-raw 选项没有配置为 ON
描述:当 log-raw 记录启用时,有权访问日志文件的人可能会看到纯文本密码
加固建议:编辑 Mysql 配置文件/etc/my.cnf
,删除log-raw参数,并重启mysql服务
确保配置了 log-error 选项
描述:启用错误日志可以提高检测针对 mysql 和其他关键消息的恶意尝试的能力,如果错误日志未启用,则连接错误可能会被忽略
加固建议:编辑 Mysql 配置文件/etc/my.cnf
,在[mysqld_safe]段落中配置log-error参数,代表存放日志文件路径
vim /etc/my.cnf
[mysqld_safe]
log-error=/var/log/mysqld.log
删除 'test' 数据库
描述:测试数据库可供所有用户访问,并可用于消耗系统资源。删除测试数据库将减少 MySQL 服务器的攻击面
加固建议:登录数据库执行以下 SQL 语句删除 test 数据库
[root@localhost ~]# mysql
mysql> DROP DATABASE test;
mysql> flush privileges;
禁止 --skip-grant-tables 启动 MySQL
描述:使用此选项,会导致所有客户端都对所有数据库具有不受限制的访问权限
加固建议:编辑Mysql配置文件/etc/my.cnf
删除skip-grant-tables
参数,并重启mysql服务
为 MySQL 使用专用的最低特权账户
描述:使用最低权限账户运行服务可减小MySQL天生漏洞的影响受限账户将无法访问与MySQL无关的资源,例如操作系统配置
加固建议:使用非root和非sudo权限用户启动MySQL服务
修改默认 3306 端口
描述:避免使用熟知的端口,降低被初级扫描的风险
加固建议:编辑/etc/my.cnf
文件[mysqld] 段落中配置新的端口参数,并重启MySQL服务
vim /etc/my.cnf
[mysqld]
port=3506
禁用 local-infile 选项
描述:禁用 local_infile 选项会降低攻击者通过 SQL 注入漏洞器读取敏感文件的能力
加固建议:编辑Mysql配置文件/etc/my.cnf
的[mysqld]段落中配置local-infile
参数为0,并重启mysql服务
vim /etc/my.cnf
[mysqld]
local-infile=0
Redis安全基线检查
开启 redis 密码认证
描述:redis因查询效率高,auth这种命令每秒能处理9w次以上,简单的redis的密码极容易为攻击者暴破
加固建议:打开redis.conf,找到requirepass所在的地方,修改为指定的密码,再去掉前面的#号注释符,然后重启服务
密码应符合复杂性要求:
长度8位以上
包含以下四类字符中的三类字符:
英文大写字母(A 到 Z)
英文小写字母(a 到 z)
10 个基本数字(0 到 9)
非字母字符(例如 !、$、#、%、@、^、&)
避免使用已公开的弱口令,如:abcd.1234 、admin@123等
禁止使用 root 用户启动
描述:使用 root 权限去运行网络服务是比较有风险的(nginx和apache都是有独立的work用户,而redis没有)redis crackit漏洞就是利用root用户的权限来替换或者增加authorized_keys,来获取root登录权限的
加固建议:使用 root 切换到 redis 用户启动服务
[root@localhost ~]# useradd -s /sbin/nolog -M redis
[root@localhost ~]# sudo -u redis /<redis-server-path>/redis-server /<configpath>/redis.conf 2&1>/dev/null &
禁止监听在公网
描述:Redis 监听在 0.0.0.0,可能导致服务对外或内网横向移动渗透风险,极易被黑客利用入侵
加固建议:在redis的配置文件redis.conf
中配置bind 127.0.0.1
或者内网IP,然后重启 redis
限制 redis 配置文件访问权限
描述:因为 redis 密码明文存储在配置文件中,禁止不相关的用户访问改配置文件是必要的,设置 redis 配置文件权限为 600
加固建议:执行以下命令修改配置文件权限
[root@localhost ~]# 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 ""
重命名为""代表禁用命令,如想保留命令,可以重命名为不可猜测的字符串,如:rename-command FLUSHALL joYAPNXRPmcarcR4ZDgC
打开保护模式
描述:redis 默认开启保护模式。要是配置里没有指定 bind 和密码,开启该参数后,redis 只能本地访问,拒绝外部访问
加固建议:编辑文件redis的配置文件redis.conf
设置protected-mode yes