权限管理

1
2
3
4
5
6
7
8
9
10
#权限和用户的关系
Linux中的文件或目录的权限和用户及用户组关联很大,Linux中每个文件或目录都有一组共9个基础权
限位,每三个字符被分为一组,他们分别是属主权限位(占三个字符)、属组权限位(占三个字符)、其他用
户权限位(占三个字符)
比如 rwxr-xr-x linux中正是这9个权限位来控制文件属主(User)、属组(Group)、其他用户(Other)基础权
限。
每种身份,又对应了3种权限:r(readable)、w(writeable)、x(excutable)
r=4
w=2
x=1

image-20240413153515306

1
2
3
4
5
6
7
8
9
10
User
Group
Other
## 所属用户:属主
## 所属用户组:属组
## ugo权限
//用户对资源来说, 有三种角色
User(u): 属主用户(文件所有者)
Group(g): 属组用户(包含组成员)
Other(o): 其他用户
字母 含义 对应权限
r(read) 读取权限 4
w(write) 写入权限 2
x(execute) 执行权限 1
-(没有权限) 没有权限 0

修改权限命令

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
# change mode
chmod [选项] 权限 文件名
## 数字修改方式
[root@localhost ~]# chmod 777 test1.txt
[root@localhost ~]# ll test1.txt
-rwxrwxrwx. 1 root root 0 Apr 12 17:01 test1.txt
[root@localhost ~]# chmod 700 test1.txt
[root@localhost ~]# ll test1.txt
-rwx------. 1 root root 0 Apr 12 17:01 test1.txt
## ugo修改方式
# 加权限
## u+权限 rwx
## g+权限 w
## o+权限 x
## a+权限 即a是all 可省略a +x +r +w +rw +rx +rwx +wx
[root@localhost ~]# chmod g+xw test1.txt
[root@localhost ~]# chmod +x test1.txt

#修改ugo三个权限
[root@localhost ~]# chmod u=rwx,g=w,o=x test1.txt 不如直接修改数字方式
[root@localhost ~]# chmod 721 test1.txt
## 递归修改目录权限
[root@localhost ~]# chmod -R 222 zls121
[root@localhost ~]# ll -d zls121/
d-w--w--w-. 3 zls121 zls121 139 Apr 12 18:31 zls121/
[root@localhost ~]# ll zls121/
total 0
--w--w--w-. 1 root root 0 Apr 12 18:30 1.txt
--w--w--w-. 1 root root 0 Apr 12 18:30 2.txt
--w--w--w-. 1 root root 0 Apr 12 18:30 3.txt
--w--w--w-. 1 root root 0 Apr 12 18:30 4.txt
[root@localhost ~]# ll zls121/zls1/
total 0
--w--w--w-. 1 root root 0 Apr 12 18:31 1.txt

权限对文件的影响

1
2
3
4
5
6
7
8
9
10
11
当文件只有r权限时,可以查看内容,不能写入(文件所属用户可以使用vi强制保存),不能执行
当文件只有w权限时,不能查看,只能写入(使用vi会覆盖文件内容,使用echo >>可以追加),不能执行
当文件只有x权限时,不能查看,不能写入,不能执行(都看不了无法执行)

当文件只有rw权限时,可以查看,可以写入,不能执行
当文件只有rx权限时,可以查看,不能写入,可以执行
当文件只有wx权限时,不能看,能写入,不能执行

当文件有rwx权限时,可以查看,可以写入,可以执行

##总结:x权限不能单独出现,需要配合r权限使用,也不能配合w(因为没有读取权限,就不知道文件内容,所以没法执行)

权限对目录的影响

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[zls@localhost ~]$ ll /opt/
ls: cannot open directory /opt/: Permission denied
[zls@localhost ~]$ mkdir /opt/zls
mkdir: cannot create directory ‘/opt/zls’: Permission denied
[zls@localhost ~]$ ./opt
-bash: ./opt: No such file or directory
当目录权限为---时,不能查看,不能进入,不能拷贝,不能移动,不能创建,不能删除
当目录权限为r时,能查看目录下的文件名(看不到文件属性),不能进入,不能拷贝,不能移动,不能创建,不能删除
当目录权限为w时,不能查看,不能进入,不能拷贝,不能移动,不能创建,不能删除
当目录权限为x时,不能查看,能进入,不能拷贝,不能移动,不能创建,不能删除

