易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 3398|回复: 0
收起左侧

特殊权限 SUID、SGID、Sticky

[复制链接]
发表于 2020-4-27 10:27:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
一. 前提
本篇主要讲解SUID, SGID, Sticky三个权限的基本原理和应用.
为什么要使用特殊权限?
比如系统中假如有超过四类人然而每一类人都需要一种独特权限.只有三种独特权限的基础权限系统就会明显不够用.
特殊权限可以扩展系统基础权限的功能,使得linux权限更加强大灵活.
在理解特殊权限之前,需要先具备几个关于安全上下文的认知:
前提:进程有属主和属组;文件有属主和属组;
(1) 任何一个可执行程序文件能不能启动为进程:取决于发起者对程序文件是否拥有执行权限;
(2) 启动为进程之后,其进程的属主为发起者;进程的属组为发起者所属的组;
(3) 进程访问文件时的权限,取决于进程的发起者:
(a) 进程的发起者,同文件的属主:则应用文件属主权限;
(b) 进程的发起者,属于文件的属组;则应用文件属组权限;
(c) 应用文件“其它”权限;
. SUID
  • 权限设定方法:( t' U8 z" U& Y3 M
    • 字母表示法:
      5 Y; @9 i- e) |* S( l! Y
chmod u+s FILE...
chmod u-s FILE...
  • 数字表示法:3 C. B9 J6 j7 {# Q1 ^9 {
chmod 4755 FILE 添加SUID权限到二进制程序文件(添加到DIR无意义)
& |' P) X4 q/ o( R) _0 o, d
在普通三位数字权限位之前,用4代表添加的SUID位
/ i' w' Y- g  p. ]5 j8 T  g
chmod 0xxx .... 可以删除文件的SUID(无法删除目录的SUID)  
  • 文件权限表示:7 g- ~& i& }( L8 a
      # ll f1      -rwsr-xr-x. 1 root root 0 Nov 17 20:18 f1
* D" B7 {% C8 P# L3 n  ]
      文件属主的x权限,用s代替.表示被设置了SUID
      如果属主位没有x权限,会显示为大写S,表示有故障(权限无效)
  • SUID相关说明:
    2 S0 a* O; q9 T7 G
    • 启动为进程之后,其进程的属主为原程序文件的属主;
    • 只能作用在二进制程序上,不能作用在脚本上,且设置在目录上无意义 ;
    • 执行suid权限的程序时,此用户将继承此程序的所有者权限;
      4 `, i; }# [8 C& b: x; \- T
  • SUID工作原理
    9 m8 V5 o3 S3 {* x, w
  • 环境前提:
    % S9 h  @/ b4 N$ X8 R0 v# O
    • linux中有一个二进制程序cat,属主属组均为root
    • linux中有一个系统文件/etc/shadow,属主属组均为root
    • 我们创建一个普通用户叫user1
    • user1具有对cat的执行权限
    • user1 不具有对/etc/shadow的任何权限/ f. U' N* }+ `9 _* {/ v  C: s8 y
  • 默认情况下
    * J4 D. l9 g5 M' I* A& b
    • user1执行cat,系统创建一个cat进程,进程的属主属组取程序发起者,也就是user1:user1
    • cat进程访问/etc/shadow,由于进程属主属组是user1:user1,与/etc/shadow的属组属主都不匹配,所以被拒绝访问.
      6 S8 n& H; {2 D; w0 O3 p- P2 q
  • 给cat设置SUID之后/ R' D6 O% S1 U0 O! _- K' K6 y
    • user1执行cat.系统创建一个cat进程,进程的属主取cat的属主,属组取程序发起者,就是root:user1
    • cat进程访问/etc/shadow,由于进程属主是root,与/etc/shadow的属主匹配,所以被允许访问.
      0 O, H, o5 X6 m
  • 举例说明:! s- ~6 f  @! w
passwd命令是linux系统中用来修改密码的命令.系统中所有用户都可以使用.
而passwd命令改密码的行为是通过修改/etc/shadow文件来实现.
看一下/etc/shadow的文件权限:
    # ll /etc/shadow   ----------. 1 root root 1771 Nov 16 17:06 /etc/shadow 7 u! S6 y3 @) x$ B4 ?0 X7 F* o
可见/etc/shadow对普通用户没有任何权限.
所以普通用户默认无法使用文本编辑器打开或者编辑这个文件.
那为什么通过passwd这个命令就可以编辑呢?
用ls命令查看passwd命令的源文件信息:
    # ls -l /usr/bin/passwd    -rwsr-xr-x. 1 root root 30768 2月  22 2012 /usr/bin/passwd
/ o& a% |! G0 S' B% i6 R; w# U" i
我们发现passwd这个程序的属主位的执行位不是x而是s,说明passwd被设置了特殊权限SUID.
于是普通用户运行passwd命令,系统创建的passwd进程的属主由默认为"程序发起者"变为了passwd的属主
而passwd的属主是root,所以普通用户其实是在用root的权限修改/etc/shadow文件.最后passwd命令执行结束,passwd进程被关闭.
  • 做个实验:3 i4 d5 K  ]0 v% g; V7 R/ O
给命令vim添加SUID,可以让普通用户自己把自己变为超级用户.
看一下vim的原权限
    #ll /usr/bin/vim    -rwxr-xr-x. 1 root root 2289640 Aug  2 08:45 /usr/bin/vim
! C+ b0 A' m% K5 r% ]3 E0 }5 C
给vim加个SUID
    # chmod u+s /usr/bin/vim
$ }# _( o2 a% s/ f6 v9 ]
权限变为
    -rwsr-xr-x. 1 root root 2289640 Aug  2 08:45 /usr/bin/vim3 H! C& @1 y3 w/ @
现在用普通用户登录
    # su quintin
1 T0 ]# B9 I" Q" O
尝试使用vim编辑系统账户文件/etc/passwd
    $ vim /etc/passwd & K+ i* H; W) C" t) {
