技术标签: Linux 运维 linux 服务器 ssh 网络安全 centos
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,没有输出,则没有使用。
/etc/pam.d/目录包含应用程序的PAM配置文件。例如,login程序将其程序/服务名称定义为login,与之对应的PAM配置文件为/etc/pam.d/login。
每个PAM配置文件都包含一组指令,用于定义模块以及控制标志和参数。每条指令都有一个简单的语法,用于标识模块的目的(接口)和模块的配置设置,语法格式如下:
module_interface control_flag module_name module_arguments
如在/etc/pam.d/password-auth-ac配置文件中(CentOS),其中一行PAM模块接口定义如下
PAM为认证任务提供四种类型可用的模块接口,它们分别提供不同的认证服务:
√ auth - 认证模块接口,如验证用户身份、检查密码是否可以通过,并设置用户凭据
√ account - 账户模块接口,检查指定账户是否满足当前验证条件,如用户是否有权访问所请求的服务,检查账户是否到期
√ password - 密码模块接口,用于更改用户密码,以及强制使用强密码配置
√ session - 会话模块接口,用于管理和配置用户会话。会话在用户成功认证之后启动生效
单个PAM库模块可以提供给任何或所有模块接口使用。例如,pam_unix.so提供给四个模块接口使用。
所有的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模块的配置参数
为了进一步提高安全性,可以指定超过失败登录尝试次数后锁定用户。用户账户可以被解锁(可以由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,不知道其它终端有没有提示,但是只要超过设定的值,输入正确的密码也是登陆不了的!,还是要等到设定的时间在重新尝试输入正确密码进行登录认证
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执行任何命令(需要输入密码)
在/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是一个在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 完全随机生成密码
参考博客:
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法