当目录权限为rw时,能查看目录下的文件名(看不到文件属性),不能进入,不能拷贝,不能移动,不能创建,不能删除
当目录权限为rx时,可以查看,能进入,能拷贝,不能移动,不能创建,不能删除
当目录权限为wx时,不能查看,能进入,能拷贝,能移动,能创建,能删除
## 只有x权限才能cd进入
## 目录权限,必须两两组合使用
## 目录权限,必须组合x权限使用
## 目录权限,一般情况下,普通用户,只给rx,超级用户 rwx

文件属主属组修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## change owner
chown [选项] 属主:属组 文件名
## 修改属主和属组
[root@localhost ~]# chown zls:zls student.txt
[root@localhost ~]# chown root.root student.txt
## 属主不变,修改属组
[root@localhost ~]# chown :tls student.txt
## 属组不变,修改属主 只加一个默认就是修改属主
[root@localhost ~]# chown zls student.txt

一个用户,创建出来的文件,不一定权限属于他的主组,newgrp只要切换过组,在哪个组工作,创建出的文件属组就属于哪个组
## 修改目录属主和属组下面文件权限不变
[root@localhost ~]# chown www.www /code/
## 递归修改目录的属主和属组
[root@localhost ~]# chown -R www.www /code/s

Linux中的特殊权限

1
普通用户可以修改自己的密码,在于passwd命令,该命令拥有特殊权限,SetUID,也就是咱们看到的,在属主的权限位的执行权限上是 s.当...普通用户使用passwd命令来更改自己的密码时,实际上是在用passwd命令的所有者,所有者是谁?就是root的身份在执行passwd命令
1
2
3
4
5
6
7
8
9
在 Linux 系统中,有三种特殊权限,分别是 SUID 权限、SGID 权限和 SBIT 权限:
#sUID 权限(Set User ID):
允许用户在执行可执行文件时以文件所有者的身份运行。具有 SUID 权限的文件在执行时将继承文件所有者的权限,而不是执行者自己的权限。这对于需要特定权限才能执行的程序非常有用。

#SGID 权限(Set Group ID):
SGID 权限类似于 SUID 权限,但是它是针对群组而不是用户。具有 SGID 权限的文件在执行时将继承文件所属群组的权限,而不是执行者所属群组的权限。

#SBIT 权限(Sticky Bit):
主要用于目录。当目录具有 SBIT 权限时,只有目录所有者、文件所有者和 root 用户才能删除或移动该目录中的文件。这可以防止其他用户意外删除或移动他人的文件

特殊权限suid介绍(set uid)

image-20240415143350501

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## 修改密码的命令
[root@localhost ~]# passwd
## 修改密码的命令位置
[root@localhost ~]# which passwd
/usr/bin/passwd
## 用户密码信息存放文件
[root@localhost ~]# ll /etc/shadow
----------. 1 root root 641 Apr 12 19:50 /etc/shadow
## 用户密码信息存放文件
文件权限:000
所有用户,没有读取权限,写入权限,执行权限
## 一个普通用户,是否可以修改密码?
只能修改自己的密码
## 问题:为什么一个普通用户,对/etc/shadow文件没有任何操作权限,却可以修改自己的密码?
## 原因:因为passwd命令,属主权限位上有个s权限
[zls@localhost ~]$ ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
suid授权方式
特殊权限——setgid
授权方式
如果在一个文件的属主权限位上,出现s权限,代表,该文件具有set uid权限
set uid(suid)权限作用:让使用该文件的用户,以该文件的属主身份执行
## 因为passwd命令有suid权限,那么普通用户可以以root身份执行该命令,但是为啥不能修改其他用户密码
原因:普通用户在执行passwd命令时,有个判断,就是该命令后面不能加任何参数

suid授权方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
suid数字权限:4000
## 数字权限授权
chmod 4xxx 文件名
[root@localhost ~]# chmod 4644 cheak_student.sh
[root@localhost ~]# chmod 4755 /bin/passwd
## ugo方式
[root@localhost ~]# chmod u+s student.txt
s:代表该文件的属主权限位上,本身有x(执行)权限
S:代表该文件的属主权限位上,本身没有x(执行)权限
## 总结:
1.让普通用户对可执行的二进制文件,临时拥有二进制文件的所属权限
2.如果设置的二进制文件没有执行权限,那么suid的权限显示就是S
3.特殊权限suid仅对二进制可执行程序有效,其他文件或目录则无效
注意:suid极其危险,不信可以尝试对vim或者rm命令进行设定suid

