欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Linux 特殊权限

程序员文章站 2022-06-22 15:50:20
"普通权限管理详细说明" 一,特殊权限:SUID,SGID,STICKY 1,SUID 默认情况下,用户发起的进程的属主是其发起者,因此,进程以发起者的身份去访问别的资源。 SUID的作用:用户执行某个程序文件时,如果此程序文件拥有SUID权限,则此进程的属主不是其发起者,而是这个程序文件的属主。 ......

一,特殊权限:suid,sgid,sticky

1,suid

  • 默认情况下,用户发起的进程的属主是其发起者,因此,进程以发起者的身份去访问别的资源。

    suid的作用:用户执行某个程序文件时,如果此程序文件拥有suid权限,则此进程的属主不是其发起者,而是这个程序文件的属主。

    suid权限的风险很大!

  • 管理文件的suid权限:chmod u+|-s file...

    展示位置:属主的执行权限位。

    • 原来属主有执行权限:显示为小写的s。
    • 原来属主没有执行权限:显示为大写的s。

    例子:非root用户是无法使用/bin/cat命令查看/etc/shadow文件的内容的。

    拷贝/bin/cat到/home/ys/bin下,给/home/ys/bin/cat加上suid后,就可以使用/home/ys/bin/cat命令,查看/etc/shadow文件的内容了。

    # ll /etc/shadow
    ----------. 1 root root 1674 dec 24 17:19 /etc/shadow
    # su - ys
    $ cat /etc/shadow
    cat: /etc/shadow: permission denied
    # ll /bin/cat
    -rwxr-xr-x. 1 root root 54160 oct 31  2018 /bin/cat
    # cp /bin/cat /home/ys/bin/
    # ll /home/ys/bin/
    -rwxr-xr-x. 1 root root 54160 dec 24 18:17 cat
    # su - ys
    $ /home/ys/bin/cat /etc/shadow
    /home/ys/bin/cat: /etc/shadow: permission denied
    $ sudo chmod u+s /home/ys/bin/cat
    $ ll /home/ys/bin/cat
    -rwsr-xr-x. 1 root root 54160 dec 24 18:17 /home/ys/bin/cat
    $ /home/ys/bin/cat /etc/shadow > /dev/null
    $ echo $?
    0
  • 由于没有个用户都可以修改自己的密码,所以程序/bin/passwd就必须有suid权限。因为修改密码要修改/etc/passwd文件,这个文件只有root用户才有写权限。所以普通用户运行/bin/passwd,就必须用root的身份运行,才能够修改/etc/passwd文件。

    $ ll /bin/passwd
    -rwsr-xr-x. 1 root root 27832 jun 10  2014 /bin/passwd
    $ ll /etc/passwd
    -rw-r--r--. 1 root root 2643 dec 23 21:38 /etc/passwd

2, sgid

  • 用户fedora和gentoo都在组mageedu里。目录/tmp/test的属组是mageedu。

    让fedora用户在目录/tmp/test下创建文件a.fedora,a.fedora文件的属组是用户fedora的基本组,也就是fedora。

    让gentoo用户在目录/tmp/test下创建文件a.gentoo,a.gentoo文件的属组是用户gentoo的基本组,也就是gentoo。

    有个需求,希望同一组的用户,在某个目录下创建的文件,组里的成员都有权限修改。上面的2个用户虽然都在组mageedu里,但是创建文件时,默认的属组是用户的基本组,有没有一个办法,让创建文件的属组自动是此目录的属组呢?sgid就登场了!

  • sgid用途:设置在目录的属组上。效果是,在此目录下创建的文件的属组,是此目录的属组,而不是用户的基本组了

    # ll -d /tmp/test
    drwxrwxr-x. 2 ys mageedu 6 dec 24 19:16 /tmp/test
    # id fedora
    uid=1005(fedora) gid=1005(fedora) groups=1005(fedora),5000(mageedu)
    # id gentoo
    uid=1004(gentoo) gid=1004(gentoo) groups=1004(gentoo),1001(za1),5000(mageedu)
    # su - fedora
    last login: thu dec 19 21:35:48 cst 2019 on pts/2
    $ cd /tmp/test
    $ touch a.fedora
    $ ll
    -rw-rw-r--. 1 fedora fedora 0 dec 24 19:24 a.fedora
    # su - gentoo
    last login: tue dec 24 17:19:49 cst 2019 on pts/2
    $ cd /tmp/test
    $ touch a.gentoo
    $ ll
    -rw-rw-r--. 1 fedora fedora 0 dec 24 19:24 a.fedora
    -rw-rw-r--. 1 gentoo gentoo 0 dec 24 19:33 a.gentoo
    # chmod g+s /tmp/test
    # ll -d /tmp/test
    drwxrwsr-x. 2 ys mageedu 38 dec 24 19:33 /tmp/test
    # su - fedora
    last login: tue dec 24 19:23:49 cst 2019 on pts/1
    $ cd /tmp/test
    $ touch b.fedora
    $ ll
    -rw-rw-r--. 1 fedora fedora  0 dec 24 19:24 a.fedora
    -rw-rw-r--. 1 gentoo gentoo  0 dec 24 19:33 a.gentoo
    -rw-rw-r--. 1 fedora mageedu 0 dec 24 19:35 b.fedora
    # su - gentoo
    last login: tue dec 24 19:33:15 cst 2019 on pts/1
    $ cd /tmp/test
    $ touch b.gentoo
    $ ll
    -rw-rw-r--. 1 fedora fedora  0 dec 24 19:24 a.fedora
    -rw-rw-r--. 1 gentoo gentoo  0 dec 24 19:33 a.gentoo
    -rw-rw-r--. 1 fedora mageedu 0 dec 24 19:35 b.fedora
    -rw-rw-r--. 1 gentoo mageedu 0 dec 24 19:35 b.gentoo
    # su - ys
    last login: tue dec 24 19:14:42 cst 2019 from 10.247.236.90 on pts/1
    $ cd /tmp/test
    $ touch a.ys
    $ ll
    -rw-rw-r--. 1 fedora fedora  0 dec 24 19:24 a.fedora
    -rw-rw-r--. 1 gentoo gentoo  0 dec 24 19:33 a.gentoo
    -rw-rw-r--. 1 ys     mageedu 0 dec 24 19:38 a.ys
    -rw-rw-r--. 1 fedora mageedu 0 dec 24 19:35 b.fedora
    -rw-rw-r--. 1 gentoo mageedu 0 dec 24 19:35 b.gentoo
    [ys@localhost test]$ id ys
    uid=1000(ys) gid=1000(ys) groups=1000(ys),10(wheel)
  • 管理文件的guid权限:chmod g+|-s file...

    展示位置:属组的执行权限位。

    • 原来属主有执行权限:显示为小写的s。
    • 原来属主没有执行权限:显示为大写的s。

