Linux权限管理

一、ACL权限

Linux 系统传统的权限控制方式,无非是利用 3 种身份(文件所有者,所属群组,其他用户),并分别搭配 3 种权限(读 r,写 w,访问 x)。但在实际应用中,以上这 3 种身份根本不够用。

1.1 ACL 权限概述

ACL是用于解决用户对文件身份不足的问题。将用户直接赋予文件相关权限。

1.2 ACL 权限开启

CentOS 6.x 系统中,ACL 权限默认处于开启状态,无需手工开启。但如果你的操作系统不是 CentOS 6.x,可以通过如下方式查看ACL权限是否开启:

[root@localhost ~]# dumpe2fs -h /dev/sda3(路径为分区对应的目录)
#dumpe2fs命令是查询指定分区详细文件系统信息的命令
选项:
-h 仅显示超级块中信息,而不显示磁盘块组的详细信息。

Default mount options这一选项如果有acl字段,证明开启了ACL权限。如果没有开启,手工开启分区的ACL权限:

[root@localhost ~]# mount -o remount,acl /
#重新挂载根分区,并挂载加入acl权限

也可以通过修改/etc/fstab文件,永久开启ACL权限(注意要选对分区):

[root@localhost ~]# vi /etc/fstab
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 / ext4 defaults,acl 1 1
#加入acl
[root@localhost ~]# mount -o remount /
#重新挂载文件系统或重启动系统,使修改生效

1.3 ACL基本命令

设定 ACl 权限,常用命令有 2 个,分别是 setfaclgetfacl 命令,前者用于给指定文件或目录设定 ACL 权限,后者用于查看是否配置成功。

1.3.1 文件ACL权限查询

getfacl 命令用于查看文件或目录当前设定的 ACL 权限信息。该命令的基本格式为:

[root@localhost ~]# getfacl 文件名

1.3.2 文件ACL权限设置

setfacl 命令可直接设定用户或群组对指定文件的访问权限。此命令的基本格式为:

[root@localhost ~]# setfacl 选项 文件名

setfacl选项功能:

  • -m:(设定ACL权限)

    • 如果是给予用户 ACL 权限,参数则使用 "u:用户名:权限" 的格式,例如 setfacl -m u:st:rx /project 表示设定 st 用户对 project 目录具有 rx 权限;
    • 如果是给予组 ACL 权限,参数则使用 "g:组名:权限" 格式,例如 setfacl -m g:tgroup:rx /project 表示设定群组 tgroup 对 project 目录具有 rx 权限。
  • -x:(删除ACL权限)

    • 删除指定用户(参数使用 u:用户名)的 ACL 权限,例如 setfacl -x u:st /project 表示删除 st 用户对 project 目录的 ACL 权限。
    • 删除指定群组(参数使用 g:群组名)的 ACL 权限,例如 setfacl -x g:tgroup /project 表示删除 tgroup组对 project 目录的 ACL 权限。
  • -b:(删除所有ACL权限)

    • 删除所有的 ACL 权限,例如 setfacl -b /project 表示删除有关 project 目录的所有 ACL 权限。
  • -R:(递归设定ACL权限,配合-m选项)

    • 指设定的 ACL 权限会对目录下的所有子文件生效,命令格式为 "setfacl -m u:用户名:权限 -R 文件名"(群组使用 g:群组名:权限),例如 setfacl -m u:st:rx -R /project 表示 st 用户对已存在于 project 目录中的子文件和子目录拥有 rx 权限。
  • -d:(设定默认ACL权限,配合-m选项)

    • 命令格式为 "setfacl -m d:u:用户名:权限 文件名"(如果是群组,则使用 d:g:群组名:权限),只对目录生效,指目录中新建立的文件拥有此默认权限,例如 setfacl -m d:u:st:rx /project 表示 st 用户对 project 目录中新建立的文件拥有 rx 权限。
  • -k:(删除默认 ACL 权限)

    • 删除默认 ACL 权限,如果没有默认的规则,将不提示。

注意:如果给目录赋予ACL权限,递归与默认的区别: setfacl -m u:cc:rx -R /project 只对已经存在的文件生效 setfacl -m d:u:aa:rwx -R /project 只对以后新建的文件生效

1.4 最大有效权限mask

mask 权限,指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理。

需要注意的是,将权限进行对比的过程,实则是将两权限做“按位相与”运算,最终得出的值,即为用户有效的 ACL 权限。

mask 权限可以使用 setfacl 命令手动更改,可执行如下命令:

[root@localhost /]# setfacl -m m:权限 文件或目录
#设定mask权限为r-x。使用“m:权限”格式

如图所示,之前user1用户对test文件的ACL权限为rwx,当mask权限设置为rx后,user1用户对test文件的ACL权限为rx。(rwx与r_x相与后的结果)

