Linux 用户的特殊shell与PAM模块

文章目录

  • Linux 用户的特殊shell与PAM模块
    • 特殊的shell:/sbin/nologin
    • PAM模块简介
      • PAM模块设置语法
    • 常用模块简介
      • login的PAM验证机制流程
    • 其他相关文件
      • limits.conf
        • 使用案例
      • /var/log/secure、/var/log/messages

Linux 用户的特殊shell与PAM模块

你想过吗?如果我今天想要建立一个【仅能使用邮件服务的相关账号,而该账号并不能登录Linux主机】,如果不能给予该账号一个密码,那么该账号就无法使用系统的各项资源,当然也包括mail资源。如果给予一个密码,那么该账号就可能能登录Linux主机。

在之前用户管理的时候我们谈到了etc/login.defs文件中/,默认密码是5个字符长度,该值是已经被PAM模块所替换,那么什么是PAM?为什么可以影响用户登录呢?

特殊的shell:/sbin/nologin

之前在用户管理里面passwd文件结构里面我们就谈过系统账号,他的shell就是使用/sbin/nologin,重点在于系统账号是不需要登录的。所以我们就给他这个无法登录的合法shell,使用了这个shell的用户即使有了密码也无法登录,因为会出现如下的信息:

连接成功
Last login: Wed Apr 12 17:36:01 2023 from 192.168.100.1
This account is currently not available.

我们所谓的【无法登录】指的是:【这个用户无法使用bash或其他shell来登录系统】而已,并不是说这个账号就无法使用其他的系统资源。举例来说,各个系统账号,打印作业由IP这个账号在管理,WWW服务由apache这个账号在管理,他们都可以进行系统程序的工作,但是【就是无法登录主机获取交互的shell】而已。

就像我们上面谈到的邮件服务问题,我们就可以用/sbin/nologin作为他们的shell。

另外,如果我想要让某个具有/sbin/nologin的用户知道,它们不能登录主机时,其实我们可以建立【/etc/nologin.txt】这个文件,并且在这个文件内说明不能登录的原因,那么下次当这个用户想要登录的时候,屏幕上就会出现的是/etc/nologin.txt文件里面的内容,而不是默认内容

那么我们尝试创建一个不可以登录的账号,然后创建一个nologin.txt的文件写入不可登录的原因,然后登录测试

[root@localhost ~]# useradd -s /sbin/nologin myuser4 
[root@localhost ~]# vi /etc/nologin.txt    # 在里面添加如下内容
此帐户系统帐户或邮件帐户
请不要使用此帐户登录我的Linux服务器
[root@localhost ~]# su - myuser4        # 登录myuser4账号测试
此帐户系统帐户或邮件帐户
请不要使用此帐户登录我的Linux服务器
# 结果发现与原本的默认信息不一样

PAM模块简介

PAM(Pluggable Authentication Modules,插入式验证模块)是 Linux 系统中的一种模块化认证机制,可以通过 PAM 模块来控制系统用户的身份验证和授权,同时也可以控制用户访问系统时可以使用的服务和资源。PAM 模块可以支持多种认证方式,如本地密码、LDAP、Kerberos 等,同时也支持多种授权方式,如限制登录时间、限制登录来源 IP 等。

PAM 模块的主要作用是将认证机制与服务分离开来,使得管理员可以通过添加或删除 PAM 模块来控制用户访问系统时的身份验证和授权。PAM 模块的配置文件为/etc/pam.d/目录下的文件,每个文件对应一个服务,例如 ssh、login 等。在 PAM 配置文件中,可以指定使用哪些 PAM 模块来进行认证和授权,以及这些模块的顺序和参数。

PAM 模块可以极大地增强 Linux 系统的安全性和灵活性,可以根据具体需求来配置 PAM 模块,以实现更加精细的访问控制和认证机制。

PAM模块设置语法

