Linux 权限配置管理
修改文件所属用户组
使用 chgrp
可以改变一个文件的所属用户组,目标组名必须已经存在于 /etc/group
。
例如修改 dir1
文件夹的所属组为 tss
:
[root@101c7 ~]$ chgrp tss dir1 ; ll total 4 -rw-------. 1 root root 1260 Sep 7 13:38 anaconda-ks.cfg drwxr-xr-x. 2 ftp tss 16 Sep 8 23:29 dir1
使用选项 -R
可以递归修改目录 dir1
下内容的所属组:
[root@101c7 ~]$ chgrp input -R dir1 ; ll dir1 total 0 -rw-r--r--. 1 root input 0 Sep 8 23:29 xx
修改文件所有者
使用 chown
命令可以修改文件或目录的所有者和所属组。目标用户名必须已经存在于 /etc/passwd
文件中。
例如,将文件夹 dir1
的所有者设置为 lp
,所属组设置为 tape
:
[root@101c7 ~]$ chown lp:tape dir1 ; ll total 4 -rw-------. 1 root root 1260 Sep 7 13:38 anaconda-ks.cfg drwxr-xr-x. 2 lp tape 16 Sep 8 23:29 dir1
使用 -R
参数可以递归修改目录下的文件或子目录的所有者和所属组:
[root@101c7 ~]$ chown -R ftp:ftp dir1 ; ll dir1 total 0 -rw-r--r--. 1 ftp ftp 0 Sep 8 23:29 xx
修改文件权限
使用 chmod
设置权限(只有文件所有者和 root 能执行),可以使用数字或字符来更改,数字类型采用数字累加来代表:
数字 | 字符 | 权限(文件 / 目录) |
---|---|---|
4 | r | 读取文件内容 / 查看目录下的文件或目录名称(无法看到属性) |
2 | w | 修改文件内容(不包含删除)/ 在目录下新建、删除、重命名文件或目录 |
1 | x | 文件可以被系统执行 / 进入目录、遍历目录 |
特殊权限:
数字 | 权限(文件 / 目录) |
---|---|
4 | SUID(用在文件上) |
2 | SGID |
1 | SBIT(用在目录上) |
例如修改 dir1
文件夹的权限为 rwxrw---x
:
[root@101c7 ~]$ chmod 761 dir1 ; ll total 4 -rw-------. 1 root root 1260 Sep 7 13:38 anaconda-ks.cfg drwxrw---x. 2 ftp tss 16 Sep 8 23:29 dir1
用字符类型改变文件权限方式:
- 用
u
、g
、o
、a
分别表示所有者、组、其他人和所有人。 - 用
+
、-
、=
分别表示增加、去除、设置权限。如果没有指定权限,则该权限不会发生变化。
例如设置 dir1
文件夹及其下的所有文件权限为 rwxrwxr--
:
[root@101c7 ~]$ chmod -R u=rwx,g=rwx,o=r dir1 [root@101c7 ~]$ ll dir1 total 0 -rwxrwxr--. 1 ftp root 0 Sep 8 23:29 xx
设置 dir
文件夹禁止进入:
[root@101c7 ~]$ chmod a-x dir1 ; ll total 4 -rw-------. 1 root root 1260 Sep 7 13:38 anaconda-ks.cfg drw-rw-r--. 2 ftp tss 16 Sep 8 23:29 dir1
要给文件 2
设置 SUID/SGID 的权限(也可以使用 u+s,g+s,o+t
命令来设置 SUID、SGID、SBIT),可以使用以下命令:
[root@101c7 ~]$ chmod 6755 2; ls -l 2 -rwsr-sr-x. 1 root root 0 Sep 9 07:57 2
当用户没有执行权限却设置了特殊权限时,特殊权限中的 s
和 t
会变成 S
和 T
,表示无效权限。例如:
[root@101c7 ~]$ chmod 7666 2; ll 2 -rwSrwSrwT. 1 root root 0 Sep 9 08:57 2
修改默认权限
文件创建时默认(umask
为 000
的情况)权限是 666
,文件夹是 777
,可以使用 umask
来对这一权限进一步削弱。
root
用户的 umask
默认为 022
,一般用户为 002
。使用 umask
修改的值必须写入到 .profile
文件中才能一直生效。
查看目前用户在新建文件和目录时的权限默认值:
[root@101c7 audit]$ umask 0022
上述命令表示新建文件不包括属组和其他用户的写权限。如果要添加属组的写权限,需要定义 umask
值:
[root@101c7 audit]$ umask 002 ; umask 0002
访问控制列表
在默认权限无法满足要求时,可以考虑使用访问控制列表。
ACL 访问控制列表
ACL 是 Access Control List 的缩写,主要用于提供传统权限之外的具体权限设置。ACL 可以针对单个用户或组、单个文件或目录进行权限控制。
默认情况下,系统会自动启用 ACL 支持。可以使用 dumpe2fs -h
命令查询挂载参数:
[root@101c7 ~]$ mount | grep sd /dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota) /dev/sdb4 on /root/sdb4m type ext3 (rw,relatime,seclabel,data=ordered) /dev/sdb5 on /ext333 type ext3 (rw,relatime,seclabel,data=ordered) [root@101c7 ~]$ dumpe2fs -h /dev/sdb4 | grep acl dumpe2fs 1.42.9 (28-Dec-2013) Default mount options: user_xattr acl
若要手动挂载 ACL,可以使用 mount -o remount,acl /
命令,或者修改启动配置 /etc/fstab
。
设置 ACL
可以使用 setfacl
来设置某个文件或目录的 ACL 规定,命令用法如下:
setfacl [-bkRd] [{-m|-x} acl 参数] 目标
参数说明:
参数 | 说明 |
---|---|
-m | 设置后续的 ACL 参数给文件使用 |
-x | 删除后续的 ACL 参数 |
-b | 删除所有的 ACL 设置参数 |
-k | 删除默认的 ACL 参数 |
-R | 递归设置 |
-d | 设置默认 ACL 参数,只对目录有效,目录下新建的数据都会用此默认值 |
针对单个用户设置,例如给用户 user1
设置目录 dir1
的读取和执行权限:
[root@101c7 sdb4m]$ setfacl -m u:user1:rx dir1 [root@101c7 sdb4m]$ ll -d dir1 drwxr-xr-x+ 2 root root 2048 Sep 13 07:34 dir1
可以看到权限部分多了一个加号 +
。
查询 ACL
要查询特殊权限,可以使用 getfacl
命令,该命令参数与 setfacl
相同。例如,要查询 dir1
的权限内容:
[root@101c7 sdb4m]$ getfacl dir1 # file: dir1 # owner: root # group: root user::rwx user:user1:r-x group::r-x mask::r-x other::r--
其中,user
、group
、other
代表普通权限。另外,还有一条刚设置的 user1
权限。
有效权限
ACL 中的 mask
规定了最大权限,也就是单独设置的权限不能超过 mask
显示的权限。
首先,给用户组 user1
设置目录 dir1
的写权限:
[root@101c7 sdb4m]$ setfacl -m g:user1:w dir1
然后,将 dir1
的 mask
权限设置为只读:
[root@101c7 sdb4m]$ setfacl -m m:r dir1 [root@101c7 sdb4m]$ getfacl dir1 # file: dir1 # owner: root # group: root user::rwx user:user1:r-x #effective:r-- group::r-x #effective:r-- group:user1:-w- #effective:--- mask::r-- other::r-x
这样,effective
后面显示的才是有效权限。
权限继承
可以使用 d:[ug]:用户列表:[rwx]
命令设置 ACL 权限被后续子文件夹和目录继承:
[root@101c7 sdb4m]$ setfacl -m d:g:user1:w dir1 [root@101c7 sdb4m]$ mkdir dir2 ; ls -ld dir2 ; getfacl dir2 drwxrwxr-x+ 2 root root 2048 Sep 13 07:56 dir2 # file: dir2 # owner: root # group: root user::rwx group::r-x group:user1:-w- mask::rwx other::r-x default:user::rwx default:group::r-x default:group:user1:-w- default:mask::rwx default:other::r-x
这样设置后,dir2
目录会继承 dir1
目录的 ACL 权限。