权限管理 (redhat 8.0)

本文深入探讨Linux权限管理,包括SUID、SGID和Sticky特殊权限的工作原理及其应用,以及文件系统访问控制列表(facl)的设置与管理,展示了如何通过facl灵活地授予用户权限。同时,文章还介绍了sudo的使用和配置,以实现用户以其他身份执行命令的功能。

权限管理

linux安全上下文

前提:进程有属主和属组;文件有属主和属组

  • 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否拥有可执行权限;
  • 启动为进程后,其进程的属主为发起者,属组为发起者所属的组
  • 进程访问文件时的权限取决于进程的发起者:
  1. 进程的发起者是文件的属主时,则应用文件属主权限
  2. 进程的发起者是文件的属组时,则应用文件属组权限
  3. 应用文件“其它”权限

特殊权限

linux默认权限是根据linux安全上下文的方式来控制的,而特殊权限的存在打破了linux安全上下文的规则

SUID(4) //运行程序时,这个程序启动的进程的属主是程序文件自身的属主,而不是启动者为属主
chmod u+s file
chmod u-s file
//如果file本身原来就有执行权限,则SUID显示为s,否则显示为S

[root@wcluser ~]# ll /usr/bin/vim
-rwxr-xr-x. 1 root root 3525384 7月  23 2019 /usr/bin/vim

用普通用户执行vim

[wcl@wcluser ~]$ vim /usr/bin/vim

通过查看进程可以看到通过普通用户打开vim此时的进程发起者是普通用户

[root@wcluser ~]# ps -ef | grep vim
wcl        2053   1922  0 09:30 pts/1    00:00:00 vim /root/anaconda-ks.cfg
root       2055   1968  0 09:30 pts/2    00:00:00 grep --color=auto vim

给passwd设置SUID特殊权限

[root@wcluser ~]# chmod u+s /usr/bin/vim
[root@wcluser ~]# ll /usr/bin/vim
-rwsr-xr-x. 1 root root 3525384 7月  23 2019 /usr/bin/vim		#属主的可执行权限变为s说明文件本身具有可执行权限

用普通用户重新查看

[wcl@wcluser ~]$ vim /usr/bin/vim

通过查看进程发现即使是普通用户启动的vim但是进程发起者仍旧是root

[root@wcluser ~]# ps -ef | grep vim
root       2048   1922  0 09:30 pts/1    00:00:00 vim /root/anaconda-ks.cfg
root       2050   1968  0 09:30 pts/2    00:00:00 grep --color=auto vim

SGID(2) //运行程序时,这个程序启动的进程的属组是程序文件自身的属组,而不是启动者所属的基本组
//默认情况下,用户创建文件时,其属组为此用户所属的基本组;
//一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件或目录,其所属的组
//为此设定了SGID的目录的属组
chmod g+s DIR
chmod g-s DIR
//如果file本身原来就有执行权限,则SGID显示为s,否则显示为S

给/root赋予可写可执行权限

 
[root@wcluser ~]# chmod 777 /root/
drwxrwxrwx.   3 root root  201 8月   6 05:32 root

用普通用户在/root下创建文件

[wcl@wcluser root]$ touch wcl.txt
[wcl@wcluser root]$ echo 'never say never' > wcl.txt 

可以看到wcl.txt此时的属组是普通用户wcl的属组(创建用户wcl将其归入了fyj用户组中)

[wcl@wcluser root]$ ll
-rw-r--r--. 1 wcl  fyj    16 8月   6 10:22 wcl.txt

给/root赋予SGID特殊权限

[root@wcluser ~]# chmod g+s /root/
[root@wcluser ~]# ll /
drwxrwsrwx.   3 root root  216 8月   6 10:22 root		#此时/root的属组可执行权限变为s

用普通用户wcl在/root创建文件wei.txt

[wcl@wcluser root]$ touch wei.txt

此时文件wei.txt的属组变成了root而不是普通用户wcl

[wcl@wcluser root]$ ll
-rw-r--r--. 1 wcl  root    0 8月   6 10:29 wei.txt

Sticky(1)
作为一个公共目录,每个人都能创建文件,删除自己的文件,但是不能删除别人创建的文件
chmod o+t DIR
chmod o-t DIR
如果DIR本身原来就有执行权限,则Sticky显示为t,否则显示为T

4755 //有SUID,文件权限为755
2755 //有SGID,文件权限为755
1755 //有Sticky,文件权限为755
//这里前面的4、2、1分别表示SUID、SGID、Sticky

创建/root/share并赋权

[root@wcluser ~]# chmod 777 /root/share			#这里必须给777权限否则普通用户没有可写权限无法创建文件

普通用户各自在/root/share中创建文件

[wcl@wcluser share]$ touch wcl.txt
[fyj@wcluser share]$ touch fyj.txt

普通用户相互删除对方创建的文件

[wcl@wcluser share]$ rm -rf fyj.txt 
[wcl@wcluser share]$
[fyj@wcluser share]$ rm -rf wcl.txt 
[fyj@wcluser share]$ 

由上面实验可得出结论在未设定Sticky特殊权限时普通用户可以删除其他用户的文件

设置Sticky权限

[root@wcluser ~]# chmod o+t /root/share/
[root@wcluser ~]# ll /
drwxrwxrwt. 2 root root   36 8月   6 10:43 share		#在others部分的可执行权限变为了t

普通用户各自创建自己的文件

[wcl@wcluser share]$ touch wcl.txt
[wcl@wcluser share]$ ll
总用量 0
-rw-r--r--. 1 fyj root 0 8月   6 10:43 fyj.txt
-rw-r--r--. 1 wcl fyj  0 8月   6 10:43 wcl.txt
[fyj@wcluser share]$ touch fyj.txt
[fyj@wcluser share]$ ll
总用量 0
-rw-r--r--. 1 fyj root 0 8月   6 10:43 fyj.txt
-rw-r--r--. 1 wcl fyj  0 8月   6 10:43 wcl.txt

