网络安全(二)-- 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可读不可写。

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

实例展示

  1. 用户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
    
  2. 验证用户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: 权限不够
    
  3. 设置hello文件ACL

    itcast@itcast:~/class$ setfacl -m u:test01:rw ./hello 
    
  4. 验证用户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$ 
    
  5. 验证用户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用于向特定模块传递相关的选项,然后由模块分析解释这些选项

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/210197.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷P1044 [NOIP2003 普及组] 栈 递归方法

目录 核心&#xff1a; 问题转化&#xff1a; 状态转化&#xff1a;&#xff08;你得先读懂题&#xff0c;理解我们要干什么&#xff09; 对应不同情况下的状态转化&#xff1a;&#xff08;比如栈空就不能出栈&#xff0c;&#xff0c;&#xff09; AC代码&#xff1a; 题…

GAN:ImprovedGAN-训练GAN的改进策略

论文&#xff1a;https://arxiv.org/abs/1606.03498 代码&#xff1a;https://github.com/openai/improved_gan 发表&#xff1a;NIPS 2016 一、文章创新 1&#xff1a;Feature matching&#xff1a;特征匹配通过为生成器指定新目标来解决GANs的不稳定性&#xff0c;从而防止…

css实现正六边形嵌套圆心

要实现一个正六边形嵌套圆心&#xff0c;可以使用CSS的::before和::after伪元素以及border-radius属性。以下是具体的解析和代码&#xff1a; 使用::before和::after伪元素创建正六边形。设置正六边形的背景色。使用border-radius属性使正六边形的内角为60度。在正六边形内部创…

Qt 软件调试——windbg初篇(一)

在上一篇《Qt 软件调试&#xff08;二&#xff09;使用dump捕获崩溃信息》中我们结尾处提示大家先准备好windbg&#xff0c;windbg是非常强大的调试工具&#xff0c;对于我们进行代码调试和分析异常有着非常重要的意义。 在Qt软件调试这个系列的首篇&#xff0c;我们介绍了《Qt…

前端传参中带有特殊符号导致后端接收时乱码或转码失败的解决方案

文章目录 bug背景解决思路1&#xff1a;解决思路2解决思路3&#xff08;最终解决方案&#xff09;后记 bug背景 项目中采用富文本编辑器后传参引起的bug&#xff0c;起因如下&#xff1a; 数据库中存入的数据会变成这种未经转码的URL编码 解决思路1&#xff1a; 使用JSON方…

7nm项目之顶层规划——01数据导入

1.创建workspace 创建workspace后&#xff0c;在其目录下产生。 CORTEXA53.json文件是将有默认配置的文件master.json、有library的.config.json文件、tunes下CORTEXA53.tunes.json文件合并 注&#xff1a;tunes下的CORTEXA53.tunes.json文件可以覆盖一些master.json的设置…

深入微服务架构 | 微服务与k8s架构解读

微服务项目架构解读 ① 什么是微服务&#xff1f; 微服务是指开发一个单个小型的但有业务功能的服务&#xff0c;每个服务都有自己的处理和轻量通讯机制&#xff0c;可以部署在单个或多个服务器上。 微服务也指一种种松耦合的、有一定的有界上下文的面向服务架构。也就是说&…

华为手环关闭智能适时测量

问题 使用华为手环并使用华为创新研究APP后&#xff0c;会自动打开智能适时测量开关&#xff0c;此开关开启后&#xff0c;手环会在睡眠时间自动测量血氧&#xff0c;增加手环功耗从而影响续航&#xff0c;用户可根据自身需求决定是否开启&#xff0c;下文介绍如何找到此开关。…

PyQt6 QListWidget列表控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计35条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

Failed to resolve org.junit.platform:junit-platform-launcher:1.9.3

springboot 跑 unit test 的时候&#xff0c;如果报错如题的话&#xff0c;可以更改idea 里的 Settings ——> HTTP Proxy 配置为&#xff1a;Auto-detect proxy settings

STM32单片机项目实例:基于TouchGFX的智能手表设计(1)项目介绍及GUI界面基础

STM32单片机项目实例&#xff1a;基于TouchGFX的智能手表设计&#xff08;1&#xff09;项目介绍及GUI界面基础 一、项目介绍 1.1方案提供 1.2主控选择 1.3硬件平台 1.4 开发环境 1.5 关于华清 二、GUI界面基础 2.1.1 嵌入式绘图系统 2.1.1 色彩格式 2.1.1帧缓冲区 …

某60区块链安全之JOP实战一学习记录

区块链安全 文章目录 区块链安全Jump Oriented Programming实战一实验目的实验环境实验工具实验原理实验内容Jump Oriented Programming实战一 实验步骤分析合约源代码漏洞Jump Oriented Programming实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约中中Ju…

5. Jetson Orin Nano CUDA 配置

5. Jetson Orin Nano CUDA 配置 1&#xff1a;安装Jtop jtop安装主要有以下三个步骤&#xff1a; 安装pip3 我们需要使用pip3来安装jtop&#xff0c;所以先安装pip3 sudo apt install python3-pip安装jtop sudo -H pip3 install -U jetson-stats运行jtop服务 sudo -H pip3 in…

Qt 天气预报项目

参考引用 QT开发专题-天气预报 1. JSON 数据格式 1.1 什么是 JSON JSON (JavaScript Object Notation)&#xff0c;中文名 JS 对象表示法&#xff0c;因为它和 JS 中对象的写法很类似 通常说的 JSON&#xff0c;其实就是 JSON 字符串&#xff0c;本质上是一种特殊格式的字符串…

前端面试高频考点—TCP vs UDP

目录 简介&#xff1a; 区别&#xff1a; 应用选择&#xff1a; tcp为什么需要三次握手&#xff1f; 简介&#xff1a; TCP(传输控制协议)和UDP&#xff08;用户数据报协议&#xff09; TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;是专门为了在不…

关于如何解决问题?代码习惯。

警钟长鸣 从师哥身上学到的东西&#xff1a; 关于如何解决问题&#xff1f; 1、沟通&#xff1a;有效的沟通&#xff0c;将问题描述清楚&#xff0c;让老师和师哥明白你出了什么问题&#xff0c;给出建议&#xff0c;很多时候一句良言胜过自己摸索很久 2、出现问题由浅入深地…

基于AT89C51单片机的秒表设计

1&#xff0e;设计任务 利用单片机AT89C51设计秒表&#xff0c;设计计时长度为9:59:59&#xff0c;超过该长度&#xff0c;报警。创新&#xff1a;设置重启&#xff1b;暂停&#xff1b;清零等按钮。最后10s时播放音乐提示。 本设计是采用AT89C51单片机为中心&#xff0c;利用其…

如何使用Cloudreve搭建本地云盘系统并实现随时远程访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#…

20:kotlin 类和对象 --泛型(Generics)

类可以有类型参数 class Box<T>(t: T) {var value t }要创建类实例&#xff0c;需提供类型参数 val box: Box<Int> Box<Int>(1)如果类型可以被推断出来&#xff0c;可以省略 val box Box(1)通配符 在JAVA泛型中有通配符?、? extends E、? super E&…

eNSP实验

前言 本文记录了使用eNSP进行组网&#xff0c;学习、巩固一些之前学的网络基础知识和协议。实验中用到的eNSP工程源文件在下方仓库中。 门牙会稍息 / eNSP GitCode 一&#xff1a;同网段、网关互通 网络拓扑如下&#xff1a; AR1的配置&#xff1a; interface G0/0/0 ip a…