网络安全(二)-- Linux 基本安全防护技术
4.1. 概述
安全防护基础主要是会用Linux系统, 熟悉Linux基本操作命令。
在这个章节中,我们主要探讨自主访问控制(许可位、ACL)、文件属性、 PAM技术、能力机制等。
4.1.1. 补充命令
本章节中,涉及一些新的命令,一些通用的命令如下所述
-
whoami
- 显示与当前的有效用户ID相关联的用户名
- 简单的说,就是在操作之前确认一下我是谁
-
id
- 查看用户的id
id username
查看username用户的id
-
useradd
- 添加用户
- -m : 一起创建用户的家目录
- -s: 指定用户的登录shell类型,
-s /bin/bash
- 示例:
uaseradd -m -s /bin/bash itcast
-
userdel
- 删除已存在用户
- -r: 用户主目录以及用户主目录下文件一起删除
- 示例:
userdel -r newuser
-
passwd
- 修改用户口令
- 两种典型用法:
- 修改当前用户口令
passwd
- 修改指定用户口令
passwd username
- 修改当前用户口令
4.1.2. 常用术语
-
访问、主体、客体
- 访问: 两个实体间的信息流动
- 主体: 发起访问的实体,主动的, 通常为代表某个用户的进程
- 客体: 响应访问的实体,被动的, 通常为文件
-
访问类型
访问就是信息的流动,可以分为读、写、执行三种类型
* 读(Read/r):
* 信息由客体流向主体
* 写(Write/w):
* 信息由主体流向客体
* 执行(Execute/x):
* 将客体的内容引入内存并作为代码执行
补充说明 在有些文档中,目录文件的执行,称之为搜索(Search)对目录的内容进行搜索(查找)。
以 cat file
为例解读上述基本概念
4.2. 访问权限 (许可位)
在信息系统安全章节中,我们探讨了半天安全,本质上,安全就是控制“文件”(客体),的读、写,文件不被非授权人员读取,满足安全的机密性;文件不被非授权人员写,满足安全的完整性。所以读、写就构成了安全最基本的含义。
4.2.1. 文件权限(访问许可位)
我们探讨文件权限, 准确的描述是“用户A对文件B的访问权限” , 判断用户A是否被允许访问文件B。 可以分两步:
- 先判断用户A的类别(所谓A的类别,就是A是属主? 属组? 还是其他?)
- 在根据用户的类别,查看相应的许可位
4.2.1.1. 属主、属组、“其他”的概念
在探讨一个文件是否被允许访问,首先需要明确访问者的“身份类别",因为文件的访问许可就是以文件的属主、属组、其他来组织的。
以一下内容,参考自《Linux私房菜-基础篇》, 举例比较清晰
关于者和属组的关系, 我们可以使用目前“家庭”的观念来来进行解说。假讴有一家人,家里只有三兄弟,分别是王大毛、王二毛、王三毛三个人, 而这个家庭是登记在王大毛的名下的!所以,“王大毛家有三个人,分别是王大毛、王二毛,王三毛”, 而且这三个人都有自己的房间,并且共同拥有一个客厅喔!
-
属主的概念: 由于王家三人各自拥有自己的房间, 所以, 王二毛虽然可以进入王三毛的房间,但是二毛不能翻三毛的抽屉喔!那样会被三毛K的! 因为抽屉里面可能有三毛自己私人的东西,例如情书啦,日记啦等等的,这是“私人的空间”,所以当然不能让二毛拿啦。
-
属组的概念: 由于共同拥有客厅,所以王家三兄弟可以在客厅打开电规机啦、 翻阅报纸啦、坐在沙发上面发呆啦等等的! 反正,只要是在客厅的玩意儿,三兄弟都可以使用喔! 因为大家都是一家人嘛!
这样说来应该有点晓得了喔! 那个“王大毛家”就是所谓的“属组”, 至于三兄弟就是分别为三个“属主”,而这三个属主是在同一个属组里面的喔! 而三个属主虽然在同一属组内,但是我们可以设定“权限” 好让某些用户个人的信息不被属组的属主查询,以保有个人“私人的空间”啦! 而设定属组共享,则可让大家共同分享喔!
-
“其他”的概念: 那么今天又有个人,叫做张小猪,他是张小猪家的人,与王家没有关系啦! 这个时候,除非王家认识张小猪,然后开门让张小猪进来王家,否则张小猪永进没有办法进入王家, 更不要说迚到王三毛的房间啦!不过,如果张小猪透过关系认识了三毛,并且跟王三毛成为好朊友,那么张小猪就可以透过三毛进入王家啦!呵呵!没错!那个张小猪就是所谓的“其他人,Others”啰!
因此, 简单的说,在 Linux 里面,任何一个文件都具有"User, Group 及 Others”三种身份的个别权限, 我们可以将上面的说明以底下的图来解释:
一般来说, 我们通常用简写字母来表示属主、属组、其他:
- u: 属主
- g: 属组
- o: 其他
从ls命令输出,进行逐列介绍
Panda.Guo@2018-04-03 14:32:43 $ ls -l
drwxr-xr-x 2 panda panda 4096 6月 3 14:32 dir
-rwxr--r-- 1 panda panda 0 6月 3 13:43 file1
4.2.1.2. 权限(访问许可位)
许可位,共计4组组成, 每组3位,
-
S/Owner/Group/Other
-
S组
- b3 → SUID;b2 → SGID;b1 -> Sticky
-
Owner组
- b3 → Read;b2 → Write; b1 -> Execute
-
Group组
- b3 → Read;b2 → Write; b1 -> Execute
-
Other组
- b3 → Read;b2 → Write; b1 -> Execute;
4.2.2. 文件权限(许可位)表示方式
对于许可位,有两种表示方式:
数字表示方式
- 用3组8进制的数字。来描述u/g/o三个部分的访问许可
- 每组用3位,来表示这部分的rwx(访问类型)
- 对应就是 b3 b2 b1 (4 2 1) ,
- 哪一位被许可,则值为1
- 例: 我们用644, 表示文件属主可读、写, 组可以读、 其他可读
- 例: 我们用755, 表示文件属主可读、写、执行, 组可读、执行, 其他可读、可执行。
符号表示方式
-
可以用r、w、x、-来表示文件的访问权限
- 用r描述读
- 用w描述写
- 用x描述执行
- 用-表示无权限
-
实例解读文件访问许可
- 添加用户itcast
sudo useradd -m -s /bin/bash itcast
-
修改itcast 口令,为itcast
sudo passwd itcast
-
以panda用户创建文件(644),验证文件属主可读写,以itcast用户协助验证other可读不可写。
- 添加用户itcast
Panda.Guo@2018-06-04 11:11:57 $touch file-name
Panda.Guo@2018-06-04 11:25:35 $ ls -l file-name
-rw-r--r-- 1 panda panda 0 6月 4 11:03 file-name
Panda.Guo@2018-06-04 11:26:32 $ whoami
panda
Panda.Guo@2018-06-04 11:26:37 $ echo "Hello world" >> file-name
Panda.Guo@2018-06-04 11:26:53 $ cat file-name
Hello world
Panda.Guo@2018-06-04 11:27:07 $
以 itcast用户验证 others,只有r权限
Panda.Guo@2018-06-04 11:27:55 $ su itcast
密码:
itcast@PandaGuo:/home/panda/tmp/itcast$ whoami
itcast
itcast@PandaGuo:/home/panda/tmp/itcast$ ls -l
总用量 8
drwxr-xr-x 2 panda panda 4096 6月 4 11:04 dir
-rw-r--r-- 1 panda panda 12 6月 4 11:26 file-name
itcast@PandaGuo:/home/panda/tmp/itcast$ cat file-name
Hello world
itcast@PandaGuo:/home/panda/tmp/itcast$ echo "itcast" >> file-name
bash: file-name: 权限不够
4.2.3. 变更文件的访问权限
通过修改文件的许可位,可以变更文件的访问权限。
变更许可位有两种方式, 一种数字类型,一种符号类型
- 符号类型
我之前介绍, 文件的的访问许可由三组(u/g/o)、三个访问类型(r/w/x)组成。
Panda.Guo@2018-04-03 16:22:47 $ ls -l file1
-rw-r--r-- 1 panda panda 0 6月 3 16:22 file1
Panda.Guo@2018-04-03 16:22:58 $ chmod u+x file1
Panda.Guo@2018-04-03 16:23:05 $ ls -l file1
-rwxr--r-- 1 panda panda 0 6月 3 16:22 file1
- 数字类型:
Panda.Guo@2018-04-03 16:23:08 $ ls -l file2
-rw-r--r-- 1 panda panda 0 6月 3 16:22 file2
Panda.Guo@2018-04-03 16:23:43 $ chmod 666 file2
Panda.Guo@2018-04-03 16:23:53 $ ls -l file2
-rw-rw-rw- 1 panda panda 0 6月 3 16:22 file2
4.2.4. 粘着位sticky
设置目录的sticky位后, 该目录下的文件,只能被创建者删除
-
对谁有效?
- 只对目录有效。对其他的客体无效。
-
如何设定?
chmod 1xxx file
-
实例
-
讨论: 粘着位的应用场景?
4.2.5. 讨论 (思考)
-
umask 为用户创建文件的掩码,代表用户创建文件的最终权限为(mode & ~umask), 那么您的观点,umask取值应为多少合适?
-
umask 设置只在当前终端中临时有效, 你有几种办法可以使其登录后默认生效
-
答题: 有一个目录,要求任何人可以创建客体并可以对目录进行读/搜索访问,但只有创建者可以删除,试用8进制写出它应具有的许可位
4.3. 访问控制列表 -ACL
ACL是什么: 存储在文件扩展属性中的一组访问控制规则, (利用文件的扩展属性保存额外的访问控制权限)
4.3.1. 为什么需要ACL
我们需要一种更细粒度的访问控制方式, 对other组的用户成员,作出区分
- 文件访问控制(许可位)是通过文件的属主user、属组group、其他other来实现访问权限控制的, 对于“其他”来说, 一个用户既不是文件属主,也不属于同一组,那么就统统属于“其他”, 这样的 ACL 提供一种更细粒度的权限控制方法。
实例分析
创建test01用户,test02用户, 访问itcast用户的文件,(相对于itcast用户,test01,test02用户为others用户), 无法做到对test01用户和test02用户的权限区别
4.3.2. ACL 基本操作
对于ACL基本操作来说,也就是ACL设定、ACL查询、ACL移除
我们可通过setfacl、getfacl 来设定和查询文件的访问控制列表
4.3.2.1. 设定/修改ACL
我们可以通过
setfacl -m
, 来设定文件的ACL, (注: 文件属主和特权用户可进行操作)
- 基本用法: setfacl -m u:username:rwx filename
- -m: 选项
- u:itcast:rwx , 设定用户itcast,访问权限为rwx
- u: 用户
- g: 组
- m: 掩码
- filename, 文件,你想设定谁的ACL
itcast@itcast:~/class$ setfacl -m u:test01:rw ./hello
注意, 添加文件的acl后, 命令ls -l
会发生变化, 如:
文件原始显示
itcast@itcast:~/class$ ls -l
-rw-r--r-- 1 itcast itcast 0 6月 4 17:40 file
添加文件acl后, 命令ls -l
变为:
itcast@itcast:~/class$ setfacl -m u:itcast:w file
itcast@itcast:~/class$ ls -l file
-rw-rw-r--+ 1 itcast itcast 0 6月 4 17:40 file
注意: 有+号,代表此文件被设定了ACL, 那么此时,文件file的权限,就受到ACL影响
4.3.2.2. ACL查询
我们可以通过
getfacl
, 来获取文件的ACL
- 基本用法
getfacl ./filename
itcast@itcast:~/class$ getfacl ./hello
# file: hello
# owner: itcast
# group: itcast
user::rw-
user:test01:rw-
group::rw-
mask::rw-
other::r--
itcast@itcast:~/class$
- 显示解读
- user后面没有跟用户名,表示的是文件属主的权限
- user 后面有用户名, 表示是指定用户的权限
- group后面没有跟组名,表示的是文件属组的权限
- mask表示的是额外访问控制权限的最大权限,mask可自定义,自定义之后,额外访问控制权限的最大权限不得超过mask的权限,否则超出的权限会被裁掉。详细见下一章节
4.3.2.3. ACL移除
移除文件file1 的ACL, 可通过
setfacl -x
- 典型用法
setfacl -x u:itcast file
itcast@itcast:~/class$ setfacl -x u:test01 ./hello
实例展示
-
用户itcast创建hello文件
itcast@itcast:~/class$ touch hello itcast@itcast:~/class$ ls -l 总用量 0 -rw-rw-r-- 1 itcast itcast 0 8月 24 11:11 hello
-
验证用户test01对其只有r权限,
test01@itcast:/home/itcast/class$ whoami test01 test01@itcast:/home/itcast/class$ ls -l hello -rw-rw-r-- 1 itcast itcast 0 8月 24 11:11 hello test01@itcast:/home/itcast/class$ cat ./hello hello world test01@itcast:/home/itcast/class$ echo "hello world" > ./hello bash: ./hello: 权限不够
-
设置hello文件ACL
itcast@itcast:~/class$ setfacl -m u:test01:rw ./hello
-
验证用户test01对文件的hello权限(rw)
test01@itcast:/home/itcast/class$ whoami test01 test01@itcast:/home/itcast/class$ ls -l ./hello -rw-rw-r--+ 1 itcast itcast 12 8月 24 11:17 ./hello test01@itcast:/home/itcast/class$ getfacl ./hello # file: hello # owner: itcast # group: itcast user::rw- user:test01:rw- group::rw- mask::rw- other::r-- test01@itcast:/home/itcast/class$ cat ./hello hello world test01@itcast:/home/itcast/class$ echo "hello test01" >> hello test01@itcast:/home/itcast/class$ cat ./hello hello world hello test01 test01@itcast:/home/itcast/class$
-
验证用户test02对文件hello权限(r-)
4.3.3. 文件权限的有效次序
- 当一个用户将要访问一个文件的时候(没有acl的情况下):
- 首先应用Owner权限,当要访问的文件的属主和该用户一致的情况下,就以该属主的权限去执行文件
- 其次应用Group的权限,当要访问的文件的属组和用户的属组一致的情况下,就以该属组的权限去执行文件
- 最后应用Other的权限,如果Other有相应的权限的话,就以Other的权限去执行文件。
-
当一个用户要访问一个文件的时候(有acl的情况下):
- 如果用户是文件属主, 按文件属主的权限位判定访问控制
- 如果用户不是文件属主, 而是符合ACL中的user项, 则按该项权限位判别且受mask限制。
- 如果用户的属组属于group或者ACL中group项, 只要组或者ACL的group项,允许优先且受mask限制。
- 否则应用Other的权限。
上述内容,详见
man acl
的 “ACCESS CHECK ALGORITHM”, 此处简单描述.
注 此处用“用户”表述并不准确, 严格来说应该是“代表某个用户执行的那个进程的有效ID(euid)”, 为了便于大家理解,不引入太多的概念。
示例
- 去掉文件属主panda,对文件file1的写权限
Panda.Guo@2018-04-03 18:22:56 $ ls -l file1
-rw-rw-r--+ 1 panda panda 4 6月 3 17:57 file1
Panda.Guo@2018-04-03 18:23:06 $ chmod u-w file1
Panda.Guo@2018-04-03 18:23:56 $ ls -l file1
-r--rw-r--+ 1 panda panda 4 6月 3 17:57 file1
- 权限验证
Panda.Guo@2018-04-03 18:24:01 $ cat file1
bbb
Panda.Guo@2018-04-03 18:24:08 $ echo "aaa" >> file1
bash: file1: 权限不够
- 添加访问控制列表
Panda.Guo@2018-04-03 18:24:44 $ setfacl -m u:panda:rw file1
Panda.Guo@2018-04-03 18:24:49 $ getfacl file1
# file: file1
# owner: panda
# group: panda
user::r--
user:panda:rw-
user:itcast:rwx
group::r--
mask::rwx
other::r--
- 权限验证
Panda.Guo@2018-04-03 18:24:56 $ echo "aaa" >> file1
bash: file1: 权限不够
4.3.4. ACL中的mask
- 设定
Panda.Guo@2018-04-03 19:37:38 $ setfacl -m m::r -m u:itcast:rwx ./file1
Panda.Guo@2018-04-03 19:38:38 $ getfacl ./file1
# file: file1
# owner: panda
# group: panda
user::r--
user:panda:rw- #effective:r--
user:itcast:rwx #effective:r--
group::r--
mask::r--
other::r--
Panda.Guo@2018-04-03 19:38:46 $
- 验证
Panda.Guo@2018-04-03 17:56:40 $ su itcast
密码:
itcast@PandaGuo:/home/panda/tmp/itcast$ ls
chown dir file1 file2 file3
itcast@PandaGuo:/home/panda/tmp/itcast$ cat file1
aa
itcast@PandaGuo:/home/panda/tmp/itcast$ echo "bbb" > file1
bash: file1: 权限不够
4.3.5. 参考资料
$ man acl
$ man setfacl
$ man getfacl
4.3.6. 讨论(思考)
- 访问控制列表的应用场景
4.4. 文件属性
我们在之前探讨信息安全时提到,完整性在Linux系统上,就是控制写,也就是一个文件不被非授权人员所篡改,我们就可以认为它是完整的。有些文件属性设定后,就可以避免对文件修改(超级用户也被允许),可以很好的满足我们对完整性的需求。
4.4.1. 什么是文件属性
- 在特定的文件系统中支持的,对文件、文件夹等文件额外施加的一些访问控制
4.4.2. 文件都有那些属性
在特定的文件系统上, 当前文件具备那些可用的文件属性, 这个以EXT4文件系统为例:
Panda.Guo@2018-06-05 13:42:39 $ man ext4
在帮助信息中, 检索关键字 "FILE ATTRIBUTES" 可以看到Ext系列文件系统中支持的文件属性, 以下作为拣选:
属性 | 描述 |
---|---|
a (append only) | 仅允许以追加的方式打开文件 |
A (no atime updates) | 这个属性不允许更新文件的atime |
c (compressed) | 启用这个属性时,文件在磁盘上会自动压缩 |
d (no dump) | 不能使用dump命令备份文件 |
D (synchronous directory updates) | 设置了文件夹的D属性时,更改会在同步保存在磁盘上 |
e (extent format) | 它表明,该文件使用磁盘上的块的映射扩展 |
i (immutable) | 在文件上启用这个属性时,我们不能更改、重命名或者删除这个文件 |
j (data journaling) | 设置了这个属性时,文件的数据首先保存在日志中,然后再写入文件 |
S (synchronous updates) | 设置了这个属性时,变更或更改同步保存到磁盘上 |
4.4.3. 文件属性管理(添加、删除、查看)
有两个命令 lsattr
和 chattr
用来管理属性。下面是常用属性的列表。
chattr属性中可以使用的不同选项 :
-R 递归地修改文件夹和子文件夹的属性
-V chattr命令会输出带有版本信息的冗余信息
-f 忽略大部分错误信息
在chattr中用于设置或者取消属性的 操作符
'+' 符号用来为文件和文件夹设置属性,
'-' 符号用来移除或者取消属性
'=' 使它们成为文件有的唯一属性。
chattr 和 lsattr 命令的基本语法 :
# chattr <options> <attributes> <file or Directory >
# lsattr <File or Directory>
- 使用‘i’属性使文件不可更改
Panda.Guo@2018-06-05 14:05:14 $ ls -l file
-rw-r--r-- 1 panda panda 12 6月 5 14:05 file
Panda.Guo@2018-06-05 14:05:28 $ cat file
Hello World
Panda.Guo@2018-06-05 14:05:31 $ sudo chattr +i file
Panda.Guo@2018-06-05 14:05:46 $ sudo lsattr file
----i---------e---- file
对 file 文件添加 “i” 属性
- 修改 file 文件
Panda.Guo@2018-06-05 14:05:51 $ echo "Hello 2 " >> file
bash: file: 不允许的操作
Panda.Guo@2018-06-05 14:09:05 $ cat file
Hello World
- 删除 file 文件
Panda.Guo@2018-06-05 14:09:17 $ rm file
rm: 无法删除'file': 不允许的操作
- 对 file 文件创建硬连接
Panda.Guo@2018-06-05 14:09:22 $ ln file file-link
ln: 无法创建硬链接'file-link' => 'file': 不允许的操作
- 以root用户,删除file 文件
Panda.Guo@2018-06-05 14:09:45 $ su
密码:
root@PandaGuo:/home/panda/tmp/itcast# whoami
root
root@PandaGuo:/home/panda/tmp/itcast# rm file
rm: 无法删除'file': 不允许的操作
- 对于已经设置 i 属性的文件,如果需要修改、删除等操作,需要以特权用户移除i属性后,再进行相应操作
Panda.Guo@2018-06-05 14:12:42 $ lsattr file
----i---------e---- file
Panda.Guo@2018-06-05 14:12:51 $ sudo chattr -i file
Panda.Guo@2018-06-05 14:13:01 $ lsattr file
--------------e---- file
Panda.Guo@2018-06-05 14:13:12 $ rm file
Panda.Guo@2018-06-05 14:13:14 $ ls file
ls: 无法访问'file': 没有那个文件或目录
讨论
- 文件属性a、i的应用场景
4.5. PAM技术
在探讨PAM技术之前, 我们先探讨一个术语“标识&鉴别”
- 标识:登录系统的用户需要标识, 标识解决“我是谁”的话题
- 鉴别:鉴别解决“我是我”的话题
4.5.1. PAM是什么
Pluggable Authentication Modules , 可插拔的鉴权模块, sun提出的一种鉴权机制。
它通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。
Panda.Guo@2018-06-05 14:48:40 $ ls /lib/x86_64-linux-gnu/security/
4.5.2. 如何使用 PAM
Pam使用非常简单, 就是修改相应配置文件,添加pam 模块的配置。
Panda.Guo@2018-06-05 15:02:59 $ ls /etc/pam.d/
关于pam配置相关的帮助信息
Panda.Guo@2018-06-05 15:03:59 $ man pam.conf
以 common-password
配置文件简单介绍配置方式
Panda.Guo@2018-06-05 15:04:55 $ vi /etc/pam.d/common-password
4.5.3. PAM 配置实例 - 弱口令防护
典型的弱口令防护策略: pam_cracklib
弱口令防护,简单说就是增加口令负责度
- 口令长度不小于8位
- 口令是大、小字母、数字和特殊字符组成
- 口令不得与账户名相同
Panda.Guo@2018-06-05 15:05:09 $ sudo vi /etc/pam.d/common-password
password required pam_cracklib.so retry=3 minlen=8 difok=3 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 reject_username
通过 man pam_cracklib
查看cracklib 选项信息
-
配置描述
- retry=3 键入口令错误时,重复次数
- minlen=8 口令最小长度
- lcredit=-1 小写字符至少为1
- ucredit=-1 大写字母至少为1
- dcredit=-1 数字至少为1
- ocredit=-1 特殊字符至少为1
- difok=3 新旧口令差别至少3个字符
- reject_username 口令中,不允许包括用户名称(正序和逆序)
-
讨论: root用户要不要受口令复杂度的限制。
4.5.4. PAM 配置实例 - 暴力破解防护
字典攻击、暴力破解的防护,简单说,就是当你尝试口令错误达到一定次数, 我锁定你账户,延迟一段时间再允许你进行登录即可
- 连续登录失败5次后,账户锁定10分钟;
Panda.Guo@2018-06-05 15:14:57 $ sudo vi /etc/pam.d/su
auth required pam_tally.so unlock_time=600 deny=5
可通过 man pam_tally
查看选项信息
-
配置描述
- unlock_time: 用户锁定时间
- deny: 口令输入错误的重复次数
-
讨论: 锁定时间不是越长越好
4.5.5. 附录: 配置格式
配置文件有许多配置项(每行对应一个配置项)组成,每一行又分为四列(每列对应一栏):
-
第一栏,认证鉴别接口类型:(四类接口)
-
auth:表示鉴别类接口模块类型用于检查用户和密码,并分配权限
-
account:表示账户类接口,主要负责账户合法性检查,确认帐号是否过期,是否有权限登录系统等;
-
session:会话类接口。实现从用户登录成功到退出的会话控制;
-
password:口令类接口。控制用户更改密码的全过程。
-
每行只能指定一种接口类型
- 第二栏,control_flag控制位:
他的四种可能的取值分别为required、Requisite、sufficient或_optional:
* required:表示该行以及所涉及模块的成功是用户通过鉴别的必要条件,只有当对应于应用程序的所有带 required标记的模块全部成功后,该程序才能通过鉴别。
* requisite:与required相仿,只有带此标记的模块返回成功后,用户才能通过鉴别。不同之处在于其一旦失败就不再执行堆中后面的其他模块,并且鉴别过程到此结束,同时也会立即返回错误信息。
* sufficient:表示该行以及所涉及模块验证成功是用户通过鉴别的充分条件。也就是说只要标记为sufficient的模块一旦验证成功,那么PAM便立即向应用程序返回成功结果而不必尝试任何其他模块。
* optional:他表示即便该行所涉及的模块验证失败用户仍能通过认证。在PAM体系中,带有该标记的模块失败后将继续处理下一模块。也就是说即使本行指定的模块验证失败,也允许用户享受应用程序提供的服务。
第三栏,module_path即所使用模块的全路径名称
第四栏,options用于向特定模块传递相关的选项,然后由模块分析解释这些选项