[TOC]
0x00 快速入门
通过前面我们的学习,我们知道文件基础权限类型以及Linux文件权限的作用:
[TOC]
通过前面我们的学习,我们知道文件基础权限类型以及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)
Linux中权限对文件的作用(注意对root用户没用)
1 | #比如 |
Linux中权限对目录的作用(注意对root用户没用)
比如:由于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
注意事项:
1 | #下面这种权限慎用: |
描述:对于文件或者目录进行赋予rwx权限,也可以减去特定的权限(常用且非常有用)
语法参数:1
2
3
4
5
6
7
8
9
10chmod [选项] 模式 文件名
#主要参数
-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命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。
用户可以是用户或者是用户ID,用户组可以是组名或组id,文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。
注Tips:只有文件主和超级用户才可以便用该命令。
语法参数:1
2
3
4
5
6
7
8
9chown(选项)(参数)
-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 #文件夹得宿主
描述:在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/
描述:用于修改建立文件或者目录的默认权限,默认情况下用户创建文件与目录的权限如下;
-rw-rw-rw-(666)
;drwxrwxrwx(777)
语法参数: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
注意事项:
描述:ACL是由一系列的Access Entry所组成的,每一条Access Entry定义了特定的类别可以对文件拥有的操作权限。
从上面文件和目录的权限我们就能看出大概就三种权限所有者权限/组权限/其他权限,但是有时候不够用的时候就需要ACL权限,来解决用户身份不够的问题。
自动创建的规则:文件目录仅包含3个基本的acl规则,为了使规则能正常执行,需要满足以下规则。
Access Entry有三个组成部分:
1 | #Entry tag type它有以下几个类型: |
示例1.查看分区ACL权限是否开启1
2
3dumpe2fs -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会失败)。
描述:Linux中ACL权限查看与设定getfacl主要是查看权限;
基础语法1
2
3
4getfacl 文件名|目录
#参数
--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
描述:给文件或者目录设置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
42setfacl 选项 文件名
#参数
--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 | #示例4.Linux中ACL最大权限与删除,删除这个文件会文件夹的所有ACL权限 |
1 | #示例6.默认ACL权限的作用时如果给父目录设定了默认的ACL权限,那么父目录中所有新建的文件都会继承父目录的ACL权限 |
注意事项:
描述:用来改变文件和目录的Access ACL and Default ACL,它的具体参数大家可以去看man page。
1 | Usage: |
描述:特殊文件权限类型主要是,类似于普通文件权限表示方法rwx:
1 | #特殊文件权限UGB |
示例:1
2
3chmod +4755 pp.py #setUID -rwsr-xr-x //显示红色
chmod +2755 pp.py #setGID -rwxr-sr-x //显示黄色
chmod +1755 test/ #StrckyBit -rwxr-xr-t //蓝色
描述:SetUID的功能只有可以执行的二进制程序才能设定SUID权限,相当于说是以非root用户来指向root所属者的可执行文件;
操作案例: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针对文件的作用,只有可执行的二进制程序才能设置SGID权限:
SetGID针对目录的作用:
操作案例: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组
描述:SBIT也叫粘着位权限目前只对目录有效,普通用户对该目录拥有w和x权限,即普通用户可以在此目录有写入权限;
简单的说我们不能删除别人的文件,那我们可以修改别人文件内容啊!就算你是Root都不能删除,必须要把权限关闭后才行。
操作案例: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": 不允许的操作
描述:设置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
8
9
10
11# 示例1.添加目录i权限不能建立和删除文件
chattr +i www/
touch www
# touch: 无法创建"www": 权限不够
# 示例2.添加文件i权限不能删除与修改
chattr +i Weiyieek.txt
# 实例3.不需要修改文件但是可以创建文件(只能追加)
chattr -R +a /var/log/.history
chattr +a /var/log/.backups
注意事项:
chattr: Inappropriate ioctl for device while reading flags on hello.txt
;1 | ❯ df -h |
描述:查看设置chattr的权限;
语法参数:1
2
3
4
5
6lsattr [-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/
你好看友,欢迎关注博主微信公众号哟! ❤
这将是我持续更新文章的动力源泉,谢谢支持!(๑′ᴗ‵๑)
温馨提示: 未解锁的用户不能粘贴复制文章内容哟!
方式1.请访问本博主的B站【WeiyiGeek】首页关注UP主,
将自动随机获取解锁验证码。
Method 2.Please visit 【My Twitter】. There is an article verification code in the homepage.
方式3.扫一扫下方二维码,关注本站官方公众号
回复:验证码
将获取解锁(有效期7天)本站所有技术文章哟!
@WeiyiGeek - 为了能到远方,脚下的每一步都不能少
欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】
或者个人公众号【WeiyiGeek】
联系我。
更多文章来源于【WeiyiGeek Blog - 为了能到远方,脚下的每一步都不能少】, 个人首页地址( https://weiyigeek.top )
专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏 【点个赞、投个币、收个藏、关个注、转个发、赞个助】,这将对我的肯定,我将持续整理发布更多优质原创文章!。
最后更新时间:
文章原始路径:_posts/系统运维/Linux/常用命令/权限管理类命令/文件基本权限与特殊权限.md
转载注明出处,原文地址:https://blog.weiyigeek.top/2019/6-23-158.html
本站文章内容遵循 知识共享 署名 - 非商业性 - 相同方式共享 4.0 国际协议