特殊的 shell, /sbin/nologin

『无法登入』指的是:『这个使用者无法使用 bash 或其他 shell 来登入系统』而已, 并不是说这个账号就无法使用其他的系统资源!

让某个具有 /sbin/nologin 的使用者知道,他们不能登入主机时, 其实我可以建立 『/etc/nologin.txt 』这个文件,

并且在这个文件内说明不能登入的原因,那么下次当这个用户想要登 入系统时, 屏幕上出现的就会是 /etc/nologin.txt 这个文件的内容,而不是预设的内容了!

PAM 模块简介

PAM 可以说是一套应用程序编程接口 (Application Programming Interface, API),他提供了一连串的 验证机制,只要使用者将验证阶段的需求告知 PAM 后, PAM 就能够回报使用者验证的结果 (成 功或失败)。

如上述的图示, PAM 是一个独立的 API 存在,只要任何程序有需求时,可以向 PAM 发出验证要 求的通知, PAM 经过一连串的验证后,将验证的结果回报给该程序,然后该程序就能够利用验证 的结果来进行可登入或显示其他无法使用的讯息。

PAM 用来进行验证的数据称为模块 (Modules),每个 PAM 模块的功能都不太相同。举例来说, 还 记得我们在本章使用 passwd 指令时,如果随便输入字典上面找的到的字符串, passwd 就会回报错 误信息了!这是为什么呢?这就是 PAM 的 pam_cracklib.so 模块的功能!他能够判断该密码是否在 字典里面! 并回报给密码修改程序,此时就能够了解你的密码强度了。

PAM 模块设定语法

PAM 藉由一个与程序相同文件名的配置文件来进行一连串的认证分析需求。我们同样以 passwd 这 个指令的呼叫 PAM 来说明好了。 当你执行 passwd 后,这支程序呼叫 PAM 的流程是:

  1. 用户开始执行 /usr/bin/passwd 这支程序,并输入密码;
  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@study ~]# cat /etc/pam.d/passwd
#%PAM-1.0 <==PAM 版本的说明而已!
auth    include    system-auth    <==每一行都是一个验证的过程
account include system-auth
password substack system-auth
-password optional pam_gnome_keyring.so use_authtok
password substack postlogin
验证类别 控制标准 PAM 模块与该模块的参数

在这个配置文件当中,除了第一行宣告 PAM 版本之外,其他任何『 # 』开头的都是批注,而每一 行都是一个独立的验证流程, 每一行可以区分为三个字段,分别是验证类别(type)、控制标准(flag)、 PAM 的模块与该模块的参数。

Tips 你会发现在我们上面的表格当中出现的是『 include (包括) 』这个关键词,他代表的是『请呼叫后面的文件来作为这个类别的验证』, 所以,上述的每一行都要重复呼叫 /etc/pam.d/system-auth 那个文件来进行验证的意思!

  • 第一个字段:验证类别 (Type)

验证类别主要分为四种,分别说明如下:

  • auth

是 authentication (认证) 的缩写,所以这种类别主要用来检验使用者的身份验证,这种类别通常是需要密码 来检验的, 所以后续接的模块是用来检验用户的身份。

  • account

account (账号) 则大部分是在进行 authorization (授权),这种类别则主要在检验使用者是否具有正确的权限,举例来说,当你使用一个过期的密码来登入时,当然就无法正确的登入了。

  • session

session 是会议期间的意思,所以 session 管理的就是使用者在这次登入 (或使用这个指令) 期间,PAM 所 给予的环境设定。这个类别通常用在记录用户登入与注销时的信息!例如,如果你常常使用 su 或者是 sudo 指令的话, 那么应该可以在 /var/log/secure 里面发现很多关于 pam 的说明,而且记载的数据是『session open, session close』的信息!

  • password

password 就是密码嘛!所以这种类别主要在提供验证的修订工作,举例来说,就是修改/变更密码啦!


  • 第二个字段:验证的控制旗标 (control flag)

那么『验证的控制旗标(control flag)』又是什么?简单的说,他就是『验证通过的标准』啦!这个字 段在管控该验证的放行方式,主要也分为四种控制方式:

  • required

此验证若成功则带有 success (成功) 的标志,若失败则带有 failure 的标志,但不论成功或失败都会继续后 续的验证流程。 由于后续的验证流程可以继续进行,因此相当有利于资料的登录 (log) ,这也是 PAM 最 常使用 required 的原因。

  • requisite

若验证失败则立刻回报原程序 failure 的标志,并终止后续的验证流程。若验证成功则带有 success 的标志 并继续后续的验证流程。 这个项目与 required 最大的差异,就在于失败的时候还要不要继续验证下去?由 于 requisite 是失败就终止, 因此失败时所产生的 PAM 信息就无法透过后续的模块来记录了。

  • sufficient

若验证成功则立刻回传 success 给原程序,并终止后续的验证流程;若验证失败则带有 failure 标志并继续 后续的验证流程。 这玩意儿与 requisits 刚好相反!

  • optional

