linux访问认证类-PAM模块学习1-附加ssh

以下操作均在实验环境中进行,环境为centos7

一、PAM

1.不是一个应用程序,是一种认证框架,为各类应用程序(如:ssh、telnet、ftp、su)提供认证服务;例如ssh服务需要对用户的身份、特征(是普通用户还是root用户),用户的密码是否正确、是否过期,进行验证时就可以调用PAM模块;有了PAM模块,开发人员不再需要针对一个程序单独开发用户认证功能,直接调用PAM模块即可。

2.SSH服务本身具备基础的用户验证机制(在/etc/ssh/sshd_config文件中实现远程登录时,对于用户、密码等属性的限制),但并不丰富,易被攻击,

ssh认证方式:

基于密码认证

基于密钥认证

密码认证流程:

1).客户端向服务端发起ssh连接请求,服务端发送自己的公钥给客户端(只有第一次ssh时才会保存公钥,如果服务端公钥产生变化,需要更新客户端侧的公钥,因为在后续的交互过程中客户端需要使用服务端的公钥对输入的密码进行加密,公钥不匹配,私钥就无法解密

2).客户端保存服务端的公钥文件到自身家目录下的..ssh/know.hosts文件中

3).客户端输入服务端的用户密码,并且用服务端的公钥对这个密码进行加密

4).客户端将加密后的密文发送给服务端,服务端使用自己的私钥进行解密,如果解密后的密码和客户端所登录的用户的密码一致,则允许登录,反之不允许登录

不安全性:拿到服务端的私钥文件即可对加密密码进行解密,从而获取账户密码

密钥认证流程(RSA非对称加密)

又名免密登录,不需要输入任何的密码即可远程登录linux系统

1).客户端首先要在本地生成一对密钥文件:"ssh-keygen",密钥文件默认保存目录为用户家目录下的.ssh目录,再使用命令将公钥发送给服务端:"ssh-copy-id username@服务端ip",此时服务端拥有了客户端的公钥

在生成密钥文件时,会有3个确认步骤:

Enter file in which to save the key (/root/.ssh/id_rsa):  #确认在哪儿保存密钥文件,这里建议什么都不敲,默认保存即可
Enter passphrase (empty for no passphrase): #输入密钥文件密码,根据需求来,我这里没输入,直接敲的enter,就默认密钥文件没有密码
Enter same passphrase again: #重新输入密码,我这里也是直接敲的enter,忽略

2).客户端发起ssh请求(此时服务端会将公钥发送给客户端,如果以前已经建立过ssh连接,这个发送公钥的动作不产生,此时客户端拥有了服务端的公钥,服务端验证自身是否有该客户端的公钥文件(服务端发送一个随机字符串给客户端,客户端使用自身的私钥进行加密再发给服务端,服务端用所有的客户端公钥进行匹配进行验证,这个步骤主要用于服务端区分不同的客户端,即使用客户端的公钥匹配客户端的私钥)  相当于服务端得确认我使用哪个公钥来和你进行互动,如果服务端不具备客户端的公钥,后面的流程也进行不下去

3).如果服务端有客户端的公钥,服务端会使用客户端的公钥对随机字符串进行加密,然后发给客户端

4).客户端使用自身的私钥进行解密,然后使用服务端的公钥进行加密,发给服务端

5).服务端使用自身的私钥进行解密,对比解密后的字符串是否和自己发出的相同,如果相同,则同意客户端进行免密登录

总结:公钥交给对方,用于在网络之间进行加密传输;私钥保存在本地,用于解密,保证安全性;用对方的公钥进行加密,用自身的私钥进行解密。

安全性:如果我具备了客户端的私钥文件,就可以进行免密登录

这里我用白话文解释下:箱子=公钥  钥匙=私钥

A国有自己的箱子和自己的钥匙,B国有自己的箱子和自己的钥匙,两国先交换了彼此的箱子,两国传递信息都用对国的箱子,B国用A国的箱子写了机密文件,交给A国,A国使用自己的钥匙打开箱子写了回复,并使用B国箱子装起来,交给B国,B国使用自己的钥匙打开箱子,读取内容,确认是在原文进行了回复,相信这是A国写的,因为只有A国能开自己的箱子。

在客户端侧,保存服务端公钥的位置:.ssh/know_hosts

客户端自身生成的密钥文件保存位置:家目录下.ssh目录下,.pub结尾文件为公钥

服务端保存客户端的公钥位置

3.PAM模块针对各类服务的配置文件

路径:/etc/pam.d目录下

一般以服务名作为文件名,如sshd

上图第一行非该文件默认配置,是我自行添加的

1)配置文件大致分为四列

