# 文件权限

Linux 系统中,文件的访问权限用九个字符表示,例如:rw- r-- r--

  • 每三个字符为一组,三组字符分别表示 user(文件所有者)、group(与文件所有者同组的用户)、others(其他用户)对该文件的访问权限。
  • 每组的三个字符分别表示 r、w、x 三种权限。
    • r :可读。可以读取文件内容,或查看目录列表。
    • w :可写。可以更改文件内容,或在目录下增加、删除、重命名文件。
    • x :可执行。可以执行文件,或进入目录。
    • -:无权限。
  • 文件权限也可以用数字表示:将每组的三个字符转换成数字并相加(r、w、x、- 分别对应数字 4、2、1、0),三组权限就可以表示成三个数字。
    • 对应关系如下:
      0    ---
      1    --x
      2    -w-
      3    -wx
      4    r--
      5    r-x
      6    rw-
      7    rwx
      
  • 访问权限只能限制普通用户,root 用户有权访问任何文件和目录。

# 相关命令

# chmod

$ chmod <权限> <path> # 修改文件的访问权限
        -R            # 递归处理(用于处理目录)
  • 例:
    chmod 755 f1      # 相当于 chmod u=rwx,go=rx f1
    chmod +x f1       # 相当于 chmod a+x f1
    chmod u-w,g+r f1  # user 去掉 w 权限,group 加上 r 权限
    chmod a=rwx f1    # a 相当于 ugo
    

# chown

$ chown
        <user> <path>          # 改变文件所属的用户
        <user>:<group> <path>  # 改变文件所属的用户和用户组
        -R                     # 递归处理(用于处理目录)

# chgrp

$ chgrp <group> <path>         # 修改文件所属的用户组
        -R                     # 递归处理(用于处理目录)

# umask

$ umask        # 显示 umask 值
        027    # 设置 umask 值
  • 当用户新建或拷贝一个文件时,都是该文件的所有者,而该文件的权限 = 初始权限 - umask 。
    • 文件的初始权限为 666 ,目录的初始权限为 777 ,不能修改。
    • root 用户的 umask 默认为 0022 ,其他用户默认为 0002 。
    • 可以通过修改 umask 的值,改变新建文件、目录时的默认权限。也可以在文件、目录创建之后再修改其权限。
  • 例:
    • umask 为 0022 时,第一位 0 表示特殊权限,后三位 022 表示对默认权限 chmod g-2,o-2 。
    • 假设新建文件时,umask 为 0002 ,则默认权限为 664 ,即 rw- rw- r--
    • 假设新建目录时,umask 为 0002 ,则默认权限为 775 ,即 rwx rwx r-x

# 特殊的文件权限

  • SUID :只能作用于二进制程序,让执行该程序的其它用户临时拥有该程序的 user 权限。
    • 用命令 chmod u+s f1 可设置 SBIT ,这会将其 user 权限的第三位从 x 改为 s ,或从 - 改为 S 。
    • 例如:/usr/bin/passwd 文件设置了 SUID ,权限为 rwsr-xr-x ,普通用户在执行 passwd 的过程中,会临时拥有 root 的权限,从而能修改密码。
  • SGID :作用于二进制程序时,会让执行程序的用户临时拥有该程序的 group 权限;作用于目录时,会让该目录下新增的文件自动继承该目录的 GID 。
    • 用命令 chmod g+s f1 可设置 SGID ,这会将其 group 权限的第三位从 x 改为 s ,或从 - 改为 S 。
  • SBIT :只能作用于目录,在该目录下创建文件或目录时,权限归属于当前用户、用户组。
    • 用命令 chmod o+t dir1 可设置 SBIT ,这会将其 others 权限的第三位从 x 改为 t ,或从 - 改为 T 。
    • 例如:/tmp 目录设置了 SBIT ,权限为 1777/drwxrwxrwt 。所有用户都可以在这里读、写、创建文件,但非 root 用户只能删除自己的文件。

# ACL

标准的文件权限只有三种角色,通过访问控制列表(ACL)可以分别控制多个用户的访问权限。

# setfacl

$ setfacl <file>...
    -m u:leo:rwx     # 修改文件的 ACL ,针对某个用户
    -m g:root:rwx    # 修改文件的 ACL ,针对某个用户组
    -Rm u:leo:rwx    # 递归修改
    -b               # 删除文件的 ACL

# getfacl

$ getfacl <file>...  # 显示文件的 ACL

# SELinux

:安全增强型 Linux(Security Enhanced Linux),又称为安全上下文(Security Context)。

  • 它是一个内核模块,用于限制各种服务程序的访问权限,可以显著提升 Linux 系统的安全性。
  • 传统 Linux 系统中,一个进程能否访问某个文件,取决于这个进程是被哪个用户启动的。而使用了 SELinux 之后,即使这个进程是被 root 用户启动的,SELinux 也可以限制它的访问权限。
  • SELinux 有三种运行模式。
    • Enforcing :当服务程序发生越权行为时,强制拦截。
    • Permissive :只发出警告,不拦截。
    • Disabled :关闭 SELinux 。
  • 修改 /etc/selinux/config 文件(重启后生效)中的如下内容,启用 SELinux :
    SELINUX=enforcing
    

# sestatus

$ sestatus      # 显示 SELinux 的状态
        -v      # 显示进程、目录的安全上下文
        -b      # 显示所有限制策略(Policy booleans)

# setenforce

$ setenforce         # 设置 SELinux 的状态(重启后会复原)
        Enforcing    # 启用
        Permissive

# setsebool

$ setsebool <name> on|off  # 开启或关闭一个服务的 SELinux
        -P                 # 永久性地设置(重启后不会复原)
  • 例:
    setsebool httpd_anon_write off
    

# semanage

$ semanage    # 管理一些文件、目录默认的安全上下文

进程的违规行为会被记录在日志文件 /var/log/audit/audit.log 中,可以直接查看,也可以安装 setroubleshoot 工具来分析:

$ sealert -a /var/log/audit/audit.log    # 分析 SELinux 的日志