[TOC]

0x00 快速入门

通过前面我们的学习,我们知道文件基础权限类型以及Linux文件权限的作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-rw-r--r-- # r = 4 / w = 2 / x = 1
# r:read 读取文件内容(cat more tail head)
# w: write 编辑 新增 修改文件内容(vi mvi) 但是不包括删除文件
# x: execute 可执行

-rw- r-- r--
u所有者 g所属组 o其他人

#常见的权限
rwx 属性:4 + 2 + 1= 7   (可读可写可执行)
rw- 属性:4 + 2 = 6          (可读可写不可执行)
r-x 属性: 4 + 1 = 5         (可读不可写可执行)


#默认建立文件和目录的权限
umask 0022 #第一位0:文件特殊权限 / 022:文件默认权限
#对文件来讲 最高权限是x / 对目录来讲 最高权限是w
-rw-r--r-- 1 root root 0 Jun 24 21:59 a.sh #644
drwxr-xr-x 2 root root 4096 Jun 24 21:59 www #755 (主要目录必须要有执行权限和写入权限)
对于文件默认权限 644(rw-r--r--)
对于目录默认权限 755(rwx-r-xr-x)

WeiyiGeek.示例

WeiyiGeek.示例


Linux中权限对文件的作用(注意对root用户没用)

  • 文件默认不能建立为执行文件,必须收工赋予执行权限
  • 所以文件默认最大权限为666、目录默认的最大权限为777.
  • 默认权限需要换算成字母再相减,所有建立文件之后的默认权限,为666减去umask的值
    1
    2
    #比如
    666-022=644 #文件默认最大权限666 umask值022


Linux中权限对目录的作用(注意对root用户没用)

  • 目录默认最大权限777,默认权限需要换算成字母再相减建立文件之后的默认权限,为777减去umask的值
  • r: 可以查询目录下文件名 (ls)
  • w: 具有修改目录结构的权限。如新建文件和目录,删除此目录下文件和目录,重命名此目录下文件和目录,剪切(touch rm mv cp)
  • x: 可以进入目录 (cd)

