最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

Linux:目录和文件的权限管理二

XAMPP相关 admin 471浏览 0评论
继续梳理Linux系统的权限管理,今天的内容是ACL权限、文件特殊权限、文件系统属性chattr权限、系统命令sudo权限等,值得注意的是,前三个操作对象都是文件和目录,sudo操作对象是系统命令。

一、ACL权限

1. 场景
在实际工作中,普通权限是不够用的,比如有一个场景:

一个公司的A部门存在一个该部门文件目录./deptA,对该目录权限的规划应该为:部门主管使用root用户,且作为属主拥有rwx权限,而该部门的员工加入的是groupA,groupA作为属组并赋予rwx权限,其他人则没有权限,这样是符合实际情况的!

但是,有一天需要从其他部门调过来一个同事支撑该部门的日常工作,由于这位同事不熟悉该部门的业务,不能随意修改该部门的文档,只能给他赋予rx的权限。这样的话,是把他加入groupA组?还是赋予他其他人的权限?这些都明显不符合要求,这时候普通权限就不够用了!

2. ACL操作

Windows系统中,可以单独指定用户并单独进行分配权限的方式,就能很好的解决用户身份不足的情况。那么,Linux系统使用的ACL(访问控制列表)设置用户对文件的权限,CentOS系统是默认开启ACL的。

<1>. 查看ACL状态:getfacl  文件/目录名
# 查看 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 /]# 
<2>. 设置ACL状态:setfacl  [参数选项]  文件/目录名

参数选项:

[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 /]# 
从结果可以看到,用户xiaoxiao既不是deptA目录的属主,也不是属组,也不是其他人,而是单独被分配了rx权限。通过 setfacl -m u:指定用户:指定权限  指定目录 方式很便捷的实现了单独为指定用户分配指定的权限!!同理,通过 setfacl -m g:指定用户组:指定权限  指定目录 方式也可以实现单独为指定用户组分配指定的权限~~

除了通过-m实现新增ACL权限操作外,使用参数选项中的-R可以递归设置ACL权限;使用参数选项中的-d可以设置默认ACL权限;使用参数选项中的-x/-b/-k可分别删除单个/删除所有/删除默认的ACL权限;

二、文件特殊权限(SetUID、SetGID、Sticky BIT)

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
这两个文件,一个是644(普通用户只具有可读权限)、一个是000(普通用户无权限),也就是说普通用户对这两个文件其实都是没有写权限的,那为什么普通用户可以修改自己的权限呢?
其实,普通用户可以修改自己的密码的秘密不在于这两个文件,而在于passwd命令,看下这个命令:
[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文件,命令执行完成后,该身份也随之消失。

当然,可以验证SetUID权限的作用,比如,通过以下命令取消root用户的SetUID权限,普通用户修改密码则会报错:
[root@localhost /]# chmod u-s /usr/bin/passwd
[root@localhost /]# su xiaoxiao
[xiaoxiao@localhost /]$ passwd
更改用户 test_0814 的密码 。
新的 密码:
重新输入新的 密码:
passwd:身份验证令牌错误。

实际上我们不能随便设置SetUID权限,同时要防止黑客的恶意修改,有几点安全建议:

  • 关键目录应严格控制w写权限,比如“/”“/usr”等;
  • 用户的密码设置要严格遵守密码规范;
  • 对系统中默认应该拥有SetUID权限的文件制作一张列表,定时检查有没有列表之外的文件被设置了SetUID权限。
2、SetGID

参考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

Sticky BIT意为粘着位,也简称为SBIT,作用如下:
  • 目前只对目录有效;
  • 普通用户对该目录拥有w和x权限;
如果没有SBIT的话,因为普通用户拥有w权限,可以删除此目录下的所有文件,包括其他用户建立的文件。一旦被赋予了粘着位,除了root用户可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,而不能删除其他用户建立的文件。

默认系统中/tmp/目录拥有SBIT权限,其他人的x权限位被t占用了:

[root@localhost /]# ll -d /tmp/
drwxrwxrwt. 35 root root 8192 8月  14 20:51 /tmp/
因此,具有SBIT权限的目录是不允许删除的!
4、总结一下

我们知道,“755”代表属主拥有读、写、执行权限;属组拥有读、执行权限;其他人拥有读、执行权限。如果把特殊权限也考虑在内,那么权限就应该写成“4755”,其中“4”就是特殊权限SetUID了,“755”还是代表属主、属组和其他人的权限。这几个特殊权限这样来表示:

  • 4:代表SetUID
  • 2:代表SetGID
  • 1:代表SBIT
另外,需要注意:这几个特殊权限操作的对象是不同的,SetUID只对二进制程序文件有效,SetGID可以对二进制程序文件和目录有效,但是SBIT只对目录有效。特殊权限只针对具有可执行权限的文件有效,不具有x权限的文件被赋予了SetUID和SetGID权限会被标记为S, SBIT权限会被标记为T。
所以,如果需要设置特殊权限,则还是需要分开设定的。
三、文件系统属性chattr权限

charrt权限的特点:

  • 只能root用户使用,用来修改文件系统的权限属性;
  • chattr 命令是一种强于rwx权限的一种授权方式。
chattr 命令格式:
chattr [-RVf] [+-=参数选项] 文件/目录名
通过–help看下有哪些参数选项:
[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/
四、系统命令sudo权限
root超级用户作为管理员,拥有着Linux系统的最高级权限,实际上所有的大小事情都交给root超级用户去做是不现实的,健康的管理方法是在Linux服务架构好后,可授权普通用户协助管理员完成日常管理,通过sudo工具实现,几乎所有的Linux是默认安装了sudo。值得注意的是,sudo的操作对象是系统命令,即root把本来只能由超级用户执行的命令赋予普通用户执行。
root用户通过visudo命令可以编辑其配置文件/etc/sudoers进行授权,配置文件部分内容如下,注释也解释的很清楚:
[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 /]$
额,这下尴尬了,用户 test_0814 无法执行关机重启的命令,这是咋回事呢?看一下该用户授权列表:

卧槽,仔细检查一番之后发现,-r写成-h,哈哈哈!

[test_0814@localhost /]$ sudo -l
[sudo] test_0814 的密码:
......用户 test_0814 可以在 localhost 上运行以下命令:
    (ALL) /sbin/shutdown -h now
[test_0814@localhost /]$ 
这里,科普下 shutdown 关机命令各参数的区别:
- k     => 不执行任何关机操作,只发出警告信息给所有用户
- r     => 重新启动计算机
- h     => 关机并彻底断电
- f     => 快速关机且重启动时跳过fsck
- n     => 快速关机不经过init程序
- c     => 取消之前的定时关机
很明显,要用-r重启,而不是-h!
就到这~

转载请注明:XAMPP中文组官网 » Linux:目录和文件的权限管理二

您必须 登录 才能发表评论!