ACL权限

ACL权限简介与开启

ACL是Access Control List(访问控制列表)的缩写,不过在Linux系统中,ACL用于设定用户针对文件的权限,而不是在交换路由器中用来控制数据访问 的功能(类似于防火墙)。

  1. 查看分区ACL权限是否开启
1
2
3
4
[ root@localhost ~ ] # dumpe2fs [ -h ] [ /dev/sda3 ] 

选项:-u 仅显示超级块中信息,而不是显示磁盘块组的详细信息
# dumpe2fs:命令是指定分区详细文件系统信息的命令(centos 7版本命令为:xfs\_growfs 分区路径)

  1. 临时开启分区ACL权限
1
[ root@localhost ~ ] # mount -o remount,acl [ /bin ] 重新挂载根目录下bin分区,并挂载加入acl权限

  1. 永久开启分区ACL权限
1
2
3
4
5
[ root@localhost ~ ] # vim [ /bin ]
注释:
# UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 / ext4 defaults,acl 1 1 #加入acl

[ root@localhost ~ ] # mount -o remount 重新挂载文件系统或重启系统,是修改生效


查看与设定ACL权限

  1. 查看ACL命令:
1
2
[ root@localhost ~ ] # getfacl [ 文件名 ] 
#查看acl权限

  1. 设定ACL权限命令:
1
2
3
4
5
6
7
8
9
10
11
12
13
[ root@localhost ~ ] # setfacl [ 选项 ] [ 文件名 ]
选项:
-m 设定ACL权限

-x 删除指定的ACL权限

-b 删除所有的ACL权限

-d 设定默认的ACL权限

-k 删除默认的ACL权限

-R 递归设定ACL权限

  1. 给用户组设定ACL权限:
1
2
[ root@localhost ~ ] # setfacl -m g:lsp:rwx [ project ] 
# (为组lsp分配acl权限,使用“g:组名:权限 ”格式


最大效有权限与删除ACL权限

  1. 最大有效权限mask:

mask是用来指定最大有效权限。如果给用户赋予了ACL权限,是需要和mask的权限“相与”才能得到用户的真正权限

A B
r– r– r–
r–
r–
  1. 修改最大有效权限:
1
2
[ root@localhost ~ ] # setfacl -m m:rx [ 文件名 ]  
# (设定mask权限为rx,使用“m:权限 ”格式)m:代表mask
  1. 删除ACL权限:
1
2
3
4
5
[ root@localhost ~ ] # setfacl -x u:用户名 [ 文件名 ] 
# (删除指定用户的acl权限)

[ root@localhost ~ ] # setfacl -x g:组名 [ 文件名 ]
# (删除指定用户组的acl权限)


默认ACL权限和递归ACL权限

  1. 递归ACL权限

递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限。(对已经存在的文件有效,对操作之后新建的文件无效)

1
>[ root@localhost ~ ] # setfacl -m u:用户名:权限 -R [ 文件名 ]
  1. 默认ACL权限:

默认ACL权限的作用是如果给父目录设定了默认ACL权限,那么父目录中所有新建的子文件都会继承父目录的ACL权限
(对已经存在的文件无效,对操作之后新建的文件有效)




文件特殊权限

  1. SetUID:

    SetUID功能:

    1. 只有可执行的二进制程序才能设定SUID权限

    2. 命令执行者要对该程序有执行权(x)

    3. 命令执行者在执行改程序过程时获得该程序文件的属主身份 (相当于赋予其所有者root的权限”灵魂“)

    4. 只有可执行的二进制程序过程中有效,程序执行完后不再具有属主的特权

    示例:

    1. passewd命令具有SetUID权限,所有普通用户可以修改自己的密码
    1
    2
    3
    >[ root@localhost ~ ]$ ll /usr/bin/passwd

    ># -rwsr-xr-x. 1 root root 259765 222 2023 /usr/bin/passwd
    1. cat命令没有SetUID权限,所有普通用户不能查看/etc/shadow 文件的内容
    1
    2
    >[ root@localhost ~ ] $ ll /bin/cat
    ># -rwxr-xr-x. 1 root root 25675 222 2023 /bin/cat
  2. 设定SetUID的方法

    • 4 代表SUID:
1
2
3
4
5
[ root@localhost ~ ] $ chmod 4755 文件名 
#(755:rwxr-xr-x)

[ root@localhost ~ ] $ chmod u+s 文件名
#(u:用户)
  1. 取消SetUID的方法:
    • 4 代表SUID:
1
2
3
4
5
[ root@localhost ~ ] $ chmod 755 文件名 
#(755:rwxr-xr-x)

[ root@localhost ~ ] $ chmod u-s 文件名
#(u:用户)
  1. 危险的SetUID:

    • 关键的目录应严格控制写权限。如: /usr /bin
    • 用户密码设置严格遵守密码三原则
    • 对系统默认具有SetUID权限的文件进行列表制作,定时检查,如果有除列表之外的文件被设置的suid权限,则立即修改
  2. SetGID针对文件的作用:

  • 只有可执行的二进制程序才能设定SGID权限
  • 命令执行者要对该程序有执行权(x)
  • 命令执行者在执行改程序过程时组身份升级该程序文件的所属组(相当于赋予其所属组的权限”灵魂“)
  • 只有可执行的二进制程序过程中有效,程序执行完后不再具有属组的特权
    示例
