PAM模块
当用户登录Linux主机时,需要通过/etc/passwd和/etc/shadow的验证并取得相关得权限数据,最后获得一个shell。在登入系统前,还需要通过PAM (Pluggable Authentication Modules, 嵌入式模块)地验证。
PAM模块除了可以在用户登录时进行身份验证之外,还可以辅助一些应用程序的验证,例如passwd。
以/usr/bin/passwd这个程序来说明PAM的使用过程:
- 用户开始执行 /usr/bin/passwd 这支程序,并输入密码;
- passwd 开始呼叫 PAM 模块,PAM 模块会搜寻 passwd 程序的 PAM 相关文件, 这个设定文件一般是在 /etc/pam.d/ 里面的与程序同名的文件,所以,在本例中, PAM 会去搜寻/etc/pam.d/passwd 这个文件;
- 经由 /etc/pam.d/passwd 文件的数据,取用 PAM 所提供的相关模块来进行验证;
- 将验证结果回传给 passwd 这支程序,而 passwd 这支程序会根据 PAM 回传的结果决定下一个动作 (重新输入新密码或者通过验证)
[root@localhost pam.d]# cat /etc/pam.d/passwd
#%PAM-1.0
auth include system-auth
account include system-auth
password substack system-auth
-password optional pam_gnome_keyring.so
#每一行为一个动作,一个动作分为四个字段,分别为:
#验证的类别 验证的控制标准 使用的PAM模块 该模块能使用的参数
#验证的类别共分为四种类,分别为:
#• auth
#主要用来检验用户的身份验证,通常是需要密码来检验。
#• account
#主要在检验用户是否具有正确的使用权限,例如,当使用一个过期的密码来登入时, 无法正确的登入。
#• session
#主要在管理当用户正确的使用该程序时的环境设定。。
#• password
#这种类别主要在提供验证的修订工作,就是修改/变更密码。
#验证的控制标准有四种方式,分别是:
#• required
#当模块设定为required时,该模块的验证必须要成功,否则就会回传一个 failure 的讯息。
#不过,不论此一动作的模块是否成功,接下去的模块都还会继续动作。
#• requisite
#当模块设定为 requisite 时,该模块的认证要求验证成功。若失败,则不会进行下一步。
#• optional
#这个模块控件大多是在显示讯息而已,并不是用在验证方面的。
#• sufficient
#相对于 requisite 是『发生错误时,立刻回报原执行程序failure , 并且中断 PAM 的运作』,
#sufficient 则是『顺利通过验证时,立刻回报原程序通过的讯息, 并且中断 PAM 的运作』。
查询用户:w,who,last,lastlog
#显示已经登录的用户以及它们在做什么
[root@localhost ~]# w
04:56:39 up 14:08, 3 users, load average: 0.19, 0.09, 0.06
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 :0 Sun14 14:08m 27.47s 27.47s /usr/bin/Xorg :0 -br -verbose -audit 4 -auth /var/run/gdm/au
root pts/0 :0.0 Sun14 34.00s 0.47s 0.36s bash
root pts/1 192.168.190.1 04:56 0.00s 0.18s 0.13s w
#查看谁在使用系统
[root@localhost ~]# who
root tty1 2020-02-09 14:48 (:0)
root pts/0 2020-02-09 14:57 (:0.0)
root pts/1 2020-02-10 04:56 (192.168.190.1)
#显示最近登录用户的信息
[root@localhost ~]# last
root pts/1 192.168.190.1 Mon Feb 10 04:56 still logged in
root pts/2 192.168.190.1 Mon Feb 10 01:08 - 04:44 (03:36)
root pts/1 192.168.190.1 Sun Feb 9 15:48 - 02:13 (10:24)
root pts/0 :0.0 Sun Feb 9 14:57 still logged in
root tty1 :0 Sun Feb 9 14:48 still logged in
reboot system boot 2.6.32-642.el6.x Sun Feb 9 14:48 - 04:56 (14:08)
root tty1 :0 Thu Nov 1 12:19 - crash (465+03:28)
reboot system boot 2.6.32-642.el6.x Thu Nov 1 12:18 - 04:56 (465+17:38)
wtmp begins Thu Nov 1 12:18:03 2018
#lastlog 会去读取 /var/log/lastlog 文件,结果将数据输出
[root@localhost ~]# lastlog
Username Port From Latest
root pts/1 192.168.190.1 Mon Feb 10 04:56:36 -0500 2020
bin **Never logged in**
daemon **Never logged in**
adm **Never logged in**
lp **Never logged in**
sync **Never logged in**
shutdown **Never logged in**
halt **Never logged in**
mail **Never logged in**
uucp **Never logged in**
operator **Never logged in**
games **Never logged in**
gopher **Never logged in**
ftp **Never logged in**
nobody **Never logged in**
dbus **Never logged in**
....
检查工具
手动修改账户时,需要这些命令的检查。
pwck
检查/etc/passwd这个文件中的信息,可以检查家目录是否存在,或者比对/etc/passwd和/etc/shadow的信息是否一致。
pwunconv
将 /etc/shadow 内的密码栏数据写回 /etc/passwd 当中, 并且删除/etc/shadow 档案。
chpasswd
读入未加密前的密码,并且经过加密后, 将加密后的密码写入/etc/shadow 当中。这个指令很常被使用在大量建置账号的情况中。
手动创建账户流程
- 先建立所需要的群组 ( vi /etc/group );
- 将 /etc/group 与 /etc/gshadow 同步化 ( grpconv );
- 建立账号的各个属性 ( vi /etc/passwd );
- 将 /etc/passwd 与 /etc/shadow 同步化 ( pwconv );
- 建立该账号的密码 ( passwd accountname );
- 建立使用者家目录 ( cp -a /etc/skel /home/accountname );
- 更改使用者家目录的属性 ( chown -R accountname.group /home/accountname )。