zoukankan      html  css  js  c++  java
  • Linux 文件特殊权限 SUID SGID SBIT

      文件除了常规的权限r, w, x 还有一些特殊的权限,s与t权限,具体的用处如下

      1 SetUID

      当s 这个标志出现在文件所有者的x权限上时, 例如/usr/bin/passwd,

    [root@oracledb ~]# ll -d /usr/bin/passwd
    -rwsr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd

    这个文件的权限状态为 -rwsr-xr-x 此时被称作Set UID 简称SUID 的特殊权限。 那么SUID的权限对于一个文件的特殊功能是什么呢?

    SUID 仅对二进制程序有效;

    执行者对于该程序需要具有x的可执行权限;

    本权限仅在执行程序过程中有效;

    执行者将具有该程序所有者的权限;

     

    举个例子,我们linux系统中, 所有账号的密码都记录在/etc/shadow 这个文件中,这个文件的权限为---------- 1 root root 1401 Jun 27 16:17 /etc/shadow, 意思是这个文件仅有root可以强制写入。 既然这个文件只有root 可以修改, 那么其他账户能否自己修改自己的密码呢? 显然是可以的,结果不是很冲突麽!

    表面上 /etc/shadow  明明只能root强制修改,一般用户不能访问,为什么一般用户还能够修改这个文件内的密码呢?这就是SUID的功能,

    • 普通用户对于/usr/bin/passwd具有x 权限的,它能够执行passwd这个命令;
    • passwd这个命令的拥有者是root;
    •  普通用户执行passwd的过程中,会“暂时”获得root权限;
    • 普通用户执行passwd命令时暂时获得root权限时就可以修改/etc/shadow

     

    如果普通用户执行cat命令去读取/etc/shadow时,能够读取吗?显然不能,因为cat 不具有SUID权限。

    此外SUID仅可用在二进制程序上,不能够用在shell script上。

     

    2 Set GID

    当s 标志在文件所有者的x 项目为SUID, 那 s 在用户的 x 时称为Set GID即 SGID. 举个例子来说明

    [root@oracledb ~]# ls -l /usr/bin/locate
    -rwx--s--x. 1 root slocate 38464 Oct 10 2012 /usr/bin/locate

     /usr/bin/locate 这个程序可以去查询 /var/lib/mlocate/mlocate.db 这个文件的内容,因为他们属于同一个用户组,如果我们使用普通账号执行locate时, 那这个账号就可以取得slocate 用户组的支持,因此它就可以访问mlocate.db的内容

     

    [root@oracledb ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
    -rwx--s--x. 1 root slocate 38464 Oct 10 2012 /usr/bin/locate
    -rw-r----- 1 root slocate 4028188 Jun 27 03:13 /var/lib/mlocate/mlocate.db

     

    与SUID不同的是,SGID可以针对文件或者目录来设置。如果是针对文件,SGID与SUID类似

    • SGID 仅对二进制程序有用;
    • 程序执行者对于该程序需要具备 x 的权限;
    • 执行者在执行的过程中获得该程序用户组的支持;

      除了二进制程序之外,SGID能够用在目录上, 当一个目录设置了SGID之后具有如下功能:

    • 用户若对于此目录具有 x 与 r 的权限时,该用户能够进入此目录;
    • 用户在此目录下的有效用户组将会变成该目录的用户组;
    • 若用户在此目录下具有w权限, 则用户所创建的新文件的用户组与此目录的用户组相同;

      3 Sticky Bit

      Sticky Bit 仅针对目录有效, 它对于目录的作用是:

    • 当用户对于此目录具有 w, x 权限时;
    • 当用户在该目录下创建文件或目录时,仅有自己与root 才有权利删除该文件;

      举例来说, /tmp 本身的权利是 drwxrwxrwt 这样的权限下任何人都可以在 /tmp 内添加、修改文件,但仅有该文件/目录创建者与root 能够删除自己的目录或者文件,这个特性非常重要。

      4 SUID/SGUID/SBIT 权限设置

      如何配置文件或者目录使其具有SUID与SGID的权限呢,我们在之前的配置r, w, x的数字前面加上一个数字就可以配置权限了

    • 4 为SGUID
    • 2 为SGID
    • 1 为 SBIT

      举例,如果将一个文件权限改为 "-rwsr-xr-r" 时,由于s 在用户权限中,所以是SUID,在原来的基础755之前加上4即可, chmod 4755 filename

     5  实际应用

    系统中有两个用户,分别是latiny1 与latiny2,这两个用户除了自己的用户组还共同支持另外一个用户组project,如果这两个用户需要共同拥有/srv/ahome目录开发权限,且该目录不允许其他人进入查阅。此时我们该如何设置该目录的权限?

     

    1) 创建用户

    [root@oracledb srv]# useradd -G project latiny1
    [root@oracledb srv]# useradd -G project latiny2
    [root@oracledb srv]# id latiny1
    uid=503(latiny1) gid=504(latiny1) groups=504(latiny1),501(project)
    [root@oracledb srv]# id latiny2
    uid=504(latiny2) gid=505(latiny2) groups=505(latiny2),501(project)

     

      2) 创建目录

    [root@oracledb srv]# mkdir ahome
    [root@oracledb srv]# ls -l
    total 4
    drwxr-xr-x 2 root root 4096 Jul 3 11:10 ahome
    [root@oracledb srv]# chgrp project ahome/
    [root@oracledb srv]# ls -l
    total 4
    drwxr-xr-x 2 root project 4096 Jul 3 11:10 ahome
    [root@oracledb srv]# chmod 770 ahome
    [root@oracledb srv]# ls -l
    total 4
    drwxrwx--- 2 root project 4096 Jul 3 11:10 ahome

     

    3) 测试两个账户能否互相编辑对方在目录ahome下的创建的文件

    [root@oracledb srv]# su - latiny1
    [latiny1@oracledb ~]$ cd /srv/ahome
    [latiny1@oracledb ahome]$ touch lainty1;
    [latiny1@oracledb ahome]$ ls -l
    total 0
    -rw-rw-r-- 1 latiny1 latiny1 0 Jul 3 11:13 lainty1
    [latiny1@oracledb ahome]$ su - lainty2
    su: user lainty2 does not exist
    [latiny1@oracledb ahome]$ su - latiny2
    Password:
    [latiny2@oracledb ~]$ cd /srv/ahome/
    [latiny2@oracledb ahome]$ ls -l
    total 0
    -rw-rw-r-- 1 latiny1 latiny1 0 Jul 3 11:13 lainty1
    [latiny2@oracledb ahome]$ vim lainty1

     

     

    测试结果显示latiny1创建的文件对应的用户组是latiny1, latiny2不能修改,显然目录/srv/ahome没有达到这两个用户共同开发的目的.

     

    我们加入SGID权限试试

    latiny2@oracledb ahome]$ su - root
    Password:
    [root@oracledb ~]# chmod 2770 /srv/ahome/
    [root@oracledb ~]# cd /srv
    [root@oracledb srv]# ls -l
    total 4
    drwxrws--- 2 root project 4096 Jul 3 11:13 ahome

     

    由于目录/srv/ahome被添加了SGID权限,latiny2在此目录下创建的文件用户组为project,并且lainty1可以编辑latiny2创建的文件,而之前latiny1创建的文件用户组为latiny1,latiny2不能编辑。

    [latiny2@oracledb ahome]$ touch latiny2
    [latiny2@oracledb ahome]$ su - latiny1
    Password:
    [latiny1@oracledb ~]$ cd /srv/ahome/
    [latiny1@oracledb ahome]$ ls -l
    total 0
    -rw-rw-r-- 1 latiny1 latiny1 0 Jul 3 11:13 lainty1
    -rw-rw-r-- 1 latiny2 project 0 Jul 3 11:19 latiny2
    [latiny1@oracledb ahome]$ vim latiny2

     

  • 相关阅读:
    Python
    版本控制
    后台
    前端
    提升权限 关闭系统
    SC命令(windows服务开启/禁用)
    获取当前电脑全部网络连接名字
    x64 win64编译环境下ADO链接Access数据库的问题解决
    Netsh命令-网络禁用开启
    windows主机防护
  • 原文地址:https://www.cnblogs.com/Latiny/p/7086529.html
Copyright © 2011-2022 走看看