[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)

目录结构

一、文件基本权限
    1. Linux文件权限的设定
    2. Linux文件权限的作用
    3. Linux中权限对目录的作用
    4. 其他权限命令
        1)修改文件的所有者
        2)修改文件的所属组
        3)同时修改文件的所有者&所属组
        4)对用户、用户组的常规操作
二、默认权限
    1. 查看默认权限的命令
    2. 文件的默认权限
    3. 目录的默认权限
三、ACL权限
    1. ACL权限开启
        1)查看分区ACL权限是否开启
        2)临时开启分区ACL权限
        3)永久开启分区ACL权限
    2. ACL权限查看、设定
        1)设定ACL权限
        2)查看ACL命令
        3)给用户设定ACL权限
        4)给用户组设定ACL权限
        5)案例:给不同身份的用户设定不同的权限
    3. ACL最大权限与删除
        1)最大有效权限mask概述
        2)修改最大有效权限
        3)删除ACL权限
    4. ACL默认权限&递归权限
        1)递归ACL权限
        2)默认ACL权限
四、sudo权限
    1. sudo权限
    2. 案例:授权普通用户执行sudo赋予的命令,实现重启服务器
    3. 案例:授权普通用户可以添加其他用户
五、文件特殊权限
    1. SetUID
        1)SetUID的功能(针对文件的作用)
        2)设定setUID的方法
        3)SetUID的安全风险
        4)案例:检查系统中具有SetUID、SetGID权限的文件是否合法
    2. SetGID
        1)SetGID针对文件的作用
        2)SetGID针对目录的作用
        3)设定SetGID权限
    3. Sticky BIT
        1)SBIT粘着位的作用
        2)设置与取消粘着位
六、不可改变位权限
    1. chattr命令格式
    2. 查看文件系统属性


一、文件基本权限

1. Linux文件权限的设定

通过命令ls -l可查看当前目录下文件的详细信息,其中第1列即为权限位

[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第1张图片
r==>读  w==>写  x==>执行
权限(第1列) 含义 说明
1位 文件类型 -:文件
d:目录
l:软链接文件(快捷方式)
2-4位 所有者(u) 文件所有者可对文件的操作权限
5-7位 所属组(g) 文件所属组可对文件的操作权限
8-10位 其他人(o) 其他用户可对文件的操作权限

chmod命令

chmod [选项] 模式 文件名
选项:
-R  递归
模式:
[ugoa][+-=][rwx]
[mode=421]

权限的数字表示


常用权限
最高权限:rwxrwxrwx ==> 777
执行权限:rwxr-xr-x ==> 755
一般文件权限:rw-r--r-- ==> 644

2. Linux文件权限的作用

r:读取/查看文件内容(cat、more、head、tail)
w:编辑、新增、删除文件内容(vi、echo);不包含删除文件本身(需要文件的上级目录有写权限才可删除文件)
x:执行

3. Linux中权限对目录的作用

r:可查询目录下的文件名(ls)
w:具有修改目录结构的权限。如:新建文件和目录,对此目录下的文件和目录进行删除、重命名、剪切、复制(touch、rm、mv、cp)
x:可进入目录(cd)

PS:
① 对文件而言,最高权限是执行(x)
② 对目录而言,最高权限是写(w)。可赋予的有效权限为:0(---)、5(r-x)、7(rwx)
③ 从安全性角度考虑,其他人(o)不建议赋予7(rwx)权限

4. 其他权限命令

1)修改文件的所有者
chown 用户名 文件名
2)修改文件的所属组
chgrp 组名 文件名
3)同时修改文件的所有者&所属组
chown 用户名:组名 文件名
4)对用户、用户组的常规操作

用户

# 添加用户
useradd 用户名
# 设置用户密码
passwd 用户名
# 删除用户
userdel 用户名
# 修改用户名:用户名1-->用户名2
usermod -l 用户名2 用户名1
# 查看用户
cat /etc/passwd

用户组

# 添加用户组
groupadd 组名
# 设置用户组密码
gpasswd 组名
# 删除用户组
groupdel 组名
# 将用户添加到用户组中
gpasswd -a 用户名 组名
# 删除用户组中的用户
gpasswd -d 用户名 组名