找到自己的用户名一行

. F4 L: x7 e4 x% c' J- z
) [/ E/ r, `3 ?
                               
登录/注册后可看大图
  
修改第三列自己的uid为0
root的uid不用改.
然后保存,提示只读文件,使用w!强制保存,成功!
/ J" f: ^' `  r& \) R
                               
登录/注册后可看大图
   
我们知道普通用户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
0 y7 p0 c& |3 w- Z5 _
                               
登录/注册后可看大图

1 |, w/ w/ Q/ g: N' L
因为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
8 p% M7 y8 x' u" e4 n
改个名字
    # mv f11 f1
; U4 G$ i* M$ T0 |/ ?& Z
成功.
三.  SGID
  • 权限设定方法:2 L0 s# W, d+ ?' b
    • 字母表示法
      6 T# H9 y2 Y4 I: ~& X3 k4 D7 l4 `
chmod g+s DIR/FILE...
chmod g-s DIR/FILE...
  • 数字表示法 :1 K; N! S* H# j4 \! l, S
chmod 2755  DIR/FILE 添加SGID到目录或文件
在普通数字权限位前,用2代表添加SGID位
chmod 0755 DIR/FILE 删除文件的SGID,(目录不受影响)
chmod 755 DIR/FILE 同上
  • 文件权限表示:
    0 J. T% S' w% N9 p
    # ll /app/f1    -rwxr-sr-x. 1 root root 0 Nov 17 20:18 /app/f1
6 V: R" P+ E& P! ]9 R4 i- Y
文件属组的x权限,用s代替.表示被设置了SGID
如果属组位没有x权限,会显示为大写S,表示有故障(权限无效)
  • SGID相关说明:; Q1 K, H' V5 D& a, H
    • 作用在二进制程序上时:
      2 I7 C0 L! \0 z+ |1 N3 {3 N
执行sgid权限的程序时,此用户将继承此程序的所属组权限
  • 作用于目录上时:# ^# m! V3 H' ]
此文件夹下所有用户新建文件都自动继承此目录的用户组.
  • SGID实例:
    % k% e8 H2 [  h, e3 g
    • 作用在二进制程序上时,原理同SUID,只是由user位变为group位.
    • 作用于目录上时演示:' o7 S2 a3 `0 d- k# S, |
普通帐户quintin在/tmp中创建一个目录叫quintindir,添加SGID.权限777
        $ chmod 2777 quintindir/        $ ll -d quintindir/        drwxrwsrwx. 2 quintin quintin 6 Nov 18 14:42 quintindir/
) ~  o1 ^6 ]" K4 F
切换到普通用户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 1 ^- v5 j+ Q+ j) n/ e2 {
结果显示,user1在quintindir目录下创建的文件和目录都自动继承了quintindir的属组
而且新目录的权限也继承了SGID.
所以设定了SGID的目录中的所有新建文件和目录都会自动属于quintin组.
四. Sticky粘滞位
  • 权限设定方法:
    0 y5 F3 f  J2 M$ Z+ K) r9 |
    • 字母表示法:
      # j' q4 w7 Y/ K
chmod o+t DIR...
chmod o-t DIR...
chmod +t DIR...
  • 数字表示法:
    " L8 K) m$ V6 L  k
chmod 1755 DIR
在普通数字权限位前,用1代表添加Sticky位
  • 文件权限表示:7 Z/ Z# z. ^% r4 K
      
         # ll -d tmp            drwxrwxrwt. 2 root root 19 Nov 17 20:02 tmp # t( t, Q1 P$ Z* C

6 E% X- G5 t; e, H$ Q
        文件other位的x权限,用t代替.表示被设置了Sticky
        如果other位没有x权限,会显示为大写T,表示有故障(权限无效)
  • Sticky相关说明:
    " K1 @: u4 m) l7 J4 C
    • 对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除和改名自己的文件或目录
    • 只能作用在目录上.普通文件设置无意义,且会被linux内核忽略
    • 用户在设置Sticky权限的目录下新建的目录不会自动继承Sticky权限7 W2 d! N2 b  N8 p  n8 D# u
  • Sticky实例: : A6 p" J8 X" N7 a
  • 目的:
    4 e3 Q2 r# _- Z' b
