sshd配置
配置文件:/etc/ssh/sshd_config
Note: 更改ssh相关配置后需要重启sshd服务 systemctl restart sshd
ssh访问控制
AllowUsers
AllowGroups
DenyUsers
DenyGroups
配置加密算法
Ciphers aes256-ctr,aes192-ctr,aes128-ctr # 使用已批准的加密类型
MACs hmac-sha2-512,hmac-sha2-256 # 使用已批准的Mac算法
密码验证
PermitEmptyPasswords no # 禁止无密码访问服务器
PermitRootLogin yes # 是否禁止使用root登录(为方便管理,暂未收回权限)
如果禁用root需要创建一个超级管理员。
openssh主机认证
HostbasedAuthentication no
限制用户认证次数
MaxAuthTries 4 # 等保三要求该值小于等于 4
ssh空闲超时
ClientAliveInterval 300 # 小于等于300s
ClientAliveCountMax 3 # 存活用户数小于等于3
用户认证及密码强度管理(pam)
pam 简介
Linux-PAM(linux可插入认证模块)是一套共享库,使本地系统管理员可以随意选择程序的认证方式.。换句话说,不用(重新编写)重新编译一个包含PAM功能的应用程序,就可以改变它使用的认证机制。这种方式下,就算升级本地认证机制,也不用修改程序。
PAM使用配置 /etc/pam.d/ 下的文件,来管理对程序的认证方式。应用程序调用相应的配置文件,从而调用本地的认证模块。模块放置在 /lib/security 下,以加载动态库的形式进,像我们使用su命令时,系统会提示你输入root用户的密码,这就是su命令通过调用PAM模块实现的。
pam 配置文件介绍
PAM配置文件有两种写法:
一种是写在 /etc/pam.conf 文件中,但centos6之后的系统中,这个文件就没有了。
另一种写法是,将PAM配置文件放到 /etc/pam.d/ 目录下,其规则内容都是不包含 service 部分的,即不包含服务名称,而 /etc/pam.d 目录下文件的名字就是服务名称。如: vsftpd,login等。
配置文件示例:
由上图可以将配置文件内容划分为四列:
第一列:代表模块类型
第二列:代表控制标记
第三列:代表模块路径
第四列:代表模块参数
pam 模块类型
Linux-PAM有四种模块类型,分别代表四种不同的任务,它们是:
认证管理(auth)
账号管理(account)
会话管理(session)
密码(password)管理
一个类型可能有多行,它们按顺序依次由PAM模块调用 。
管理方式
说明
auth
用来对用户的身份进行识别。如:提示用户输入密码,或判断用户是否为root等。
account
对帐号的各项属性进行检查。如:是否允许登录,是否达到最大用户数,或是root用户是否允许在这个终端登录等。
session
这个模块用来定义用户登录前的,及用户退出后所要进行的操作。如:登录连接信息,用户数据的打开与关闭,挂载文件系统等。
password
使用用户信息来更新。如:修改用户密码。
pam 控制标记
PAM使用控制标记来处理和判断各个模块的返回值。(在此只说明简单的认证标记)
控制标记
说明
required
表示即使某个模块对用户的验证失败,也要等所有的模块都执行完毕后,PAM 才返回错误信息。这样做是为了不让用户知道被哪个模块拒绝,如果对用户验证成功,所有的模块都会返回成功信息。
requisite
与required相似,但是如果这个模块返回失败,则立刻向应用程序返回失败,表示此类型失败,不再进行同类型后面的操作。
sufficient
表示如果一个用户通过这个模块的验证,PAM结构就立刻返回验证成功信息(即使前面有模块fail了,也会把 fail结果忽略掉),把控制权交回应用程序。后面的层叠模块即使使用requisite或者required 控制标志,也不再执行。如果验证失败,sufficient 的作用和 optional 相同
optional
表示即使本行指定的模块验证失败,也允许用户接受应用程序提供的服务,一般返回PAM_IGNORE(忽略)。
模块路径
模块路径,即要调用模块的位置.。如果是64位系统,一般保存在/lib64/security,如:pam_unix.so。
同一个模块,可以出现在不同的类型中。它在不同的类型中所执行的操作都不相同。这是由于每个模块针对不同的模块类型,编制了不同的执行函数。
模块参数
模块参数,即传递给模块的参数。参数可以有多个,之间用空格分隔开,如:
password requisite pam_cracklib.so try_first_pass retry=3 minlen=14 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1
常用pam模块介绍
pam模块
结合管理类型
说明
pam_unix.so
auth
提示用户输入密码,并与/etc/shadow文件相比对。匹配返回0
account
检查用户的账号信息(包括是否过期等)。帐号可用时,返回0
password
修改用户的密码。将用户输入的密码,作为用户的新密码更新shadow文件
pam_shells.so
auth/account
如果用户想登录系统,那么它的shell必须是在/etc/shells文件中之一的shell
pam_deny.so
account/auth/password/session
该模块可用于拒绝访问
pam_permit.so
account/auth/password/session
模块任何时候都返回成功
pam_securetty.so
auth
如果用户要以root登录时,则登录的tty必须在 /etc/securetty 之中
pam_listfile.so
account/auth/password/session
访问应用程的控制开关
pam_cracklib.so
password
这个模块可以插入到一个程序的密码栈中,用于检查密码的强度
pam_limits.so
session
定义使用系统资源的上限,root用户也会受此限制,可以通过 /etc/security/limits.conf 或 /etc/security/limits.d/*.conf 来设定
pam_tally2.so
auth
设置认证限制(见实例)
实例及参数介绍
实例1:密码强度及用户认证方式
配置密码复杂度和认证方式(同时修改文件 /etc/pam.d/system-auth 和 /etc/pam.d/password-auth ):
#%PAM-1.0
auth required pam_faillock.so preauth audit silent deny=5 unlock_time=900
auth [success=1 default=bad] pam_unix.so
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900
auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=900
auth required pam_tally2.so deny=3 unlock_time=300 even_deny_root root_unlock_time=10
# deny 设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户
# unlock_time 设定普通用户锁定后,多少时间后解锁,单位是秒;
# root_unlock_time 设定root用户锁定后,多少时间后解锁,单位是秒;
# 此处使用的是 pam_tally2 模块,如果不支持 pam_tally2 可以使用 pam_tally 模块。另外,不同的pam版本,设置可能有所不同,具体使用方法,可以参照相关模块的使用规则
password requisite pam_cracklib.so try_first_pass retry=3 minlen=14 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1
# try_first_pass:表明该模块首先应当使用前一个模块从用户那里得到的密码,如果该密码验证不通过,再提示用户输入新的密码
# minlen:指定密码最小长度为14
# dcredit/ucredit/ocredit/lcredit=-1:至少含有1个数字、大写字母、小写字母、特殊字符
# retry=3:配置密码时,提示3次用户密码错误输入
# difok=6:配置密码时,新密码中至少6个字符与旧密码不同(默认为5)
# reject_username:新密码中不能包含与用户名称相同的字段
# maxrepeat=N:拒绝包含超过N个连续字符的密码,默认值为0表示此检查已禁用
# maxsequence=N:拒绝包含大于N的单调字符序列的密码,例如’1234’或’fedcb’,默认情况下即使没有这个参数配置,一般大多数这样的密码都不会通过,除非序列只是密码的一小部分
# maxcla***epeat=N:拒绝包含相同类别的N个以上连续字符的密码。默认值为0表示此检查已禁用。
# use_authtok:强制使用先前的密码,不提示用户输入新密码(不允许用户修改密码)
实例2:su权限配置
配置文件位置:/etc/pam.d/su auth required pam_wheel.so use_uid
创建有sudo权限的用户组 /etc/group : wheel \:x\:10:root,<user list>
上述操作可限定具有sudo权限的用户。
注意事项
在[pam模块类型](pam 模块类型)中有讲到各个模块按顺序依次由PAM模块调用,所以在配置时要严格按顺序配置,否则可能导致配置不生效,以下面的配置为例:
# tag1
password requisite pam_cracklib.so try_first_pass retry=3 minlen=14 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1
# tag2
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
在该配置中我标记了其顺序分别为tag1、tag2,pam_cracklib.so用于密码强度验证,pam_unix.so用于提示用户更新密码并将密码保存到shadow文件中。
# 密码过期,登录时需要更改密码
You are required to change your password immediately (password aged)
Last login: Fri Nov 16 10:54:11 2018 from host2
Changing password for root.
(current) UNIX password:
New password:
Retype new password:
如果将tag1放到tag2后面,会导致远程更改用户密码无法更新到shadow文件,最终因密码过期等原因无法登录服务器——后果惨重!!!
参考
密码过期时间
命令:chage $ chage -h
用法:chage [选项] 登录
选项:
-d, --lastday 最近日期 将最近一次密码设置时间设为“最近日期”
-E, --expiredate 过期日期 将帐户过期时间设为“过期日期”
-h, --help 显示此帮助信息并推出
-I, --inactive INACITVE 过期 INACTIVE 天数后,设定密码为失效状态
-l, --list 显示帐户年龄信息
-m, --mindays 最小天数 将两次改变密码之间相距的最小天数设为“最小天数”
-M, --maxdays 最大天数 将两次改变密码之间相距的最大天数设为“最大天数”
-R, --root CHROOT_DIR chroot 到的目录
-W, --warndays 警告天数 将过期警告天数设为“警告天数”
对应的配置文件 /etc/login.defs : PASS_MAX_DAYS 90 # 密码过期时间
PASS_MIN_DAYS 0 # 两次密码更改时间差最小天数
PASS_MIN_LEN 14 # 密码最小长度(密码强度在 /etc/pam.d/password-auth 配置)
PASS_WARN_AGE 7 # 密码过期前警告天数
用户及密码活跃性
将默认密码不活动期限设置为30天: useradd -D -f 30
将不合规的用户设置为失效状态:chage --inactive 30
邮件管理
将邮件传输代理配置为仅限本地模式:
编辑 /etc/postfix/main.cf 文件, inet_interfaces = localhost ;
重启postfix。
日志管理
只记录指定日志 /etc/rsyslog.conf :
# 默认
*.* @@remote-host:514
等保要求:
可以将"*.*"替换为你实际需要的日志信息。比如:kern.* ; mail.* 等等;
或者关闭远程记录日志功能(直接注销即可)。
grub加密
编辑配置文件 /etc/grub.d/40_custom 添加如下配置:
password xxxxxxxx
aide工具
AIDE(Advanced Intrusion Detection Environment,高级入侵检测环境)是个入侵检测工具,主要用途是检查文档的完整性。AIDE生产一个文件系统状态的快照,其中包括修改时间,权限和文件哈希值,然后可以其与文件系统的当前状态进行比较,以检测对系统的修改。
yum install -y aide
内核管理
检查可疑数据包是否被记录,内核配置如下:
# 在 /etc/sysctl.conf 文件中设置以下参数:
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
生效以上配置:
# 开启并记录欺骗,源路由和重定向包
$ sysctl -w net.ipv4.conf.all.log_martians=1
$ sysctl -w net.ipv4.conf.default.log_martians=1
# 清空路由缓存
$ sysctl -w net.ipv4.route.flush=1
# 更新系统内核配置
$ sysctl -p