服务器及MySQL安全设置指南
在安全设置中,密码复杂度、登录失败和登录超时等策略是关键的安全措施。这些措施可以有效防止未授权访问,并增强系统的整体安全性,接下来我们将详细介绍如何配置这些安全策略。
密码复杂度规则确保用户创建的密码足够强壮,难以被猜测或暴力破解。可以通过以下几种方式来实现:
长度要求:设定最小密码长度(例如至少8个字符)。
字符种类:要求密码包含大写字母、小写字母、数字以及特殊字符。
历史记录:不允许使用最近几次使用的旧密码。
示例:配置有效期90天、长度不少于8位、至少3种字符的密码策略。
#vim /etc/login.defs
PASS_MAX_DAYS 90 (密码有效期)
PASS_MIN_DAYS 0 (密码修改间隔)
PASS_MIN_LEN 8 (密码最小长度)
PASS_WARN_AGE 7 (密码到期前警告)
设置包含字符、大写字母、小写字母
# cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak
# vim /etc/pam.d/system-auth
找到包含pam_pwquality.so模块的行,将原有行注释并修改为如下的新配置:
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 enforce_for_root
# minlen=8 密码最小长度为8个字符。
# lcredit=-1 密码应包含的小写字母的至少一个
# ucredit=-1 密码应包含的大写字母至少一个
# dcredit=-1 将密码包含的数字至少为一个
# ocredit=-1 设置其他符号的最小数量,例如@,#、! $%等,至少要有一个
# enforce_for_root 确保即使是root用户设置密码,也应强制执行复杂性策略
测试:使用passwd测试是否配置成功
登录失败策略用于限制非法尝试登录的次数,以减少通过暴力破解攻击成功的机会。通常包括锁定账户一段时间或永久锁定直至管理员解锁。
示例:配置3次锁定、锁定时长60分钟的登陆失败策略。
# vim /etc/pam.d/sshd
新增以下配置:
auth required pam_tally2.so onerr=fail deny=3 unlock_time=1800 even_deny_root root_unlock_time=300
# root_unlock_time: 表示root用户锁定时间
# unlock_time: 表示普通用户锁定时间
# onerr=fail: 表示连续失败
# deny=3: 表示超过3次登录失败即锁定
# 如果不想限制root用户,可以去掉:even_deny_root root_unlock_time=300。
注意:auth要放到第二行,否则不生效!!
测试:
如果要查看某个用户的登陆失败次数,可以使用以下命令查看:
pam_tally2 --user luweihao
重置某个用户的登陆失败次数:
pam_tally2 --user luweihao --reset
登陆超时策略为了防止会话被长时间闲置而被他人利用,应设置合理的会话超时时间,即当用户无活动状态达到一定时限后自动断开连接。
示例:配置会话超时时间为30分钟。
# vim /etc/profile
注意:在末尾增加(单位是s)
TMOUT=1800
有效的日志记录不仅可以帮助管理员监控系统活动,还能在发生安全事件时提供关键信息用于调查和响应。
示例:启用auditd/rsyslog
service auditd status
service rsyslog status
合理地分配不同的管理角色对于确保系统的安全性至关重要。通过创建系统管理员、安全管理员和审计管理员等角色,并为每个角色设定相应的权限,可以有效地实现职责分离,减少内部威胁风险。
5.1 创建系统管理员(应该对/var进行授权,修改可能会影响到ssh登录)
groupadd sysgroup
useradd sys -g sysgroup
passwd sys
usermod -G sysgroup sys
mkdir /vartest
chown -R sys:sysgroup /vartest
chmod 741 /vartest
5.2 创建安全管理员(应该对/etc进行授权)
useradd -d /security security
passwd security
chown -R security:security /security
chmod 700 /security
5.3 创建审计管理员(应该对/var/log进行授权)
useradd audit
passwd audit
vim /etc/sudoers
添加
audit ALL = (ALL) NOPASSWD: /usr/bin/cat , /usr/bin/less , /usr/bin/more , /usr/bin/tail , /usr/bin/head
chown -R audit:audit /var/log
chmod 700 /var/log
MySQL无法直接进行密码策略配置,需要安装插件。MySQL5.7默认有
validata_password的插件,但是没有安装,需要手动安装。
注意:如果MySQL设置了只读账号,需要先关闭只读,安装完插件后,重新开启只读。
#关闭只设置
set global read_only=0;
#最后再打开只读设置(根据需求)
set global read_only=1;
- INSTALL PLUGIN validate_password SONAME 'validata_password.so';
查看当前设置
SHOW VARIABLES LIKE 'validate_password%';
SHOW VARIABLES LIKE '%password%';
#default_password_lifetime这个为全局设置,影响到所有账号,生产环境谨慎设置。
#validate_password_check_user_name:用于是否检查密码是否与用户名相似。设置为 OFF 表示不检查。
#validate_password_dictionary_file:用于指定用于密码验证的字典文件。如果为空,表示没有配置特定的字典。
#validate_password_length:密码的最小长度,这里表示密码至少需要 8 个字符。
#validate_password_mixed_case_count:密码中必须包含的大写和小写字母的最少数量。在此设置为 1,表示至少需要一个大写或小写字母。
#validate_password_number_count:密码中必须包含的数字的最少数量。在此设置为 1,表示至少需要一个数字。
#validate_password_policy:定义密码的复杂性策略。设置为 MEDIUM,表示密码需满足中等复杂性要求。
#validate_password_special_char_count:密码中必须包含的特殊字符的最少数量。未设置,表示没有要求。
可以自己修改配置,如密码长度修改成10位
SET GLOBAL validate_password_length = 10;
#创建系统管理员用户
CREATE USER 'sysdba'@'localhost' IDENTIFIED BY 'NBYl6vu9d5Bev&S2';
#修改系统管理员用户的密码过期时间
alter user 'sysdba'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
#赋予系统管理员相应的权限
GRANT ALL PRIVILEGES ON *.* TO 'sysdba'@'localhost' WITH GRANT OPTION;
#查看权限
show grants for 'sysdba'@'localhost';
#查看密码过期时间
show create user 'sysdba'@'localhost';
#创建安全管理员用户
CREATE USER 'safedba'@'localhost' IDENTIFIED BY 'CqLs@rGKt3RG@fMI';
#修改安全管理员用户密码过期时间
alter user 'safedba'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
#赋予安全管理员相应的权限
GRANT SELECT, SHOW VIEW ON *.* TO 'safedba'@'localhost';
#查看权限
show grants for 'safedba'@'localhost';
#查看密码过期时间
show create user 'safedba'@'localhost';
#创建审计管理员用户
CREATE USER 'auditdba'@'localhost' IDENTIFIED BY 'isn2ecX#ZVhjx#Eu';
#修改审计管理员用户密码过期时间
alter user 'auditdba'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
#赋予审计管理员相应的权限
GRANT RELOAD, PROCESS, SHOW DATABASES ON *.* TO 'auditdba'@'localhost';
#查看权限
show grants for 'auditdba'@'localhost';
#查看密码过期时间
show create user 'auditdba'@'localhost';
#安装CONNECTION_CONTROL插件
INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
#提供了一个INFORMATION_SCHEMA类型的表,用户在此表中可以查看更详细关于登陆失败连接的信息。
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
#查看当前配置
show variables like '%connection%';
#connection_control_failed_connections_threshold:连续失败最大次数3次,0表示不开启
#connection_control_max_connection_delay:超过最大失败次数之后阻塞登录最大时间(毫秒)
#connection_control_min_connection_delay:超过最大失败次数之后阻塞登录最小时间(毫秒)
#例如:set global connection_control_failed_connections_threshold=0;
#查询各账号登录失败次数
use information_schema;
select * from connection_control_failed_login_attempts;
#卸载插件
UNINSTALL PLUGIN CONNECTION_CONTROL;
UNINSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
show variables like "%wait_timeout%";
#修改超时时间为600s
set global wait_timeout=600;
正确地配置以上策略能够显著提高服务器的安全性,但同时也需要注意不要给合法用户提供过多障碍。因此,在实施上述任何一种策略之前,请根据实际情况做出适当调整,确保既保证了安全性又不影响正常使用体验。