已复制
全屏展示
复制代码

linux权限管理完整总结


· 7 min read

一. 基本权限

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 位。显示为 sS,取决于属主是否具有 x 权限。

sgid

  • 对于文件:
    给文件添加sgid后,执行此文件会以此文件的所属组的身份执行。也必须先给出x权限,比如将touch命令添加sgid,当普通用户使用此命令时创建的文件所属组也是root
  • 对于目录:
    当给目录设置sgid位后,在该目录之下的所有内容的所属组都会是该目录的所属组。
    占用属组的 x 位。显示为 sS,取决于属组是否具有 x 权限。

sticky

  • 当一个目录有777权限的时候,表示所有人都可以在此目录目录下创建文件,但是,每一个用户只能删除自己的文件。linux系统上/tmp目录有sticky位。(如果其他用户想对你的文件进行查看或者编辑,需要你修改权限,让其他用户有权限)。占用其他人的 x 位。显示为 tT,取决于其他人的是否具有 x 权限。

设置 umask

umask 002
umask 022

1.3 设置权限

设置权限使用chmod命令:chmod [ugoa] [+-=] [strwx] filename,选项部分可以直接用数字的形式比如:chmod 777 filenamefilename的权限改为-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/
🔗

文章推荐