马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
一. 前提 本篇主要讲解SUID, SGID, Sticky三个权限的基本原理和应用. 为什么要使用特殊权限? 比如系统中假如有超过四类人然而每一类人都需要一种独特权限.只有三种独特权限的基础权限系统就会明显不够用. 特殊权限可以扩展系统基础权限的功能,使得linux权限更加强大灵活. 在理解特殊权限之前,需要先具备几个关于安全上下文的认知: 前提:进程有属主和属组;文件有属主和属组; (1) 任何一个可执行程序文件能不能启动为进程:取决于发起者对程序文件是否拥有执行权限; (2) 启动为进程之后,其进程的属主为发起者;进程的属组为发起者所属的组; (3) 进程访问文件时的权限,取决于进程的发起者: (a) 进程的发起者,同文件的属主:则应用文件属主权限; (b) 进程的发起者,属于文件的属组;则应用文件属组权限; (c) 应用文件“其它”权限; 二. SUID - 权限设定方法:; p4 w. b. i( f
- 字母表示法:
* a4 u+ h/ t: _* S
chmod u+s FILE... chmod u-s FILE... - 数字表示法:: R8 ?9 o0 m# ^" T5 C' D
chmod 4755 FILE 添加SUID权限到二进制程序文件(添加到DIR无意义) 4 A& ~, C" m4 _, L* N' H; W( K
在普通三位数字权限位之前,用4代表添加的SUID位 3 ?% C+ ], o! m/ K: ~
chmod 0xxx .... 可以删除文件的SUID(无法删除目录的SUID) - 文件权限表示:& U4 |. p( E6 e) ^
# ll f1 -rwsr-xr-x. 1 root root 0 Nov 17 20:18 f1
0 E2 H! h% ^+ D, U e. P& g 文件属主的x权限,用s代替.表示被设置了SUID 如果属主位没有x权限,会显示为大写S,表示有故障(权限无效) - SUID相关说明:
$ n3 t+ a$ O* F# O @/ m E# V" z- 启动为进程之后,其进程的属主为原程序文件的属主;
- 只能作用在二进制程序上,不能作用在脚本上,且设置在目录上无意义 ;
- 执行suid权限的程序时,此用户将继承此程序的所有者权限;
- h8 B8 J( o0 A( I
- SUID工作原理& X" \1 E/ }' v4 W& H/ m
- 环境前提:
* J0 p/ W, G6 ?$ c! g* s' w- linux中有一个二进制程序cat,属主属组均为root
- linux中有一个系统文件/etc/shadow,属主属组均为root
- 我们创建一个普通用户叫user1
- user1具有对cat的执行权限
- user1 不具有对/etc/shadow的任何权限1 o1 t/ f8 V9 c7 N* O1 Z# c
- 默认情况下
4 I1 C0 H; g- J- }- ^! @- user1执行cat,系统创建一个cat进程,进程的属主属组取程序发起者,也就是user1:user1
- cat进程访问/etc/shadow,由于进程属主属组是user1:user1,与/etc/shadow的属组属主都不匹配,所以被拒绝访问.
# f* L1 R: f+ R; b1 x( M( Q1 y$ R/ O
- 给cat设置SUID之后
# R- D j+ J! X6 T, i- user1执行cat.系统创建一个cat进程,进程的属主取cat的属主,属组取程序发起者,就是root:user1
- cat进程访问/etc/shadow,由于进程属主是root,与/etc/shadow的属主匹配,所以被允许访问.1 }4 l* l" _8 m' D
- 举例说明:
: Z8 R$ D8 g8 U- {+ ~/ u( a- @8 c
passwd命令是linux系统中用来修改密码的命令.系统中所有用户都可以使用. 而passwd命令改密码的行为是通过修改/etc/shadow文件来实现. 看一下/etc/shadow的文件权限: # ll /etc/shadow ----------. 1 root root 1771 Nov 16 17:06 /etc/shadow " i' l! P- @2 \( k" ?# O, @
可见/etc/shadow对普通用户没有任何权限. 所以普通用户默认无法使用文本编辑器打开或者编辑这个文件. 那为什么通过passwd这个命令就可以编辑呢? 用ls命令查看passwd命令的源文件信息: # ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 30768 2月 22 2012 /usr/bin/passwd
- K$ Q, c0 I" i; y8 Z 我们发现passwd这个程序的属主位的执行位不是x而是s,说明passwd被设置了特殊权限SUID. 于是普通用户运行passwd命令,系统创建的passwd进程的属主由默认为"程序发起者"变为了passwd的属主 而passwd的属主是root,所以普通用户其实是在用root的权限修改/etc/shadow文件.最后passwd命令执行结束,passwd进程被关闭. 给命令vim添加SUID,可以让普通用户自己把自己变为超级用户. 看一下vim的原权限 #ll /usr/bin/vim -rwxr-xr-x. 1 root root 2289640 Aug 2 08:45 /usr/bin/vim
7 F) X' {& ?1 M& p9 ~! y S 给vim加个SUID # chmod u+s /usr/bin/vim
/ M5 w/ ?$ q, O( G/ I 权限变为 -rwsr-xr-x. 1 root root 2289640 Aug 2 08:45 /usr/bin/vim
8 Y% _6 z/ |$ O, b 现在用普通用户登录 # su quintin , R4 g8 ?7 z4 [2 T* U& V1 n$ }
尝试使用vim编辑系统账户文件/etc/passwd $ vim /etc/passwd
5 z; _6 a& W# m f9 v 找到自己的用户名一行
; E z8 h. W' G& o 修改第三列自己的uid为0 root的uid不用改. 然后保存,提示只读文件,使用w!强制保存,成功! 我们知道普通用户quintin对vim是有执行权限的,而对/etc/passwd则没有编辑权限. 通常情况下quintin启动vim后,系统会创建一个以当前用户quintin为属主属组的vim进程, 此时vim进程的属主属组为quintin:quintin,由于无论是属主还是属组都不具有对/etc/passwd的编辑权限, 所以这个vim进程无权编辑/etc/passwd. 而给/usr/bin/vim设置了SUID之后,quintin或任何用户启动vim程序时, 系统创建的vim进程的属主则是取了/usr/bin/vim这个程序文件自身的属主root, 所以此时vim进程的属主属组为root:quintin. 系统检查发现正好匹配了/etc/passwd的属主,于是放行vim进程. 其他文本编辑器同理. 退出vim并重新登陆quintin帐户 这时发现命令提示符已完全变为root,而且系统认为我就是root + R* o" Y$ ^( R( D" W
因为linux只通过uid判断超级管理员,而quintin帐户把自己的uid变成了超级管理员一样的0, 所以重新登陆之后,quintin具有了root的身份. 测试: 找一个属主属组都为root且other位无w的文件 # ll /app/f11 -rw-r--r--. 1 root root 0 Nov 17 20:18 f11 : \& f' ^0 [9 y0 t5 D
改个名字 # mv f11 f1
& R: `" ]: g3 |( E) ~$ k& Z 成功. 三. SGID - 权限设定方法:
& A0 d$ }0 m( t$ j* k0 W! f- 字母表示法
" q5 @' D2 @1 R: z6 |
chmod g+s DIR/FILE... chmod g-s DIR/FILE... - 数字表示法 :
; V5 ?' d; h' {4 k
chmod 2755 DIR/FILE 添加SGID到目录或文件 在普通数字权限位前,用2代表添加SGID位 chmod 0755 DIR/FILE 删除文件的SGID,(目录不受影响) chmod 755 DIR/FILE 同上 - 文件权限表示:+ N- `- f4 g" K1 X& J% n
# ll /app/f1 -rwxr-sr-x. 1 root root 0 Nov 17 20:18 /app/f1 / m& M& m' y; p
文件属组的x权限,用s代替.表示被设置了SGID 如果属组位没有x权限,会显示为大写S,表示有故障(权限无效) - SGID相关说明:9 K8 Y) y( p: U8 l" Q7 y' i! y& I0 S7 N
- 作用在二进制程序上时:( Y: g% |% q$ b
执行sgid权限的程序时,此用户将继承此程序的所属组权限 - 作用于目录上时:
& e# i/ `$ D! y$ g! o+ v- M/ v
此文件夹下所有用户新建文件都自动继承此目录的用户组. - SGID实例:
. a; H% W! {: r5 r; z& a0 v0 M- 作用在二进制程序上时,原理同SUID,只是由user位变为group位.
- 作用于目录上时演示:
& D$ W# o% u6 F9 b
普通帐户quintin在/tmp中创建一个目录叫quintindir,添加SGID.权限777 $ chmod 2777 quintindir/ $ ll -d quintindir/ drwxrwsrwx. 2 quintin quintin 6 Nov 18 14:42 quintindir/
& r/ h& P* p0 H5 ^4 {5 a 切换到普通用户user1,在quintindir目录中创建一个文件和一个目录 $ touch user1file $ mkdir user1dir $ ll -rw-rw-r--. 1 user1 quintin 0 Nov 18 14:47 user1file drwxrwsr-x. 2 user1 quintin 6 Nov 18 14:47 user1dir % a6 b9 c0 e7 f% i- e8 Y4 F$ F
结果显示,user1在quintindir目录下创建的文件和目录都自动继承了quintindir的属组 而且新目录的权限也继承了SGID. 所以设定了SGID的目录中的所有新建文件和目录都会自动属于quintin组. 四. Sticky粘滞位 - 权限设定方法:' W+ i6 g, J9 p7 [: p
- 字母表示法:
* M9 B9 J$ `, f7 i& u+ Q9 P
chmod o+t DIR... chmod o-t DIR... chmod +t DIR... - 数字表示法:
+ q5 d+ R! d: ]# y
chmod 1755 DIR 在普通数字权限位前,用1代表添加Sticky位 - 文件权限表示:+ q& f! S+ K& p# T9 T
# ll -d tmp drwxrwxrwt. 2 root root 19 Nov 17 20:02 tmp * x9 k- g7 c; b3 z1 h
. H! x/ A$ z5 k 文件other位的x权限,用t代替.表示被设置了Sticky 如果other位没有x权限,会显示为大写T,表示有故障(权限无效) - Sticky相关说明:
9 A+ ^% U) {0 f; f# e( k- 对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除和改名自己的文件或目录;
- 只能作用在目录上.普通文件设置无意义,且会被linux内核忽略
- 用户在设置Sticky权限的目录下新建的目录不会自动继承Sticky权限5 Y4 ~! W6 I- u6 n" ^% W
- Sticky实例:
2 t) g- X) ]7 l6 J8 K
我希望在系统中创建一个很多用户可以共同使用的目录,但是要求用户之间不能互相删除改变对方的文件. - 实现:
7 A- ]. a2 p1 Z6 s) H
root用户先创建一个777权限目录/app/tmp 普通用户quintin和wang分别在其中创建几个文件和目录 这时候有个问题,就是目录中的任何用户都可以随意删除其他人的文件. 所以root要给/tmp这个文件夹设定一个Sticky位. # chmod 1777 tmp # ll -d tmp drwxrwxrwt. 5 root root 97 Nov 20 00:49 tmp
3 Y3 A' \) J- H 设定完毕可见目录tmp的other权限中的x位已经显示为t.说明已设定成功. 切换到quintin用户,进入/app/tmp目录 尝试删除或改名用户wang的文件或目录 改名文件 [quintin@centos7 /app/tmp]$ mv wangf1 aaa mv: cannot move ‘wangf1’ to ‘aaa’: Operation not permitted : p: B t, l3 p) I3 Q! `
改名目录 [quintin@centos7 /app/tmp]$ mv wangd1 bbb mv: cannot move ‘wangd1’ to ‘bbb’: Operation not permitted
# |- K2 x! s3 _9 S+ [7 y0 c 移动文件 [quintin@centos7 /app/tmp]$ mv wangf1 qdir1/ mv: cannot move ‘wangf1’ to ‘qdir1/wangf1’: Operation not permitted / N. }6 Y" T! G7 R" U# T: c" ~
删除文件 [quintin@centos7 /app/tmp]$ rm -f wangf1 rm: cannot remove ‘wangf1’: Operation not permitted ; N2 }4 f8 O& N. Q1 Q
删除目录 [quintin@centos7 /app/tmp]$ rm -f wangf1 rm: cannot remove ‘wangf1’: Operation not permitted ( o2 t* n+ H) G2 x5 X5 P
以上所有操作均提示Operation not permitted,表明Sticky权限已发挥作用. - 提示:
' ~, P. o/ Z' @" G: H) k
普通用户在设定了Sticky位的目录下创建的子目录不会继承这个Sticky权限,所以要注意设定好自己目录的权限. 五. 总结: - 作用范围及功能:6 g* g$ l& z1 J# h+ C9 c6 {
- SUID:作用于文件(二进制程序)
9 R, [& \7 L9 K0 @0 p: U# r
此用户将继承此程序的所有者权限 - SGID:作用于文件(二进制程序)和目录: C5 U$ o3 B" ^/ q, \/ Q7 l
- 对于文件:
0 {4 M/ n- Z( H# F0 |4 x
此用户将继承此程序的所属组权限. - 对于目录:+ J C" J- I, K* e+ x# T
此文件夹下所有用户新建文件都自动继承此目录的用户组. - Sticky:作用于目录
8 A3 ~. Z* j/ E# `
设定后,目录中的用户只能删除、移动或改名自己的文件或目录 | 二进制文件 | 目录 | SUID | 此用户将继承此程序的所有者权限 | 无意义 | SGID | 此用户将继承此程序的所属组权限 | 此目录下所有用户新建文件都自动继承此目录的用户组 | Sticky | 无意义 | 目录中每个用户仅能删除、移动或改名自己的文件或目录 | 4 ^6 s# P1 M8 f0 w( y. {
- 添加权限方法及注意事项:
$ Z; j' b8 e7 L
- 字母权限法很灵活,无论目录还是文件都可以随意添加删除超级权限$ f2 r( [5 p7 f/ Q9 U
chmod u+s ... 添加SUID chmod g+s ... 添加SGID chmod +s ...同时添加SUID和SGID chmod -s ...同时删除SUID和SGID chmod o+t ...添加Sticky chmod +t ...同上 - 数字权限表示法添加/删除时:5 s& I& `, f, ^+ z8 z
- 数字权限法可以同时删除文件的所有三种超级权限
4 @. h! `. Z& N1 |' z; \+ }
chmod 0755 FILE chmod 755 FILE - 数字权限法只能删除目录的Sticky.不能删除目录的SUID和SGID.
- 数字权限法每次只能设置一种超级权限.添加权限时:& R5 J" m0 Z2 z6 G5 G# u$ ^
对于文件,会删除掉原有的其他超级权限. 对于目录,添加SUID或SGID时,Sticky会被删除. - 所有表示为大写字母的权限均为无效(故障)权限,因为缺少了相应的x权限.1 a! w8 i3 f- @& m: y% x' ]$ S0 R2 E
- 几个权限位映射参考:3 Z$ I4 o1 |$ d9 l8 q+ M3 E# w
SUID: user, 占据属主的执行权限位; s: 属主拥有x权限 S:属主没有x权限 SGID: group, 占据group的执行权限位; s: group拥有x权限 S:group没有x权限 Sticky: other, 占据ohter的执行权限位; t: other拥有x权限 T:other没有x权限 : t8 [8 K: R) Q0 Q
|