懒人少语之第十周
💙PAM认证机制
`认证框架,可用于开发`
实现身份验证,用户的身份验证,服务的身份验证等.
User => PAM会话例 => PAM-API
用户需要做好API的开发接口,由管理员来控制配置数据与PAM服务模块进行操作
PAM服务模块 => PAM-SPI (PAM开发人员来创建)
认证管理模块; 帐号管理模块; 会话管理模块; 口令管理模块
每个用户可以对其做独立的认证
PAM认证:
Service(服务/记录的pam信息)->PAM(配置文件/管理员定义了各种规则)->pam_*.so(库文件/直接调用pam)
PAM认证首先要确定那一项服务,
然后加载相应的PAM的配置文件(位于/etc/pam.d下),
最后调用认证文件(位于/lib/security下)进行安全认证
man 8 pam_time
Linux-PAM_SAG.pdf `PAM手册.pdf`
pam文档说明
/user/share/doc/pam-*
rpm -qd pam `所有pam手册`
man –k pam_*
man 模块名 `man rootok`
《The Linux-PAM System Administrators‘ Guide》
🌙PAM相关文件
模块文件目录() /lib64/security/*.so
pam_selinux.so `selinux相关的`
pam_rootok.so `root相关的`
pam_access.so `库文件`
...
环境相关的设置() /etc/security/ `仅部分,非全部所需`
access.conf `access的库文件的配置文件`
主配置文件:
/etc/pam.conf `默认不存在`
为每种应用模块提供一个专用的配置文件:
/etc/pam.d/APP_NAME `有刚需的情况下则用该目录对应的配置`
用户使用某个独立的应用程序需要pam的文件的命令,会调用这个文件,
需要根据这个配置文件来提供操作
注意:如/etc/pam.d存在,/etc/pam.conf将失效
`应用模块存在,则主配置文件失效`
😠通用/主配置文件`/etc/pam.conf`格式,不推荐修改
application type control module-path arguments
application `应用程序`
正因为有了/etc/pam.d/app_name应用程序所以才不需要在主配置上修改整理了.
type `类型`
control `控制规则`
module-path `路径`
arguments `参数`
😠专用配置文件`/etc/pam.d/*`格式 `立即生效`
type control module-path arguments
type `类型`
control `控制规则`
module-path `路径`
arguments `参数`
参考🌙说明👇👇
😛PAM认证过程:`假若用了passwd模块`
1.使用者执行/usr/bin/passwd程序,并输入密码
使用激活;/etc/pam.d/passwd()
2.passwd开始呼叫PAM模块,PAM模块会搜寻passwd程序的PAM相关设定文件,这个设定文件一般是在/etc/pam.d/里边的与程序同名的文件,即PAM会搜寻/etc/pam.d/passwd这个设置文件
唤醒PAM;里边包括pam_gnome_keyring.so库文件,所以会根据配置文件去调用该库()
3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证
类型选择;`Auth|Account|Password|Session|-type等`
4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证)
控制规则;`required|requisite|sufficient|optional|include等`
🌙说明:
/etc/pam.d/服务名(application)
telnet、login、ftp等,服务名字;"OTHER"代表所有没有在该文件中明确配置的其它服务
⭐模块类型(module-type)`根据不同的 /etc/pam.d/ 下模块有不同的功能项`
Auth `是否为有效帐号/身份验证`账号的认证和授权
Account `验证帐号是否有效`与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,当前有效的系统资源(最多可以有多少个用户),限制用户的位置(例如:root用户只能从控制台登录)
Password `密码复杂度`用户修改密码时密码复杂度检查机制等功能
Session `用户在服务之前之后的操作`用户获取到服务之前或使用服务完成之后需要进行一些附加的操作,如:记录打开/关闭数据的信息,监视目录等
-type `带-的模块为无问题,表示模块非必要`表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用
...
⭐控制规则(control) PAM库该如何处理与该服务相关的PAM模块的成功或失败情况 `上下关系,先看上再判断下Control`
根据不同的关键词`required/optional/include`等等有不同的操作功能
required 表示一票拒绝,全部拒绝,`不会立即通知,等同一type中的所有模块finsh后再将失败返回给应用程序`
假若这次成功了,还需检查后续Control,`并没有一票成功权`
requisite 表示一票否决,`一次性,失败了全部失败,不再后续检查`
假若这次成功了,还需检查后续Control,`并没有一票成功权`
sufficient 表示一票通过,`一个返回成功则全部直接成功`
optional 表示可选,不会起关键作用,返回值可忽略
include 调用其它配置文件中定义的配置
⭐路径(module-path) 用来指明本模块对应的程序文件的路径名
相对路径:
/lib64/security目录下的模块可使用相对路径
如:pam_shells.so、pam_limits.so
绝对路径:
模块通过读取配置文件完成用户对系统资源的使用控制()
/etc/security/*.conf
注意:修改PAM配置文件将马上生效()
建议:编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误()
⭐参数(Arguments) 用来传递给该模块的参数
根据传进的参数不同,而操作即不同
比如你可以这样:
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_env.so
auth sufficient /lib/security/pam_ldap.so
auth required /lib/security/pam_unix.so try_first_pass
...
👆第一条pam_securetty.so模块检查它配置文件/etc/的安全性,并查看是否能使用该
登录终端列出,如果不是就拒绝root登录.但由于失败了会根据规则required来继续后续
工作,即为将所有模块调用了(即便成功一些)最终还是登录失败.
👆第二条pam_env.so模块基于管理员在/etc/security/pam_env.conf下设定的环境变量中,
该模块并非真的设置任何变量,只不过这么做是为了使用户通过SSH后有环境变量,
后续则不需用户自己再设置
👆第三条pam_ldap.so模块提示用户输入密码,后检查在/etc/ldap.conf中的目录进行身份验证,
若失败后执行pam_unix依旧成功,那么操作结果仍然当作成功.若一开始的pam_ldap成功了
则后边的pam_unix将不会被调用 `这是sufficient的功效`
👆第四条pam_unix.so try_first_pass;当pam_unix不提示用户使用密码时,则try_first_pass
告诉模块使用前一个模块给出的密码(pam_ldap),并登录,而当登录系统调用身份验证失败后,
就意味pam_unix的失败会导致pam_ldap一并失败.若成功了,那么操作则成功
auth为是否为有效帐号/身份验证()
⭐例子:
在/etc/pam.d/sshd下添加
auth required pam_shells.so `则表示会验证shells库的安全策略`通过检查sshd下有没有符合pam_shells规则
pam_shells.so `检查该/etc/shells里是否包含你用户用sshd登录的shell环境,不包含则拒绝登录`
如果用户shell在/etc中列出,它就允许访问系统()
在/etc/pam.d/su下添加
auth required pam_shells.so `则表示使用su切换观察shells的策略`
🌙例子解释:
模块:pam_shells
功能:检查有效shell
man pam_shells
示例:不允许使用/bin/csh的用户本地登录
vim /etc/pam.d/login
auth required pam_shells.so
vim /etc/shells
去掉/bin/csh
useradd –s /bin/csh testuser
testuser将不可登录
tail /var/log/secure
🌙例子2:
模块:pam_securetty.so `针对root可登录的终端环境有哪些`
功能:只允许root用户在/etc/securetty列出的安全终端上登陆 `指定用户在某个终端登录`
示例:允许root在telnet登陆
vim /etc/pam.d/login
#auth required pam_securetty.so #将这一行加上注释
或者/etc/securetty文件中加入
pts/0,pts/1…pts/n
🌙例子3:
模块:pam_nologin.so `非管理员不能登录,shell为nologin的用户显示提示并否决登录`
功能:如果/etc/nologin文件存在,将导致非root用户不能登陆,
如果用户shell是/sbin/nologin 时,当该用户登陆时,
会显示/etc/nologin.txt文件内容,并拒绝登陆
echo you login err > /etc/nologin `拒绝登录的会有该添加的提示`
`指定文件nologin不可登陆的shell`
account required pam_nologin.so `某服务用了该模块普通用户则将无法登录`
account required pam_nologin.so file=/app/nologin.txt `指定文件`
nologin.txt添加No_login文字,若在su服务下添加该模块后,则无法使用su切换登录并提示No_login文字()
🌙例子4:
模块:pam_limits.so `控制用户使用的资源`
功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间
修改限制的实现方式:
(1) 💛ulimit命令,立即生效,但无法保存,当前shell生效 `内部命令,不同的shell有不同的控制`
https://www.ibm.com/developerworks/cn/linux/l-cn-ulimit/
-a 显示所有控制;显示当前资源限制设定
core file size (blocks, -c) 0 `设定core文件最大值,单位/区块`
data seg size (kbytes, -d) unlimited `程序数据节区最大值,单位/kb`
scheduling priority (-e) 0 `调度优先级`
file size (blocks, -f) unlimited `文件大小,shell能建立的最大文件,单位/区块`
pending signals (-i) 3791 `当前待处理的信号`
max locked memory (kbytes, -l) 64 `最大任务锁住的物理内存大小,单位/kb`
max memory size (kbytes, -m) unlimited `单个任务最大常驻物理内存大小,单位/kb`
open files (-n) 1024 `一个任务最多同时打开文件数量/支持打开文件的个数/最大文件描述符数量`
pipe size (512 bytes, -p) 8 `管道最大空间/管道缓冲区大小,单位/kb`
POSIX message queues (bytes, -q) 819200 `支持最大POSIX消息队列`
real-time priority (-r) 0
stack size (kbytes, -s) 8192 `进程栈最大值,单位/kb`
cpu time (seconds, -t) unlimited `进程使用的cpu时间`
max user processes (-u) 3791 `最大的所有用户进程数,有时候只小不大`
virtual memory (kbytes, -v) unlimited `进程的最大地址空间`
file locks (-x) unlimited `锁住文件最大个数`
-n `设置最多的打开的文件描述符个数`
-u `最大用户进程数`
-S `使用soft(软)资源限制` `非强制性,设置可增加,但不超过硬资源`
ulimit -Sn 32 `32个文件描述符`
-H `使用hard(硬)资源限制` `强制性,一旦设置不能增加`
ulimit -Hs 64 `线程栈大小为64K`
(2) 配置文件:/etc/security/limits.conf `针对自己的配置文件,修改后永久生效`
/etc/security/limits.d/*.conf
配置文件:每行一个定义;
<domain> <type> <item> <value>
<domain> `user; @group(组); *(所有用户); %group(组); `
<type> `指定类型,软,硬,- ... Soft(软限制); Hart(硬限制); -(软硬限制)`
<item> `nofile(最大文件数量); nproc(最大进程数量); 内核;数据;大小;文件个数;内存;进程;地址空间;用户|系统最大登录次数;记录日志;nice;实时优先级`
<value> `指定具体值,数字`
如:
@student hard nproc 20
@sutdent -(包含软硬) maxlogins 4
wang hard nproc(进程) 10 `wang用户最多能用的进程数限制为10个`
Resource temporarily
复杂详细实现:使用一个或多个“status=action”
[status1=action1 status2=action …]
Status: 检查结果的返回状态
Action: 采取行为ok,done,die,bad,ignore,reset
ok 模块通过,继续检查
done 模块通过,返回最后结果给应用
bad 结果失败,继续检查
die 结果失败,返回失败结果给应用
ignore 结果忽略,不影响最后结果
reset 忽略已经得到的结果