这个模块控件目大多是在显示讯息而已,并不是用在验证方面的。

将这些控制旗标以图示的方式配合成功与否的条件绘图,会有点像底下这样:

常用模块简介

由于我们常常需要透过各种方式登入 (login) 系统,因此就来看看登入所需要的 PAM 流程为何:

[root@study ~]# 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@study ~]# 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        sufficient    pam_fprintd.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.soaccount     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.sopassword    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.sosession     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 说明文件。

这里 仅简单介绍几个较常使用的模块,详细的信息还得要您努力查阅参考书呢!

  • pam_securetty.so

限制系统管理员 (root) 只能够从安全的 (secure) 终端机登入;那什么是终端机?例如 tty1, tty2 等就是传 统的终端机装置名称。那么安全的终端机设定呢? 就写在 /etc/securetty 这个文件中。你可以查阅一下该文 件, 就知道为什么 root 可以从 tty1~tty7 登入,但却无法透过 telnet 登入 Linux 主机了!

  • pam_nologin.so

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

  • pam_selinux.so

SELinux 是个针对程序来进行细部管理权限的功能,SELinux 这玩意儿我们会在第十六章的时候再来详细谈论。由于 SELinux 会影响到用户执行程序的权限,因此我们利用 PAM 模块,将 SELinux 暂时关闭, 等到验证通过后, 再予以启动!

  • pam_console.so

当系统出现某些问题,或者是某些时刻你需要使用特殊的终端接口 (例如 RS232 之类的终端联机设备) 登 入主机时, 这个模块可以帮助处理一些文件权限的问题,让使用者可以透过特殊终端接口 (console) 顺利 的登入系统。

  • pam_loginuid.so

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

  • pam_env.so

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

  • pam_unix.so

这是个很复杂且重要的模块,这个模块可以用在验证阶段的认证功能,可以用在授权阶段的账号许可证管 理, 可以用在会议阶段的登录文件记录等,甚至也可以用在密码更新阶段的检验!非常丰富的功能! 这个模块在早期使用得相当频繁喔!

  • pam_pwquality.so

可以用来检验密码的强度!包括密码是否在字典中,密码输入几次都失败就断掉此次联机等功能,都是这 模块提供的! 最早之前其实使用的是 pam_cracklib.so 这个模块,后来改成 pam_pwquality.so 这个模块, 但此模块完全兼容于 pam_cracklib.so,同时提供了 /etc/security/pwquality.conf 这个文件可以额外指定默认 值!比较容易处理修改!

  • pam_limits.so

还记得ulimit吗?其实那就是这个模块提供的能力!还有更多细部的设定可以参考: /etc/security/limits.conf 内的说明。

其他相关文件

我们也知道 PAM 相关的配置文件在 /etc/pam.d , 说明文件在 /usr/share/doc/pam-(版本) ,模块实际在 /lib64/security/ 。那么还有没有相关的 PAM 文件呢? 是有 的,主要都在 /etc/security 这个目录内!


  • limits.conf

ulimit 功能中, 除了修改使用者的 ~/.bashrc 配置文件之外,其实系统管理员可 以统一藉由 PAM 来管理的! 那就是 /etc/security/limits.conf 这个文件的设定了。这个文件的设定 很简单,你可以自行参考一下该文件内容。 我们这里仅作个简单的介绍:

范例一:vbird1 这个用户只能建立 100MB 的文件,且大于 90MB 会警告 [root@study ~]# vim /etc/security/limits.conf
vbird1 soft fsize 90000
vbird1 hard fsize 100000
#账号 限制依据 限制项目 限制值
# 第一字段为账号,或者是群组!若为群组则前面需要加上 @ ,例如 @projecta
# 第二字段为限制的依据,是严格(hard),还是仅为警告(soft);
# 第三字段为相关限制,此例中限制文件容量,
# 第四字段为限制的值,在此例中单位为 KB。
# 若以 vbird1 登入后,进行如下的操作则会有相关的限制出现![vbird1@study ~]$ ulimit -a....(前面省略)....
file size (blocks, -f) 90000
....(后面省略)....[vbird1@study ~]$ dd if=/dev/zero of=test bs=1M count=110 File size limit exceeded
[vbird1@study ~]$ ll --block-size=K test
-rw-rw-r--. 1 vbird1 vbird1 90000K Jul 22 01:33 test
# 果然有限制到了范例二:限制 pro1 这个群组,每次仅能有一个用户登入系统 (maxlogins)
[root@study ~]# vim /etc/security/limits.conf
@pro1 hard maxlogins 1
# 如果要使用群组功能的话,这个功能似乎对初始群组才有效喔!而如果你尝试多个 pro1 的登入时,
# 第二个以后就无法登入了。而且在 /var/log/secure 文件中还会出现如下的信息:
# pam_limits(login:session): Too many logins (max 1) for pro1 

  • /var/log/secure, /var/log/messages

