CentOS Linux系统限制远程登录尝试密码次数及锁定时间-程序员宅基地

技术标签: Linux  运维  linux  服务器  ssh  网络安全  centos  

一、关于PAM

Linux-PAM (Pluggable Authentication Modules for Linux)可插拔认证模块。Linux-PAM是一套适用于Linux的身份验证共享库系统,它为系统中的应用程序或服务提供动态身份验证模块支持。在Linux中,PAM是可动态配置的,本地系统管理员可以自由选择应用程序如何对用户进行身份验证。PAM应用在许多程序与服务上,比如登录程序(login、su)的PAM身份验证(口令认证、限制登录),passwd强制密码,用户进程实时管理,向用户分配系统资源等。

PAM的主要特征是认证的性质是可动态配置的。PAM的核心部分是库(libpam)和PAM模块的集合,它们是位于文件夹/lib/security/中的动态链接库(.so)文件,以及位于/etc/pam.d/目录中(或者是/etc/pam.conf配置文件)的各个PAM模块配置文件。/etc/pam.d/目录中定义了各种程序和服务的PAM配置文件,其中system-auth文件是PAM模块的重要配置文件,它主要负责用户登录系统的身份认证工作,不仅如此,其他的应用程序或服务可以通过include接口来调用它(该文件是system-auth-ac的软链接)。此外password-auth配置文件也是与身份验证相关的重要配置文件,比如用户的远程登录验证(SSH登录)就通过它调用。而在Ubuntu、SuSE Linux等发行版中,PAM主要配置文件是common-auth、common-account、common-password、common-session这四个文件,所有的应用程序和服务的主要PAM配置都可以通过它们来调用。

使用如下命令判断程序是否使用了PAM:

root@HMing ~ # ldd /usr/bin/passwd | grep libpam

libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007fb74f748000)

libpam.so.0 => /lib64/libpam.so.0 (0x00007fb74eb45000)

如看到有类似的输出,说明该程序使用了PAM,没有输出,则没有使用。

二、PAM身份验证配置文件

/etc/pam.d/目录包含应用程序的PAM配置文件。例如,login程序将其程序/服务名称定义为login,与之对应的PAM配置文件为/etc/pam.d/login。

三、PAM配置文件语法格式

每个PAM配置文件都包含一组指令,用于定义模块以及控制标志和参数。每条指令都有一个简单的语法,用于标识模块的目的(接口)和模块的配置设置,语法格式如下:

module_interface      control_flag      module_name  module_arguments

如在/etc/pam.d/password-auth-ac配置文件中(CentOS),其中一行PAM模块接口定义如下

在这里插入图片描述

四、PAM模块接口(模块管理组)

PAM为认证任务提供四种类型可用的模块接口,它们分别提供不同的认证服务:

√ auth 	- 认证模块接口,如验证用户身份、检查密码是否可以通过,并设置用户凭据
√ account 	- 账户模块接口,检查指定账户是否满足当前验证条件,如用户是否有权访问所请求的服务,检查账户是否到期
√ password  	- 密码模块接口,用于更改用户密码,以及强制使用强密码配置
√ session 	- 会话模块接口,用于管理和配置用户会话。会话在用户成功认证之后启动生效

单个PAM库模块可以提供给任何或所有模块接口使用。例如,pam_unix.so提供给四个模块接口使用。

五、PAM控制标志

所有的PAM模块被调用时都会返回成功或者失败的结果,每个PAM模块中由多个对应的控制标志决定结果是否通过或失败。每一个控制标志对应一个处理结果,PAM库将这些通过/失败的结果整合为一个整体的通过/失败结果,然后将结果返回给应用程序。模块可以按特定的顺序堆叠。控制标志是实现用户在对某一个特定的应用程序或服务身份验证的具体实现细节。该控制标志是PAM配置文件中的第二个字段,PAM控制标志如下:

六、PAM配置方法

所有的PAM配置方法都在man手册中有说明,比如要查找某个程序支持PAM模块的配置,可以使用man 加模块名(去掉.so)查找说明,如# man pam_unix。(模块名可以在目录/lib/security/或/lib64/security/中找到。)

