linux权限管理完整总结
一. 基本权限
1.1 文件属性
下面是ls -l
的示例,其中就包含了权限信息。
lrwxrwxrwx. 1 root root 7 Dec 24 2019 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Feb 2 15:37 boot
drwxr-xr-x. 3 root root 17 Dec 24 2019 cgroups_test
drwxr-xr-x. 9 root root 97 Jun 8 11:11 data
-rw-r--r-- 1 root root 647 Feb 18 18:16 derby.log
drwxr-xr-x 20 root root 3840 May 29 14:49 dev
drwxrwxrwt. 149 root root 12288 Jul 2 16:01 tmp
按照顺序从左到右依次表示:文件类型、所属者权限、所属组权限、其他用户权限、(对于普通文件表示链接数|对于目录表示第一级子目录数)、所属者、所属组、文件字节数、最后修改时间、文件名总共10项。
- 文件类型
- 代表文件
b 代表块设备
c 代表字符型设备
d 代表目录
l 代表链接
n 代表网络设备
p 管理文件
s 套接字文件
- 文件权限
针对文件:
读:表示可以查看文件内容
写:表示可以编辑文件内容
执行:表示可以执行文件
针对目录:
读:能列出目录所有内容(ls)。当只有读权限时,只能查看目录内的文件名称,其他信息无法查看
写:能在目录中创建、删除文件。当只有读、写权限时无法创建删除文件,还需要x权限
执行:能够进入目录(cd)。如果只有执行权限,能进入,不能ls,但能够使用具体名称查看文件信息和内容。
1.2 权限掩码
权限掩码用于定义用户创建文件时的默认权限,比如umask的值为0022
。对于目录,直接使用777-umask
得到目录的权限,对于文件使用666-umask
得到文件的权限。通常情况下目录一般都有x
权限,文件创建一般都没有x
权限(为了安全让其不能执行)。
umask的四位八进制数分别是:特殊权限位、用户权限位、组权限位、其他权限位。
- 特殊权限位的值分别位:
suid(4) sgid(2) sticky(1)
- 普通权限位的值分别为:
r(read 4) r(write 2) x(execute 1)
[work@vm ~]$ umask
0002
[work@vm ~]$ umask -S
u=rwx,g=rwx,o=rx
suid
suid
位专为文件设计,此文件执行时以文件所属者的身份执行,比如将touch
命令添加suid
后,当普通用户使用此命令时创建的文件所属者也是root
,因为touch
命令的所属者为root
。/bin/passwd
命令有suid
位,所以普通用户可以修改自己密码。设置suid
之前需要有x
权限,否则出现大写的S
错误。
占用属主的权限位的x
位。显示为s
或S
,取决于属主是否具有x
权限。
sgid
- 对于文件:
给文件添加sgid
后,执行此文件会以此文件的所属组的身份执行。也必须先给出x
权限,比如将touch
命令添加sgid
,当普通用户使用此命令时创建的文件所属组也是root
。 - 对于目录:
当给目录设置sgid
位后,在该目录之下的所有内容的所属组都会是该目录的所属组。
占用属组的x
位。显示为s
或S
,取决于属组是否具有x
权限。
sticky
- 当一个目录有
777
权限的时候,表示所有人都可以在此目录目录下创建文件,但是,每一个用户只能删除自己的文件。linux
系统上/tmp
目录有sticky
位。(如果其他用户想对你的文件进行查看或者编辑,需要你修改权限,让其他用户有权限)。占用其他人的x
位。显示为t
或T
,取决于其他人的是否具有x
权限。
设置 umask
umask 002
umask 022
1.3 设置权限
设置权限使用chmod
命令:chmod [ugoa] [+-=] [strwx] filename
,选项部分可以直接用数字的形式比如:chmod 777 filename
将filename
的权限改为-rwxrwxrwx
,如果对目录进行权限修改,可以使用-R
选项递归修改。
# 设置特殊权限位
chmod u+s filename # 对文件设置 suid
chmod g+s filename # 对文件设置 sgid
chmod g+s dirname # 对目录设置 sgid
chmod o+t dirname # 对目录设置 sticky
# 设置普通权限位
chmod 777 filename # 设置任何人都有读写执行权限
chmod +x filename # 设置用户、组、其他的执行权限
chmod a+w -R dirname # 递归设置目录 户、组、其他的写权限
1.4 设置用户
每个文件都属于某一个用户、某一个组,基于用户和组进行权限设置
chown root.root filename # 设置用户、组
chown root.root -R dirname # 设置用户、组
chown root filename # 设置用户
chown .root filename # 设置组
二. ACL权限
acl 权限(access control list):当某个用户需要对某个文件有操作权限时,但是又不能修改该文件的所有者或者所属组,这时就需要用到acl
方式个给特定的用户对文件的特定权限。
- 在使用
acl
之前需要查看该文件系统是否支持acl
,不过centos7
及以后都默认支持了acl
# centos
cat /boot/config-3.10.0-1062.el7.x86_64 | grep -i acl | grep -i xfs
CONFIG_XFS_POSIX_ACL=y
# ubuntu
cat /boot/config-5.3.0-53-generic | grep -i acl | grep -i ext4
CONFIG_EXT4_FS_POSIX_ACL=y
setfacl
命令设置文件的acl
权限
参数:
-m :定义一条 ACL 策略
-R :递归设置 ACL 策略
-d :为目录设置默认的权限(子文档自动继承)
-b :清除所有已经设置的 ACL 策略
setfacl -m u:username:rw file # 让username对file文件有读写权限
setfacl -m g:groupname:rw file # 让groupname对file文件有读写权限
setfacl -m d:u:username:r dir # 设置默认acl,其目录下的内容都继承该权限(username对dir只读)
setfacl -b file # 删除该文件的所有acl权限,如果是目录,删除设置的默认项
getfacl
获取文件的acl
权限
getfacl .bashrc # 使用相对路径查看
# file: .bashrc
# owner: yzy
# group: yzy
user::rw-
group::r--
other::r--
getfacl -p /home/yzy/.bashrc # 使用绝对路径查看,如果没有-p参数,则会有一个警告提示。
# file: /home/yzy/.bashrc
# owner: yzy
# group: yzy
user::rw-
group::r--
other::r--
三. 隐藏权限
Linux 文件的隐藏属性在保护系统文件的安全性上非常重要,是防止误操作的,对root 用户也同样有效。
3.1 chattr设置权限
sudo chattr +i /etc/profile # 添加权限:任何人都不能修改,包括root用户
sudo chattr +a /var/log/shell/shell.log # 添加权限:任何人只能追加该文件,不能修改、删除等
# 常用属性
# S 一般文件是异步写入磁盘,加上S属性后,文件将同步写入磁盘
# D 目录也时同步更新
# a 当设置a后,文件只能增加数据,既不能删除也不能修改数据
# i i属性可使文件不能被删除、改名,设置连接也无法写入或添加数据。对于系统安全性有很大帮助。
3.2 lsattr查询权限
# 查看文件权限
lsattr /etc/profile
# 查看目录下的第一层级目录和文件权限
lsattr /etc/
# 若目标是目录,仅列出目录本身的属性,而不是子文件
lsattr -d /etc
# 查看目录下的第一层级目录和文件权限,包括隐藏目录或文件
lsattr -a /etc/