PS:
让用户对文件&目录拥有一定的权限,从安全性角度考虑,不轻易赋予777最高权限。分配文件基本权限的核心原则:在最小权限情况下能够实现要求即可

二、默认权限

默认权限:在系统中建立文件or目录之后,就拥有的权限
<关联> [LN_09] Shell编程-环境变量配置文件操作解析

1. 查看默认权限的命令

# 查看默认权限值
umask
# 临时设置默认权限值
umask xxxx
# 永久修改umask(根据系统可能位置有所不同)
vi /etc/profile
vi /etc/bashrc

0022
第1个"0":文件特殊权限
后面的"022":文件默认权限

2. 文件的默认权限

① 文件建立时默认不能为执行文件,必须手工赋予执行权限,即文件默认权限最大为666
② 默认权限需要换算成字母再相减
③ 建立文件之后的默认权限=666换算成字母-umask值换算成字母;文件默认权限为644

若umask值=022,换算成字母:-----w--w-
文件默认最大权限666,换算成字母:-rw-rw-rw-
两者相减:
-rw-rw-rw-
-----w--w-
--------------------
-rw-r--r--
换算成数字:644

3. 目录的默认权限

① 目录默认权限最大为777
② 默认权限需要换算成字母再相减
③ 建立目录之后的默认权限=777换算成字母-umask值换算成字母;目录默认权限为755

若umask值=022,换算成字母:-----w--w-
目录默认最大权限为777,换算成字母:-rwxrwxrwx
两者相减:
-rwxrwxrwx
-----w--w-
--------------------
-rwxr-xr-x
换算成数字:755

三、ACL权限

1. ACL权限开启

ACL权限是对用户身份(所有者、所属组、其他人)不足的情况下进行补充身份

1)查看分区ACL权限是否开启
# 查找挂载在根分区上的文件系统目录
df -h
# 查询指定分区的详细文件系统信息,判断是否开启ACL权限
dumpe2fs -h /dev/mapper/VolGroup-lv_root
选项:
-h  仅显示超级块中信息,而不显示磁盘块组的详细信息
[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第2张图片

以上,默认挂载选项(Default mount options)中已开启ACL权限

2)临时开启分区ACL权限
# 重新挂载根分区,并挂载加入acl权限
mount -o remount,acl /
3)永久开启分区ACL权限
# 修改fstab文件
vi /etc/fstab
# 在根分区一栏的defaults后加上 ",acl"
xxx / ext4 defaults,acl
# 重新挂载文件系统or重启系统,使修改生效
mount -o remount /

2. ACL权限查看、设定

1)设定ACL权限
setfacl 选项 文件名
选项:
-m  设定ACL权限
-x  删除指定的ACL权限
-b  删除所有的ACL权限
-d  设定默认ACL权限
-k  删除默认ACL权限
-R  递归设定ACL权限
2)查看ACL命令
# 查看acl权限
getfacl 文件名
3)给用户设定ACL权限
# 给用户赋予ACL权限
setfacl -m "u:用户名:权限"
4)给用户组设定ACL权限
setfacl -m "g:组名:权限"
5)案例:给不同身份的用户设定不同的权限

描述:创建一个目录,给不同身份的用户设定不同的权限
所有者:sp001,权限:rwx
所属组:stu,权限:rwx
其他人,无任何权限
第四身份:zero,权限:r-x

操作步骤:
创建movie目录:mkdir movie
创建用户sp001:useradd sp001
创建用户组stu组:groupadd stu
修改movie目录的所有者&所属组:chown sp001:stu movie
根据要求为目录movie配置权限:chmod 770 movie
创建第四身份的用户名、设置密码(如:123):useradd zero && passwd zero
给用户zero设定对目录movie的ACL权限:setfacl -m u:zero:rx movie