PAM借由一个与程序相同的文件名的配置文件来完成一连串的认证分析需求,我们同样以passwd这个命令调用PAM来说明。当你执行passwd后,这个程序调用PAM的流程是:

  1. 用户开始执行PAM模块进行验证
  2. passwd调用PAM模块进行验证
  3. PAM模块会到/etc/pam.d/找寻与程序(passwd)同名的配置文件
  4. 根据/etc/pam.d/passwd内的设置,引用相关的PAM模块逐步进行验证分析。
  5. 将验证结果(成功、失败以及其他信息)返回给passwd这个程序
  6. passwd这个程序会根据PAM返回的结果决定下一个操作(重新输入新密码或通过验证)

由上面的说明得知,我们知道重点其实是/etc/pam.d/里面的配置文件,以及配置文件所调用的PAM模块进行的验证工作。前面我们谈到passwd命令,那我们来看看/etc/pam.d/passwd这个配置文件的内容是怎么样的吧

[root@localhost ~]# 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 use_authtok
password   substack     postlogin
# 验证类别  # 控制标准    # PAM模块与该模块的参数

当执行 cat /etc/pam.d/passwd 命令时,会输出 /etc/pam.d/passwd 文件的内容。该文件是 Linux 系统中的一个 PAM(Pluggable Authentication Modules)配置文件,用于指定用户修改密码时使用的 PAM 模块。具体输出内容如下:

#%PAM-1.0
auth       include      system-auth
account    include      system-auth
password   substack     system-auth
-password   optional    pam_gnome_keyring.so use_authtok
password   substack     postlogin
# 模块类型   # 控制标志   # 模块路径

其中,#%PAM-1.0 是 PAM 配置文件的头部信息,指定了 PAM 的版本号为 1.0。
接下来是几行 PAM 模块的配置,每行的格式为:

module_type  control_flag  module_path  [module_arguments]


module_type:模块类型,包括 auth、account、password、session 等。
control_flag:控制标志,用于指定模块的行为,包括 include、substack、required、sufficient、optional 等。
module_path:模块路径,指定使用的 PAM 模块的路径。
module_arguments:模块参数,指定传递给 模块的参数信息。

对于 /etc/pam.d/passwd 文件中的模块配置,具体含义如下:

第二行 auth include system-auth:指定使用 system-auth 配置文件中的 auth 模块进行用户身份验证。

第三行 account include system-auth:指定使用 system-auth 配置文件中的 account 模块进行账户检查。

第四行 password substack system-auth:指定使用 system-auth 配置文件中的 password 模块进行密码验证和更改,但只是作为子堆栈,即在最终确认密码更改前,要求先通过 system-auth 模块的认证。

第五行 -password optional pam_gnome_keyring.so use_authtok:指定使用 pam_gnome_keyring.so 模块来管理 GNOME Keyring 密码。当用户在 GNOME 环境下使用 passwd 命令修改密码时,该模块会将新密码同步到 GNOME Keyring 中。注意,这里使用了 - 号来标记该模块为可选模块,如果该模块无法正常工作,系统不会报错,而是继续执行后面的模块。

第六行 password substack postlogin:指定使用 postlogin 模块作为子堆栈,即在用户密码已经更改成功后,执行 postlogin 模块的相关操作,如打印最后一次登录信息等。

Linux PAM模块中的控制标志用于控制PAM模块认证过程中的行为。这些控制标志分为四种类型,分别是required、requisite、sufficient和optional。

required:表示必须通过认证才能进行后续操作,如果认证失败,则直接返回失败并且不会执行后续的认证方法。

requisite:表示必须通过认证才能进行后续操作,如果认证失败,会立即返回失败且不会执行后续的认证方法。与required不同的是,如果前面的requisite标志返回失败,后续的requisite标志也不会继续执行。

sufficient:表示认证成功即可通过,如果认证成功,则直接返回成功并且不会执行后续的认证方法。如果前面的sufficient标志返回成功,则后面的标志将不会继续执行。

optional:表示不一定要通过认证,如果认证失败,则会继续执行后续的认证方法,但是如果认证成功,则后续的认证方法将不会继续执行。

Linux 用户的特殊shell与PAM模块_第1张图片

常用模块简介

我们知道了配置文件的语法后,现在来看看提供的PAM默认文件的内容是什么,由于我们常常需要通过各种方式登录(login)系统,那么就来看看登录所需要的PAM流程是什么?

[root@localhost ~]# cat /etc/pam.d/login 
#%PAM-1.0
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