特殊权限——setgid

1
2
3
4
5
6
将目录设置为SGID后,如果在该目录下创建文件,都将与该目录的所属组保持一致
## 在文件的属组权限位上出现s权限
[root@localhost ~]# mkdir /opt/test
[root@localhost ~]# chmod g+s /opt/test/
[root@localhost ~]# ll /opt/test/ -d
drwxr-sr-x. 2 root root 6 Apr 15 18:40 /opt/test/

授权方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sgid数字权限:2000
## 数字权限授权
chmod 2xxx 文件名
[root@localhost ~]# chmod 2644 dir1
[root@localhost ~]# chmod 2755 dir1
小练习
## ugo方式
[root@localhost ~]# chmod g+s dir1
s:代表该文件的属组权限位上,本身有x(执行)权限
S:代表该文件的属组权限位上,本身没有x(执行)权限
## 总结:
1.针对用户组权限位修改,用户创建的目录或文件所属组和该目录的所属组一致。
2.当某个目录设置了sgid后,在该目录中新建的文件不在是创建该文件的默认所属组
3.使用sgid可以使得多个用户之间共享一个目录的所有文件变得简单。

特殊权限——粘滞位权限(SBIT)

1
2
sticky(SI TI KI)粘滞,目前只对目录有效,作用如下:
普通用户对该目录拥有w和x权限,即普通用户可以在此目录中拥有写入权限,如果没有粘滞位,那么普通用户拥有w权限,就可以删除此目录下的所有文件,包括其他用户简历的文件。但是一旦被赋予了粘滞位,除了root可以删除所有文件,普通用户就算有w权限也只能删除自己建立的文件,而不能删除其他用户简历的文件。系统中存在的/tmp目录是经典的粘滞位目录,谁都有写权限,因此安全成问题,常常是木马第一手跳板。

授权方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SBIT数字权限:1000
suid=4000
sgid=2000
sbit=1000
r=4
w=2
x=1
-=0
## 数字权限授权
chmod 1xxx 文件名
[root@localhost ~]# chmod 1644 dir1
[root@localhost ~]# chmod 1755 dir1
## ugo方式
[root@localhost ~]# chmod o+t dir1
t:代表该文件的其他用户权限位上,本身有x(执行)权限
T:代表该文件的其他用户权限位上,本身没有x(执行)权限
## 总结:
1.让多个用户都具有写权限的目录,并让每个用户只能删自己的文件(root除外)。
2.特殊sticky目录表现在others的x位,用小t表示,如果没有执行权限是T
3.一个目录即使它的权限为"777"如果是设置了粘滞位,除了目录的属主和"root"用户有权限删除,除此之
外其他用户都不允许删除该目录下的所有文件

chattr权限

1
2
3
4
5
6
7
8
9
10
11
chattr只有root用户可以使用,用来修改文件系统的权限属性,建立凌驾于rwx基础权限之上的授权

#查看有没有加chattr权限
lsattr /etc/passwd

# 授权方式
[root@localhost ~]# chattr +i /etc/passwd
chattr命令格式:chattr [+-=][选项] 文件名或目录名
#i:不得任意更动文件或目录
#a:append可以追加,但无法更改文件内容
[root@localhost ~]# chattr +a /etc/passwd /etc/shadow /etc/group /etc/gshadow

Linux进程掩码umask

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
系统默认umask为022,那么当我们创建一个目录时,正常情况下目录的权限应该是777,但是umask表示要减
去的值,所以新目录文件的权限应该是777-022=755。至于文件的权限也依次类推:666-022=644
## 查看系统默认umask
[root@localhost ~]# umask
0022
## 目录权限使用777-umask
## 文件权限使用666-umask
但是当umask出现奇数位时,需要在该位上得到结果后+1
## umask 147
[root@localhost ~]# umask 147
[root@localhost ~]# mkdir zls789 // 630
[root@localhost ~]# touch zls456 // 620
## 条件
[root@localhost ~]# # 1.uid > 199
[root@localhost ~]# # 2.uid name = gid name

cat /etc/profile
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
# UID大于199 并且 用户名和组名子一样 此时 : umask=002 (平台用户)
# UID小于199时 此时 umask=022 (root用户)
# 用户名和组名不一样时 此时umask=022

用户家目录umask 077
[root@lb01 ~]# cat /etc/login.defs

#查看文件的数字权限
stat -c a% 文件
stat 文件