安全防护基础主要是会用Linux系统, 熟悉Linux基本操作命令。
在这个章节中,我们主要探讨自主访问控制(许可位、ACL)、文件属性、 PAM技术、能力机制等。
本章节中,涉及一些新的命令,一些通用的命令如下所述
whoami
id
id username
查看username用户的iduseradd
-s /bin/bash
uaseradd -m -s /bin/bash itcast
userdel
userdel -r newuser
passwd
passwd
passwd username
访问、主体、客体
访问类型
访问就是信息的流动,可以分为读、写、执行三种类型
* 读(Read/r):
* 信息由客体流向主体
* 写(Write/w):
* 信息由主体流向客体
* 执行(Execute/x):
* 将客体的内容引入内存并作为代码执行
补充说明 在有些文档中,目录文件的执行,称之为搜索(Search)对目录的内容进行搜索(查找)。
以 cat file
为例解读上述基本概念
在信息系统安全章节中,我们探讨了半天安全,本质上,安全就是控制“文件”(客体),的读、写,文件不被非授权人员读取,满足安全的机密性;文件不被非授权人员写,满足安全的完整性。所以读、写就构成了安全最基本的含义。
我们探讨文件权限, 准确的描述是“用户A对文件B的访问权限” , 判断用户A是否被允许访问文件B。 可以分两步:
在探讨一个文件是否被允许访问,首先需要明确访问者的“身份类别",因为文件的访问许可就是以文件的属主、属组、其他来组织的。
以一下内容,参考自《Linux私房菜-基础篇》, 举例比较清晰
关于者和属组的关系, 我们可以使用目前“家庭”的观念来来进行解说。假讴有一家人,家里只有三兄弟,分别是王大毛、王二毛、王三毛三个人, 而这个家庭是登记在王大毛的名下的!所以,“王大毛家有三个人,分别是王大毛、王二毛,王三毛”, 而且这三个人都有自己的房间,并且共同拥有一个客厅喔!
属主的概念: 由于王家三人各自拥有自己的房间, 所以, 王二毛虽然可以进入王三毛的房间,但是二毛不能翻三毛的抽屉喔!那样会被三毛K的! 因为抽屉里面可能有三毛自己私人的东西,例如情书啦,日记啦等等的,这是“私人的空间”,所以当然不能让二毛拿啦。
属组的概念: 由于共同拥有客厅,所以王家三兄弟可以在客厅打开电规机啦、 翻阅报纸啦、坐在沙发上面发呆啦等等的! 反正,只要是在客厅的玩意儿,三兄弟都可以使用喔! 因为大家都是一家人嘛!
这样说来应该有点晓得了喔! 那个“王大毛家”就是所谓的“属组”, 至于三兄弟就是分别为三个“属主”,而这三个属主是在同一个属组里面的喔! 而三个属主虽然在同一属组内,但是我们可以设定“权限” 好让某些用户个人的信息不被属组的属主查询,以保有个人“私人的空间”啦! 而设定属组共享,则可让大家共同分享喔!
“其他”的概念: 那么今天又有个人,叫做张小猪,他是张小猪家的人,与王家没有关系啦! 这个时候,除非王家认识张小猪,然后开门让张小猪进来王家,否则张小猪永进没有办法进入王家, 更不要说迚到王三毛的房间啦!不过,如果张小猪透过关系认识了三毛,并且跟王三毛成为好朊友,那么张小猪就可以透过三毛进入王家啦!呵呵!没错!那个张小猪就是所谓的“其他人,Others”啰!
因此, 简单的说,在 Linux 里面,任何一个文件都具有"User, Group 及 Others”三种身份的个别权限, 我们可以将上面的说明以底下的图来解释:
一般来说, 我们通常用简写字母来表示属主、属组、其他:
从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组组成, 每组3位,
S/Owner/Group/Other
S组
Owner组
Group组
Other组
对于许可位,有两种表示方式:
数字表示方式
符号表示方式
可以用r、w、x、-来表示文件的访问权限
实例解读文件访问许可
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: 权限不够
通过修改文件的许可位,可以变更文件的访问权限。
变更许可位有两种方式, 一种数字类型,一种符号类型
我之前介绍, 文件的的访问许可由三组(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
设置目录的sticky位后, 该目录下的文件,只能被创建者删除
对谁有效?
如何设定?
chmod 1xxx file
实例
讨论: 粘着位的应用场景?
umask 为用户创建文件的掩码,代表用户创建文件的最终权限为(mode & ~umask), 那么您的观点,umask取值应为多少合适?
umask 设置只在当前终端中临时有效, 你有几种办法可以使其登录后默认生效
答题: 有一个目录,要求任何人可以创建客体并可以对目录进行读/搜索访问,但只有创建者可以删除,试用8进制写出它应具有的许可位
ACL是什么: 存储在文件扩展属性中的一组访问控制规则, (利用文件的扩展属性保存额外的访问控制权限)
我们需要一种更细粒度的访问控制方式, 对other组的用户成员,作出区分
实例分析
创建test01用户,test02用户, 访问itcast用户的文件,(相对于itcast用户,test01,test02用户为others用户), 无法做到对test01用户和test02用户的权限区别
对于ACL基本操作来说,也就是ACL设定、ACL查询、ACL移除
我们可通过setfacl、getfacl 来设定和查询文件的访问控制列表
我们可以通过
setfacl -m
, 来设定文件的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影响
我们可以通过
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$
移除文件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-)
当一个用户要访问一个文件的时候(有acl的情况下):
上述内容,详见man acl
的 “ACCESS CHECK ALGORITHM”, 此处简单描述.
注 此处用“用户”表述并不准确, 严格来说应该是“代表某个用户执行的那个进程的有效ID(euid)”, 为了便于大家理解,不引入太多的概念。
示例
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: 权限不够
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: 权限不够
$ man acl
$ man setfacl
$ man getfacl
我们在之前探讨信息安全时提到,完整性在Linux系统上,就是控制写,也就是一个文件不被非授权人员所篡改,我们就可以认为它是完整的。有些文件属性设定后,就可以避免对文件修改(超级用户也被允许),可以很好的满足我们对完整性的需求。
在特定的文件系统上, 当前文件具备那些可用的文件属性, 这个以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) | 设置了这个属性时,变更或更改同步保存到磁盘上 |
有两个命令 lsattr
和 chattr
用来管理属性。下面是常用属性的列表。
chattr属性中可以使用的不同选项 :
-R 递归地修改文件夹和子文件夹的属性
-V chattr命令会输出带有版本信息的冗余信息
-f 忽略大部分错误信息
在chattr中用于设置或者取消属性的 操作符
'+' 符号用来为文件和文件夹设置属性,
'-' 符号用来移除或者取消属性
'=' 使它们成为文件有的唯一属性。
chattr 和 lsattr 命令的基本语法 :
# chattr
# lsattr
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” 属性
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
Panda.Guo@2018-06-05 14:09:17 $ rm file
rm: 无法删除'file': 不允许的操作
Panda.Guo@2018-06-05 14:09:22 $ ln file file-link
ln: 无法创建硬链接'file-link' => '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': 不允许的操作
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': 没有那个文件或目录
讨论
在探讨PAM技术之前, 我们先探讨一个术语“标识&鉴别”
Pluggable Authentication Modules , 可插拔的鉴权模块, sun提出的一种鉴权机制。
它通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。
Panda.Guo@2018-06-05 14:48:40 $ ls /lib/x86_64-linux-gnu/security/
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
典型的弱口令防护策略: pam_cracklib
弱口令防护,简单说就是增加口令负责度
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 选项信息
配置描述
讨论: root用户要不要受口令复杂度的限制。
字典攻击、暴力破解的防护,简单说,就是当你尝试口令错误达到一定次数, 我锁定你账户,延迟一段时间再允许你进行登录即可
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
查看选项信息
配置描述
讨论: 锁定时间不是越长越好
配置文件有许多配置项(每行对应一个配置项)组成,每一行又分为四列(每列对应一栏):
第一栏,认证鉴别接口类型:(四类接口)
auth:表示鉴别类接口模块类型用于检查用户和密码,并分配权限
account:表示账户类接口,主要负责账户合法性检查,确认帐号是否过期,是否有权限登录系统等;
session:会话类接口。实现从用户登录成功到退出的会话控制;
password:口令类接口。控制用户更改密码的全过程。
每行只能指定一种接口类型
他的四种可能的取值分别为required、Requisite、sufficient或_optional:
* required:表示该行以及所涉及模块的成功是用户通过鉴别的必要条件,只有当对应于应用程序的所有带 required标记的模块全部成功后,该程序才能通过鉴别。
* requisite:与required相仿,只有带此标记的模块返回成功后,用户才能通过鉴别。不同之处在于其一旦失败就不再执行堆中后面的其他模块,并且鉴别过程到此结束,同时也会立即返回错误信息。
* sufficient:表示该行以及所涉及模块验证成功是用户通过鉴别的充分条件。也就是说只要标记为sufficient的模块一旦验证成功,那么PAM便立即向应用程序返回成功结果而不必尝试任何其他模块。
* optional:他表示即便该行所涉及的模块验证失败用户仍能通过认证。在PAM体系中,带有该标记的模块失败后将继续处理下一模块。也就是说即使本行指定的模块验证失败,也允许用户享受应用程序提供的服务。
第三栏,module_path即所使用模块的全路径名称
第四栏,options用于向特定模块传递相关的选项,然后由模块分析解释这些选项