# 可以看到,其实login也多次调用了system-auth,所以下面列出该配置文件

[root@localhost ~]# cat /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

上述描述的内容中使用了很多的PAM模块,每个模块的功能都不太相同,详细的模块信息可以在你的系统中找到:

  • /etc/pam.d/*:每个程序的PAM配置文件
  • /lib64/security:PAM模块文件的实际放置目录
  • /etc/security/*: 其他PAM环境的配置文件
  • /usr/share/doc/pam-*/:详细的PAM说明文件,例如 /usr/share/doc/pam-1.1.8/txts/README.pam_nologin

这里只列出几个比较常用的模块

pam_securetty.so

限制系统管理员(root),只能够从安全的(secure)终端登录。那什么是终端?例如tty1,tty2,tty3等传统的终端设备名称。安全的终端设置就在/etc/securetty这个文件中。/etc/securetty是一个文本文件,用于指定哪些终端设备可以用于root用户登录。当root用户登录时,系统会检查当前登录的终端设备是否在/etc/securetty中指定的列表中,如果不在列表中,则无法登录。

pam_nologin.so

这个模块可以限制一般用户是否能够登录主机。当/etc/nologin这个文件存在时,则所有一般用户均无法再登录系统了,若/etc/nologin存在,则一般用户在登录时,在他们的终端上会将该文件的内容显示出来,所以,正常情况下,这个文件应该是不能存在于系统中的,但这个模块对root以及已经登录系统中的一般账号没有影响(注意:这与/etc/nologin.txt并不相同)

pam_seLinux.so

SELinux是一个针对程序来进行详细管理权限的功能,由于SELinux会影响到用户执行程序的权限,因此我们利用PAM模块,将SELinux暂时关闭,等到验证通过后,在给予启动。

pam_loginuid.so

我们知道系统账号与一般账号的UID是不同的,一般账号的UID均大于1000才合理,因此为了验证用户的UID真的是我们所需要的数值,可以使用这个模块来进行规范

pam_env.so

用来设置环境变量的一个模块,如果你需要额外设置环境变量,可以参考/etc/security/pam_env.conf 这个文件的详细说明

pam_unix.so

这个是个很复杂且重要的模块,这个模块可以用在验证阶段的认证功能、授权阶段的账号许可证管理、会话阶段的日志文件记录等,甚至还可以用在密码更新阶段的检验。

pam_pwquality.so

可以用来检验密码的强度,包括密码是否在字段中、密码输入几次都失败就短刀此次连接等功能,都是这个模块提供的。

pam_limits.so

pam.limits.so用于设置用户的资源限制,例如CPU使用时间、内存限制、文件打开数等。可以通过修改/etc/security/limits.conf文件来设置用户的资源限制,而pam.limits.so模块可以根据这些限制配置进行验证和应用

login的PAM验证机制流程

  1. 验证阶段(auth):首先,(a)会经过pam_securetty.so判断,如果用户是root时,则会参考/etc/securetty的设置;接下来(b)经过pam_env.so设置额外的环境变量;再©通过pam_unix.so检验密码,若通过则返回login程序;若不通过则(d)继续往下以pam_succeed_if.so判断UID是否大于1000,若小于1000则返回失败,否则再往下(e)以pam_deny.so拒绝连接
  2. 授权阶段(account):(a)先以pam_nologin.so判断/etc/nologin是否存在,若存在则不允许一般用户登录;(b)接下来以pam_unix.sopam_localuser.so进行账号管理,再以©pam_succed_if.so判断UID是否小于1000,若小于1000则不记录登录信息;(d)最后以pam_permit.so允许该账号登录。
  3. 密码阶段(password):(a)先以pam_pwquality.so设置密码仅能尝试错误3此;(b)接下来以pam_unix.so 通过sha521、shadow等功能进行密码检验,若通过则返回login程序,若不通过则©以pam_deny.so拒绝登录
  4. 会话阶段(session):(a)先以pam_selinux.so暂时关闭SELinux;(b)使用pam_limits.so设置好用户能够操作的系统资源;©登录成功后开始记录相关信息再日志文件中;(d)以pam_loginuid.so 规范不同的UID权限;(e)开启pam_selinux.so的功能

