当前位置:   article > 正文

Linux笔记 No.22---(Linux - PAM)_pam_cracklib.so

pam_cracklib.so

一、PAM 介绍

在Linux中执行有些程序时,这些程序在执行前首先要对启动它的用户进行认证,符合一定的要求之后才允许执行,例如像我们使用su命令时,系统会提示你输入root用户的密码.这就是su命令通过调用PAM模块实现的

在Linux中进行身份或是状态的验证程序是由PAM来进行的,PAM(Pluggable Authentication Modules)可动态加载验证模块,因为可以按需要动态的对验证的内容进行变更,所以可以大大提高验证的灵活性。

PAM可以说是一套程序编程接口(api application programming interface) ,它提供了一连串的验证,只要用户将验证阶段的需求告诉给PAM,,PAM就会进行验证,将结果反馈给用户。简而言之,PAM就是一个独立的api,任何程序有需求,可以向PAM发出验证要求通知,PAM经过验证将结果反馈给该程序。

优点:
它通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。

二、PAM的配置文件

PAM使用配置/etc/pam.d/下的文件来管理对程序的认证方式。应用程序调用相应的配置文件,从而调用本地的认证模块。模块放置在/usr/lib64/security/下

PAM模块
PAM 的各个模块一般存放在/usr/lib64/security/*中,以动态库文件的形式存在,文件名格式一般为 pam_*.so。

  • /usr/lib64/security/* :PAM 模块文件的实际放置目录
  • /usr/share/doc/pam-1.1.8/ :详细的 PAM 说明
[root@admin ~]# cd /usr/lib64/security/
[root@admin security]# ls
pam_access.so     pam_limits.so          pam_shells.so
pam_cap.so        pam_listfile.so        pam_stress.so
pam_chroot.so     pam_localuser.so       pam_succeed_if.so
pam_console.so    pam_loginuid.so        pam_systemd.so
pam_cracklib.so   pam_mail.so            pam_tally2.so
pam_debug.so      pam_mkhomedir.so       pam_time.so
pam_deny.so       pam_motd.so            pam_timestamp.so
pam_echo.so       pam_namespace.so       pam_tty_audit.so
pam_env.so        pam_nologin.so         pam_umask.so
pam_exec.so       pam_permit.so          pam_unix_acct.so
pam_faildelay.so  pam_postgresok.so      pam_unix_auth.so
pam_faillock.so   pam_pwhistory.so       pam_unix_passwd.so
pam_filter        pam_pwquality.so       pam_unix_session.so
pam_filter.so     pam_rhosts.so          pam_unix.so
pam_ftp.so        pam_rootok.so          pam_userdb.so
pam_group.so      pam_securetty.so       pam_warn.so
pam_issue.so      pam_selinux_permit.so  pam_wheel.so
pam_keyinit.so    pam_selinux.so         pam_xauth.so
pam_lastlog.so    pam_sepermit.so
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

PAM 的配置文件

针对各种服务和应用已经定义好的 PAM 配置文件 /etc/pam.d/ 文件夹内的多个文件

  • /etc/pam.d/* :每个程序/服务的 pam 配置文件
  • /etc/security/* :其他相关的配置文件

/etc/pam.d/ 下的配置文件通常以每一个使用 PAM 的程序的名称来命令

比如 /etc/pam.d/su,/etc/pam.d/login 等等。还有些配置文件比较通用,经常被别的配置文件引用,也放在这个文件夹下,比如 /etc/pam.d/system-auth。

[root@admin pam.d]# ls
atd                  password-auth-ac   sudo
chfn                 polkit-1           sudo-i
chsh                 postlogin          su-l
config-util          postlogin-ac       system-auth
crond                remote             system-auth-ac
fingerprint-auth     runuser            systemd-user
fingerprint-auth-ac  runuser-l          vlock
login                smartcard-auth     vmtoolsd
other                smartcard-auth-ac  vsftpd
passwd               sshd
password-auth        su
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

/etc/pam.d/下的这些配置文件的格式都保持一致:

login配置文件

[root@admin ~]# 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在配置文件当中,除了第一行声明 PAM 版本之外,其他每一行都是一个独立的验证流程,每一行可以区分为四个字段,分别是验证类别(type)、控制标记(control_flag)、PAM的模块、该模块的参数

一般的,PAM配置文件都保存在/etc/pam.d目录里。大多的情况下,一个配置文件将在对应至少一个PAM模块。这些模块大多在 /usr/lib64/security 下。在 /usr/share/doc/pam-1.1.8/txts/ 以及 html 子目录下是每个模块的详细描述。

配置文件语法:

第一个字段:验证类别(type)
验证类别主要分为四种:

  • auth (身份认证管理)
    是authentication(认证)的缩写,所以这种类别主要用来检验用户的身份,这种类别通常是需要密码来检验的,所以后接续的模块用来检验用户的身份。例如,PAM auth规则验证用户是否提供了有效的用户名和口
    令凭证。
  • account (账户管理)
    account(账号)大部分用于进行authorization(授权),这种类别主要检验用户是否具有正确的权限。依据账户策略允许或拒绝访问。例如,PAM account规则可依据时间,口令有效期限或者受限用户的列表来拒绝访问。
  • password(口令管理)
    管理口令变更的策略,主要是在提供验证的修订任务。例如,PAM password规则可以强制用户试图变更口令时
    需要输入的口令的最小长度。
  • session(会话管理)
    session是会话期间的意思,所以session管理的就是用户在这次登录期间,PAM所给予的环境设置。这个类通常用于记录用户登录与注销时的信息。例如,PAM session 规则可设置登录控制台的默认设置

这四个验证的类型通常是有顺序的。一般说:总是要先验证身份(auth)后,系统才能借由用户的身份给予适当的授权与权限设置(account),此时登录与注销期间的环境才需要设置,也才需要记录登录与注销的信息(session)。如果在运行期间需要密码修改,这时便应该给予password的类别。

第二个字段:控制标记(control_flag)
PAM使用控制标记(control_flag)来处理和判断各个模块的返回值

规定如何处理PAM模块鉴别认证的结果,简而言之就是鉴别认证成功或者失败之后会发生什么事,如何进行控制。单个应用程序可以调用多种底层模块,通常称为“堆叠”。对应于某程序按照配置文件中出现顺序执行的所有模块成为“堆”,堆中的各模块的地位与出错时的处理方式由control_flag栏的取值决定,他的四种可能的取值分别为required、Requisite、sufficient或_optional:

  • required
    表示该行以及所涉及模块的成功是用户通过鉴别的必要条件。换句话说,只有当对应于应用程序的所有带 required标记的模块全部成功后,该程序才能通过鉴别。同时,如果任何带 required 标记的模块出现了错误,PAM并不立刻将错误消息返回给应用程序,而是在所有模块都调用完毕后才将错误消息返回调用他的程序。 反正说白了,就是必须将所有的模块都执行一次,其中任何一个模块验证出错,验证都会继续进行,并在执行完成之后才返回错误信息。这样做的目的就是不让用户知道自己被哪个模块拒绝,通过一种隐蔽的方式来保护系统服务。就像设置防火墙规则的时候将拒绝类的规则都设置为drop一样,以致于用户在访问网络不成功的时候无法准确判断到底是被拒绝还是目标网络不可达。

  • requisite
    与required相仿,只有带此标记的模块返回成功后,用户才能通过鉴别。不同之处在于其一旦失败就不再执行堆中后面的其他模块,并且鉴别过程到此结束,同时也会立即返回错误信息。

  • sufficient
    表示该行以及所涉及模块验证成功是用户通过鉴别的充分条件。也就是说只要标记为sufficient的模块一旦验证成功,那么PAM便立即向应用程序返回成功结果而不必尝试任何其他模块。即便后面的层叠模块使用了requisite或者required控制标志也是一样。当标记为sufficient的模块失败时,sufficient模块会当做 optional对待。因此拥有sufficient 标志位的配置项在执行验证出错的时候并不会导致整个验证失败,但执行验证成功之时则大门敞开。所以该控制位的使用务必慎重。

  • optional
    他表示即便该行所涉及的模块验证失败用户仍能通过认证。在PAM体系中,带有该标记的模块失败后将继续处理下一模块。也就是说即使本行指定的模块验证失败,也允许用户享受应用程序提供的服务。使用该标志,PAM框架会忽略这个模块产生的验证错误,继续顺序执行下一个层叠模块。

  • include
    表示在验证过程中调用其他的PAM配置文件。在RHEL系统中有相当多的应用通过完整调用/etc/pam.d/system-auth来实现认证而不需要重新逐一去写配置项。这也就意味着在很多时候只要用户能够登录系统,针对绝大多数的应用程序也能同时通过认证。

第三字段:PAM模块名

即要调用的模块, 如果是64位系统,一般保存在/usr/lib64/security,如:pam_unix.so
同一个模块,可以出现在不同的类型中。它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型,编制了不同的执行函数.

第四字段:模块参数

模块参数,即传递给模块的参数。参数可以有多个,之间用空格分隔开,如:

password  required  pam_unix.so nullok obscure min=4 max=8 md5
  • 1

常用的PAM模块

PAM模块管理类型说明
pam_unix.soauth提示用户输入密码,并与/etc/shadow文件相比对.匹配返回0
account检查用户的账号信息(包括是否过期等).帐号可用时,返回0.
password修改用户的密码. 将用户输入的密码,作为用户的新密码更新shadow文件
pam_shells.soauth / account如果用户想登录系统,那么它的shell必须是在/etc/shells文件中之一的shell
pam_deny.soaccount / auth / password / session该模块可用于拒绝访问
pam_permit.soaccount / auth / password / session模块任何时候都返回成功.
pam_securetty.soauth如果用户要以root登录时,则登录的tty必须在/etc/securetty之中.
pam_cracklib.sopassword这个模块可以插入到一个程序的密码栈中,用于检查密码的强度.
pam_limits.sosession定义使用系统资源的上限,root用户也会受此限制,可以通过/etc/security/limits.conf或/etc/security/limits.d/*.conf来设定
pam_listfile.soaccount / auth / password / session实现基于用户/组,主机名/IP,终端的访问控制

三、PAM模块的工作原理和流程

system-auth是一个非常重要的pam配置文件,主要负责用户登录系统的认证工作。而且该文件不仅仅只是负责用户登录系统认证,其它的程序和服务通过include接口也可以调用到它,从而节省了很多重新自定义配置的工作。所以应该说该文件是系统安全的总开关和核心的 PAM 配置文件。

[root@admin ~]# 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.
#password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok remember=3
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 第一部分表示,当用户登录的时候,首先会通过auth类接口对用户身份进行识别和密码认证。所以在该过程中验证会经过几个带auth的配置项。

    其中的第一步是通过pam_env.so模块来定义用户登录之后的环境变量, pam_env.so允许设置和更改用户登录时候的环境变量,默认情况下,若没有特别指定配置文件,将依据/etc/security/pam_env.conf进行用户登录之后环境变量的设置。

    然后通过pam_unix.so模块来提示用户输入密码,并将用户密码与/etc/shadow中记录的密码信息进行对比,如果密码比对结果正确则允许用户登录,而且该配置项的使用的是“sufficient”控制位,即表示只要该配置项的验证通过,用户即可完全通过认证而不用再去走下面的认证项。不过在特殊情况下,用户允许使用空密码登录系统,例如当将某个用户在/etc/shadow中的密码字段删除之后,该用户可以只输入用户名直接登录系统。

    下面的配置项中,通过pam_succeed_if.so对用户的登录条件做一些限制,表示允许uid大于500的用户在通过密码验证的情况下登录,在Linux系统中,一般系统用户的uid都在500之内,所以该项即表示允许使用useradd命令以及默认选项建立的普通用户直接由本地控制台登录系统。

    最后通过pam_deny.so模块对所有不满足上述任意条件的登录请求直接拒绝,pam_deny.so是一个特殊的模块,该模块返回值永远为否,类似于大多数安全机制的配置准则,在所有认证规则走完之后,对不匹配任何规则的请求直接拒绝。

  • 第二部分的三个配置项主要表示通过account账户类接口来识别账户的合法性以及登录权限

    第一行仍然使用pam_unix.so模块来声明用户需要通过密码认证。第二行承认了系统中uid小于500的系统用户的合法性。之后对所有类型的用户登录请求都开放控制台。

  • 第三部分会通过password口另类接口来确认用户使用的密码或者口令的合法性

    第一行配置项表示需要的情况下将调用pam_pwquality.so来验证用户密码复杂度。如果用户输入密码不满足复杂度要求或者密码错,最多将在三次这种错误之后直接返回密码错误的提示,否则期间任何一次正确的密码验证都允许登录。

    需要指出的是,pam_pwquality.so是一个控制密码复杂度的pam模块。之后带pam_unix.so和pam_deny.so的两行配置项的意思与之前类似。都表示需要通过密码认证并对不符合上述任何配置项要求的登录请求直接予以拒绝。不过用户如果执行的操作是单纯的登录,则这部分配置是不起作用的。

  • 第四部分主要将通过session会话类接口为用户初始化会话连接。其中几个比较重要的地方包括,使用pam_keyinit.so表示当用户登录的时候为其建立相应的密钥环,并在用户登出的时候予以撤销。不过该行配置的控制位使用的是optional,表示这并非必要条件。之后通过pam_limits.so限制用户登录时的会话连接资源,相关pam_limit.so配置文件是/etc/security/limits.conf,默认情况下对每个登录用户都没有限制。

可见,不同应用程序通过配置文件在认证过程中调用不同的pam模块来定制具体的认证流程。那么管理员便可以根据实际的需要对 PAM 的配置文件进行修改以满足不同的认证需求

以 passwd 命令为例说明PAM的工作流程:

PAM用来进行验证的数据称为模块(modules),然而每个PAM模块的功能也不相同,例如使用 passwd 命令修改用户密码,如下:

[dxk@admin ~]$passwd
更改用户 dxk 的密码 。
为 dxk 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
无效的密码: 密码是一个回文
新的 密码:
无效的密码: 密码少于 8 个字符
新的 密码:
无效的密码: 密码未通过字典检查 - 过于简单化/系统化
passwd: 已经超出服务重试的最多次数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

报错的原因是PAM的pam_cracklib.so 模块的功能, 它能够判断该密码是否在字典里面,并将错误信息返回给修改程序。即该模块会验证所设置密码的安全性和强度,如果不符合要求就会 返回如上错误信息

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 模块进行的验证工作

查看 /etc/pam.d/passwd 配置文件内容:

[dxk@admin 15:28:44 ~]$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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

四、查看是否支持PAM认证

PAM 限制仅针对用户,不针对进程。换句话说,通一个进程如果被不同的用户执行,他们的影响是不一样的

查看某个程序是否支持PAM,使用命令:ldd

[root@admin ~]# ldd `which sshd` | grep libpam
	libpam.so.0 => /lib64/libpam.so.0 (0x00007f9b0d3ac000)
  • 1
  • 2

sshd 就代表查看的程序名,如果包含libpam库,那么该程序就支持PAM验证。

举个不是特别恰当的例子:PAM机制就相当于给一个房屋安装防盗门,也就是对要进入这间屋子的人进行控制,不让这
间屋子处于一种任何人都可以随便进入的状态。

  • 支持PAM验证呢,就是表示这屋子给安装防盗门预留了空位
  • 不支持PAM,就是说房子整个就是封闭的,人根本进不了,或者是房子基本没有墙,不需要对出入进行限制。
  • 在PAM机制中,PAM模块就相当于是防盗门上可以安装的各种锁具,这些锁具各有不同的特点和功能,你可以按需要安装。
  • 相同的,在PAM中,程序的配置文件就相当于这个防盗门的制作和安装方案,安在什么地方,在支持的各种锁具中选择合适的锁,然后是开这些锁的先后顺序等这些具体使用规范。

五、PAM模块控制

pam_securetty.so模块

对于本地访问的控制通常是在/etc/securetty文件中,它默认包含11个虚拟控制台的访问指令。

etc/securetty文件指定了允许root登录的tty设备,由/bin/login程序读取。

[root@admin ~]# cat /etc/securetty 
console
vc/1
vc/2
vc/3
vc/4
vc/5
vc/6
vc/7
vc/8
vc/9
vc/10
vc/11
tty1
tty2
tty3
tty4
tty5
tty6
tty7
tty8
tty9
tty10
tty11
ttyS0
ttysclp0
…………
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Centos7系统默认开启6个虚拟终端,均容许root本地登录。为了安全起见,如何对本地的root用户登录做限制?

/etc/securetty文件中列出的虚拟控制台确定根管理用户可以登录的控制台

  • 如果让该文件中的指令以注释的形式存在(即所有内容不生效)或者置空该文件,则禁止root登录任何终端,此时必须使用普通用户进行登录,使用su或sudo命令进行管理。
  • 如果删除文件中的指定终端,则root无法登录进被删除的终端。
  • 若删除该文件,则容许root访问任何终端。

pam_listfile.os模块

pam_listfile.so模块的功能和pam_access.so模块类似,目标也是实现基于用户/组,主机名/IP,终端的访问控制

访问控制是靠pam配置文件中的控制选项和一个自定义的配置文件来实现的。而且除了针对上述访问源的控制之外,还能够控制到ruser,rhost,所属用户组和登录shell。

使用pam_listfile.os模块来限制指定用户的访问权限

比如安装了vsftpd服务器,在/etc/pam.d/vsftpd文件就包含了该模块。

[root@admin ~]# cat /etc/pam.d/vsftpd
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke

auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed

#控制用户登录的方式:
#item:限制对终端(tty)、用户(user)和组(group)等的访问。
#sense:在File中有用,指定File指定的文件是白名单还是黑名单,有allow和deny两个值。
#File:文件路径,列出用户,组等。
#onerr:如果有问题,则告诉模块怎么做,有succeed和fail两个值。

auth       required     pam_shells.so
auth       include      password-auth
account    include      password-auth
session    required     pam_loginuid.so
session    include      password-auth
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

/etc/pam.d/vsftpd文件中的:

auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
  • 1

表示当用户试图登录FTP服务器的时候,会调用pam_listfile.so模块来验证用户是否可以登录,这里item=user表示访问控制是基于user即用户实现的。sense=deny表示禁止登录。那么哪些用户被禁止登录?即file选项所定义的/etc/vsftpd/ftpusers文件内的用户禁止登录到FTP服务器,而在/etc/vsftpd/vsftpd.conf中明确指定了对用户的认证需要通过/etc/pam.d/vsftpd中的配置调用pam模块:

[root@admin ~]# cat /etc/vsftpd/vsftpd.conf | grep pam_service
pam_service_name=vsftpd
  • 1
  • 2

查看哪些用户被禁止登录到FTP服务器:

[root@admin ~]# cat /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

另外除了通过pam_listfile.so实现基于用户的访问控制之外,还可以实现基于其它条件的访问控制。这个可以具体查看pam_listfile.so模块的选项,使用pam_listfile.so模块配置的格式分为五个部分:分别是item、onerr、sense、file以及apply。 其中:

  • item=[tty|user|rhost|ruser|group|shell]: 定义了对哪些列出的目标或者条件采用规则,显然,这里可以指定多种不同的条件。
  • onerr=succeed|fail: 定义了当出现错误(比如无法打开配置文件)时的缺省返回值。
  • sense=allow|deny: 定义了当在配置文件中找到符合条件的项目时的控制方式。如果没有找到符合条件的项目,则一般验证都会通过。
  • file=filename: 用于指定配置文件的全路径名称。
  • apply=user|@group: 定义规则适用的用户类型(用户或者组)。

而至于file文件的写法就简单了,每行一个用户或者组名称即可。所以,当需要对其它服务进行类似的访问控制的时候,就可以照葫芦画瓢。例如现在需要在SSH服务器上对ssh客户端实现基于用户的访问控制

【例 】
不允许dxk用户通过ssh方式登录

# 针对这种需求只需要更改/etc/pam.d/sshd文件,并在该文件中添加一行
[root@admin ~]# vim /etc/pam.d/sshd
auth required pam_listfile.so  item=user sense=deny file=/etc/pam.d/denyusers onerr=succeed
......
# 建立文件/etc/pam.d/denyusers,并在文件中写入用户信息
[root@admin ~]# touch /etc/pam.d/denyusers
[root@admin ~]# echo "dxk" > /etc/pam.d/denyusers
# 测试使用dxk用户通过ssh方式无法登录
[root@admin ~]# ssh dxk@localhost
dxk@localhost's password: 
Permission denied, please try again.
dxk@localhost's password: 
Permission denied, please try again.
dxk@localhost's password: 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

表示用户以ssh登录必须要通过pam_listfile.so模块进行认证,认证的对象类型是用户,采用的动作是禁止,禁止的目标是/etc/pam.d/denyuser文件中所定义的用户。
这样在该条目添加到该文件之后,使用dxk账号从其它主机远程ssh访问服务器会出现密码错误的提示

【例 2】
仅仅允许Danny用户可以通过ssh远程登录
在/etc/pam.d/sshd文件中添加一条

auth required pam_listfile.so item=user sense=allow file=/etc/sshdusers onerr=succeed
  • 1

编辑file指定的文件,并在文件中写入 Danny

 echo "Danny" >/etc/sshdusers
  • 1

pam_access.so模块

pam_access.so模块主要的功能和作用是根据主机名(包括普通主机名或者FQDN)、IP地址和用户实现全面的访问控制

pam_access.so模块的具体工作行为根据配置文件 /etc/security/access.conf 来决定。该配置文件的主体包含了三个字段——权限、用户和访问发起方。格式:

permission : users : origins
  • 1

其中:

  • 第一个字段:权限(permission),使用"+“表示授予权限,用”-"表示禁止权限。
  • 第二个字段:用户(user),定义了用户、组以及用"@"表示的在不同主机上的同名用户和同一主机上不同名用户,如果是all则表示所有用户。
  • 第三个字段:访问发起方(origins),定义了发起访问的主机名称、域名称、终端名称。local表示本地,all表示所有地点,console表示控制台。另外,origins也可以是某一网络。
  • 后面两个域中加上 except是”除了”的意思。例如:除了wheel和bob用户,其他所有用户禁止从控制台登录:
-:ALL EXCEPT wheel bob:console
  • 1

而且/etc/security/access.conf文件提供了很多范例供修改时参考,并且都给出了具体的说明,例如:

# Disallow non-root logins on tty1  
# 禁止非root用户通过tty1登录
#-:ALL EXCEPT root:tty1
#
# Disallow console logins to all but a few accounts.
# 禁止除了wheel、shutdown以及sync之外的所有用户登录
#-:ALL EXCEPT wheel shutdown sync:LOCAL
#
…………
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

【例 】

使用pam_access.so模块限制用户访问

第一种:

在/etc/pam.d/login中添加以下行:

account  required   pam_access.so
  • 1

修改access.conf文件:添加以下字段

+:root:ALL #root可以从任意位置连入系统
+:test:192.168.42. #test用户只能从192.168.42这个网段连入
-:ALL:ALL #其余用户拒绝访问
  • 1
  • 2
  • 3

以上配置只是针对虚拟终端效,伪终端不受影响

如果不在access.conf文件中写明限制规则,那么所有用户便无法登录虚拟终端,会显示“Module is unknown”。但是伪终端的登录不受影响

第二种:

在/etc/pam.d/login中添加以下行:

[root@admin ~]# vim /etc/pam.d/login 
account    required     pam_access.so accessfile=/etc/deny_user
…………
  • 1
  • 2
  • 3

创建/etc/deny_user文件,并添加要进行限制的规则即可(语法和access.conf文件内的相同)

[root@admin ~]# echo "-:dxk:ALL" > /etc/deny_user
  • 1

此时,用户dxk便无法从虚拟终端登录,但是xshell等虚拟终端登录不受影响

pam_limits.so模块

pam_limits.so模块的主要功能是限制用户会话过程中对各种系统资源的使用情况。缺省情况下该模块的配置文件是 /etc/security/limits.conf ,而该配置文件的基本格式实际上是由4个字段组成的表,其中具体限制的内容包括:

  • Domain : 用户名/组名

  • type : 软/硬限制

  • item :限制资源

      core——core文件大小 (KB)
      data——最大数据大小(KB)
      fsize——最大文件大小(KB)
      memlock——最大可用内存空间(KB)
      nofile——最大可以打开的文件数量
      rss——最大可驻留空间(KB)
      stack——最大堆栈空间(KB)
      cpu——最大CPU使用时间(MIN)
      nproc——最大运行进程数
      as——地址空间限制
      maxlogins——用户可以登录到系统最多次数
      locks——最大锁定文件数目
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • value:具体值

【例 】

pam_limits.so模块也可以使用在对一般应用程序使用的资源限制方面。如果需要在SSH服务器上对来自不同用户的ssh访问进行限制,就可以调用该模块来实现相关功能。例如,当需要限制用户 bob 登录到SSH服务器时的最大连接数(防止同一个用户开启过多的登录进程)。限制操作如下:

由于/etc/pam.d/system-auth中,默认就会通过pam_limits.so 限制用户最多使用多少系统资源

[root@admin ~]# cat /etc/pam.d/system-auth|grep limits.so
session     required      pam_limits.so
  • 1
  • 2

因此只需要在 /etc/security/limits.conf 文件中增加一行对 bob 用户产生的连接数进行限定:

[root@admin ~]# vim /etc/security/limits.conf
......
bob             hard    maxlogins       2

  • 1
  • 2
  • 3
  • 4

但当客户端以bob身份开启第三个登录窗口的时候便会被服务器拒绝

pam_rootok.so模块

一般情况下,pam_rootok.so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码

pam_rootok.so模块的一个典型应用是插入到一些应用程序的认证配置文件中,当root用户执行这些命令的时候可以不用输入口令而直接通过认证。

比如说"su"命令,为什么当以root用户执行"su"切换到普通用户身份的时候是不需要输入任何口令而可以直接切换过去?当我们查看一下/etc/pam.d/su文件的内容就不会奇怪了。因为该文件的第一行就是:

[root@admin ~]# cat /etc/pam.d/su
#%PAM-1.0
auth		sufficient	pam_rootok.so
…………
  • 1
  • 2
  • 3
  • 4

而如果将该行配置注释掉的情况下,就会发现即便以root用户切换普通用户的时候仍然要求输入口令。

【例 】

禁止用户使用su切换命令

可以在/etc/pam.d/su文件里设置禁止用户使用su命令

  1 #%PAM-1.0
  2 auth            sufficient      pam_rootok.so
  3 # Uncomment the following line to implicitly trust users in th    e "wheel" group.
  4 #auth           sufficient      pam_wheel.so trust use_uid
  5 # Uncomment the following line to require a user to be in the     "wheel" group.
  6 #auth           required        pam_wheel.so use_uid
  7 auth            substack        system-auth
  8 auth            include         postlogin
	…………
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 以上第2、6行是默认状态(即开启第2行,注释第6行),这种状态下是允许所有用户间使用su命令进行切换的!(或者两行都注释也是运行所有用户都能使用su命令,但root下使用su切换到其他普通用户需要输入密码;如果第2行不注释,则root使用su切换普通用户就不需要输入密码)
  • 如果开启第2行,表示只有root用户和wheel组内的用户才可以使用su命令。
  • 如果注释第2行,开启第6行,表示只有wheel组内的用户才能使用su命令,root用户也被禁用su命令。

pam_nologin.so模块

这个模块也是控制用户登录。 不过,这个模组只针对一般身份使用者有效,对 root 是没有效果的。这个模组必须要与 /etc/nologin 搭配使用

当 /etc/nologin 档案存在时,则任何一个一般身份帐号在尝试登入时, 都会先去获取 /etc/nologin 内容的信息,如果文件内容中存在该用户那么便无法登入主机。

【例 】

禁止普通用户登录

在login文件默认已经引入am_nologin.so模块

[root@admin ~]# 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
# 在login文件默认已经引入该模块
account    required     pam_nologin.so
…………
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

创建 /etc/nologin 文件,并在其中输入“You are too low to enter … ”

[root@admin ~]# echo "You are too low to enter ... " > /etc/nologin
  • 1

此时只有root用户才能登录到系统中,其他普通用户无法登录,并会显示文件中的内容和提示信息:
在这里插入图片描述
删除此文件即可解除限制

pam_time.so模块

功能:基于时间的访问控制,默认文件“/etc/security/time.conf ”

【例 】
限制 bob 用户每星期二晚上22:00-22:30不能使用SSH来登录系统

先在/etc/pam.d/sshd配置文件中,引入pam_time.so模块:

[root@admin ~]# vim /etc/pam.d/sshd
account    required     pam_time.so
…………
  • 1
  • 2
  • 3

在/etc/security/time.conf文件中写入限制规则:

[root@admin ~]# vim /etc/security/time.conf
sshd;*;bob;!Tu2200-2230
  • 1
  • 2

即可生效

Tips:
如果PAM配置错误,可能会改变系统的安全性。这取决于你自己的选择,你可以选择不安全(开放系统)和绝对安全(拒绝任何访问)。通常,Linux-PAM 在发生错误时,倾向于后者。任何的配置错误都可能导致系统整个或者部分无法访问。配置 Linux-PAM 时,可能遇到最大的问题可能就是 Linux-PAM 的配置文件/etc/pam.d/*被删除了。如果发生这种事情,你的系统就会被锁住。可以使用备份的镜像来恢复系统,或者进入单用户模式然后进行正确的配置

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/190733
推荐阅读
相关标签
  

闽ICP备14008679号