废话不多说,直接上菜~~~

注意:操作时建议做好记录或备份哟~

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-authpassword 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

最后修改:2022 年 04 月 26 日
-