总之,就是根据验证类别来看,然后由login的设置值去查看,如果出现【include system-auth】就转到system-auth文件中的相同类别,去获取额外的验证流程,然后再到下一个验证类别,最终将所有的验证跑完,就结束这次的PAM验证。

经过这样的验证流程,就知道了为什么/etc/nologin存在会有问题,也会知道为何你使用一些远程连接机制,老是无法使用root登录的问题了吧?没错都是PAM模块提供的功能

其他相关文件

前面谈到的/etc/securetty会影响到root可登录的安全终端,/etc/nologin会影响到一般用户是否能够登录的功能之外,我们也知道PAM相关的配置文件在/etc/pam.d,说明文件在/usr/share/doc/pam-(版本),模块实际在/lib64/security/。那么还有没有相关的PAM文件呢?是有的,主要都在/etc/security这个目录内。下面我们介绍几个可能会用到的配置文件

limits.conf

/etc/security/limit.conf是Linux系统中与进程资源限制有关的配置文件。它可以用来限制单个用户或整个系统中的进程使用某些资源

使用案例

zhw这个用户只能建立100MB的文件,且大于90MB会警告⚠

[root@localhost ~]# vim /etc/security/limits.conf 
....
..
zhw     soft       fsize    90000
zhw     hard       fsize    100000
#账号   #限制根据   #限制选项  #限制值
 
# 第一列位账号,或是用户组,若为用户组则前面加上@,例如@projecta
# 第二列位限制的数据,是严格(hard),还是仅为警告(soft)
# 第三列位相关限制,此例中限制文件容量
# 第四列位限制的值,在此例中单位位KB
# 若zhw用户登录后,进行如下的操作则会有相关的限制

[zhw@localhost ~]$ ulimit -a   # 注意这里是zhw用户
....
..
file size               (blocks, -f) 90000
...
....
[zhw@localhost ~]$ dd if=/dev/zero of=test bs=1M count=110
文件大小超出限制
[zhw@localhost ~]$ ll --block-size=K test 
-rw-rw-r--. 1 zhw zhw 90000K 414 20:22 test

限制pro1这个用户组,每次仅能有一个使用者登录系统(maxlogins)

[root@localhost ~]# vi /etc/security/limits.conf
....
@pro1 hard maxlogins

# 如果要使用用户组功能的话,这个功能似乎对初始用户组才有效。而如果你尝试多个pro1的登录时,
# 第二个以后就无法登录了,而且在/var/log/secure 文件中还会出现如下信息
Apr 14 20:28:59 localhost sshd[20712]: Accepted password for pro1 from 192.168.100.1 port 51958 ssh2
Apr 14 20:28:59 localhost sshd[20712]: pam_limits(sshd:session): Too many logins (max 1) for pro1
Apr 14 20:28:59 localhost sshd[20712]: pam_unix(sshd:session): session opened for user pro1 by (uid=0)
Apr 14 20:28:59 localhost sshd[20712]: error: PAM: pam_open_session(): Permission denied

这个文件设置完成立马生效,你不用重启任何服务。但是PAM有个特殊的地方,由于它是在程序调用的时才给予设置的,因此你修改完成的数据,对于已经登录系统中的用户来说是没有效果的,要等他再次登录时才会生效。

/var/log/secure、/var/log/messages

/var/log/secure文件记录与系统认证和授权相关的信息,包括用户登录和注销、系统重启以及其他与安全相关的事件。这个文件通常被系统管理员用来监视系统活动并跟踪安全相关问题。

/var/log/messages文件是一个通用的系统日志文件,记录有关系统事件和进程的信息。它包括有关硬件和软件错误、系统警告和其他系统消息的信息。这个文件对于需要在系统上解决问题的系统管理员和开发人员来说是一个有用的信息源

如果你无法登录或是参数一些你无法预期的错误时,由于PAM模块都会将数据记录在/var/logsecure当中,所以发生问题请务必到该文件内去查询一个问题点。举例来说,我们上述例二,就谈到了多重登录的错误可以到/var/log/secure中查看

此文参考【鸟哥Linux私房菜】

你可能感兴趣的:(Linux学习,linux,服务器,运维)