Linux系统常见加固
(1)Linux 设置密码最长过期天数,最小长度等
vim /etc/login.defs
增加如下内容
PASS_MAX_DAYS 90 # 密码最长过期天数
PASS_MIN_DAYS 80 # 密码最小过期天数
PASS_MIN_LEN 8 # 密码最小长度
PASS_WARN_AGE 7 # 密码过期警告天数
vim /etc/pam.d/system-auth
把 password requisite pam_cracklib.so 一行换成如下内容:
password requisite pam_cracklib.so retry=5 difok=3 minlen=8 ucredit=-1 lcredit=-3 dcredit=-3 dictpath=/usr/share/cracklib/pw_dict
参数含义:
修改密码尝试次数:5 ;
与旧口令最少不同字符:3 ;
最小密码长度:8 ;
最少大写字母:1;
最少小写字母:3 ;
最少数字:3 ;
字典位置:/usr/share/cracklib/pw_dict
(2)设置登录限制,规定在n 次失败后限制n秒后才能重新登录
vim /etc/pam.d/sshd
增加如下内容
auth required pam_tally2.so onerr=fail deny=5 unlock_time=300 even_deny_root root_unlock_time=300
解释:设置为密码连续错误5次锁定,锁定时间300秒 root密码连续错误3次锁定,时间为 300秒 )
root_unlock_time: 表示root用户锁定时间
unlock_time: 表示普通用户锁定时间
onerr=fail: 表示连续失败
deny=5: 表示超过5次登录失败即锁定
如果不想限制root用户,可以去掉:even_deny_root root_unlock_time=300。
编辑完成后重启sshd
systemctl restart sshd.service
(3)登录连接超过5分钟自动退出
1.修改ssh配置文件(适用于SSH会话)
vim /etc/ssh/sshd_config
ClientAliveInterval 1800 #秒
ClientAliveCountMax 0 #次数
systemctl reload sshd #更新sshd配置
2、修改终端环境变量(适用于交互式终端会话)
用户级:
#修改~/.bashrc或~/.bash_profile
vim ~/.bashrc
TMOUT=3600 #秒
source ~/.bashrc
系统级:
vim /etc/profile
export TMOUT=43200 #秒
source /etc/profile
3、修改用户在使用 su 命令切换到其他用户后的超时时间
用户级则修改各用户的.bashrc 或 .bash_profile 文件
vim /etc/login.defs
SU_TIMEOUT 10 #分钟
(4)限制root用户登录
vim /etc/ssh/sshd_config
增加如下内容
PermitRootLogin = no
编辑完成后重启sshd
systemctl restart sshd.service
(5)Linux强制用户首次登陆修改密码
[root@123 ~]# chage -d 0 user01
-d 0 user01设置该用户密码是在1970年1月1日更改的,这实际上是让当前密码立即到期,从而让密码在下一次登录时被更改。
chage 命令说明
使用示例:
1、查看user01用户以及密码的有效期
[root@123 ~]# chage -l user01
(6)linux设置user01用户90天后密码过期,
设置至少7天后才能修改密码,密码过期前30天开始收到告警信息。
[root@123 ~]# chage -M 90 -m 7 -W 30 user01
验证结果:
[root@123 ~]# chage -l user01
(7)linux设置服务器审计记录保存时间6个月以上
7.1设置审计日志保存6个月以上:需要调整日志滚动策略。
vi /etc/audit/auditd.conf
max_log_file = 180
表示保留180个日志文件,每个文件一天。
要定期自动压缩和删除旧的审计记录,可以使用logrotate工具。在/etc/logrotate.d/目录下创建一个名为audit的文件,文件内容可以如下所示:
/var/log/audit/*.log {
daily
rotate 180
compress
delaycompress
notifempty
missingok
}
这将使日志每天轮转一次,并保留180个日志文件。旧的日志文件将被压缩,并在下次轮转时被删除。
修改完重启审计服务
sudo systemctl start auditd
- linux设置日志文件保存时间为6个月
vi /etc/logrotate.conf
将全局的weekly下的rotate 4改为rotate 24,表示6个月;
将指定文件的monthly下的rotate 1改为rotate 6,表示6个月
Mysql数据库加固
(1)设置 mysql 数据库密码复杂度、密码长度
设置密码负责度策略,密码最小长度设置为8位,采用数字、字母、特殊符号等组合的方式。
1.1 安装插件:
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
1.2 vi /etc/my.cnf,增加以下配置,
[mysqld]
plugin-load-add=validate_password.so
validate_password = on
validate_password_policy = 1
validate_password_length=8
1.3 重启数据库生效:
各项解释如下:
plugin-load-add=validate_password.so
这一行的意思是数据库重启的时候自动加载密码复杂度插件,不配置的话,一般没问题,但遇到数据库迁移的话,可能会启动数据库失败,为保险起见,还是加上这一行。
validate_password = on #开启密码复杂度验证插件
validate_password_policy = 1 #密码负责度策略,这里设置为1,中复杂度。
validate_password_policy类型如下,有三个可选项
validate_password_length=8 #设置密码的最小长度
验证:使用弱口令进行密码验证
mysql>CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
结果如下:
(3)设置 mysql 登录失败次数
- 登录数据库,安装插件
install plugin CONNECTION_CONTROL soname 'connection_control.so';
install plugin CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS soname 'connection_control.so';
2、查看所有已安装的插件
show plugins;
3、按需修改配置文件(/etc/my.cnf)
vim /etc/my.cnf
添加如下两行配置:
connection-control-failed-connections-threshold=5 #登陆失败次数限制
connection-control-min-connection-delay=1800000 #限制重试时间,此处为毫秒,注意按需求换算
4、重新启动MySQL
5、重新登录数据库,查看配置是否生效
mysql>show variables like '%connection_control%';
6、验证
输错5次密码后,会发现第6次登录会卡住,限制登录,时间为设定的限制时间30分钟
(4)设置 mysql 数据库连接超时时间
临时设置
登录mysql以后执行如下命令即可
mysql>SET GLOBAL wait_timeout = 1800;
mysql>SET GLOBAL interactive_timeout = 1800;
永久设置
vi my.cnf
添加如下内容
wait_timeout = 1800;
interactive_timeout = 1800;
然后重启mysql
查看连接空闲超时时间命令 show variables like 'wait_timeout' ;
参数说明:
Connect_time:mysql 客户端在尝试与 mysql 服务器建立连接时,mysql 服务器返回错误握 手协议前等待客户端数据包的最大时限。默认 10 秒。
Wait_timeout:等待超时时间、默认值 28800 秒(8 小时)
interactive_timeout:交互式连接超时时间(mysql 工具、mysqldump 等) wait_timeout:非交互式连接超时时间
(4)设置 mysql 数据库用户及用户允许登录的 IP
设置用户root登录IP为192.168.1.100
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.100' IDENTIFIED BY 'password';
刷新权限
mysql>FLUSH PRIVILEGES;
查询用户权限:mysql>show grants for root@localhost ;
查询用户列表及对应的登录 IP:select user,host from mysql.user;
参数说明:
Host 列指定了允许用户登录所使用的 IP,比如 user=root Host=192.168.1.1。这里的意思 就是说 root 用户只能通过 192.168.1.1 的客户端去访问。
而%是个通配符,如果 Host=192.168.1.%,那么就表示只要是 IP 地址前缀为“ 192.168.1. ” 的客户端都可以连接。如果 Host=%,表示所有 IP 都有连接权限。
(5)设置 mysql 数据库开启通用日志功能
临时设置
mysql>SET GLOBAL general_log = 'ON';
永久设置
vi my.cnf 添加如下内容:
general_log = 'ON';
然后重启mysql
mysql> SHOW VARIABLES LIKE '%general%';
参数说明:
general_log:记录所有到达 MySQL Server 的 SQL 语句记录,VALUE 值为 ON,说明已开启。
- 设置 mysql 数据库开启log_bin 日志功能
vi my.cnf
[mysqld] 节下,添加以下配置项:
log-bin=mysql-bin ##mysql 5.7版本使用此配置
log_bin = /var/log/mysql/mysql-bin.log ##设置binlog存储路径
编辑完成重启mysql
查看数据库 log_bin 的日志文件是否开启:
mysql>show variables like 'log_bin' ;
参数说明:
Log_bin:记录了所有的 DDL 和 DML(除了数据查询语句)语句,VALUE 值为 ON,说明已开启。
- 设置 mysql 数据库开启审计功能
mysql> INSTALL PLUGIN audit_log SONAME 'audit_log.so';
mysql> SHOW PLUGINS;
vi my.cnf 在[mysqld]添加以下配置项:
plugin_load_add = "audit_log.so" # 启用审计功能
# 审计日志文件路径
audit_log = "/var/log/mysql/audit.log"
修改完重启mysql
验证:mysql>show variables like '%audit%' ;
- 设置 mysql 数据库密码有效期
临时设置
mysql> SET GLOBAL default_password_lifetime = 90;
或者
mysql> ALTER USER 'username'@'hostname' PASSWORD EXPIRE INTERVAL 90 DAY;
查看过期时间
mysql> SHOW VARIABLES LIKE 'default_password_lifetime';
永久设置
vi my.cnf
[mysqld]
default_password_lifetime=90 #过期时间90天
5、查看账号过期状态
mysql> SELECT user, host, password_expired, password_last_changed, account_locked FROM mysql.user;