身份鉴别
a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换;
/etc/passwd 和 /etc/shadow
第一列:账户名称
第二列:x,代表密码占位符(为空时,账户无需密码即可登录)
第三列:账户UID
第四列:账户主组GID
第五列:账户的注释信息,一般为账户全称等
第六列:账户的家目录
第七列:账户登录的shell
第一列:账户名称
第二列:加密后的password字段,$6代表采用SHA-512($1代表MD5,$2代表SHA-256)$FxzMjStoYSPttaK4代表盐,$9u1VQE/R8B···加盐后哈希值”;普通用户未设置密码时为!!,代表禁止登录
第三列:表示用户最后一次修改密码的时间,从1970年1月1日开始计算,上图为空,则表示装机后就未进行修改过
第四列:最小修改时间间隔,0代表不限制,如果为3,代表密码修改后3天之内不得再次修改
第五列:密码有效期,最长使用期限,如果为7,代表修改密码7天之后需要再次更改
第六列:密码变更前的警告天数,默认为7,距离密码有效期的第七天开始,每次登录系统都会向该账户发出“修改密码”的警告信息
第七列:密码过期后的宽限天数,也成为“口令失效日”,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登录,也不会提示账户过期,是完全禁用
第八列:帐号失效时间,使用自1970年1月1日以来的总天数作为账户的失效时间。表示帐号在此字段规定的时间之外,无论你的密码是否过期,都将无法使用!通常被使用在具有收费服务的系统中。
第九列:保留字段
1、应核查用户在登录时是否采用了身份鉴别措施;
1)通过/etc/passwd进行本地免密登录
通过尝试得知把X去掉本地登录不需要密码,但是会使得ssh无法使用
2)通过ssh-keygen免密登录
一般多出现大型项目,如云计算平台和大数据平台等,一台主机存放其他主机的密码进行跳转。
3)通过PAM模块机制进行免密登录
auth sufficient pam_listfile.so onerr=succeed item=user sense=allow fule=/etc/bduser
2、应核查用户列表确认用户身份标识是否具有唯一性;
我们吧user1的UID改成0:0 会发现他自动跳到还是root。
root:x:0:0:root:/root:/bin/bash
user1:x:0:0::/home/user1:/bin/bash
[root@centos7 ~]# su - user1
Last login: Fri Feb 24 00:57:20 EST 2023 on pts/0
[root@centos7 ~]#
我们吧user1放到root上面
user1:x:0:0::/home/user1:/bin/bash
root:x:0:0:root:/root:/bin/bash
[user1@centos7 sbin]# su - root
Last login: Fri Feb 24 01:02:18 EST 2023 on pts/0
[user1@centos7 ~]#
3、应核查用户鉴别信息是否具有复杂度要求。
我们都知道linux有两个文件控制密码长度要求
centos下login
login.defs 仅仅对于shadow-utils 软件套件内的命令起作用,这些命令没有涉及到PAM机制
请注意,此配置文件中的参数控制shadow-utils组件中工具的行为。这些工具都不使用PAM机制,因此使用PAM的实用程序(如passwd命令)应该在其他地方配置。有关详细信息,请参阅/etc/pam.d/system-auth。
简单说就是:pwquality和login.defs都会涉及到密码长度的要求,两者之间的区别在于。前者适用于所有已经存在的及未来创建的帐号的密码长度限制,而login.defs主要适用于新创建的用户的一些属性信息。
我们首先尝试下shadow-utils组件修改密码,我们先把login.defs参数修改一下
PASS_MAX_DAYS 使用密码最大天数
PASS_MIN_DAYS 使用密码最少天数
PASS_MIN_LEN 密码字符
PASS_WARN_AGE 密码过期前几天通知。
vim /etc/security/pwquality.conf
difok = N:密码中最少要有 N 个字符类别不同。
minlen = N:要求密码的最小长度为 N 个字符。
dcredit = N:要求密码中必须包含至少 N 个数字(digit)。
ucredit = N:要求密码中必须包含至少 N 个大写字母(uppercase)。
lcredit = N:要求密码中必须包含至少 N 个小写字母(lowercase)。
ocredit = N:要求密码中必须包含至少 N 个特殊字符(other characters)。
minclass = N:要求密码中必须包含至少 N 种字符类别(例如数字、大写字母、小写字母和特殊字符)。
maxrepeat = N:密码中不允许有超过 N 个连续重复字符。
dictpath = ; 通往破解词典的道路。默认值是使用cracklib默认值。指令路径
b)应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施;
1、通过cat /etc/pam.d/system-auth查看是否限制终端登陆失败锁定措施;
1)本地tty登录,这里是使用login命令,所以从而调用
/etc/pam.d/login
配置文件,最终调用底层的组件进行密码验证等;
2)本地图形化界面,比如我用gdm,那么我在图形化登录界面时,就会调用
/etc/pam.d/gdm
配置文件;
3)ssh远程登录,就会调用
/etc/pam.d/sshd
配置文件。
可以看到这三个配置文件使用
include
或
substack
又引用了其他的配置文件,具体下来则是:
login引用system-auth
gdm引用system-auth
sshd引用password-auth
在
/etc/pam.d/system-auth
文件下添加上述对应参数即可生效。
auth required pam_tally2.so deny=5 unlock_time=300 even_deny_rootroot_unlock_time=300
·deny:登录失败次数一旦大于等于该数值,所登录的账号就会被锁定。
·lock_time:每一次登录失败后,在尚未达到deny所设置的次数时,会限制你的登录时间。
例如:deny=3,lock_time=10。那么你第1次和第2次登录失败时,在10S内的登录是无效的,输入啥都不会让你登进去的。
另外当你达到了第3次登录失败后,该参数失效,由unlock_time来接管。
·unlock_time:当你登录失败的次数大于等于deny所设置值时,帐号的锁定时间。
·even_deny_root:只要达到了deny设置值,root帐号照样被锁定。
·root_unlock_time:配合even_deny_root配合使用,表示root账户锁定的时间。
实验
我们如果sshd文件和password-auth均写入登录失败处理会一次失败算作两次
我们在把password-auth中deny改成3次
我们在输错一次密码失败次数变成3,输入正确的密码还是能登录
之后我们将密码失败次数尝试到6次,之后再输入正确密码发现登录不上了。首先我们怀疑一下是不是sshd文件比password-auth的优先级高,我们将两个文件配置修改相反一下。
我们使用 pam_tally2 -r 重置下登录失败次数
修改一下两个文件的配置
我们输错两次之后进行正确密码登录发现拒绝登录
次数变成了6可能因为最后一次拒绝也算登录失败了,所以我们猜测pam读取sshd的文件配置之后不会改变了,下面具有PAM_tally2模块就会记录一次,但是文件配置还是读取的sshd的文件配置。
2、应核查是否配置并启用了登录连接超时及自动退出功能。
全局配置TMOUT值
在/etc/profile文件下添加:TMOUT=600
对所有登录方式生效。对FTP登录方式无效
记得刷新source /etc/profile
一般应该是在/etc/profile这个文件中对所有用户进行设置,可能有极个别的会单独为每个用户配置超时时间。所以直接查看/etc/profile文件内容,然后再用
echo $TMOUT 语句看看运行环境中的TMOUT变量到底是多少。
在各自账户的home目录的.bash_profile、.bashrc
文件中添加:TMOUT=600
source .bash_profile仅对当前用户生效。 而且只对bash有效
.bash_profile 一般是用户的配置文件,配置一些基础环境变量
比如/root/.bash_profile这个文件就是当root用户 用bash作为登陆shell的时候登陆后会运行这个文件里面的一系列的命令。
用户登录 shell、sh、bash系统会执行此文件,另外当我们使用一个功能其中部分功能是读取bash_profile文件的配置
实验
我们分别在profile和.bash_profile均设置TOMOUT
!
通过实验得知我们最后加载那个文件那个文件生效。
Centos8和国产欧拉系统和统信系统和ubuntu22.4之后版本采用faillock测评
pam_tally2模块在centos8后已淘汰掉,centos8用pam_faillock 模块替换。
openEuler 22.03 (LTS-SP4)为例(欧拉系统自带登录失败和密码复杂度设置)
这里面要注意的写法是和pam_tally2写法不一样
没有 preauth 或者 放 pam_unix.so 后面的话,一点效果都没
authfail 和 authsucc 放 pam_unix.so 前面的话,永远登录失败
authfail 和 authsucc 放 pam_succeed_if.so 后面的话,限制不了 root
换个说法:
preauth 要出现在第一个auth pam_unix.so 前
prefail, presucc要出现在第一个auth pam_unix.so 后,auth pam_succeed_if.so 前
这大概和 sufficient, requisite, required
三个模块官方解释
Options
{preauth|authfail|authsucc}
This argument must be set accordingly to the position of this module instance in the PAM stack.
The preauth argument must be used when the module is called before the modules which ask for the user credentials such as the password. The module just examines whether the user should be blocked from accessing the service in case there were anomalous number of failed consecutive authentication attempts recently. This call is optional if authsucc is used.
The authfail argument must be used when the module is called after the modules which determine the authentication outcome, failed. Unless the user is already blocked due to previous authentication failures, the module will record the failure into the appropriate user tally file.
The authsucc argument must be used when the module is called after the modules which determine the authentication outcome, succeded. Unless the user is already blocked due to previous authentication failures, the module will then clear the record of the failures in the respective user tally file. Otherwise it will return authentication error. If this call is not done, the pam_faillock will not distinguish between consecutive and non-consecutive failed authentication attempts. The preauth call must be used in such case. Due to complications in the way the PAM stack can be configured it is also possible to call pam_faillock as an account module. In such configuration the module must be also called in the preauth stage.
此参数必须根据此模块实例在PAM堆栈中的位置进行相应设置。
在请求用户凭据(如密码)的模块之前调用模块时,必须使用preauth参数。该模块仅检查是否应阻止用户访问服务,以防最近连续身份验证尝试失败的次数异常。如果使用authsucc,则此调用是可选的。
当在确定身份验证结果的模块失败后调用模块时,必须使用authfail参数。除非用户因之前的身份验证失败而被阻止,否则该模块将把失败记录到相应的用户计数文件中。
在确定身份验证结果的模块成功后调用模块时,必须使用authsucc参数。除非用户因之前的身份验证失败而被阻止,否则模块将清除失败记录
实验
用户累积失败5次后账户被锁定60秒(1分钟)。账户在锁定期间正确密码可以正常登录。
password-auth
#%PAM-1.0
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
#在认证之前检查失败尝试。如果一个账户在未认证的情况下已经累计了三次失败尝试,那么该用户将被锁定一分钟。
auth required pam_faillock.so preauth audit deny=3 even_deny_root unlock_time=60
-auth sufficient pam_fprintd.so
auth sufficient pam_unix.so nullok try_first_pass
-auth sufficient pam_sss.so use_first_pass
#确保在密码验证失败后更新失败尝试的记录。
auth [default=die] pam_faillock.so authfail audit deny=3 even_deny_root unlock_time=60
auth sufficient pam_faillock.so authsucc audit deny=3 even_deny_root unlock_time=60
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so
account required pam_unix.so
account required pam_faillock.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
-account [default=bad success=ok user_unknown=ignore] pam_sss.so
account required pam_permit.so
# 系统会检查账户是否因密码输错过多而被锁定,并阻止被锁定账户的登录。
account required pam_faillock.so # 新增
password requisite pam_pwquality.so try_first_pass local_users_only
password sufficient pam_unix.so sm3 shadow nullok try_first_pass use_authtok
-password sufficient pam_sss.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
-session optional pam_sss.so
~
system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth requisite pam_faillock.so preauth silent audit deny=3 unlock_time=120 fail_interval=3600 #新增
auth required pam_faildelay.so delay=2000000
auth sufficient pam_unix.so nullok try_first_pass
auth [default=die] pam_faillock.so authfail audit deny=3 unlock_time=120 fail_interval=3600 #新增
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
account required pam_faillock.so # 新增
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
用户累积失败5次后账户被锁定600秒(10分钟)。账户在锁定期间正确密码可以正常登录。
password-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
# 指明在 pam_unix.so 模块成功后应该跳过一个后续模块,直接执行下下一个模块。
auth [success=1 default=ignore] pam_unix.so nullok # 新增
auth [default=die] pam_faillock.so authfail audit deny=3 unlock_time=120 # 新增
auth required pam_faildelay.so delay=2000000
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
account required pam_faillock.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth [success=1 default=ignore] pam_unix.so nullok # 新增
auth [default=die] pam_faillock.so authfail audit deny=3 unlock_time=120 # 新增
auth required pam_faildelay.so delay=2000000
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
account required pam_faillock.so # 新增
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
required: 这个关键字指定了所列模块是必须的,如果标记为required的模块失败,则认证或授权将立即失败。
requisite: 类似于required,但如果requisite模块失败,PAM会立即返回失败,不再检查其他模块。
sufficient: 如果sufficient模块成功,它会返回“成功”,然后PAM会继续检查其他模块。如果所有sufficient模块都失败,则PAM会继续检查required和requisite模块。
optional: 标记为optional的模块被视为可选的。即使optional模块失败,认证或授权也可以继续。
suggested: 该关键字并非PAM配置中的标准关键字,可能是某些特定系统或应用程序中添加的定制关键字。通常用于建议性的策略和模块。
preauth: 指明模块应在进行实际身份验证之前执行,对用户进行先前的验证。
account: 用于检查用户账户是否可用的模块,例如检查密码期限、用户活动等。
password: 用于更改用户密码的模块。
session: 处理用户会话建立和终止的模块,如在用户登录时启动会话或在用户注销时结束会话。
silent: 当模块失败时,不会产生错误消息或警告。
even_deny_root: 即使是root用户也将受到锁定的影响。
permanent_lockout = false: 设置账户暂时锁定,而非永久锁定。
authfail:认证失败时触发 faillock。
success:是一个控制指令,用于定义在一个模块成功完成后,PAM 应该跳过多少个后续模块而继续执行认证流程。如果指定了 success=1,PAM 将会跳过下一个模块,直接执行下下一个模块。如果指令是 success=2,那么在一个成功状态后,将会跳过两个模块,以此类推。
audit: 用于记录认证事件和日志的审计模块,可以将关键事件和信息写入系统的安全日志中。这些事件可以包括成功或失败的认证尝试、账户锁定、密码更改等。
reset_time=3600: 设置重置失败计数的时间间隔为3600秒(1小时),以实现累积失败次数的设定。
default: default 关键字用于指定当没有其他更具体的条件或情况匹配时应采取的默认行为。它通常与条件语句一起使用,用于定义在所有其他条件均未匹配时所应使用的行为。
default=ignore: 当未匹配任何其他规则时,default=ignore 表示忽略此模块,即不执行任何操作。
default=die: 当未匹配任何其他规则时,default=die 表示立即中止认证或授权过程,并返回失败状态。
default=bad: 在未匹配其他规则时,default=bad 表示返回失败状态,但允许继续尝试其他模块。
default=ok: 当未匹配任何其他规则时,default=ok 表示认证或授权成功,继续进行后续操作。
system-auth文件介绍
#%PAM-1.0 %PAM-1.0:标识这个文件遵循PAM 1.0的规范。这个文件是自动生成的,如果使用authconfig工具重新配置PAM,用户所做的更改将会被覆盖。
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
# 认证(auth)
auth required pam_env.so # 加载环境变量。
auth required pam_faildelay.so delay=2000000 # 在身份验证失败后延迟2秒再进行下一次尝试。
auth sufficient pam_unix.so nullok try_first_pass # 使用Unix标准认证,nullok允许空密码,try_first_pass尝试使用之前的密码。
auth requisite pam_succeed_if.so uid >= 1000 quiet_success # 仅当用户ID大于等于1000时认证才继续,quiet_success在成功时不输出信息。
auth required pam_deny.so # 默认拒绝所有认证,除非之前的某个模块已经成功。
# 账户管理(account)
account required pam_unix.so # 使用Unix账户管理。
account sufficient pam_localuser.so # 如果是本地用户,则此模块足够进行账户管理。
account sufficient pam_succeed_if.so uid < 1000 quiet # 对于UID小于1000的用户,此模块足以满足账户管理需求,quiet在成功时不输出信息。
account required pam_permit.so # 无条件允许。
# 密码管理(password)
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= enforce_for_root minlen=8 dcredit=-2 ucredit=-1 lcredit=-1 ocredit=-1 # 强制密码质量要求,try_first_pass尝试使用前一密码,local_users_only只适用于本地用户,retry=3重试3次。root用户也受限制。
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok # 使用Unix密码管理,sha512使用SHA-512散列,shadow使用阴影密码文件,nullok允许空密码,use_authtok使用更新的认证令牌。
password required pam_deny.so # 默认拒绝所有密码更改请求。
# 会话管理(session)
session optional pam_keyinit.so revoke # 初始化关键会话并在会话结束时撤销它。
session required pam_limits.so # 应用限制,如文件大小、进程数等。
-session optional pam_systemd.so # 为会话启动systemd用户切片。
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid # 如果会话是由crond服务启动,则此模块成功执行,不输出信息,使用UID
session required pam_unix.so # 加载Unix风格会话管理。
C)当进行远程管理时,应采取必要措施防止鉴别信息在网络传输过程中被窃听;
看见这两个要注意了这是telnet的运行进程使用telnet和ftp都无法保证鉴别信息在网络传输中被窃听。
用ssh则不会
d)应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现。
常见的身份认证因子分类有:* 秘密信息因子,包含密码、个人身份识别码 (PIN) 、安全问题验证。
物品因子,分为软件令牌和硬件令牌。
软件令牌,包含短信验证码,电子邮件验证链接、验证码,服务商提供的身份验证二维码(例如微信扫码认证)。
硬件令牌,包含sfz、驾驶证、护照、密钥卡、硬件加密锁等专用物品作为安全密钥使用 。
生物特征因子,包含指纹、语音、面部特征、虹膜、视网膜图案、个人手写签名、击键特征和语言模式等行为生物识别特征。
位置因子,包含特定位置、特定设备、特定IP范围。
时间因子,特定的时间段。
如果两个身份认证方式为一种身份认证因子类型,此认证方式为单因子认证,而不是双因子认证。例如用户密码+安全问题验证、sfz+短信验证码等,均为单因子认证。
双因子认证必须是两种不同类型的认证因子,来实现用户身份认证。
常见问题分析
(1)HOTP与TOTP有什么区别?
HOTP的“H”意为“HMAC-Based”,即“基于HMAC”。从形式上看,TOTP也可以认为是一种广义的HOTP。
当然,现行标准已规定了HOTP和TOTP的动态因子和特定算法,因此在实践中还是有必要区分:HOTP使用事件因子C(具体为计数器),通过HMAC-SHA-1算法进行计算;而TOTP使用时间因子T,通过HMAC-SHA-1 / HMAC-SHA256 / HMAC-SHA512算法进行计算。
(2)使用短信验证码进行认证是否属于动态口令认证技术?
不属于。短信验证码是应用服务商为确认用户身份是否真实而采用的有别于传统静态口令验证的认证手段,在接收到客户端请求后,通过第三方服务向用户手机发送一条即时的包含一串定长字符的短信,用户将该串字符输入应用的鉴别界面,以确认是机主本人在进行登录等敏感操作。
注意到此处仅利用到真实用户持有一种不同于静态口令的鉴别介质——一台在注册时与用户绑定的可收发讯息的移动终端(准确来说是SIM卡),并没有利用到用户及用户终端的计算能力,用户及用户终端未持有密钥这一关键鉴别信息。此外,下发短信中的字符串本身就是敏感信息,而在合规的身份鉴别过程中(包括动态口令验证),鉴别方不发送数据,或者仅发送不含显式敏感数据的中间信息。因此短信验证码认证不属于动态口令认证技术,也不是合规的身份鉴别方式。
实验1
生成证书可以通过shell工具或者linux-keygen
[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #保存秘钥文件目录
Enter passphrase (empty for no passphrase): #输入密码(可以为空)
Enter same passphrase again: #确认密码(可以为空)
Your identification has been saved in /root/.ssh/id_rsa. #私钥保存地址
Your public key has been saved in /root/.ssh/id_rsa.pub. #公钥保存地址
The key fingerprint is:
SHA256:ilNqbGQDM56juco2fxhg8JFrv/neJo8+6OKds6IYbhs root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
| . |
|. o |
|..+o |
| ++= |
|..=.+ . S |
| o *.= . |
|+E X+. |
|+*+==+oo. |
|O*==**==o |
+----[SHA256]-----+
编辑 /etc/sshd_config
PasswordAuthentication yes
#开启密码认证 yes开启 no 不开启
AuthenticationMethode "publickey,password"
#开启密码认证和证书两次认证
PubkeyAuthentication yes
#开启证书认证
先认证证书在让输入账号密码,并且证书属于密码技术,可以满足双因子其中其中一种鉴别技术至少应使用密码技术来实现
实验2
#安装必要的插件
yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker git automake libtool pam-devel epel-release
#下载google-authenticator-libpam
git clone https://github.com/google/google-authenticator-libpam.git
#安装google-authenticator-libpam
cd google-authenticator-libpam/
./bootstrap.sh
./configure && make && make install
cp /usr/local/lib/security/pam_google_authenticator.so /lib64/security/
#安装生成器
[root@admin ~]# yum -y install google-authenticator
[root@admin ~]# google-authenticator
vim /etc/pam.d/sshd
#加在最上边
auth required pam_google_authenticator.so
vim /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
重启sshd服务
systemctl restart sshd
验证登录输入账号密码登录