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

linux之权限管理及访问控制列表

程序员文章站 2022-05-09 14:06:19
...

进程对文件的访问权限应用模型:

  • 首先检查进程的属主与文件的属主是否相同,如果相同,则应用属主权限;如果不同就查看suid权限,如果相同就使用suid权限;
  • 其次,则检查进程的属组是否属于文件的数组,如果是,则应用属组的权限;如果不同就查看sgid权限,如果相同就是用sgid权限
  • 最后只能应用 other 权限。

同用权限

权限说明

类型 r w x
文件 可读 可写 可将此文件运行为进程
目录 可以使用ls命令获取其下的所有文件列表 可以修改此目录下的文件列表,即创建和删除文件 可以 cd 至目录中,且可以使用 ls -l 来读取所有文件的详细属性信息

权限组合机制(八进制组合标识法)

原始 二进制 数字
000 0
–x 001 1
-w- 010 2
-wx 011 3
r– 100 4
r-x 101 5
rw- 110 6
rwx 111 7

ls -l可以发现符号链接类型的文件权限都是777,但实际上通过符号链接访问其指向的文件的时候,权限由其指向的文件权限决定的。

chmod

  1. chmod [OPTION]... MODE[,MODE]... FILE...

    MODE表示法:

    • 赋权表示法:直接操作一类用户的所有权限位。
      u=,g=,o=可以一起使用,也可以单独用其中一个,u=时表示属主没有权限,如果属组属主相同权限,可以ug=rxa=表示操作所有权限位
    • 授权表示法:操作一类用户的一个权限位。用法一般为u+r,g+x,o+w 或者u-r,g-x,o-wa+ 或者 a- 表示操作所有用户的权限位。
      linux之权限管理及访问控制列表
  2. chmod [OPTION]... OCTAL-MODE FILE...

    八进制权限表示法

    ## 修改前
    ls -l first.sh 
    # -rw-rw-r--. 1 vagrant vagrant 176 11月 18 14:58 first.sh
    ## 修改
    chmod 770 first.sh 
    ## 修改后
    ls -l first.sh 
    #-rwxrwx---. 1 vagrant vagrant 176 11月 18 14:58 first.sh
    
  3. chmod [OPTION]... --reference=RFILE FILE...

    引用参考目标文件的权限

    ##  参考目标文件
    ls -l /var/log/messages
    #-rw-------. 1 root root 70721 11月 18 15:16 /var/log/messages
    ## 将要被修改文件权限
    ls -l first.sh 
    #-rwxrwx---. 1 vagrant vagrant 176 11月 18 14:58 first.sh
    ## 修改文件权限为参考目标文件
    chmod --reference=/var/log/messages first.sh 
    ## 参考修改后的情况
    ls -l first.sh 
    #-rw-------. 1 vagrant vagrant 176 11月 18 14:58 first.sh
    

    选项: -R,--recursive递归修改,只对目录才有意义,可能会对没有执行权限的文件分配可执行权限,有风险,慎用

chown命令

chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。
具体用法看这里