3,sticky

  • 如果某个用户拥有对某个目录的写权限,则他可以删除这个目录里的任何文件,也就是可以删除此目录里别的用户创建的文件。

    有个需求,不希望自己创建的文件被别的用户删除掉。sticky登场了!

  • sticky用途:设置在目录的other上。效果是,在此目录下文件,只有是自己创建的才可以删除。

    $ ls -ld /tmp/test
    drwxrwsr-x. 2 ys mageedu 70 dec 24 19:59 /tmp/test
    $ pwd
    /tmp/test
    $ ll
    -rw-rw-r--. 1 fedora fedora  0 dec 24 19:24 a.fedora
    -rw-rw-r--. 1 ys     mageedu 4 dec 24 19:50 a.ys
    -rw-rw-r--. 1 fedora mageedu 4 dec 24 19:51 b.fedora
    -rw-rw-r--. 1 gentoo mageedu 4 dec 24 19:50 b.gentoo
    -rw-rw-r--. 1 fedora mageedu 0 dec 24 19:51 c.fedora
    -rw-rw-r--. 1 gentoo mageedu 0 dec 24 19:51 c.gentoo
    [fedora@localhost test]$ whoami
    fedora
    [fedora@localhost test]$ rm a.ys
    [fedora@localhost test]$ rm b.gentoo
    [fedora@localhost test]$ ll
    -rw-rw-r--. 1 fedora fedora  0 dec 24 19:24 a.fedora
    -rw-rw-r--. 1 fedora mageedu 4 dec 24 19:51 b.fedora
    -rw-rw-r--. 1 fedora mageedu 0 dec 24 19:51 c.fedora
    -rw-rw-r--. 1 gentoo mageedu 0 dec 24 19:51 c.gentoo
    用户fedora可以删除别的用户创建的文件。
    修改此目录的sticky
    # chmod o+t /tmp/test
    # ll -d /tmp/test
    drwxrwsr-t. 2 ys mageedu 70 dec 24 19:59 /tmp/test
    # su - gentoo
    last login: tue dec 24 19:50:46 cst 2019 on pts/1
    $ cd /tmp/test
    $ ll
    -rw-rw-r--. 1 fedora fedora  0 dec 24 19:24 a.fedora
    -rw-rw-r--. 1 fedora mageedu 4 dec 24 19:51 b.fedora
    -rw-rw-r--. 1 fedora mageedu 0 dec 24 19:51 c.fedora
    -rw-rw-r--. 1 gentoo mageedu 0 dec 24 19:51 c.gentoo
    $ rm a.fedora
    rm: remove write-protected regular empty file ‘a.fedora’? y
    rm: cannot remove ‘a.fedora’: operation not permitted
    $ rm c.gentoo
    $ ll
    -rw-rw-r--. 1 fedora fedora  0 dec 24 19:24 a.fedora
    -rw-rw-r--. 1 fedora mageedu 4 dec 24 19:51 b.fedora
    -rw-rw-r--. 1 fedora mageedu 0 dec 24 19:51 c.fedora
    修改sticky后,就不能删除别的用户创建的文件了,只可以删除自己创建的文件。
  • 系统上/tmp和/var/tmp目录,默认都有sticky权限。

  • 管理文件的guid权限:chmod o+|-t file...

    展示位置:other的执行权限位。

    • 原来属主有执行权限:显示为小写的t。
    • 原来属主没有执行权限:显示为大写的t。