我希望在系统中创建一个很多用户可以共同使用的目录,但是要求用户之间不能互相删除改变对方的文件.
  • 实现:- x  q1 `: O2 U6 i8 q
root用户先创建一个777权限目录/app/tmp
普通用户quintin和wang分别在其中创建几个文件和目录
& l3 M/ X! A9 f; n9 _# X
                               
登录/注册后可看大图
这时候有个问题,就是目录中的任何用户都可以随意删除其他人的文件.
所以root要给/tmp这个文件夹设定一个Sticky位.
        # chmod 1777 tmp        # ll -d tmp        drwxrwxrwt. 5 root root 97 Nov 20 00:49 tmp 9 t: q8 i" d) a& c6 ]
设定完毕可见目录tmp的other权限中的x位已经显示为t.说明已设定成功.
  • 测试
    0 }5 ]! a/ M& s# @1 J! A/ o
切换到quintin用户,进入/app/tmp目录
尝试删除或改名用户wang的文件或目录
改名文件
      [quintin@centos7 /app/tmp]$ mv wangf1 aaa      mv: cannot move ‘wangf1’ to ‘aaa’: Operation not permitted
( Q' e# {# Q4 \9 d
改名目录
      [quintin@centos7 /app/tmp]$ mv wangd1 bbb      mv: cannot move ‘wangd1’ to ‘bbb’: Operation not permitted 9 r/ `( p1 J7 L' y. h: U
移动文件
      [quintin@centos7 /app/tmp]$ mv wangf1 qdir1/      mv: cannot move ‘wangf1’ to ‘qdir1/wangf1’: Operation not permitted
4 K8 A' N) `. ?; {1 ?
删除文件
      [quintin@centos7 /app/tmp]$ rm -f wangf1      rm: cannot remove ‘wangf1’: Operation not permitted 7 j" U4 K% g) r, X& x: Q0 B
删除目录
      [quintin@centos7 /app/tmp]$ rm -f wangf1      rm: cannot remove ‘wangf1’: Operation not permitted . Y. |  h! N4 E
以上所有操作均提示Operation not permitted,表明Sticky权限已发挥作用.
  • 提示:8 S5 _8 r) W% J7 K
普通用户在设定了Sticky位的目录下创建的子目录不会继承这个Sticky权限,所以要注意设定好自己目录的权限.
五. 总结:
  • 作用范围及功能:
    ' @3 Y7 i, x1 V% Z5 D  j# F
    • SUID:作用于文件(二进制程序)$ W7 t" H+ ~, ^7 C/ s# X
此用户将继承此程序的所有者权限
  • SGID:作用于文件(二进制程序)和目录
    : u: Z% ^' {1 c' `4 J5 u( a
    • 对于文件:
      7 n3 y! M6 F  J, E; b$ L
此用户将继承此程序的所属组权限.
  • 对于目录:. a! Y- W' Q0 t* Z
此文件夹下所有用户新建文件都自动继承此目录的用户组.
  • Sticky:作用于目录
    0 j/ R. x$ `9 H
设定后,目录中的用户只能删除、移动或改名自己的文件或目录
二进制文件
目录
SUID
此用户将继承此程序的所有者权限
无意义
SGID
此用户将继承此程序的所属组权限
此目录下所有用户新建文件都自动继承此目录的用户组
Sticky
无意义
目录中每个用户仅能删除、移动或改名自己的文件或目录

0 B1 c+ v+ _6 K( [' Z. P
  • 添加权限方法及注意事项:
    . i( q' W' n5 y( g2 r7 i
  • 字母权限法很灵活,无论目录还是文件都可以随意添加删除超级权限
    # q8 L, U+ f: w& o* n% H6 [& z
chmod u+s ... 添加SUID
chmod g+s ... 添加SGID
chmod +s ...同时添加SUID和SGID
chmod -s ...同时删除SUID和SGID
chmod o+t ...添加Sticky
chmod +t ...同上
  • 数字权限表示法添加/删除时:: I$ d9 i* O4 \& {1 B; _! {
    • 数字权限法可以同时删除文件的所有三种超级权限
      6 ?% [- K" R+ i( K" N6 K" y( L
chmod 0755 FILE
chmod  755 FILE
  • 数字权限法只能删除目录的Sticky.不能删除目录的SUID和SGID.
  • 数字权限法每次只能设置一种超级权限.添加权限时:
    / P! I) F6 E- e4 |, D4 y
对于文件,会删除掉原有的其他超级权限.
对于目录,添加SUID或SGID时,Sticky会被删除.
  • 所有表示为大写字母的权限均为无效(故障)权限,因为缺少了相应的x权限.
    ' q/ X) W/ e3 T2 L* }  w8 U9 W5 g( c% Y
  • 几个权限位映射参考:
    ) d8 E  I6 M' O/ ~
SUID: user, 占据属主的执行权限位;
s: 属主拥有x权限
S:属主没有x权限
SGID: group,  占据group的执行权限位;
s: group拥有x权限
S:group没有x权限
Sticky: other, 占据ohter的执行权限位;
t: other拥有x权限
T:other没有x权限

/ S0 a, b8 j2 F* K( `
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:38 , Processed in 0.063871 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表