PAM 模块都会将数据记载在 /var/log/secure 当中,所以发生了问题请务必到该文件内去查询一下问题点!

转载于:https://www.cnblogs.com/uetucci/p/7661837.html

linux学习-用户的特殊 shell 与 PAM 模块相关推荐

  1. Linux——用户的特殊shell与PAM模块

    问题:我们能否建立一个仅能使用的mail server相关邮件服务的账号,而该账号并不能登入Linux主机 1.特殊的shell./sbin/nologin 由于系统账号不需要登入,我们就给这个无法登 ...

  2. 【Linux】Linux学习(四)Shell编程

    Linux学习(四)Shell编程 Shell概述 Shell脚本入门 变量 系统预定义变量 自定义变量 特殊变量 运算符 条件判断 流程控制(重点) if判断 case语句 for循环 while循 ...

  3. Linux学习系列五:Shell命令脚本的基本语法

    这个系列的Linux教程主要参考刘遄老师的<Linux就该这么学>.用的系统是RHEL8,如果遇见一些命令出现问题,请首先检查自己的系统是否一致,如果不一致,可网上查一下系统间某些命令之间 ...

  4. 【Linux学习】如何编写Shell脚本调用企业微信api来发消息给企业微信成员?

    一.前言 最近通过python实现了发送消息给企业微信的功能,参考链接: [Jenkins学习 ]如何编写Python脚本来调用企业微信的api通知企业微信成员关于Jenkins的编译结果? http ...

  5. linux系统用户默认的shell,linux默认的shell是什么

    Linux中的shell,是指一个面向用户的命令接口,表现形式就是一个可以由用户录入的界面,这个界面也可以反馈运行信息:Linux下默认的shell是Bourne Again shell(bash). ...

  6. 第十四章 使用者的特殊 shell 与 PAM 模块

    我们前面一直谈到的大多是一般身份用户与系统管理员 (root) 的相关操作, 而且大多是讨论关于可登陆系统的账号来说.那么换个角度想,如果我今天想要创建的, 是一个『仅能使用 mail server ...

  7. Linux学习笔记 -- rpm 与 shell 编程

    目录 rpm 与 YUM rpm 包的管理 rmp 包 查询 安装 卸载 yum 安装 JDK mysql 8.0 离线安装 Centos 7 忘记mysql的root密码 Shell 编程 shel ...

  8. 【Linux学习笔记】 -- 基本Shell命令

    常见的目录名均基于文件系统层级标准(filesystem hierarchy standard,FHS) Linux的四个部分: 1 Linux内核:控制所有硬软件,必要时分配硬件根据需要执行软件 系 ...

  9. Linux新建用户可以在shell中切换到该用户也能登录到图形桌面

    解决使用useradd testname,passwd testname命令确实创建了一个用户,可以在shell中切换到该用户.但不能登录到图形桌面的问题! 通过下面方法可以在Linux中新建用户,并 ...

最新文章

  1. 需要在函数中传递的变量
  2. 红色警戒2修改器原理百科(十)
  3. C++for_each| bind1st | ptr_fun | std::function的用法
  4. docker安装jira心得
  5. MySQL中的SQL Mode及其作用
  6. DOM——获取元素的方式
  7. Haskell分解质因数
  8. 《JavaScript语言精粹》笔记(内附《JavaScript语言精粹》百度云下载链接)
  9. 酷派W711刷机教程
  10. SequoiaDB 巨杉数据库产品下载
  11. 如何在 Mac 上录制屏幕
  12. 大脑--物质与意识之综合体,是物质有双重现象(物性与灵性)的实证
  13. 综合实践计算机的入门知识教学设计,3-6年级综合实践活动3.我是电脑小画家_教案、教学设计_市级优课(0001)【信息技术】.doc...
  14. matlab建立ar时间序列模型_Matlab时间序列-AR-AR模型.doc
  15. 完全限定域名(fully qualified domain name,FQDN,笔记)
  16. 安装包升级—如何制作升级包
  17. 苹果浏览器实战(三)
  18. 博客及微博下载工具比较
  19. PowerSync 包尔星克 (群加) 对拷线/共享线连不上
  20. miumiu音乐app总结

热门文章

  1. latex subsection_利用LaTeX批量寫作「平安經」
  2. 在线预览视频/直播:m3u8、rmpt、mp4、flv
  3. 【微信小程序】组件只读
  4. python分位数回归模型_如何理解分位数回归风险价值 (VaR) 模型?
  5. bootcss echarts_数据可视化插件使用(Echarts)
  6. python下的所有文件_python批量复制文件夹下所有文件大小
  7. css border 虚线间距_【前端冷知识】CSS如何实现虚线框动画
  8. 优先级调度算法实现_一篇讲透嵌入式操作系统任务调度
  9. MySQL部署2002_MySQL入门02-MySQL二进制版本快速部署
  10. Springboot线程池的使用和扩展