四,管理特殊权限的另一种方法:

suid sgid sticy 八进制权限
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7

又组成了一组,类似rwx的权限位。

所以,可在默认的3位八进制数字的左侧再加一位八进制数字,来表示各种组合。

chmod 1777 file...

chmod 4777 file...

...

二,文件访问权限列表(file access control list)

文件除了有user,group,other的权限控制外,还有一个更灵活的权限控制机制。

可以针对某个文件,让特定的某些用户,或组访问。

这个功能就叫facl

1,查看文件的额外访问权限:getfacl files

下面的/tmp/test/a.fedora没有额外的权限控制,所以别的用户无法修改此文件。

$ ll a.fedora
-rw-rw-r--. 1 fedora fedora  0 dec 24 19:24 a.fedora
$ getfacl /tmp/test/a.fedora
getfacl: removing leading '/' from absolute path names
# file: tmp/test/a.fedora
# owner: fedora
# group: fedora
user::rw-
group::rw-
other::r--

2,给文件添加额外的权限控制:setfacl -m user/group:user/group:xxx files

给/tmp/test/a.fedora添加额外的权限控制。赋予用户ys可以修改此文件的权限。

赋予权限后再other的可执行权限位的后面多了个加号。

$ whoami
fedora
$ setfacl -m user:ys:rw a.fedora
$ getfacl a.fedora
# file: a.fedora
# owner: fedora
# group: fedora
user::rw-
user:ys:rw-
group::rw-
mask::rw-
other::r--

$ ll
-rw-rw-r--+ 1 fedora fedora  0 dec 24 19:24 a.fedora
$ whoami
ys
$ echo 111 >> a.fedora
$ cat a.fedora
111

给/tmp/test/a.fedora添加额外的权限控制。赋予组mageedu可以修改此文件的权限。

$ whoami
fedora
$ setfacl -m group:mageedu:rw a.fedora
$ getfacl a.fedora
# file: a.fedora
# owner: fedora
# group: fedora
user::rw-
user:ys:rw-
group::rw-
group:mageedu:rw-
mask::rw-
other::r--
$ id gentoo
uid=1004(gentoo) gid=1004(gentoo) groups=1004(gentoo),1001(za1),5000(mageedu)
$ whoami
gentoo
$ cd /tmp/test
$ ll
-rw-rw-r--+ 1 fedora fedora  4 dec 24 22:10 a.fedora
$ echo 44444 >> a.fedora
$ cat a.fedora
111
44444

3,删除文件的额外权限控制:setfacl -x user/group files

$ getfacl a.fedora
# file: a.fedora
# owner: fedora
# group: fedora
user::rw-
user:ys:rw-
group::rw-
group:mageedu:rw-
mask::rw-
other::r--
$ setfacl -x user:ys a.fedora
$ getfacl a.fedora
# file: a.fedora
# owner: fedora
# group: fedora
user::rw-
group::rw-
group:mageedu:rw-
mask::rw-
other::r--
$ setfacl -x group:mageedu a.fedora
$ getfacl a.fedora
# file: a.fedora
# owner: fedora
# group: fedora
user::rw-
group::rw-
mask::rw-
other::r--

4,linux的权限判断逻辑:

  • 首先判断启动进程的用户是否和file的user相同?

    • 相同:使用第一组rwx
    • 不相同:判断启动进程的用户是否在file的额外可访问用户的列表里面?
      • 在额外可访问用户的列表里面:使用额外可访问用户的rwx
      • 不在额外可访问用户的列表里面:判断启动进程的用户是否在file的group里面?
        • 在group里面:使用第二组rwx
        • 不在group里面:判断启动进程的用户是否在file的额外可访问组的列表里面?
          • 在额外可访问组里面:使用额外可访问组的rwx
          • 不在额外可访问组里面:使用第三组rwx
  • 如果某个文件的other权限是可写的,但是额外权限是不可写的,则也是不可写的。

  • 验证:

    $ ll
    -rw-rw-rw-. 1 fedora mageedu  4 dec 24 19:51 b.fedora
    $ su - ys
    last login: tue dec 24 22:10:28 cst 2019 on pts/2
    $ cd /tmp/test
    $ echo "im ys" > b.fedora
    $ cat b.fedora
    im ys
    $ setfacl -m user:ys:--- b.fedora
    $ getfacl b.fedora
    # file: b.fedora
    # owner: fedora
    # group: mageedu
    user::rw-
    user:ys:---
    group::rw-
    mask::rw-
    other::rw-
    $ ll
    -rw-rw-rw-+ 1 fedora mageedu  6 dec 24 22:37 b.fedora
    $ su - ys
    last login: tue dec 24 22:36:43 cst 2019 on pts/2
    $ cd /tmp/test
    $ echo 3232 >> b.fedora
    -bash: b.fedora: permission denied

c/c++ 学习互助qq群:877684253

Linux 特殊权限

本人微信:xiaoshitou5854