1
2
3
4
5
6
7
>1. # lsp组具有SetGID权限
>[ root@localhost ~ ] $ ll /usr/bin/lsp
># -rwxr-sr-x. 1 root root 259765 222 2023 /usr/bin/lsp

>2. # wslsp组没有SetGID权限
>[ root@localhost ~ ] $ ll /bin/wslsp
># -rwxr-xr-x. 1 root root 25675 222 2023 /bin/wslsp
  1. SetGID针对目录的作用:
    • 普通用户必须对此目录拥有r和x权限,才能进入此目录
    • 普通用户在此目录中的有效组会变成目录的属组 (a用户进入此目录后,a创建了属于他的组,他的组也是此目录的组)
    • 若普通用户对此目录拥有w权限时,新建的文件默认属组也是这个目录的属组

  1. SetGID:
    • 设定SetGID的方法:
      2 代表SGID:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[ root@localhost ~ ] $ chmod 2755 文件名 
#(755:rwxr-xr-x)

[ root@localhost ~ ] $ chmod g+s 文件名
#(g:组名)

示例:
[ root@localhost ~ ] $ cd /tmp/
[ root@localhost ~ ] $ mkdir dtest
# 创建目录
[ root@localhost ~ ] $ chomd g+s dtest
# 添加sgid权限
[ root@localhost ~ ] $ ll -d dtest
[ root@localhost ~ ] $ chmod 777 dtest
# 赋予全部权限
[ root@localhost ~ ] $ su - eayyoung
[ root@localhost ~ ] $ cd /tmp/dtest
[ root@localhost ~ ] $ touch abc.txt
# 创建文件
[ root@localhost ~ ] # ll
  • 取消SetGID的方法:
    2 代表SGID:
1
2
3
4
5
[ root@localhost ~ ] $ chmod 755 文件名 
#(755:rwxr-xr-x)

[ root@localhost ~ ] # chmod g-s 文件名
#(g:组名)

  1. Sticky BIT:
    • SBIT粘着位作用:

      • 目前只对目录有效
      • 普通用户对该目录需有w与x权限(写与执行权)
      • 如果没有粘着位,普通用户因有w权限,所以可以删除此目录下的所有文件,包括其他用户创建的文件。
      • 一旦赋予了粘着位,除了root可以删除,普通用户只能删除自己创建的文件,但不能删除其他用户的创建的文件
    • 设置粘着位:
      1 代表SBIT:

1
2
3
4
5
6
7
8
9
10
11
12
[ root@localhost tmp ] $ chmod 1755 
# 文件名 (755:rwxr-xr-x)

[ root@localhost tmp ] $ chmod o+s
# 文件名 (o:其他用户)

示例:
lsp组具有SetGID权限

[ root@localhost ~ ] # ll -d /tmp/

# -rwxr-xr-t. 1 root root 25675 222 2023 /tmp/
  • 取消粘着位:
    1 代表SBIT:

    1
    2
    3
    4
    5
    [ root@localhost tmp ] $ chmod 755 
    # 文件名 (755:rwxr-xr-x)

    [ root@localhost tmp ] $ chmod o -s
    # 文件名 (o:其他用户)


文件系统属性chattr权限

chattr命令格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~ ] $ chattr [ +-= ] [ 选项2 ] 文件或目录名

1. 选项1
+ 增加权限

- 删除权限

= 等于某权限

2. 选项2
//如果对文件设置i属性,则不允许对文件进行删除、改名,添加数据和修改数据,

//如果对目录设置i属性,则只能修改目录下的文件数据,但不允许建立和删除文件

//如果对文件设置a属性,则只能在文件中添加数据,但不允许修改和删除数据

//如果对目录设置a属性,则只能在目录下创建和修改文件,但不允许删除文件

查看文件系统属性:lsattr

1
2
3
4
5
6
7
[root@localhost ~ ] # lsattr [ 选项 ] 文件名

选项1

a --显示所有文件与目录

- 若目标不是目录,仅列出目录本身的属性,而不是子文件的属性

系统命令sudo权限

sudo权限:

  • root把本来只能超级用户执行的命令权限赋予普通用户来执行
  • sudo的操作对象是系统命令

sudo的使用:

1
2
3
[root@localhost ~ ] $ vi sudo  --实际修改的是 /etc/sudoers 文件

注释1:root ALL\=ALLALL

普通用户执行sudo赋予的命令:

1
2
3
4
5
6
7
8
[root@localhost ~ ] $ su - eayyoung 
# 切换用户身份

[eayyoung@localhost ~ ] $ sudo -l
---查看可用的sudo的命令

[yiyang@localhost ~ ] $ sudo /sbin/shutdown -r now
---普通用户执行sudo赋予的命令