# 文件权限
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 的日志