第一列:模块用途(类型),一共有四种类型:auth(认证)、account(账号)、seesion(会话0、passwd(密码);我认为就是用户认证的整个流程,发起登录请求-输入用户名密码-用户密码正确符合要求-建立会话-结束会话;PAM将这个流程分为拆分为四部分,使用模块进行控制、限制。有些模块多个流程都能使用,有些模块只能用于特定的流程

第二列:控制标记(流程控制器)

required(翻译后为需要的意思):若该行pam模块执行成功则继续后面的流程,若失败也继续后面的流程;如sshd模块配置文件中pam_nologin.so模块的控制器为required;nologin模块的作用为当/etc/nologin文件存在时只允许root用户登录,并且向屏幕输出/etc/nologin文件的内容;假设nologin文件存在,此时你在远程时输入了root用户触发了nologin模块,动作为required,则继续后面的流程,对你的密码进行验证之类的;这个模块的动作也可设置为requisite,如果设置模块动作为requisite,当nologin文件存在,并且你输入非root用户登录,将直接终结整个认证流程;上面的sshd文件中设置为required,可以通过灵活操控nologin文件是否存在来限制非root用户登录;并且就算非root用户登录,当nologin文件不存在时,也不会终结整个认证流程(以上为个人理解,如有误,大佬可纠正)

测试

SSH服务启用PAM模块,重启sshd服务

创建一个普通用户用于远程登录,并测试远程登录成功

创建nologin文件并添加内容

使用测试账户登录。登录失败并输出了nologin文件中的内容

查看日志文件,最后一行说明了登录失败的原因:因为PAM的配置拒绝了测试账户的访问

requisite(必须的):带有此控制动作的模块,执行失败后,将直接终结整个流程栈,并立即返回错误信息

sufficient(足够的):带有此执行动作的模块,执行成功后,将直接向应用程序返回成功结果且不执行之后的动作,执行失败,继续下一模块的验证

optional(可选):带有此动作的模块,即使执行失败,用户仍然能通过认证,PAM框架会忽略这个模块产生的错误结果

include(包括):表示在流程执行过程中调用其他的PAM配置文件(套娃

第三列:模块路径

这一例有个默认路径为/lib64/security,如果你自定了一个模块文件,在此列需要写出模块的绝对路径

第四列:模块参数(选项)

具体的模块支持哪些参数可以使用man帮助进行查看;有些模块提供了更多的参数来灵活地进行认证流程

如我在/etc/pam.d/sshd配置文件中添加的第一行auth类型,调用PAM_succeed_if.so 模块,对用户的特征进行限制,并附加了 一项条件 “user  != root " :当用户不为root时,允许登录

 4.环境安全配置文件

路径/etc/security/

如pam_env.so模块在定义用户登录后的环境变量时,会依据/etc/security/pam_env.conf文件中的内容进行设置;当然并不是所有模块只调用此路径下的配置文件,pam_unix.so模块用于提示用户输入密码,并将你输入的密码和/etc/shadow文件中记录的密码进行对比。

5.常用的pam模块

1)pam_deny.so:

auth    required    pam_env.so
auth    required    pam_tally.so onerr=fail deny=5
auth    sufficient  pam_unix.so nullok try_first_pass
auth    requisite   pam_succeed_if.so uid >= 500 quiet
auth    required    pam_deny.so
在auth类型流程栈中,最后一行pam_deny.so模块表示,上述四行模块有一项执行失败,则直接拒绝请求

2)pam_permit.s

account required    pam_unix.so
account sufficient  pam_succeed_if.so uid < 500 quiet
account required    pam_permit.so
这个模块给到下一行模块的执行结果肯定是true;意思是下面的模块你不管我account类型中的模块执行结果如何,我这个类型的总结果就是true;因为你远程登录或者本地登录的用户肯定是uid > 500 的用户,在上图中的第二行结果一般都会是flase,我理解为了不影响后续某个流程,在这里使用pam_permit.so模块统一返回true

3)pam_securetty.so

如果用户以root登录时,登录的tty必须在/etc/securetty之中,此文件可以限制root用户登录的设备

通过桌面新建一个虚拟终端登录为tty,远程登录为pts,如果不想要有人用root用户远程登录机器,将pts行全部注释即可

若该文件不存在,root用户将可以从任意一个字符设备登录到系统中,具有极大风险

4)pam_unix.so

提醒用户输入密码,并将用户的密码与/etc/shadow文件进行比对

5)pam_listfile.so

检查用户名是否在指定的文件中,并使用一些条件、参数生成多种控制方式

auth required pam_listfile.so item=user sense=deny file=/opt/ssh/userlist onerr=fail

如果将该行加入sshd,PAM配置文件第一行,存在于userlist文件的用户名会被拒绝访问

本文禁止用于谋利途径!!!!转载请注明出处,以上全部内容为个人学习记录并分享,肯定会有错误之处,切莫用于生产环境!!!

  • 32
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值