[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第3张图片
root用户操作
[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第4张图片
zero用户操作

以上可查看对movie目录的acl权限详细信息:

user::rwx  # 所有者权限
user:zero:r-x  # 第四身份用户zero的权限
group::rwx  # 所属组权限
mask::rwx  # 最大有效权限
other::---  # 其他人权限

3. ACL最大权限与删除

1)最大有效权限mask概述

mask是用来指定最大有效权限的,若给用户赋予了ACL权限,则需要和mask的权限“相与”(逻辑与)才能得到用户的真正权限

A与B“相与”:

A B and
r r r
r - -
- r -
- - -

==> 只有A和B都拥有某项权限时,A和B相与的结果才会得到对应的权限,否则都是无权限

mask控制最大有效权限:
当mask权限为rwx时,任何被赋予用户身份的权限与mask权限进行逻辑与运算之后的结果,依然保持是该赋予的权限
若修改mask的权限为非rwx权限,则可用来控制文件or目录的权限(如:mask权限为r-x时,此时相与之后写权限始终为无权限)

2)修改最大有效权限
# 设定mask的权限
setfacl -m "m:权限 文件名"
3)删除ACL权限
# 删除指定用户的ACL权限
setfacl -x "u:用户名 文件名"
# 删除指定用户组的ACL权限
setfacl -x "g:组名 文件名"
# 删除文件的所有ACL权限(包括用户&用户组)
setfacl -b 文件名

4. ACL默认权限&递归权限

1)递归ACL权限

递归是父目录在设定ACL权限时,其下所有的已存在的子文件和子目录也会拥有相同的ACL权限;递归仅针对目录进行操作,不对普通文件递归

# 设置递归权限(目录名采用绝对路径)
setfacl -m "u:用户名:权限" -R 目录名

PS:
设置递归权限时,若对父目录设置有执行权限(x),因执行权限对目录和普通文件的功能不一致(目录是进入目录权限,文件是执行权限),父目录下的普通文件也拥有执行权限,超出了一般情况下文件拥有的默认最大权限(不包含执行权限),从而导致此时出现权限溢出的风险

如:setfacl -m "u:zero:rx" -R /tmp/test007/ACL_Test

[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第5张图片
2)默认ACL权限

默认ACL权限的作用:若给父目录设定了默认的ACL权限,则父目录中所有新建的子文件都会继承父名录的ACL权限;默认ACL权限也是仅针对目录进行操作,不针对普通文件操作

# 设置默认ACL权限(目录名采用绝对路径)
setfacl -m "d:用户名:权限" 目录名

PS:
① 递归权限值针对父目录下已存在的子目录or子文件生效,不对新增的目录or文件生效
② 默认ACL权限则是对新增/新建目录or文件实现ACL权限生效,对已有的子目录or子文件不作生效

如:setfacl -m "d:zero:rx" -R /tmp/test007/ACL_Test