特殊权限

  1. SUID:setuid,用户在运行二进制程序时,若此程序拥有SUID权限,则此程序会根据程序文件本身的属主身份运行,而不是调用此程序的用户.

    需要特别说明的suid仅对二进制命令程序有效,不能作用在shell等脚本文件上,而且suid权限仅在命令执行过程中有效。

    # 命令格式
    chmod u{+|-}s file...
    

    SUID的权限位在属主的可以执行权限x的位置,如果发起调用的用户原来有执行权限,则显示为s,否则显示为S

    给文件设置SUID,意思在于没权限不要紧,你只要来调用我就将我的属主权限借给你

    示例

    # 输出当前用户
    whoami
    # vagrant
    
    # 使用 cat 查看 /etc/shadow
    cat /etc/shadow
    # cat: /etc/shadow: permission denied
    
    
    # 查看 /etc/shadow 权限位情况,只有 root 用户才有权限
    ll /etc/shadow
    # ----------. 1 root root 919 6月  13 17:33 /etc/shadow
    

    root 是超级用户,对所有文件具有最大权限,给/etc/cat添加SUID,使其在被调用的时候,使用root权限,而不是调用者的权限。

    # 查看当前用户
    whoami
    # root
    
    # 查看 /bin/cat 的权限位
    ll /bin/cat
    # -rwxr-xr-x. 1 root root 54160 10月 30  2018 /bin/cat
    
    # 添加 SUID 权限
    chmod u+s /bin/cat
    ll /bin/cat
    # -rwsr-xr-x. 1 root root 54160 10月 30  2018 /bin/cat
    
    
    # 切换用户
    su - vagrant
    whoami
    # vagrant
    cat /etc/shadow
    # root:$1$GcxvZm4N$67SLqTRkOUb2z5dNFck6P1:18407:0:99999:7:::
    # bin:*:17834:0:99999:7:::
    # daemon:*:17834:0:99999:7:::
    # adm:*:17834:0:99999:7:::
    # lp:*:17834:0:99999:7:::
    # ...
    
  2. SGID

    sgid既可以针对文件也可以针对目录。

    对于文件来说,sgid仅对二进制命令程序有效,执行命令的用户可以获得该程序执行期间所属组的权限,这一点和suid基本类似。

    对于目录来说,意义就非常重大了。**当用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件,如果该目录用 SGID 修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。**若该目录的组拥有写权限,则可以互相修改彼此文件。

    # 命令格式
    chmod g{+|-}s file...
    

    SGID的权限位在属组的可以执行权限x的位置,如果发起调用的用户本身有执行权限,则显示为s,否则显示为S

    演示准备:

    # 准备两个两个用户 user1  user2 , 一个用户组 group1 , 并将 group1 设置为 user1 和 user2 的附加组
    useradd user1
    useradd user2
    groupadd group1
    usermod -aG group1 user1
    usermod -aG group1 user2
    
    # 查看命令执行情况
    id user1
    #uid=1006(user1) gid=1007(user1) groups=1007(user1),1009(group1)
    id user2
    #uid=1007(user2) gid=1008(user2) groups=1008(user2),1009(group1)
    
    # 给 user1 、user2 设置密码
    passwd user1
    # ...
    passwd user2
    # ...
    
    # 创建操作目录
    cd /tmp
    mkdir testsgid
    ll -d testsgid
    # drwxrwxr-x. 2 root root 6 Jun 14 03:42 testsgid
    chown :group1 testsgid
    chmod g+w testsgid
    ll -d testsgid
    # drwxrwxr-x. 2 root group1 6 Jun 14 03:52 /tmp/testsgid
    

    演示

    su - user1
    cd /tmp/testsgid
    touch user1.test
    ll user1.test
    # -rw-rw-r--. 1 user1 user1 0 Jun 14 03:44 user1.test
    ## 这里 user1.test 的属主和数组都是user1
    
    su - user2
    cd /tmp/testsgid
    touch user2.test
    ll user2.test
    # -rw-rw-r--. 1 user2 user2 0 Jun 14 03:57 user2.test
    ## 这里 user2.test 的属主和数组都是user2
    
    
    # 对 testsgid 添加 sgid 修饰
    chmod g+s /tmp/testsgid
    ll -d /tmp/testsgid
    # drwxrwsr-x. 2 root group1 42 Jun 14 03:57 /tmp/testsgid
    
    
    su - user2
    cd /tmp/testsgid
    touch user2.sgid.test
    ll user2.sgid.test
    # -rw-rw-r--. 1 user2 group1 0 Jun 14 04:03 user2.sgid.test
    ## 这时新创建文件的属主就变成 testsgid 文件夹的属主了
    
    ### ... 同样使用 user1 在 testsgid 中创建文件,属主也都变成 group1 了
    
    
  3. sticky

    一般情况下,对于属组/全局可写的目录,组内的所有用户/全局用户都可以在该目录创建文件或者删除文件,无论是否属主是否是自己。

    若是对目录使用了sticky权限,则每个用户都可以创建新文件/目录,但是只能删除属主是自己的部分。

    root用户除外,root依然可以删除所有。

    # 命令格式
    chmod o{+|-}t file...
    

    sticky的权限位在其他用户的可以执行权限x的位置,如果发起调用的用户本身有执行权限,则显示为s,否则显示为T

    sticky 权限目前只对目录有效,用来阻止非文件的所有者删除文件。系统中的/tmp/var/tmp两个目录默认就是具有sticky权限的。

    ll -d /tmp
    # drwxrwxrwt. 17 root root 4096 Jun 14 04:05 /tmp
    
    

    权限信息中最后一位 t 表明该目录被设置了 sticky 权限。

