linux-centos7 基于等保3的系统安全体系

sshd配置

配置文件:/etc/ssh/sshd_config

Note: 更改ssh相关配置后需要重启sshd服务 systemctl restart sshd

参考文档:https://man.openbsd.org/ssh.1

ssh访问控制

AllowUsers <userlist> 
AllowGroups <grouplist> 
DenyUsers <userlist> 
DenyGroups <grouplist> 

配置加密算法

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文件,最终因密码过期等原因无法登录服务器——后果惨重!!!

参考

更多示例请见:linux中pam模块

关于各个模块参数详解请见:The Linux-PAM System Administrators' Guide

密码过期时间

  • 命令: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 <user>

邮件管理

将邮件传输代理配置为仅限本地模式:

  • 编辑 /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

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券