[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第6张图片
[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第7张图片
设置的默认权限项


四、sudo权限

1. sudo权限

sudo作用:由超级用户root赋予普通用户权限,使普通用户可执行超级用户的命令;sudo的操作对象是系统命令

# 修改 /etc/sudoers.tmp文件
visudo
# 用户名 被管理主机的地址=(可使用的身份) 授权命令
# 授权命令需要采用绝对路径
root ALL=(ALL) ALL
# %组名 被管理主机的地址=(可使用的身份) 授权命令
%wheel ALL=(ALL) ALL
[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第8张图片

PS:
① 授权命令需要采用绝对路径
② 被管理主机配置场景:可能有多台被管理的主机,由某一台控制管理其他主机,在主控机上配置允许使用的主机IP,在其他对应的主机上也能使用超级用户的命令而不需要单独为每一台主机去配置权限
③ 小括号中的ALL,(ALL)可省略也可保留,由其前的root用户切换为可使用的身份,ALL表示包括root身份和其他身份

2. 案例:授权普通用户执行sudo赋予的命令,实现重启服务器

Step1-以root身份为普通用户赋予特定的执行权限

# 以超级用户root身份执行visudo,编辑配置文件
visudo
# 在配置文件末尾加上以下配置
zero ALL=(ALL) /sbin/shutdown -r now

Step2-切换到普通用户,执行sudo赋予的命令

# 切换到普通用户身份zero
su - zero
# 查看可用的sudo命令
sudo -l
# 普通用户zero执行sudo赋予的命令
sudo /sbin/shutdown -r now
[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第9张图片

PS:
① sudo赋予的命令书写越详细,执行权限越小,如:sbin/shutdown -r now 与 shutdown对比,写成shutdown可以拥有更多的权限(除了重启,甚至还有关机等权限)
② 赋予命令和执行sudo命令时,建议都写一致的绝对路径,以确保在不同的Linux系统都能正确执行
③ 若执行sudo赋予命令以外的其他超级用户命令,则无权限执行

3. 案例:授权普通用户可以添加其他用户

# 进入编辑配置
visudo
# 授权可添加用户
zero ALL=/usr/sbin/useradd
# 授予用户设定密码的权限;需要以任意个字母开头,但不允许设置空字符用户、root用户的密码
zero ALL=/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root
[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第10张图片
[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第11张图片

PS:
sudo赋予的命令不能轻易包括vi操作权限(/bin/vi),因可能编辑存储用户密码文件(/etc/shadow),比如直接修改用户密码为自定义的密码,然后据为己有,相当于拥有了管理权限

五、文件特殊权限

执行umask命令:

umask命令所输出的0022,其中第1个"0"表示文件特殊权限,后面的"022"表示文件默认权限

1. SetUID

1)SetUID的功能(针对文件的作用)

① 只有可执行的二进制程序才能设定SUID权限
② 命令执行者要对改程序拥有执行权限(x)
③ 命令执行者在执行改程序时获得该程序的属主身份(如:root)
④ SetUID权限只在该程序执行过程中有效,执行完成即失效

PS:
(1)passwd命令拥有SetUID权限,故普通用户可以修改自己的密码(不能指定用户修改,包括指定自己)
(2)cat、vi命令没有SetUID权限,故普通用户不能查看/etc/shadow文件的内容

2)设定setUID的方法
# 设置UID权限的2种方式("4"表示 UID)
chmod 4755 文件名
chmod u+s 文件名
# 取消UID权限的2种方式
chmod 0755 文件名
chmod u-s 文件名

u+s ==> UID权限(给所有者加上s权限)
g+s ==> GID权限(给所属组加上s权限)
o+s ==> Sticky BIT权限(给其他人加上s权限)

[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第12张图片

以上,对于本身不可执行文件,强行设置UID权限之后,权限项会变为大写的S,此时文件的UID权限并不能正确执行;若权限项为小写s则可正确执行UID权限

3)SetUID的安全风险

① 关键目录(系统目录)应该严格控制写权限,如://usr/bin/vi
② 对系统中默认具有SetUID、SetGID权限的文件做一个列表,定时检查是否有列表之外的文件被设置了SetUID/SetGID权限,以此判断是否存在恶意更改or木马文件的情况
③ 密码设置规则,生产环境避免弱密码

4)案例:检查系统中具有SetUID、SetGID权限的文件是否合法

描述:
对系统中默认具有SetUID、SetGID权限的文件做一个列表,定时检查是否有列表之外的文件被设置了SetUID/SetGID权限,以此判断是否存在恶意更改文件or木马文件的情况

操作步骤:
【Step1】将系统中默认具有SetUID、SetGID权限的文件导出到一个指定的日志文件中保存(作为后续参照系)
/root/suid-sgid.log

find / -perm -4000 -o -perm -2000 > /root/suid-sgid.log
[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第13张图片

【Step2】编写Shell脚本,实现在任意时间检查系统中具有SetUID、SetGID权限的文件列表,与Step1中的参照系文件列表比对,检查是否有差异性,若有则输出差异的文件
vim uid-gid-check.sh

#! /bin/bash

# 搜索系统中所有具有SUID、SGID权限的文件,并保存到指定路径的文件中
find / -perm -4000 -o -perm -2000 > /tmp/test007/uid-gid.check

# 依次循环取出临时文件uid-gid.check中的每一行数据(文件名)
for i in $(cat /tmp/test007/uid-gid.check)
    do
        # 对临时文件中取出的每一行数据,在参照文件中搜寻比对;不查看详细执行记录
        grep $i /root/suid-sgid.log > /dev/null
        # 检测以上搜索比对的返回值
        # 若为0,则表示能从参照文件中匹配到记录
        # 若不为0,则表示文件不在参照文件中,即新出现有SUID、SGID权限文件
        if [ "$?" != "0" ]
            then
                # 若文件不在参照文件中,则输出提醒信息到指定目录文件中保存
                echo "$i 不在参照文件列表中!" >> /tmp/test007/suid-sgid.CheckResult_$(date +%y%m%d)
        fi
    done

# 循环执行完成后,将以上临时生成的文件删除
rm -rf /tmp/test007/uid-gid.check

【3】执行 uid-gid-check.sh脚本,检查对比结果
chmod 755 uid-gid-check.sh
./uid-gid-check.sh
执行结果:

[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第14张图片
[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第15张图片

2. SetGID

1)SetGID针对文件的作用

① 只有可执行的二进制程序才能设定SGID权限
② 命令执行者要对改程序拥有执行权限(x)
③ 命令执行者在执行改程序时获得该程序的所属组身份
④ SetGID权限只在该程序执行过程中有效,执行完成即失效
PS:SGID能对文件、目录设定特殊权限,SUID则是对文件设定特殊权限

案例:locate命令与mlocate.db数据库

[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第16张图片

(1)locate命令的来源路径文件(/usr/bin/locate),拥有SGID权限,普通用户对/usr/bin/locate命令拥有执行权限;而locate搜索的索引数据库文件(/var/lib/mlocate/mlocate.db),不具备文件特殊权限
(2)执行locate命令时,组身份会升级为slocate组,而slocate组对mlocate.db数据库拥有r权限,故普通用户可使用locate命令查询mlocate.db数据库;当命令执行结束后,普通用户的组身份返回原来的身份

2)SetGID针对目录的作用

① 普通用户必须对此目录拥有r和x权限,才能进入此目录
② 普通用户在此目录中的有效组(有效组默认是创建用户时生效的初始组,可改变为多个组之一)会变成此目录的所属组
③ 目录赋予SGID权限后,普通用户对此目录拥有w权限时,新建的文件默认所属组是此目录的所属组

3)设定SetGID权限
# 2代表SGID
chmod 2755 文件名
chmod g+s 文件名

3. Sticky BIT

SetUID针对文件,SetGID针对文件和目录,SBIT针对目录

1)SBIT粘着位的作用

一旦给某个目录赋予了最大权限777,若该目录有其他用户创建的文件,即便是root用户创建的文件,普通用户虽然不可以直接删除该文件,但是可以通过删除该目录来达到删除该目录下的所有文件,相当于也可以把其他用户创建的文件删除。
通过赋予粘着位,可以限制不同的普通用户只能删除自己所建立文件,而不能删除其他用户所建立的文件。

PS:
① root用户可以删除所有文件
② 不建议手工给文件赋予粘着位权限(需要赋予最高权限777)

系统中默认具有粘着位权限的文件,如:/tmp

[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第17张图片
2)设置与取消粘着位
# 设置粘着位
chmod 1755 目录名
chmod o+t 目录名
# 取消粘着位
chmod 0777 目录名
chmod o-t 目录名
[LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限)_第18张图片

普通用户无权删除具有粘着位权限的目录及其内非本用户创建的文件:

PS:若需要让不同的用户都有权限在粘着位权限的目录中创建文件,则root用户需要对该目录赋权:chmod 1777 目录名,每个普通用户都可创建归属自己的文件,且只能删除自己的文件

六、不可改变位权限

1. chattr命令格式

chattr [+-=] [选项] 文件or目录名
符号说明:
+   增加权限
-   删除权限
=   等于某权限

选项:
i(insert):若对文件设置i属性,则不允许对文件进行删除、改名、数据添加和修改;若对目录设置i属性,则只能修改目录下文件的数据,但不允许建立和删除文件
a(append):若对文件设置a属性,则只能在文件中增加数据,但是不能删除、修改数据;若对目录设置a属性,则只允许在目录中建立和修改文件,不允许删除

2. 查看文件系统属性

lsattr 选项 文件名
选项:
-a  显示所有文件和目录
-d  查看目录,不列出子文件

你可能感兴趣的:([LN_15] Linux权限管理:基本权限 & 特殊权限(ACL|sudo|SUID|SGID|SBIT|不可改变位权限))