普通用户相互删除对方创建的文件

[wcl@wcluser share]$ rm -rf fyj.txt 
rm: 无法删除'fyj.txt': 不允许的操作
[fyj@wcluser share]$ rm -rf wcl.txt 
rm: 无法删除'wcl.txt': 不允许的操作

由此可以得出结论,在设定了Sticky特殊权限后普通用户无法删除其他用户的文件,只能删除自己的文件

文件系统访问控制列表facl

facl(Filesystem Access Control List),利用文件扩展保存额外的访问控制权限。

未设置facl访问控制列表时

[root@wcluser ~]# ll 
-rwxr-xr-x+ 1 root root 1678 8月   6 11:04 passwd
  • 此时文件passwd的属主和属组都是root;属组只有可读和可执行权限

普通用户fyj的属组为root意味着它对/root/passwd仅有可读可执行权限

[fyj@wcluser share]$ id fyj
uid=1110(fyj) gid=0(root)=0(root),1110(fyj)
[fyj@wcluser share]$ vim /root/passwd 
"/root/passwd" [只读] 31L, 1678C  
  • 设置facl访问控制列表

设置属组root对passwd拥有所有权限

[root@wcluser ~]# setfacl -m g:root:rwx passwd 
[root@wcluser ~]# ll
-rwxrwxr-x+ 1 root root 1678 8月   6 11:04 passwd		#设置facl后文件属性后多了个“+”

通过getfacl 文件名的格式查看文件访问控制列表

[root@wcluser ~]# getfacl passwd 
# file: passwd
# owner: root
# group: root
user::rwx
group::r-x
group:root:rwx
mask::rwx
other::r-x

通过普通用户fyj测试

[fyj@wcluser share]$ vim /root/passwd 
[fyj@wcluser share]$ tail -1 /root/passwd 
fyj123
[root@wcluser ~]# setfacl -m u:fyj:rxw passwd 
[root@wcluser ~]# getfacl passwd 
# file: passwd
# owner: root
# group: root
user::rwx
user:fyj:rwx
group::r-x
mask::rwx
other::r-x

普通用户wcl仅有可读可执行权限

[wcl@wcluser root]$ vim /root/passwd 
"/root/passwd" [只读] 32L, 1685C  

而普通用户fyj拥有修改此文件的权限

[fyj@wcluser share]$ vim /root/passwd 
[fyj@wcluser share]$ tail -1 /root/passwd 
fyj12

由此看来设置了facl后可以灵活地授权给普通用户无需直接修改文件本身的权限

setfacl -m u:用户名 文件名 #增加一条facl访问控制条目
g:组名 文件名
setfacl -x u:用户名 文件名 #删除某一条facl访问控制条目
g:组名 文件名

setfacl -b 文件名 #删除所有facl访问控制条目

[root@wcluser ~]# setfacl -b passwd 
[root@wcluser ~]# getfacl passwd 
# file: passwd
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

sudo
sudo可以实现某个用户能够以另外哪一个用户的身份通过哪些主机执行什么命令

sudo的配置文件:/etc/sudoers

使用visudo命令进行sudo的配置,每一行就是一个sudo条目,条目格式如下:

  • who which_hosts=(runas) command
    who:User_Alias,表示运行命令者的身份
    which_hosts:Host_Alias,通过哪些主机
    runas:Runas_Alias,以哪个用户的身份
    command:Cmnd_Alias,运行哪些命令

别名必须全部而且只能使用大写英文字母的组合,可以使用感叹号取反别名分类:

  • 用户别名:
    User_Alias NETWORKADMIN =
    用户的用户名
    组名,使用%引导
    还可以其它已经定义的用户别名
  • 主机别名:
    Host_Alias =
    主机名
    IP地址
    网络地址
    其它主机别名
  • Runas别名:
    Runas_Alias =
    用户名
    %组名
    其它的Runas别名
  • 命令别名:
    Cmnd_Alias =
    命令路径
    目录(此目录内的所有命令)
    其它已定义的命令别名

sudo命令语法:sudo [options] COMMAND
-V //显示版本编号
-h //会显示版本编号及指令的使用方式说明
-l //列出当前用户可以使用的所有sudo类命令
-v //因为sudo在第一次执行时或是在N分钟内没有执行(N默认为5)会问密码,这个参数
//是重新做一次确认,如果超过N分钟,也会问密码
-k //让认证信息失效,如果不指定-k,默认认证信息在5分钟后失效
-b //将要执行的指令放在后台执行
-u USERNAME //以指定的用户名执行命令,默认为root

[root@wcluser ~]# visudo

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
fyj     ALL=(ALL)       /root/passwd
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.

赋予普通用户fyj对于/root.passwd所有权限

管理命令

w //显示当前登录到系统的用户有哪些,以及其正在做什么

sleep //睡眠,写脚本为防止上一个命令没执行完下一命令就开始执行时可以加上sleep #
//表示停顿#秒后再执行后面的命令
sleep NUMBER[SUFFIX]…
SUFFIX:
s:秒,默认
m:分
h:小时
d:天

last //显示/var/log/wtmp文件,显示用户登录历史及系统重启历史
-n # //显示最近#次的相关信息
lastb //显示/var/log/btmp文件,显示用户错误的登录尝试
-n # //显示最近#次的相关信息
lastlog //显示每个用户最近一次成功登录信息
-u username //显示特定用户最近的登录信息

basename //显示路径基名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值