> required  	- 模块结果必须成功才能继续认证,如果在此处测试失败,则继续测试引用在该模块接口的下一个模块,直到所有的模块测试完成,才将结果通知给用户。
> requisite  	- 模块结果必须成功才能继续认证,如果在此处测试失败,则会立即将失败结果通知给用户。
> sufficient  	- 模块结果如果测试失败,将被忽略。如果sufficient模块测试成功,并且之前的required模块没有发生故障,PAM会向应用程序返回通过的结果,不会再调用堆栈中其他模块。
> optional  	- 该模块返回的通过/失败结果被忽略。当没有其他模块被引用时,标记为optional模块并且成功验证时该模块才是必须的。该模块被调用来执行一些操作,并不影响模块堆栈的结果。
> include 	- 与其他控制标志不同,include与模块结果的处理方式无关。该标志用于直接引用其他PAM模块的配置参数

七、用户SSH登录失败尝试次数超出限制后锁定账户(帐户锁定/解锁和时间设置)

为了进一步提高安全性,可以指定超过失败登录尝试次数后锁定用户。用户账户可以被解锁(可以由root用户主动解锁),或者在设定的时间后自动解锁。如在三次失败的登录尝试后锁定用户十分钟。需要在/etc/pam.d/password-auth-ac(或者在/etc/pam.d/sshd)文件添加以下参数:

auth       required     pam_tally2.so    deny=5    unlock_time=300 even_deny_root root_unlock_time=600  onerr=succeed  file=/var/log/tallylog
#限制五次 非root用户限制300秒 root用户限制600秒 错误日志打印到/var/log/tallylog中

另外,使用PAM还可以限制在console控制台上登录,需要修改/etc/pam.d/system-auth配置文件(或者/etc/pam.d/login),添加如上auth配置字段即可。

一旦用户失败登录尝试次数达到3次,该帐户立刻被锁定,除非root用户解锁。root用户下使用如下命令解锁用户:

# pam_tally2 -u username -r --reset

查看用户登录失败信息:

# pam_tally2 -u username

如果要在3次失败登录尝试后永久锁定用户,那么需要删除unlock_time字段,除非root用户解锁该账户,否则将永久锁定。

CentOS中有一个pam_tally2.so的PAM模块,来限定用户的登录失败次数,如果次数达到设置的阈值,则锁定用户。
1、编译PAM的配置文件

[root@node2 ~ ]# vim /etc/pam.d/login

#%PAM-1.0
auth    required    pam_tally2.so    deny=3    unlock_time=100 even_deny_root root_unlock_time=200
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth       substack     system-auth
auth       include      postlogin
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    include      postlogin
-session   optional     pam_ck_connector.so

使用命令–>保存退出

各参数介绍:

even_deny_root    也限制root用户; 
deny           设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户 
unlock_time        设定普通用户锁定后,多少时间后解锁,单位是秒; 
root_unlock_time      设定root用户锁定后,多少时间后解锁,单位是秒; 
此处使用的是 pam_tally2 模块,如果不支持 pam_tally2 可以使用 pam_tally 模块。另外,不同的pam版本,设置可能有所不同,具体使用方法,可以参照相关模块的使用规则。

全局选项

onerr=[succeed|fail]

file=/path/to/log   失败登录日志文件,默认为/var/log/tallylog

audit               如果登录的用户没有找到,则将用户名信息记录到系统日志中

silent              不打印相关的信息

no_log_info         不通过syslog记录日志信息

 

AUTH选项

deny=n              失败登录次数超过n次后拒绝访问

lock_time=n         失败登录后锁定的时间(秒数)

unlock_time=n       超出失败登录次数限制后,解锁的时间

no_lock_time        不在日志文件/var/log/faillog 中记录.fail_locktime字段

magic_root          root用户(uid=0)调用该模块时,计数器不会递增

even_deny_root      root用户失败登录次数超过deny=n次后拒绝访问

root_unlock_time=n  与even_deny_root相对应的选项,如果配置该选项,则root用户在登录失败次数超出限制后被锁定指定时间

在#%PAM-1.0的下面,即第二行,添加内容,一定要写在前面,如果写在后面,虽然用户被锁定,但是只要用户输入正确的密码,还是可以登录的!

添加参数介绍:设置密码尝试错误三次,普通用户和root用户都进行锁定,普通用户锁定100秒,root用户锁定200秒

/etc/pam.d/login —最终配置图:
在这里插入图片描述