二、sudo授权

在之前用户管理阶段讲过使用 su 命令可以让普通用户切换到 root 身份去执行某些特权命令,但存在一些问题,比如说:

  • 仅仅为了一个特权操作就直接赋予普通用户控制系统的完整权限。
  • 当多人使用同一台主机时,如果大家都要使用 su 命令切换到 root 身份,那势必就需要 root 的密码,这就导致很多人都知道 root 的密码。

考虑到使用 su 命令可能对系统安装造成的隐患,最常见的解决方法是使用 sudo 命令,此命令也可以让你切换至其他用户的身份去执行命令。

相对于使用 su 命令还需要新切换用户的密码,sudo 命令的运行只需要知道自己的密码即可,我们甚至可以通过手动修改 sudo 的配置文件,使其无需任何密码即可运行。

sudo授权的目的在于给普通用户赋予部分管理员权限。

  • 赋予的权限越详细,普通用户得到的权限越小。
  • 赋予的权限越简单,普通用户得到的权限越大。

2.1 sudo命令的配置文件/etc/sudoers

修改 /etc/sudoers,不建议直接使用 vim,而是使用 visudo。因为修改 /etc/sudoers 文件需遵循一定的语法规则,使用 visudo 的好处就在于,当修改完毕 /etc/sudoers 文件,离开修改页面时,系统会自行检验/etc/sudoers 文件的语法。

visudo ,赋予普通用户权限命令,命令执行后和 vi 一样使用。

[root@localhost ~]# visudo

  • 用户名/组名:代表 root 给哪个用户或用户组赋予命令,注意组名前加“%” 。

  • 被管理的主机地址:用户可以用指定的命令管理指定 IP 地址的服务器。如果写 ALL,代表可以管理任何主机,如果写固定 IP,代表用户可以管理指定的服务器。(这里的 IP 指定的是用户可以管理哪个 IP 地址的服务器。那么如果你是一台独立的服务器,这里写 ALL 和你服务器的 IP 地址,作用是一样的。而写入网段,只有对 NIS 服务这样用户和密码集中管理的服务器才有意义)。如果我们这里写本机的 IP 地址,不代表只允许本机的用户使用指定命令,而代表指定的用户可以从任何 IP 地址来管理当前服务器。

  • 可使用身份:就是把来源用户切换成什么身份使用,(ALL)代表可以切换成任意身份。这个字段可以省略。

  • 授权命令:代表 root 把什么命令授权给普通用户。默认是 ALL,代表任何命令,这个当然不行。如果需要给那个命令授权,写入命令名即可,不过需要注意一定要命令写成绝对路径。

例子1:比如授权用户 user1 可以重启服务器,则由 root 用户添加如下行:

[root@localhost ~]# visudo
user1 ALL= /sbin/shutdown –r now
[user1@localhost ~]$ sudo -l 
#查看可用的授权
[user1@localhost ~]$ sudo /sbin/shutdown –r now
#user1可以执行shutdown –r now命令了

例子2:授权 user1用户可以添加其他普通用户,首先在root用户登录下命令行输入visudo进行编辑。

在user1下添加用户user2,注意前面加上sudo,否则会提示权限不够。

ls命令查看/home目录发现存在user2目录,证明user2用户添加成功。user1用户拥有了添加用户权限。查看/etc/passwd文件,存在user2这一行,再次证明user2用户添加成功。

注意:在输入visudo后进行sudo授权,比如授予了user1用户vim特权(root身份),但没有指定对具体文件的编辑权,此情况下,user1用户将会拥有以root身份对其他文件的编辑权,即使文件的rwx权里没有user1用户。导致安全隐患。在赋予权限时一定要注意赋予的权限越详细,普通用户得到的权限越小,反之越大。

三、SetUID权限

3.1 SetUID作用

在之前linux常用命令讲过 rwx 权限。linux除了rwx权限外,还有 s 权限,例如:

根据上图可以看到,原本表示文件所有者权限中的 x 权限位,却出现了 s 权限,此种权限通常称为 SetUID,简称 SUID 特殊权限。

SUID 特殊权限仅适用于可执行文件,所具有的功能是,只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失。

SetUID 的功能可以这样理解:

  • 只有可以执行的二进制程序才能设定 SUID 权限
  • 命令执行者要对该程序拥有 x(执行)权限
  • 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
  • SetUID 权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

3.2 SetUID事例

/usr/bin/passwd 命令拥有特殊权限 SetUID ,也就是在属主的权限位的执行权限上是 s。可以这样来理解它:当一个具有执行权限的文件设置 SetUID 权限后,用户执行这个文件时将以文件所有者的身份行。

