一、PAM是什么?
PAM,插件式的验证模块,开发的一种与认证相关的通用框架机制。PAM 只关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统一的API 接口,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序一种认证框架,自身不做认证。
PAM提供了对所有服务进行认证的中央机制,适用于本地登录,远程登录。系统管理员通过PAM配置文件来制定不同应用程序的不同认证策略;应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( ))来实现对认证方法的调用;而PAM服务模块的开发者则利用PAM SPI来编写模块(主要调用函数pam_sm_xxxx( )供PAM接口库调用,将不同的认证机制加入到系统中;PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联系起来。重复利用别人的开发的功能,不必自己开发,会话,密码验证等功能。
PAM相关文件
- 包名: pam
- 模块文件目录:/lib64/security/*.so
- 特定模块相关的设置文件:/etc/security/
- 应用程序调用PAM模块的配置文件
- 主配置文件:/etc/pam.conf,默认不存在,一般不使用主配置
- 为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
- 注意:如/etc/pam.d存在,/etc/pam.conf将失效。
PAM工作原理
一般遵循Service(服务)→PAM(配置文件)→pam_*.so这样的顺序。
示例:
1.使用者执行/usr/bin/passwd 程序,并输入密码
2.passwd开始调用PAM模块,PAM模块会搜寻passwd程序的PAM相关设置文件,这个设置文件一般是在/etc/pam.d/里边的与程序同名的文件,即PAM会搜寻/etc/pam.d/passwd此设置文件
3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证
4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证)
配置文件格式
每一行都是一个独立认证的过程;每一行可以区分为三个字段:认证类型 控制类型 PAM 模块及其参数
第一列代表模块类型
- Auth 账号的认证和授权
- Account 帐户的有效性,与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,限制用户的位置(例如:root用户只能从控制台登录)
- Password 用户修改密码时密码复杂度检查机制等功能
- Session 用户会话期间的控制,如:最多打开的文件数,最多的进程数等
- -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用
第二列控制类型 - required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,再将失败结果返回给应用程序,即为必要条件
- requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件
- sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的
- equired和requisiteoptional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略
- include: 调用其他的配置文件中定义的配置
- optional 不用于验证,只显示信息
第三列 PAM模块
默认是在/lib64/security/目录下,如果不在此默认路径下,要填写绝对路径。
同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型编制了不同的执行函数。
二、其他模块
shell模块
功能:检查有效shell
例子:不允许使用/bin/csh的用户本地登录
模块:pam_shell.so只允许规定的shell类型通过
加上这一行auth required pam_shells.so
securetty模块
功能:只允许root用户在/etc/securetty列出的安全终端上登陆。
pam_nologin.so模块
功能:如果/etc/nologin文件存在,将导致非root用户不能登陆,当该用户登陆时,会显示/etc/nologin文件内容,并拒绝登陆。
limit
功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间
修改限制的实现方式:
ulimit命令
- ulimit是linux shell的内置命令,它具有一套参数集,用于对shell进程及其子进程进行资源限制。
- ulimit的设定值是 per-process 的,也就是说,每个进程有自己的limits值。使用ulimit进行修改,立即生效。
- ulimit只影响shell进程及其子进程,用户登出后失效。
- 可以在profile中加入ulimit的设置,变相的做到永久生效。
选项:
- -H 设置硬件资源限制.
- -S 设置软件资源限制.
- -a 显示当前所有的资源限制.
- -c size:设置core文件的最大值.单位:blocks
- -d size:设置数据段的最大值.单位:kbytes
- -f size:设置创建文件的最大值.单位:blocks
- -l size:设置在内存中锁定进程的最大值.单位:kbytes
- -m size:设置可以使用的常驻内存的最大值.单 位:kbytes
- -n size:设置内核可以同时打开的文件描述符的最大值.单位:n
- -p size:设置管道缓冲区的最大值.单位:kbytes
- -s size:设置堆栈的最大值.单位:kbytes
- -t size:设置CPU使用时间的最大上限.单位:seconds
- -u size:最大用户进程数
- -v size:设置虚拟内存的最大值.单位:kbytes
- unlimited 是一个特殊值,用于表示不限制
临时修改
ulimit -a #可以看到系统的相关 资源限制 设置
ulimit -n 10000#修改最大值 临时修改
永久修改
#vim /etc/security/limits.conf #永久修改不用重启 软硬一起设置可以直接使用
[domain] [type] [item] [value]
[domain] 可以是用户名、组名或通配符。 [type] 可以是“软”或“硬”,具体取决于您想要实施的限制类型。 [item] 是您想要限制的内容,例如“cpu”或“nproc”(进程数)等。[value] 是您要限制的数量愿意强制执行。
sudo提权操作
sudo 即superuser do,允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性在最早之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先告知超级用户的密码。
sudo特性:
- sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
- sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器
- sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票
- sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0440
sudo组成
配置文件:/etc/sudo.conf
执行授权命令:/usr/bin/sudo
日志文件:/var/log/secure
授权规则配置文件:/etc/sudoers #修改文件,一般用visudo
或者在文件夹下/etc/sudoers /*.conf#子配置文件
配置文件说明
配置文件中支持使用通配符
#用户 登入主机 = (代表用户) 命令
#user host = (runas) command
user: 运行命令者的身份
host: 通过哪些主机,可以是多个
(runas):以哪个用户的身份
command: 运行哪些命令
User和runas:
username(用户名)#uid(id号)
%group_name(组名)%#gid(组id)
user_alias|runas_alias(别名)MYUSER=zhangsan,lisi
host:
ip或hostname(IP地址或主机名)
host_alias(别名) localhost
command:
command name (命令)
directory (文件夹里的命令)
sudoedit (可以编辑sudoers这个文件,变相变成管理员)
Cmnd_Alias (命令别名)
root ALL=(ALL) ALL
## root用户可以运行任何命令
root ALL=(ALL) ALL
lisi ALL=(root) /usr/bin/mount /dev/cdrom /mnt/
#可以跟多个命令
lisi ALL=(root) /usr/bin/mount /dev/cdrom /mnt/,/usr/bin/mount /mnt/
#也可以对组进行操作
%在前表示组
## 在wheel组中的人可以运行任何命令。
%wheel ALL=(ALL) ALL
[root@localhost ~]#gpasswd -a liwu wheel
#正在将用户“liwu”加入到“wheel”组中,wheel组表示管理员组是比较特殊的一个组,在wheel组中的成员可以使用任何命令
别名
sudo别名有四种类型:
- User_Alias(用户)
- Runas_Alias(代表用户)
- Host_Alias(登录主机)
- Cmnd_Alias(命令)
别名格式:必须大写字母,数字可以使用但是不能放在开头
Host_Alias MYHOSTS = kgc,localhost
User_Alias MYUSERS = zhangsan,wangwu,lisi
/sbin/*,!/sbin/reboot,!/sbin/poweroff,!/sbin/init,!/usr/bin/rm
!表示不执行