比如:由于A dir没有w得权限,则不能对B dir进行删除操作,因为B dir有rw权限则,可以对c file进行删除操作 (## 都只对下一级有用)

1
2
3
#比如:目录默认最大权限为777 umask值022
777 - 022 = 755
-rwxrwxrwx  减去 -----w--w- == -rwxr-xr-x

WeiyiGeek.权限对于目录的作用

WeiyiGeek.权限对于目录的作用


注意事项:

  • 分配文件基本权限时,核心原则:在最小权限情况下能够实现要求即可
    1
    2
    3
    #下面这种权限慎用:
    rw-rw-rw- :666
    rwxrwxrwx :777

0x01 普通文件权限

chmod 命令

描述:对于文件或者目录进行赋予rwx权限,也可以减去特定的权限(常用且非常有用)
语法参数:

1
2
3
4
5
6
7
8
9
chmod [选项] 模式  文件名

#主要参数
-R 递归 #主要对于目录
[ugoa][+-=][rwx]   #u 用户 g组 o 其他  a 全部

+ 加入
- 减去
= 设置

实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#示例1.给用户和组赋予write权限
chmod u+w test.txt
chmod g+w,o+w test.txt


#示例2.给所有人都赋予可读可写可执行等同于777权限(这样做非常危险)
chmod a=rwx text.txt


#示例3.’其中abc分别表示一个数字且<=7,分别表示User,Group,以及Other的权限.
chmod +abc text.sh  #+/-表示赋予和减去
chmod +777 text.sh #权限777
chmod -755 text.sh #权限022


#示例4.用户、用户组、其他人增加可读减去可执行权限
chmod +r test.txt
chmod -w test.txt


#示例6.用户可读可写可执行,组与其它人可读可执行
chmod 644 test.sh
chmod u=rwx,go=wx test.sh


chown 命令

描述:chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。
用户可以是用户或者是用户ID,用户组可以是组名或组id,文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。

注Tips:只有文件主和超级用户才可以便用该命令。
语法参数:

1
2
3
4
5
6
7
8
9
chown(选项)(参数)

-c或——changes:效果类似“-v”参数,但仅回报更改的部分;
-f或--quite或——silent:不显示错误信息;
-h或--no-dereference:只对符号连接的文件作修改,而不更改其他任何相关文件;
-R或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理;
-v或——version:显示指令执行过程;
--dereference:效果和“-h”参数相同;
--reference=<参考文件或目录>:把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同;

实际案例:

1
2
3
4
5
6
7
8
9
10
#示例1. 将目录/usr/meng及其下面的所有文件、子目录的文件用户/组用户改成 liu:
chown -R liu /usr/meng

#示例2.将文件的所属者和所属组分别设置为root和master
drwxr-xr-x 2 git(所有者) root(所有组) 21 May 9 16:50 testprivate
chown root:master test.sh

#示例3.常用赋予权限方式
chown git:vsftpd testprivate/ # 更改所有者:所有组
chown -R nobody.nobody /tmp/rsynctest  #文件夹得宿主

WeiyiGeek.示例3

WeiyiGeek.示例3


chgrp 命令

描述:在UNIX系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用chgrp指令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆可;

注意:选项参数与chown差不多

实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#示例1.修改文件的所属组, 将/usr/meng及其子目录下的所有文件的用户组改为mengxin
chgrp [-R ]组名 文件名
chgrp -R mengxin /usr/meng

#示例2.让nginx用户对文件及目录拥有一定权限
$chgrp -v -h nginx /tmp/a.sh
changed group of ‘/tmp/a.sh’ from root to nginx
$ll /tmp/a.sh
-rw-r--r-- 1 root nginx 0 Jun 24 21:59 /tmp/a.sh

#示例3.-拥有一个testprivate目录让老师拥有所有的权限,让本课程学员由查看的权限,其他人不许查看这个目录
useradd teacher
useradd student
gpasswd -a student teacher #或者usermod -g teacher student # -g代表更改用户所在的用户组/附属组
mkdir testprivate
chmod +740 testprivate/
chown student:teacher testprivate/


umask 命令 - 文件默认权限

描述:用于修改建立文件或者目录的默认权限,默认情况下用户创建文件与目录的权限如下;

  • 文件 :默认没有可执行(x)权限即只有r/w这两个选项即-rw-rw-rw-(666);
  • 目录 :默认所有权限均开放即为777分,默认权限如下drwxrwxrwx(777)
    而umask的分值是为了用在默认权限去掉其分值的所得的权限例如默认的umask的为022即实际上新建文件或者目录权限如下:
  • 文件 : (-rw-rw-rw-) - (—–w–w-) = (-rw-r–r–) => 644
  • 目录 : (drwxrwxrwx) - (d—-w–w-) = (drwxr-xr-x) => 755

语法参数:

1
usage: umask [-p] [-S] [mode]

实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 示例1: umask 值查看
umask
0022
umask -p
umask 0022
umask -S
u=rwx,g=rx,o=rx # 创建目录默认的权限

# 示例2:临时永久修改umask的值
$umask 0022
$vi /etc/profile
umask 022 # 如果需要永久修改需要编辑/etc/profile中的umask值
$source /etc/profile

注意事项:

  • (1) 上述umask默认022不能由文件默认属性(666)和目录默认属性(777)进行相减运算;

0x02 特殊权限之ACL

描述:ACL是由一系列的Access Entry所组成的,每一条Access Entry定义了特定的类别可以对文件拥有的操作权限。
从上面文件和目录的权限我们就能看出大概就三种权限所有者权限/组权限/其他权限,但是有时候不够用的时候就需要ACL权限,来解决用户身份不够的问题。

自动创建的规则:文件目录仅包含3个基本的acl规则,为了使规则能正常执行,需要满足以下规则。

  • 3个基本规则不能被删除。rwx
  • 任何一条包含指定的用户名或群组名的规则必须包含有效的权限组合。 user/group
  • 任何一条包含缺省规则的规则在使用时,缺省规则必须存在。 umask

Access Entry有三个组成部分:

  • Entry tag type
  • qualifier (optional就是username、groupname)
  • permission (权限RWX 0777)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #Entry tag type它有以下几个类型:
    类型 说明
    ACL_USER_OBJ: 相当于Linux里file_owner的permission(原本所有者)
    ACL_USER: 定义了额外的用户可以对此文件拥有的permission
    ACL_GROUP_OBJ: 相当于Linux里group的permission (原本所属组)
    ACL_GROUP: 定义了额外的组可以对此文件拥有的permission
    ACL_MASK: 定义了ACL_USER,ACL_GROUP_OBJ和ACL_GROUP的最大权限
    ACL_OTHER: 相当于Linux里other的permission

    Access Entry都是由三个被:号分隔开的字段所组成,第一个就是Entry tag type
    - user 对应了ACL_USER_OBJ和ACL_USER
    - group 对应了ACL_GROUP_OBJ和ACL_GROUP
    - mask 对应了ACL_MASK
    - other 对应了ACL_OTHER

示例1.查看分区ACL权限是否开启

1
2
3
dumpe2fs -h /dev/sda5   #当分区类型为ext* 才有效
#-h 仅显示超级块中信息,而不显示磁盘块的详细信息
Default mount options: user_xattr acl #注意这里的ACL说明分区是支持acl的

示例2.临时开启分区ACL权限

1
mount -o remount,acl /      #重新挂载根分区,并挂载加入acl权限

示例3.永久开启分区ACL权限

1
2
3
$vi /etc/fstab
UUID=c2ca6f57-b15c-43ea=bca0-f239083d8bd2 / ext4 defaults,acl 1(#启动是否需要检测) 1(#启动是否需要备份) #加入acl
$mount -o remount / #然后重写挂载

注意:xfs文件系统似乎已经默认/强制开启了acl,不用在mount时增加acl参数,fstab里加acl参数也被认为是无效的(会报错说acl是不识别选项mount会失败)。


getfacl 命令

描述:Linux中ACL权限查看与设定getfacl主要是查看权限;
基础语法

1
2
3
4
getfacl 文件名|目录

#参数
--omit-header #不显示文件头部信息

实际案例:

1
2
3
4
5
6
7
8
9
10
11
#示例1.查看文件的acl权限
getfacl test.jsp

#示例2.查看目录的acl权限
getfacl rpmbuild/
# file: rpmbuild/
# owner: root
# group: root
# user::rwx
# group::r-x
# other::r-x

WeiyiGeek.示例1

WeiyiGeek.示例1


setfacl 命令

描述:给文件或者目录设置acl权限
语法参数:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
setfacl 选项 文件名

#参数
--test:|测试模式,不会改变任何文件的acl规则,操作后的acl规格将被列出。

-m|设定ACL权限
-M|从一个文件读入ACL设置信息并以此为模版修改当前文件或目录的ACL规则
-x|删除指定的ACL权限
-X|从一个文件读入ACL设置信息并以此为模版删除当前文件或目录的ACL规则

-d: |设定默认ACL权限
-R:|递归的对所有文件及目录进行操作。 (只能对目录设置不能对文件)
-L:|跟踪符号链接,默认情况下只跟踪符号链接文件,跳过符号链接目录。
-P:|跳过所有符号链接,包括符号链接文件。

-b 删除所有的ACL权限,基本的acl规则(所有者,群组,其他)将被保留。
-k 删除默认ACL权限,如果没有缺省规则,将不提示。

--set=acl| 设置当前文件的ACL规则
--set-file=file| 从文件读入ACL规则来设置当前文件或目录的ACL规则

-n:|不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定。
--mask:|重新计算有效权限,即使ACL mask被明确指定。
--restore=file:|从文件恢复备份的acl规则(这些文件可由getfacl -R产生)。通过这种机制可以恢复整个目录树的acl规则。此参数不能和除--test以外的任何参数一同执行。



#ACL规则格式:
- [d[efault]:] [u[ser]:]uid [:perms] 指定用户的权限,文件所有者的权限(如果uid没有指定)。
- [d[efault]:] g[roup]:gid [:perms] 指定群组的权限,文件所有群组的权限(如果gid未指定)
- [d[efault]:] m[ask][:] [:perms] 有效权限掩码
- [d[efault]:] o[ther] [:perms] 其他的权限
#比如:
setfacl -x u:用户名 文件名
setfacl -x g:组名 文件名

#提示数据
- 选项-m和-x后边跟以acl规则。多条acl规则以逗号(,)隔开。选项-M和-X用来从文件或标准输入读取acl规则。
- 选项--set和--set-file用来设置文件或目录的acl规则,先前的设定将被覆盖。
- 选项-m(--modify)和-M(--modify-file)选项修改文件或目录的acl规则。
- 选项-x(--remove)和-X(--remove-file)选项删除acl规则。
- Perms域是一个代表各种权限的字母的组合:读-r写-w执行-x(也可设置为八进制格式),执行只适合目录和一些可执行的文件。

实际案例:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#示例1.给其他指定用户mynote设置rw权限
setfacl -m u:mynote:rx /home/test.jsp
getfacl test.jsp
# file: test.jsp
# owner: root
# group: root
# user::rw-
# user:mynote:rw-
# group::r--
# mask::rw- #mask是用来指定最大有效权限的。 user1:rwx & mask:rw- 与得到:rw-
# other::r--

#设置后您ll进行查看权限发现权限上会多了个+号
#当任何一个文件拥有了ACL_USER或者ACL_GROUP的值以后我们就可以称它为ACL文件,这个+号就是用来提示我们的。
-rw-rw-r--+ 1 root root 1057 6月 20 09:13 test.jsp


#示例2.给组tgroup2设定和#先让用户john拥有对test.txt文件的读写权限:
setfacl -m g:tgroup2:rwx test.jsp
$setfacl -m user:john:rw- ./test.txt
$getfacl --omit-header ./test.txt
user::rw-
user:john:rw-
group::rw-
mask::rw-
other::r--


#示例3.让用户john也对test.sh具有和root一样的permission。(ACL_MASK重点)、
-rwxrw-r-- 1 root admin 0 Jul 3 23:10 test.sh #原本权限
$getfacl -m user:john:rwx ./test.sh
$getfacl --omit-header ./test.sh
user::rwx user:john:rwx #john已经拥有了rwx的permission,mask值也被设定为rwx,那是因为它规定了ACL_USER,ACL_GROUP和ACL_GROUP_OBJ的最大值
group::rw-
mask::rwx
other::r--
-rwxrwxr--+ 1 root admin 0 Jul 3 23:10 test.sh
#那么如果现在admin组的用户想要执行test.sh的程序会发生什么情况呢?_
#它会被permission deny,原因在于实际上admin组的用户只有read and write permission,这里当中显示的rwx是ACL_MASK的值而不是group的permission。

#ACL_mask重要性
# 假如现在我们设置test.sh的mask为read only,那么admin组的用户还会有write permission吗?
setfacl -m mask::r-- ./test.sh
getfacl --omit-header ./test.sh
# user::rwx
# user:john:rwx #effective:r--
# group::rw- #effective:r--
# mask::r--
# other::r--
#ACL_MASK的定义规定了ACL_USER,ACL_GROUP_OBJ和ACL_GROUP的最大权限。
#那么在我们这个例子中他们的最大权限也就是read only。虽然我们这里给ACL_USER和ACL_GROUP_OBJ设置了其他权限,但是他们真正有效果的只有read权限。
-rwxr--r--+ 1 root admin 0 Jul 3 23:10 test.sh #的group permission也会显示其mask的值

1
2
3
4
5
6
7
8
9
10
11
12
#示例4.Linux中ACL最大权限与删除,删除这个文件会文件夹的所有ACL权限
setfacl -m u:user1:rwx test.jsp
setfacl -x u:user1:rwx test.jsp
setfacl -b test.jsp #删除这个文件的所有的ACL权限
-rw-r--r-- 1 root root 1057 6月 20 09:13 test.jsp #没有加号了


#示例5.递归ACL权限示例
#Default ACL 是指对于一个目录进行Default ACL设置,这就需要递归递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限
setfacl -m u:mynote:rwx -R ./test/ #-R 选项、递归只能对目录设置不能对文件
#对目录使用递归权限 本来不想给权限 结果给了出现权限溢出,不是默认的ACL权限 命令执行之后新建的目录不会有ACL权限
#重新对./test/ -R进行设置ACL权限
WeiyiGeek.ACL权限示例5

WeiyiGeek.ACL权限示例5

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
#示例6.默认ACL权限的作用时如果给父目录设定了默认的ACL权限,那么父目录中所有新建的文件都会继承父目录的ACL权限
setfacl -m d:u:lw:rw -R /home/test #d表示 default  默认
# 由于test的group::r-x没有写权限,我们拿mynote用户测试不能建立文件和directory,或是使用root用户进行新建

#所有在此目录下建立的文件都可以被john用户所访问
$setfacl -d -m user:john:rw ./dir
$getfacl --omit-header ./dir
user::rwx
group::rwx
other::r-x
default:user::rwx
default:user:john:rwx
default:group::rwx
default:mask::rwx
default: other::r-x
#现在root用户在dir下建立一个test.txt文件。
$touch ./dir/test.txt
$ls -l ./dir/test.txt
-rw-rw-r--+ 1 root root 0 Jul 3 23:46 ./dir/test.txt
$getfacl --omit-header ./dir/test.txt
user::rw-
user:john:rw- #john用户自动就有了read and write permission,
group::rwx #effective:rw-
mask::rw-
other::r--

注意事项:

  • 如果我给用户赋予了ACL权限,是需要和mask的权限“与”才能得到用户的真正权限,(同则同)
  • 当在不支持ACLs的文件系统上使用setfacl命令时,setfacl将修改文件权限位
  • 如果acl规则并不完全匹配文件权限位,setfacl将会修改文件权限位使其尽可能的反应acl规则,并会向standard error发送错误消息,以大于0的状态返回。
  • 如果用chmod命令改变Linux file permission的时候相应的ACL值也会改变,反之改变ACL的值,相应的file permission也会改变。
  • mv命令将会默认地移动文件的ACL属性,同样如果操作不允许的情况下会给出警告。


chacl 命令

描述:用来改变文件和目录的Access ACL and Default ACL,它的具体参数大家可以去看man page。

1
2
3
4
5
6
7
8
Usage:
chacl acl pathname...
chacl -b acl dacl pathname...
chacl -d dacl pathname...
chacl -R[|other] pathname...

#基础语法
-B | 它可以彻底删除文件或者目录的ACL属性(包括Default ACL),比如你即使用了setfacl -x删除了所有文件的ACL属性,那个+号还是会出现在文件的末尾

0x03 特殊权限之UGB

描述:特殊文件权限类型主要是,类似于普通文件权限表示方法rwx:

  • SetUID:4
  • SetGID:2
  • Sticky Bit:1
1
2
3
4
5
6
#特殊文件权限UGB
  u       g        o
  +       +        +
  s       s        s
  =       =        =
  SUID  SGID  SBIT

示例:

1
2
3
chmod +4755 pp.py   #setUID  -rwsr-xr-x //显示红色
chmod +2755 pp.py #setGID -rwxr-sr-x //显示黄色
chmod +1755 test/ #StrckyBit -rwxr-xr-t //蓝色

WeiyiGeek.特殊权限特征

WeiyiGeek.特殊权限特征


SetUID 权限

描述:SetUID的功能只有可以执行的二进制程序才能设定SUID权限,相当于说是以非root用户来指向root所属者的可执行文件;

  • 命令执行者队该程序拥有x执行权限
  • 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件属主)
  • 只有文件具有SetUID权限,命令执行时用户身份才会切换到文件所有者的身份(灵魂附体)
  • SetUID权限只在该程序执行过程中有效,也就是说身份改变在程序执行过程中有效

操作案例

1
2
3
4
5
6
7
#设定SetUID
chmod 4755 文件名
chmod u+s 文件名

#取消SetUID
chmod 0755 文件名
chmod u-s 文件名

实际案例

1
2
3
4
5
6
7
8
9
10
11
12
#示例1.shadow只有超级用户才能更改,但为什么自己能改自己的密码呢?
ll /etc/shadow  #保存密码文件
---------- 1 root root 867 6月 25 16:22 /etc/shadow
ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd #注意这里的权限
#这个指令有SetUID权限执行的时候 ,自己的身份就会这个文件所有者身份,所以就能改密码了


#示例2.危险的SUID权限危险目录应严格控制写权限。比如"/","/usr"等
chmod u+s /etc/vi #如果这样设置用户就可以修改密码了
#用户的密码设置要严格遵守密码三原则
#对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限,参考下面脚本


SUID和SGID权限查找:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/bin/bash
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
#搜索系统系统中所有有SUID和SGID的文件,并保存到临时目录中
for i in $(cat /tmp/setuid.check)
#循环去除文件中的文件名
do

grep $i /root/suid.log > /dev/null
#比对这个文件名是否在模板文件中
if[ "$?" != "0" ]
#检测上一个命令的返回值,如果不成功,上面报错
then
echo "$i isn't in listfile!" >> /root/suid_log_$(data+%F)
#如果文件名在模板文件中,则输出错误信息,并把错误写到日志中
fi
done
rm -rf /tmp/setuid.check


#执行结果(默认存在SUID和SGID权限的文件)
/run/log/journal
/run/log/journal/985306ae4b484b90bba97f8d2c2b0b7f
/usr/bin/fusermount
/usr/bin/wall
/usr/bin/mount
/usr/bin/su
/usr/bin/chfn
/usr/bin/write
/usr/bin/chsh
/usr/bin/chage
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/umount
/usr/bin/pkexec
/usr/bin/crontab
/usr/bin/ssh-agent
/usr/bin/passwd
/usr/bin/Xorg
/usr/bin/at
/usr/bin/sudo
/usr/bin/locate
/usr/bin/staprun
/usr/sbin/pam_timestamp_check
/usr/sbin/unix_chkpwd
/usr/sbin/lockdev
/usr/sbin/netreport
/usr/sbin/usernetctl
/usr/sbin/userhelper
/usr/sbin/postdrop
/usr/sbin/mount.nfs
/usr/sbin/postqueue
/usr/lib/polkit-1/polkit-agent-helper-1
/usr/lib64/dbus-1/dbus-daemon-launch-helper
/usr/lib64/vte-2.90/gnome-pty-helper
/usr/libexec/utempter/utempter
/usr/libexec/openssh/ssh-keysign
/usr/libexec/pulse/proximity-helper
/usr/libexec/qemu-bridge-helper
/usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
/usr/libexec/spice-gtk-x86_64/spice-client-glib-usb-acl-helper

问题1:那执行这条命令时,身份可以修改密码了,不就能修改其他用户的密码了吗?
答:实际上linux限制了passwd后跟其他参数,会报只有根用户才能指定用户名称的错误,用户只能 passwd 直接回车修改当前用户的密码;


SetGID 权限

描述:SetGID针对文件的作用,只有可执行的二进制程序才能设置SGID权限:

  • 命令执行者队该程序有x执行权限
  • 命令执行在执行过程的时候,组身份升级为该程序文件的属主 (在执行程序的过程中灵魂附体为文件属主)
  • SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变在程序执行过程中有效

SetGID针对目录的作用

  • 普通用户必须对此目录有r和x权限才能进入此目录(目录最大权限w、文件最大权限x)
  • 普通用户在此目录中的有效组会变成此目录的属组
  • 若普通用户对此目录有w权限时,新建的文件的默认属组是这个目录的属组

操作案例

1
2
3
4
5
6
7
#设定SetGID
chmod 2755 文件名
chmod g+s 文件名

#取消SetGID
chmod 0755 文件名
chmod g-s 文件名

操作实例:

1
2
3
4
5
6
7
8
#示例1.比如ubuntu系统中mlocate.db是可执行二进制程序,可以赋予SGID权限
-rwx--s--x 1 root slocate 35612 8月 24 2010 /usr/bin/locate
ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 1838850 1月 20 04:29 /var/lib/mlocate/mlocate.db
#比如:执行用户lamp对/usr/bin/locate命令拥有执行权限
#执行/usr/bin/locate命令时,组身份会升级为slocate组,而slocate组对/var/lib/mlocate/mlocate.db数据库有r权限,所以普通用户可以使用locate
# 命令查询mlocate.db数据库
# 命令结束,lamp用户的组身份返回lamp组


Sticky BIT 权限

描述:SBIT也叫粘着位权限目前只对目录有效,普通用户对该目录拥有w和x权限,即普通用户可以在此目录有写入权限;

简单的说我们不能删除别人的文件,那我们可以修改别人文件内容啊!就算你是Root都不能删除,必须要把权限关闭后才行。

  • 如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。
  • 如果赋予了粘着位,除了root可以删除所有文件,普通用户就算有w权限也只能删除自己建立的文件,但是不能删除其他用户建立的文件

操作案例

1
2
3
4
5
6
7
#设置粘着位
chmod 1755 目录名
chmod o+t 目录名

#取消粘着位
chmod 0777 目录名
chmod o-t 目录名

实际案例

1
2
3
4
5
#示例1.普通用户无法删除自己创建的文件
$mkdir -p test/www #此时test可以删除www目录下的文件(但必须给test赋予w权限)
$chmod -R 1777 test/
$rm -rf test.jsp #即使有w权限也不能删除test/www下的文件,但可以修改文件里面的内容
rm: 无法删除"test.jsp": 不允许的操作


chattr 命令 - 文件隐藏属性设置

描述:设置SBIT粘着位权限后用户可以对其进行更改,假如我们不想他更改里面的信息得话就可以用下面的这个命令。

语法参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 语法:
chattr [+-=][ASaxdistu]文件或目录名
chattr [ -RVf ] [ -v version ] [ -p project ] [ mode ] files
+ - =  增加  删除  等于 某权限

# 选项
A # 访问文件或者目录时候atime将不会被修改;
S # 进行任何文件的修改该改动会同步写入到磁盘之中;
d # 在dump执行时该文件或者目录将不会被dump备份
i(insert) #如果对文件设置i属性,那么 不允许对文件进行删除/改名也不能添加和修改数据; (不能对文件做任何修改)
          #如果对目录设置i属性,那么 只能修改目录下文件的数据,但不允许建立和删除文件; (修改文件)
 
a(append) #如果对文件设置a属性,那么 只能在文件中增加数据,但是不能删除也不能修改数据; (对文件增加数据)
           #如果对目录设置a属性,那么 只允许在目录中建立和修改文件,但是不允许删除; (建立修改文件)
s # 文件删除时其将被完全从这个硬盘空间中删除;
u # 与s相反当使用u来配置文件时,如果该文件被删除了它,从这个硬盘空间中任然可以将其找回;

实际案例:

1
2
3
4
5
6
7
#示例1.添加目录i权限不能建立和删除文件
$chattr +i www/
$touch www
touch: 无法创建"www": 权限不够

#示例2.添加文件i权限不能删除与修改
$chattr +i Weiyieek.txt

注意事项:

  • (1) 该命令只能在Ext2/Ext3/Ext4的文件系统上执行,其他文件系统可能无法支持该命令比如chattr: Inappropriate ioctl for device while reading flags on hello.txt;
    1
    2
    3
    ❯ df -h
    Filesystem Size Used Avail Use% Mounted on
    rootfs 151G 92G 59G 62% /
  • (2) 该命令常用选项a/i的设置值,而且很多设置值必须要身为root才能执行


lsattr 权限 - 文件隐藏属性查看

描述:查看设置chattr的权限;

语法参数:

1
2
3
4
5
6
lsattr [-adR]  文件名

# 选项:
-a 显示所有文件和目录
-d 若目标是目录仅列出目录本身的属性,而不是子文件的属性
-R 连同子目录的数据也一并列出来

实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 示例1.查找所有不可修改的文件
lsattr -d ww/ #目录
----i----------- ww/
lsattr -a ww/ #文件
----i----------- ww/. #关键点 i
---------------- ww/..

# 示例2.设置文件隐藏属性与查看
# The 'j' option is only useful for ext3 and ext4 file systems.
> chattr +aij weiyigeek.txt
> lsattr weiyigeek.txt
----ia---j--- weiyigeek.txt

# 示例3.貌似无用
find . | xargs -I file lsattr -a file 2>/dev/null | grep "^----i"
----i----------- ./ww
----i----------- ./ww/