/usr/bin/passwd 命令具有 SetUID 权限,所有者为 root(Linux 中的命令默认所有者都是 root),也就是说当普通用户使用 passwd 更改自己密码的时候,实际是在用 passwd命令所有者 root 的身份在执行 passwd 命令,root 当然可以将密码写入/etc/shadow 文件,所以普通用户也可以修改/etc/shadow 文件,命令执行完成后该身份也随之消失。如果取消 SetUID 权限,则普通用户就不能修改自己的密码了。

普通用户可以使用 cat 命令查看 /etc/shadow 文件吗?答案的否定的,因为 cat 不具有 SUID 权限,因此普通用户在执行 cat /etc/shadow 命令时,无法以 root 的身份,只能以普通用户的身份,因此无法成功读取。上述过程下图所示。

3.3 SetUID的危险性

[root@localhost ~]# chmod u+s /usr/bin/vim
[root@localhost ~]# ll /usr/bin/vim
-rwsr-xr-x 1 root root 1847752 45 2012 /usr/bin/vim

SUID权限的设置十分危险,比如将/usr/bin/vim的权限加上SUID权限,那么所有用户执行vim命令时都会以root的身份执行,这样所有的用户都可以通过vim来修改一些只有root能修改的重要系统文件,存在十分大的安全隐患。

3.4 关于SetUID的建议

  • 关键目录应严格控制写权限。比如“/”、“/usr”等。
  • 对系统中默认应该具有 SetUID 权限的文件作一列表,定时检查有没有这之外的文件被设置了 SetUID 权限。

四、SetGID权限

4.1 SetGID作用

当 s 权限位于所属组的 x 权限位时,就被称为 SetGID,简称 SGID 特殊权限。例如:

与 SUID 不同的是,SGID 既可以对文件进行配置,也可以对目录进行配置。

4.1.1 SetGID对文件的作用

SGID 即可以针对文件生效,也可以针对目录生效,这和 SUID 明显不同。如果针对文件,SGID 的含义如下:

  • 只有可执行的二进制程序才能设置 SGID 权限
  • 命令执行者要对该程序拥有 x(执行)权限
  • 命令执行在执行程序的时候,组身份升级为该程序文件的属组
  • SetGID 权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效

SGID 和 SUID 的不同之处就在于,SUID 赋予用户的是文件所有者的权限,而 SGID 赋予用户的是文件所属组的权限。

举例:

当普通用户 user1 执行 locate 命令时,会发生如下事情:

1./usr/bin/locate 是可执行二进制程序,可以赋予 SGID

**2.**执行用户 user1 对/usr/bin/locate 命令拥有执行权限

**3.**执 行 /usr/bin/locate 命令时,组身份会升级为 slocate 组,而 slocate 组 对/var/lib/mlocate/mlocate.db 数据库拥有 r 权限,所以普通用户可以使用 locate 命令查询mlocate.db 数据库

**4.**命令结束,user1 用户的组身份返回为 user1 组

4.1.2 SetGID对目录的作用

如果 SGID 针对目录设置,含义如下:

  • 普通用户必须对此目录拥有 r 和 x 权限,才能进入此目录
  • 普通用户在此目录中的有效组会变成此目录的属组
  • 若普通用户对此目录拥有 w 权限时,新建的文件的默认属组是这个目录的属组

这样写的实在太难看明白了,举个例子:

[root@localhost ~]# cd /tmp/
#进入临时目录做此实验。因为临时目录才允许普通用户修改
[root@localhost tmp]# mkdir dtest
#建立测试目录
[root@localhost tmp]# chmod g+s dtest
#给测试目录赋予 SGID
[root@localhost tmp]# ll -d dtest/
drwxr-sr-x 2 root root 4096 120 06:04 dtest/
#SGID 已经生效
[root@localhost tmp]# chmod 777 dtest/
#给测试目录权限,让普通用户可以写
[root@localhost tmp]# su – user1
#切换成普通用户 user1
[user1@localhost ~]$ cd /tmp/dtest/
#普通用户进入测试目录
[user1@localhost dtest]$ touch abc
#普通用户建立 abc 文件
[user1@localhost dtest]$ ll
总用量 0 -rw-rw-r-- 1 user1 root 0 120 06:07 abc
#abc 文件的默认属组不再是 user1 用户组,而变成了 dtest 组的属组 root

注意:SetGID对目录作用的风险在与给其他用户赋予了777(读、写、执行)权限。导致其他用户可以更改一些原本不属于他操作权限的目录。

五、Sticky BIT权限

5.1 Sticky BIT作用

Sticky BIT,简称 SBIT 特殊权限,可意为粘着位、粘滞位、防删除位等。SBIT 权限仅对目录有效,一旦目录设定了 SBIT 权限,则用户在此目录下创建的文件或目录,就只有自己和 root 才有权利修改或删除该文件。

