一、ACL权限
一个公司的A部门存在一个该部门文件目录./deptA,对该目录权限的规划应该为:部门主管使用root用户,且作为属主拥有rwx权限,而该部门的员工加入的是groupA,groupA作为属组并赋予rwx权限,其他人则没有权限,这样是符合实际情况的!
但是,有一天需要从其他部门调过来一个同事支撑该部门的日常工作,由于这位同事不熟悉该部门的业务,不能随意修改该部门的文档,只能给他赋予rx的权限。这样的话,是把他加入groupA组?还是赋予他其他人的权限?这些都明显不符合要求,这时候普通权限就不够用了!
Windows系统中,可以单独指定用户并单独进行分配权限的方式,就能很好的解决用户身份不足的情况。那么,Linux系统使用的ACL(访问控制列表)设置用户对文件的权限,CentOS系统是默认开启ACL的。
# 查看 mysql安装目录的 ACL权限
[root@localhost /]# getfacl /opt/mysql-8.0.26-el7-x86_64/
getfacl: Removing leading '/' from absolute path names
# file: opt/mysql-8.0.26-el7-x86_64/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
# 查看 test001.log文件的 ACL权限
[root@localhost /]# getfacl /home/test001.log
getfacl: Removing leading '/' from absolute path names
# file: home/test001.log
# owner: weixiangxiang
# group: mysql
user::rw-
group::r--
other::r--
[root@localhost /]#
参数选项:
[root@localhost /]# setfacl --help
setfacl 2.2.51 -- set file access control lists
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
-m, --modify=acl modify the current ACL(s) of file(s)
-M, --modify-file=file read ACL entries to modify from file
-x, --remove=acl remove entries from the ACL(s) of file(s)
-X, --remove-file=file read ACL entries to remove from file
-b, --remove-all remove all extended ACL entries
-k, --remove-default remove the default ACL
--set=acl set the ACL of file(s), replacing the current ACL
--set-file=file read ACL entries to set from file
--mask do recalculate the effective rights mask
-n, --no-mask don't recalculate the effective rights mask
-d, --default operations apply to the default ACL
-R, --recursive recurse into subdirectories
-L, --logical logical walk, follow symbolic links
-P, --physical physical walk, do not follow symbolic links
--restore=file restore ACLs (inverse of `getfacl -R')
--test test mode (ACLs are not modified)
-v, --version print version and exit
-h, --help this help text
实现上面的场景需求:
# 创建部门目录
[root@localhost /]# mkdir deptA
# 创建分组groupA
[root@localhost /]# groupadd groupA
# 设置deptA目录的属主和属组,并赋予770权限
[root@localhost /]# chown root:groupA /deptA
[root@localhost /]# chmod 770 /deptA
[root@localhost /]# ll -d /deptA/
drwxrwx---. 2 root groupA 6 8月 14 19:04 /deptA/
# 再创建一个其他部门调动过来的员工,但只能赋予操作deptA目录的rx权限
[root@localhost /]# useradd xiaoxiao
[root@localhost /]# setfacl -m u:xiaoxiao:rx /deptA/
[root@localhost /]# getfacl deptA/
# file: deptA/
# owner: root
# group: groupA
user::rwx # 用户root的权限,属主
user:xiaoxiao:r-x # 用户xiaoxiao的权限
group::rwx # 用户组groupA的权限,属组
mask::rwx # mask默认权限
other::--- # 其他人权限,其他人
[root@localhost /]#
除了通过-m实现新增ACL权限操作外,使用参数选项中的-R可以递归设置ACL权限;使用参数选项中的-d可以设置默认ACL权限;使用参数选项中的-x/-b/-k可分别删除单个/删除所有/删除默认的ACL权限;
1、SetUID
是否想过一个问题,为什么普通用户可以通过 passwd 命令修改自己的密码?我们知道,普通用户的信息保存在/etc/passwd文件中,用户的密码实际保存在/etc/shadow文件中的加密密码,看下这两个文件:
[root@localhost /]# ll /etc/passwd
-rw-r--r--. 1 root root 2658 8月 14 19:26 /etc/passwd
[root@localhost /]# ll /etc/shadow
----------. 1 root root 1729 8月 14 19:27 /etc/shadow
[root@localhost /]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd
关键的奥秘在于,在属主应该写x(执行)权限的位置出现了一个小写s,这种权限称作SetUID权限。
因此,当一个具有执行权限的文件设置SetUID权限后,用户在执行这个文件时将以文件所有者的身份来执行。也就是说,当普通用户使用passwd命令更改自己的密码的时候,实际上是在用passwd命令所有者root的身份在执行passwd命令,root当然可以将密码写入/etc/shadow文件,所以普通用户也可以修改/etc/shadow文件,命令执行完成后,该身份也随之消失。
[root@localhost /]# chmod u-s /usr/bin/passwd
[root@localhost /]# su xiaoxiao
[xiaoxiao@localhost /]$ passwd
更改用户 test_0814 的密码 。
新的 密码:
重新输入新的 密码:
passwd:身份验证令牌错误。
实际上我们不能随便设置SetUID权限,同时要防止黑客的恶意修改,有几点安全建议:
- 关键目录应严格控制w写权限,比如“/”“/usr”等;
- 用户的密码设置要严格遵守密码规范;
- 对系统中默认应该拥有SetUID权限的文件制作一张列表,定时检查有没有列表之外的文件被设置了SetUID权限。
参考SetUID,就好理解SetGID了,在属组应该写x(执行)权限的位置出现了一个小写s,这种权限称作SetGID权限。比如 locate 命令:
[root@localhost /]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 40520 4月 11 2018 /usr/bin/locate
SetGID权限可作用于文件,也可作用于目录。
当是文件:
-
只有可执行的二进制程序才能设置SetGID权限,命令执行者要对该程序拥有x(执行)权限; -
命令执行者在执行程序的时候,组身份升级为该程序文件的属组; -
SetGID权限同样只在该程序执行过程中有效,也就是说,组身份改变只在程序执行过程中有效。
和passwd命令类似,普通用户在执行locate命令的时候,会获取locate属组的组身份。locate命令是在系统中按照文件名查找符合条件的文件的,不过它不是直接搜索系统的,而是搜索/var/lib/mlocate/mlocate.db这个数据库的。
- 普通用户必须对此目录拥有r和x权限,才能进入此目录;
- 普通用户在此目录中的有效组会变成此目录的属组;。
- 若普通用户对此目录拥有w权限,则新建文件的默认属组是这个目录的属组。
3、Sticky BIT
-
目前只对目录有效; -
普通用户对该目录拥有w和x权限;
默认系统中/tmp/目录拥有SBIT权限,其他人的x权限位被t占用了:
[root@localhost /]# ll -d /tmp/
drwxrwxrwt. 35 root root 8192 8月 14 20:51 /tmp/
我们知道,“755”代表属主拥有读、写、执行权限;属组拥有读、执行权限;其他人拥有读、执行权限。如果把特殊权限也考虑在内,那么权限就应该写成“4755”,其中“4”就是特殊权限SetUID了,“755”还是代表属主、属组和其他人的权限。这几个特殊权限这样来表示:
-
4:代表SetUID -
2:代表SetGID -
1:代表SBIT
charrt权限的特点:
-
只能root用户使用,用来修改文件系统的权限属性; -
chattr 命令是一种强于rwx权限的一种授权方式。
chattr [-RVf] [+-=参数选项] 文件/目录名
[root@localhost /]# chattr --help
Usage: chattr [-RVf] [-+=aAcCdDeijsStTu] [-v version] files...
特别注意以下参数:
- a:是文件的话,只能对文件新增数据,不允许修改和删除数据;是目录的话,是不允许删除目录下的文件,但可以新建文件和修改文件。
- e:文件通常会默认的属性,表示使用ext文件系统进行存储,使用该属性之后是不能通过-e取消的!
- i:是文件的话,不允许对文件新增、修改、删除数据,不允许改名和删除文件;是目录的话,只能修改目录下的文件数据,不能新增和删除文件。
因此,charrt命令是一种凌驾于rwx权限上的命令,通常需要谨慎使用!
此外,通过 lsattr 命令可以查看文件系统属性:
# -a 列出目录下所有de文件属性,-d只显示目录
[root@localhost /]# lsattr -d /opt/
---------------- /opt/
[root@localhost /]# visudo
......
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
## user MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
## Allows members of the users group to mount and unmount the
## cdrom as root
# %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
## Allows members of the users group to shutdown this system
# %users localhost=/sbin/shutdown -h now
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
# 用户名 被管理的主机IP地址=(可使用的身份) 授权命令(绝对路径)
root ALL=(ALL) ALL
# %组名 被管理的主机IP地址=(可使用的身份) 授权命令(绝对路径)
%wheel ALL=(ALL) ALL
-
第1位:指定赋予权限的用户名或组名,组名的前面需要加上%; -
第2位:等号之前的部分表示指定被管理的主机IP地址,ALL表示所有,也可以指定固定IP地址;等号之后的部分表示切换使用的身份,ALL表示所有身份; -
第3位:root给普通用户授权的命令,ALL表示所有命令(普通用户不能赋予ALL),具体命令的话必须是该命令的绝对路径。
-
新建一个用户组和用户test_0814:(密码暂定20210814)
[root@localhost /]# useradd test_0814
[root@localhost /]# passwd test_0814
更改用户 test_0814 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
- 切换到test_0814用户,执行关机重启命令:
该用户没有执行该命令的权限,并显示“不在 sudoers 文件中”!
[root@localhost /]# su test_0814
[test_0814@localhost /]$ sudo /sbin/shutdown -r now
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] test_0814 的密码:
test_0814 不在 sudoers 文件中。此事将被报告。
[test_0814@localhost /]$
- 切换到root,赋予普通用户执行该命令的权限,并切回普通用户重试:
[test_0814@localhost /]$ su root
密码:
[root@localhost /]# visudo
......
# 在文件中加入内容:
test_0814 ALL=(ALL) /sbin/shutdown -h now
[root@localhost /]# su test_0814
[test_0814@localhost /]$ sudo /sbin/shutdown -r now
[sudo] test_0814 的密码:
对不起,用户 test_0814 无权以 root 的身份在 localhost.localdomain 上执行 /sbin/shutdown -r now。
[test_0814@localhost /]$
卧槽,仔细检查一番之后发现,-r写成-h,哈哈哈!
[test_0814@localhost /]$ sudo -l
[sudo] test_0814 的密码:
......
用户 test_0814 可以在 localhost 上运行以下命令:
(ALL) /sbin/shutdown -h now
[test_0814@localhost /]$
- k => 不执行任何关机操作,只发出警告信息给所有用户
- r => 重新启动计算机
- h => 关机并彻底断电
- f => 快速关机且重启动时跳过fsck
- n => 快速关机不经过init程序
- c => 取消之前的定时关机
转载请注明:XAMPP中文组官网 » Linux:目录和文件的权限管理二