还有一种为特殊权限位设置权限的方式,在基于通用权限八进制授权机制的基础上,在左侧再增加一位八进制数字,用以表示特殊权限位。如 chmod 7777 file

facl 访问控制列表

file access control lists

这个功能主要是提供在传统的ugosuid/sgid/sticky之外的另一种更灵活、更精细的权限控制方式,通过facl可以针对单一的用户或者组设置特定的权限。

facl允许你给任何的用户或用户组设置任何文件/目录的访问权限。

  1. getfacl用来获取指定文件/目录的facl信息

    格式getfacl file_path

  2. setfacl用来设置文件/目录的facl权限

参数 示例 说明
-m setfacl -m u:username:rwx filepath
setfacl -m g:groupname:rwx filepath
配置后面的 acl 参数给文件/目录使用,不可与 -x 合用;
-x setfacl -x u:username filepath
setfacl -x g:username filepath
删除指定用户/组的所有 facl 参数,不可与 -m同用
-R setfacl -R -m g:groupname:rwx filepath 递归执行
-d 配置“默认 acl 参数”,只对目录有效,在该目录新建的数据会引用此默认值;
-b 移除所有的 ACL 配置参数;
$ getfacl user2.sgid.test 
# file: user2.sgid.test
# owner: user2
# group: group1
user::rw-
group::rw-
other::r--

$ setfacl -m u:user1:rwx user2.sgid.test 
$ getfacl user2.sgid.test 
# file: user2.sgid.test
# owner: user2
# group: group1
user::rw-
user:user1:rwx
group::rw-
mask::rwx
other::r--

$ setfacl -m g:basher:rwx user2.sgid.test
$ getfacl user2.sgid.test 
# file: user2.sgid.test
# owner: user2
# group: group1
user::rw-
user:user1:rwx
group::rw-
group:basher:rwx
mask::rwx
other::r--


$ ll user2.sgid.test
# 看到权限的后面多了个 + 号
-rw-rwxr--+ 1 user2 group1 0 Jun 14 04:03 user2.sgid.test

umask命令

umask 设置了用户创建文件的默认权限,它与 chmod 的效果刚好相反,umask设置的是权限“补码”,而chmod设置的是文件权限码。一般在/etc/profile$ [HOME]/.bash_profile$[HOME]/.profile中设置umask值。

一般来说,umask命令是在/etc/profile文件中设置的,每个用户在登录时都会引用这个文件,所以如果希望改变所有用户的umask,可以在该文件中加入相应的条目。如果希望永久 性地设置自己的umask值,那么就把它放在自己$HOME目录下的.profile.bash_profile文件中。

  • 对于文件来说,这一数字的最大值分别是6。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用chmod命令增加这一权限。

  • 目录则允许设置执行权限,这样针对目录来说umask中各个数字最大可以到7

若没有文件掩码时,文件的默认权限为0666,文件夹的默认权限为0777。但是系统为了保护用户创建文件和文件夹的权限,此时系统会有一个默认的用户掩码(umask),大多数的Linux系统的默认掩码为0022。用户掩码的作用是用户在创建文件时从文件的默认权限中减去掩码的结果为文件的权限。

创建文件的权限=默认权限(文件0666,文件夹0777)-umask

在用户不修改umask的情况下,创建文件的权限为:0666-0022=0644。创建文件夹的权限为:0777-0022=0755

详细用法看这里