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

文件的权限管理是否生效是由文件系统决定的,传统的linux文件系统都是支持的,如ext4xfs,不支持的比如vfat既windows中的fat32,是不支持权限设置的

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

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

同用权限

权限说明

目录是一个特殊的文件,内容就是其中所有的目录文件列表,rwx权限对应的是对文件列表的权限,对于目录来说,可执行权限是基本权限。

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

有一个特殊的指向权限,大X , 该设置只对目录添加可执行权限,而不对文件添加可执行权限【除非文件本身带有可执行权限位

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

原始二进制数字
0000
–x0011
-w-0102
-wx0113
r–1004
r-x1015
rw-1106
rwx1117

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- 表示操作所有用户的权限位。
      在这里插入图片描述
  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递归修改,只对目录才有意义,可能会对没有执行权限的文件分配可执行权限,有风险,慎用

在递归修改执行权限的时候,有一个特殊的指向权限,大X , 该设置只对目录添加可执行权限,而不对文件添加可执行权限【除非文件本身带有可执行权限位

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权限

参数示例说明
-msetfacl -m u:username:rwx filepath
setfacl -m g:groupname:rwx filepath
配置后面的 acl 参数给文件/目录使用,不可与 -x 合用;
-xsetfacl -x u:username filepath
setfacl -x g:username filepath
删除指定用户/组的所有 facl 参数,不可与 -m同用
-Rsetfacl -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系统中root的默认掩码为0022,非特殊用户的默认掩码为0002

权限公式:新建文件的时候,666和掩码对位相减后,对奇数位进行+1 ,偶数不变 ; 新建文件夹的时候,777和掩码直接对位相减即可。

例如,当umask251的时候,创建文件的权限为:0666-0251=0415,奇数加一处理后为426。创建文件夹的权限为:0777-0251=0526

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值