2、这个只是限制了用户从tty登录,而没有限制远程登录,如果想限制远程登录,需要改sshd文件

[root@node2 ~ ]# vim /etc/pam.d/sshd

#%PAM-1.0
auth    required    pam_tally2.so    deny=3    unlock_time=100 even_deny_root root_unlock_time=200
auth       required     pam_sepermit.so
auth       substack     password-auth
auth       include      postlogin
# Used with polkit to reauthorize users in remote sessions
-auth      optional     pam_reauthorize.so prepare
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth
session    include      postlogin
# Used with polkit to reauthorize users in remote sessions
-session   optional     pam_reauthorize.so prepare

使用命令–>保存退出

重启sshd服务

systemctl restart sshd

同样是增加在第2行!
在这里插入图片描述

查看用户登录失败的次数:

[root@node2 ~ ]# pam_tally2 --user
Login           Failures Latest failure     From
aihuidi             6    06/20/19 10:11:07  192.168.200.186    在186这个ip上有个普通用户aihuidi登录失败
[root@node2 ~ ]# 

解锁指定用户:

[root@node2 ~ ]# pam_tally2 -r -u aihuidi    解锁aihuidi用户
Login           Failures Latest failure     From
aihuidi             6    06/20/19 10:11:07  192.168.200.186
[root@node2 ~ ]# pam_tally2 --user     在进行查看用户登录失败次数
[root@node2 ~ ]# 

ps:这个远程ssh的时候,输入密码错误超过三次但是没有提示,我用的是Xshell,不知道其它终端有没有提示,但是只要超过设定的值,输入正确的密码也是登陆不了的!,还是要等到设定的时间在重新尝试输入正确密码进行登录认证

八、允许普通用户使用sudo而不是su(限制普通用户登录到root用户)

Linux系统上默认存在一个wheel组,用于限制普通用户通过su登录到root用户,只有属于wheel组的用户成员才能使用su。但是在默认情况下,系统并没有启用这个功能,我们可以通过PAM启用它,或者修改为指定的组/用户使用su,当然指定为什么组可以按照要求而定。该配置通过pam_wheel模块指定。

首先启用whell组,使得只属于wheel组的用户可以使用su命令

需要在/etc/pam.d/su配置文件添加以下配置:

auth            required        pam_wheel.so use_uid

需要注意应该将这一行参数添加在/etc/pam.d/su文件的首部,否则PAM模块可能会跳过该项检查。配置完之后,我们就可以将需要用su权限的用户添加到wheel组中,如下:
1

# usermod -a -G wheel username

其次,如果你不想使用wheel组,而是使用其他的组代替,比如指定组名为myadmingroup的组拥有su的权限,需要这么做:

auth            required        pam_wheel.so use_uid group=myadmingroup

最后配置指定用户拥有sudo权限,要知道我们的目的是尽量少使用root身份的权限,sudo可以让用户仅仅在需要调用root用户权限的情况下调用。我们可以指定特定的组/用户使用sudo(不需要root密码)调用root权限。visudo打开配置文件:

hmm    ALL=(ALL)     NOPASSWD: ALL   #允许hmm用户通过sudo执行任何命令(不需要输入密码)

%wheel  ALL=(ALL)    ALL             #允许wheel组成员使用sudo执行任何命令(需要输入密码)

九、禁止直接使用root用户通过SSH登录

在/etc/pam.d/password-auth-ac或者/etc/pam.d/sshd配置文件中添加以下配置(该配置禁止SSH的口令认证,但仍然可以使用SSH密钥登录)

auth        required      pam_securetty.so

此外还可以配置/etc/securetty 文件禁止root用户通过所有tty终端登录系统

	
# cp /etc/securetty /etc/securetty.saved
# echo "" >/etc/securetty

十、pwgen复杂密码随机生成工具

pwgen是一个在Linux随机生成密码的工具,在CnetOS6下安装:

# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm
# yum install pwgen

使用pwgen命令随机生成字符长度为12的密码

# pwgen -s 12 -c -n -y
-n  至少包含一个数字

-c  至少包含一个大写字母

-y  至少包含一个特殊字符

-s  完全随机生成密码

在这里插入图片描述

参考博客:

Linux安全策略配置-pam_tally2身份验证模块:

CentOS Linux系统限制远程登录尝试密码次数及锁定时间

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yueaini10000/article/details/107532489

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签