SBIT 目前仅针对目录有效,它的作用如下:

  • 粘着位目前只对目录有效
  • 普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录拥有写入权限
  • 如果没有粘着位,因为普通用户拥有 w 权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了 root 可以删除所有文件,普通用户就算拥有 w 权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件。

Linux 系统中,存储临时文件的 /tmp 目录就设定有 SBIT 权限:

进入/tmp目录,分别以root,user1,user2的身份创建文件test1,test2和test3。将身份从root切换至user1,删除user2创建的文件test3。无法删除,证明SBIT起了作用。

由上图可知虽然 /tmp 目录的权限设定是 777,但由于其具有 SBIT 权限,因此 user2 用户在此目录创建的文件test3,user1用户删除失败。

5.2 文件特殊权限设定

特殊权限这样来表示:

  • 4 代表 SUID
  • 2 代表 SGID
  • 1 代表 SBIT
[root@localhost ~]# chmod 4755 ftest 
#赋予 SUID 权限
[root@localhost ~]# chmod 2755 ftest 
#赋予 SGID 权限
[root@localhost ~]# mkdir dtest
[root@localhost ~]# chmod 1755 dtest/
#SBIT 只对目录有效,所以建立测试目录,并赋予 SBIT

六、文件系统隐藏属性

6.1 chattr命令

6.1.1 chattr作用

管理 Linux 系统中的文件和目录,除了可以设定普通权限和特殊权限外,还可以利用文件和目录具有的一些隐藏属性。chattr 命令,专门用来修改文件或目录的隐藏属性,只有 root 用户可以使用。该命令的基本格式为:

[root@localhost ~]# chattr [+-=] [属性] 文件或目录名
选项:
+: 增加权限
-: 删除权限
=: 等于某权限
i: 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置 i 属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。
a: 如果对文件设置 a 属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删除文件。
e: Linux 中绝大多数的文件都默认拥有 e 属性。表示该文件是使用 ext 文件系统进行存储的,而且不能使用“chattr -e”命令取消 e 属性。

6.1.2 chattr事例

6.1.2.1 给文件赋予 i 属性
[root@localhost ~]# touch ftest
#建立测试文件
[root@localhost ~]# chattr +i ftest
[root@localhost ~]# rm -rf ftest
rm:cannot remove 'ftest':Operation not permitted
#无法删除"ftesr",操作不允许
#被赋予i属性后,root不能删除
[root@localhost ~]# echo 111>>ftest
bash:ftest:Permission denied
#权限不够,不能修改文件中的数据

可以看到,设置有 i 属性的文件,即便是 root 用户,也无法删除和修改数据。

6.1.2.2 给目录赋予 i 属性
[root@localhost ~]# mkdir dtest
#建立测试目录
[root@localhost dtest]# touch dtest/abc
#再建立一个测试文件abc
[root@localhost ~]# chattr +i dtest
#给目录赋予i属性
[root@localhost ~]# cd dtest
[root@localhost dtest]# touch bed
touch: cannot touch 'bed':Permission denied
#无法创建"bcd",权限不够,dtest目录不能新建文件
[root@localhost dtest]# echo 11>>abc
[root@localhost dtest]# cat abc
11
#可以修改文件内容
[root@localhost dtest]# rm -rf abc
rm: cannot remove 'abc': Permission denied
#无法删除"abc",权限不够

目录设置 i 属性后,即使是 root 用户,也无法在目录内部新建或删除文件,但可以修改文件内容。

**注意:**通常情况下,不要使用 chattr 命令修改 /、/dev/、/tmp/、/var/ 等目录的隐藏属性,很容易导致系统无法启动。另外,chatrr 命令常与 lsattr 命令合用,前者修改文件或目录的隐藏属性,后者用于查看是否修改成功。

6.2 lsattr命令

6.2.1 lsattr作用

使用 chattr 命令配置文件或目录的隐藏属性后,可以使用 lsattr 命令查看。lsattr 命令,用于显示文件或目录的隐藏属性,其基本格式如下:

[root@localhost ~]# lsattr [选项] 文件或目录名
选项:
-a 显示所有文件和目录
-d 若目标是目录,仅列出目录本身的属性,而不是子文件的
-R:和 -d 恰好相反,作用于目录时,会连同子目录的隐藏信息数据也一并显示出来。

6.2.2 lsattr事例

例一:

[root@localhost ~]# touch attrtest
-----------e- attrtest
[root@localhost ~]# chattr +aij attrtest
[root@localhost ~]# lsattr attrtest
----ia---j-e- attrtest
#不使用任何选项,仅用于显示文件的隐藏信息,不适用于目录。

例二:

[root@localhost ~]#lsattr -d /back/log
-----a------e- /back/log
#查看/back/log目录,其拥有a和e属性