权限管理之su与sudo
# 介绍
因为root用户的权限太大,破坏力太强,安全风险极高, 所以通常情况下公司的服务器对外都是禁止root用户直接登录的.. 做运维时,通常使用的都是普通用户,但在进行日常运维管理的过程中,经常需要获得某些root才有的管理权限才能完成任务,例如需要执行/sbin目录下的某些命令...
那么如何才能在不使用root用户直接登录操作系统的同时又能保证普通用户完成日常工作呢?
让普通用户具备管理员权限,有两种方案:
1> su切换用户身份: 使用普通用户登录,然后使用su命令切换到root账户下 不推荐
需要知道root密码; 权限控制不精细, 每次获取的都是所有root权限
2> sudo提权: 使用普通用户登录,不切换用户,用sudo命令提取root用户的 部分 管理权限
不需要知道root密码,输入的是用户自己的密码;
权限控制更为精细, 可以控制普通用户只获取部分root权限
# su切换用户
# 登录与非登录shell
linux中的shell可以分为两类:
1> 登录级别shell
输入账号密码登录进来运行的;
su - 用户名
管理员root切换到普通用户下无需输入密码,反之需要
2> 非登录级别shell
su 用户名
Ps: shell的使用方式有两种 -- 交互式;非交互式(即执行shell脚本)
"""
`su dc` 只是切换了用户身份,环境没有改变,还是在/root下
`su - dc ` 直接到普通用户dc的家目录下
"""
[root@localhost ~]# su dc
[dc@localhost root]$ pwd
/root
[dc@localhost ~]$ exit
登出
[root@localhost ~]# su - dc
上一次登录:一 8月 8 08:31:32 CST 2022pts/0 上
[dc@localhost ~]$ pwd
/home/dc
2
3
4
5
6
7
8
9
10
11
12
13
# 加载的配置文件
登录级别shell与非登录级别的shell本质上区别在于加载的配置文件以及顺序不一样!
全局配置文件(系统级别的,对所有用户都生效):
/etc/profile
/etc/profile.d/*.sh 一堆shell脚本文件,可执行程序
/etc/bashrc
个人配置文件(对单独的用户生效,归属于某个具体用户 ~号是会根据用户的不同变的):家目录下的两个隐藏文件
~/.bash_profile
~/.bashrc
PS: 验证使用echo在配置文件的每行添加一个输出即可,注意,要把输出放在文件的第一行..具体过程略.
若执行的是登录式shell,那么配置文件执行顺序是:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
如果执行的是非登录式shell,那么配置文件执行顺序是:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 配置文件的妙用
注意哦,下述操作的环境变量拼接是临时生效的TnT
若想其永久生效,可以将那个拼接命令写到用户登录时加载的任意一个全局配置文件中..^_^
Ps: 通常往配置文件的末尾加两条命令 PATH=/opt/soft:$PATH
export PATH
添加环境变量并将新的环境变量值继承到bash进程的子子孙孙中..
环境变量顾名思义在系统中的每个地方都有效!!!
举一反三:
若想针对登录级别与非登录级别的所有用户设置统一的配置
vim /etc/bashrc
; source /etc/bashrc
或者重新登录生效
Ps: 若是登录级别的所有用户,通常操作的是/etc/profile文件
若想针对某一个用户设置配置
vim ~/.bashrc
; source ~/.bashrc
或者重新登录生效
"""
我们知道,可以单独执行ls命令是因为ls加到了PATH环境变量当中..
"""
[root@localhost ~]# which ls
alias ls='ls --color=auto'
/usr/bin/ls
[root@localhost ~]# ls
anaconda-ks.cfg 公共 视频 文档 音乐
initial-setup-ks.cfg 模板 图片 下载 桌面
[root@localhost ~]# /usr/bin/ls
anaconda-ks.cfg 公共 视频 文档 音乐
initial-setup-ks.cfg 模板 图片 下载 桌面
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
"""
若此时新建一个可执行文件,不想写文件的路径前缀,只写可执行文件的名称
就需要对PATH变量进行拼接,(注意哦,此拼接是临时生效的!!)
"""
[root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir soft
[root@localhost opt]# vim /opt/soft/sb
[root@localhost opt]# cat /opt/soft/sb
echo "画一个大大的饼,吃不下消不了xswl"
## root用户新建的文件默认权限是644,将文件变为可执行文件,需要对其加上x可执行权限
[root@localhost ~]# /opt/soft/sb
-bash: /opt/soft/sb: 权限不够
[root@localhost ~]# chmod +x /opt/soft/sb
[root@localhost ~]# ll /opt/soft/sb
-rwxr-xr-x 1 root root 52 8月 8 09:17 /opt/soft/sb
[root@localhost ~]# /opt/soft/sb
画一个大大的饼,吃不下消不了xswl
[root@localhost opt]# sb
sb: need at least one file to send
Try `sb --help' for more information.
## 将sb所在的目录路径加入环境变量中
[root@localhost ~]# PATH=/opt/soft:$PATH
[root@localhost ~]# echo $PATH
/opt/soft:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# sb
画一个大大的饼,吃不下消不了xswl
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# sudo提权
通过配置sudo, 我们可以实现让普通用户输入自己的密码的情况下而获取我们为其配置的特定权限
这样既保证了普通用户拥有他想要的特定权限, 又不至于泄露管理root的密码...
# 两种编辑方式
在root管理员下修改配置文件/etc/sudoers来分配权限
1> vim /etc/sudoers
visudo -c
2> visudo
[root@localhost opt]# vim /etc/sudoers ## -- 在第一行加入字符aaaa
[root@localhost opt]# visudo -c
>>> /etc/sudoers: 语法错误 near line 1 <<<
/etc/sudoers 中第 1 行附近出现解析错误
[root@localhost opt]# vim /etc/sudoers ## -- 删除第一行的aaaa字符
[root@localhost opt]# visudo -c
/etc/sudoers:解析正确
## 与第一种方式相比,是黑白的..但会自动提示语法错误
[root@localhost opt]# visudo ## -- 同样的在第一行加入字符aaaa
>>> /etc/sudoers: 语法错误 near line 1 <<<
现在做什么?e ## -- e代表继续编辑
>>> /etc/sudoers: 语法错误 near line 1 <<<
现在做什么?Q ## -- Q代表直接退出
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# sudo语法
user MACHINE=COMMANDS 什么用户在什么机器上可以运行什么样的命令..
用户 能登录的主机IP或主机名=(能转换成的用户身份,表示允许用户以哪个用户的权限做事情) 管理命令
注意: 管理命令要写绝对路径.. 通过which 命令
可得知命令的绝对路径...
`root ALL=(ALL) ALL` -- root用户可以在所有主机上以任意用户身份执行所有命令
root: root用户
第一个ALL: 可以在任何一台机器上登录
通常就写成ALL 因为将配置文件拷贝到任意一台服务端的机器,ALL肯定包含当前这台主机
敲黑板:代表的是服务端的IP地址,与客户端无关!!!
第二个(ALL): 可以转换成任何用户的身份,即拥有所有的权限 通常就写成(ALL)
第三个ALL: 所有命令
"""
Cmnd_Alias 命令组别名
Host_Alias 主机组别名
User_Alias 用户组别名
"""
`Cmnd_Alias NETWORKING = /sbin/route,/sbin/ifconfig`
`tom ALL=(ALL) /bin/cp,/bin/touch`
-- 只允许tom用户以root用户的身份执行NETWORKING命令组里的route,ifconfig命令
`dc ALL=(ALL) ALL`
-- 这样用户dc相对于一个root超级管理员,可以无视文件权限,对任何文件使用任何命令
`onepiece ALL=(ALL) NOPASSWD:/user/bin/passed,/usr/bin/vim,!/usr/bin/vim /opt/def.txt`
-- 允许lili用户以root用户的身份对所有用户(包括root)的密码进行免密更改,
并能对所有文件免密进行编辑,但不能编辑/opt/def.txt文件
`onepiece ALL=(ALL) ALL,!/usr/bin/vim /opt/def.txt`
-- 对onepiece用户放开所有权限,唯独对/opt/def.txt文件的编辑权限不放开..
`Host_Alias TEST1 = 192.168.0.128,192.168.0.129,192.168.0.130`
-- 主机组别名TEST1,包含的是一台台服务器的IP地址,客户端是要远程连接到这些服务器上的,与客户端IP无关
`egon01 TEST1=(ALL) NOPASSWD:/usr/sbin/ifconfig`
-- egon01用户能在TEST1包含的主机上转换成root身份以没有密码的方式运行ifconfig命令
`egon02 localhost=(ALL) NOPASSWD:/usr/sbin/shutdown -h now`
-- localhost代表本机的IP地址. egon02用户只能在本机上以root身份免密执行立马关机的命令
"""
多个用户可以进行同一个sudo提权,两个方案:
`groupadd devops`
`gpasswd -a u1 devops`
`gpasswd -a u2 devops`
"""
`%devops ALL=(ALL) NOPASSWD:/usr/sbin/ifconfig`
或者另一个方案达到同样的效果:
`User_Alias ADMINS = u1,u2`
`ADMINS ALL=(ALL) NOPASSWD:/usr/sbin/ifconfig`
"""
sudo常用参数:
-l: 登录用户下面,执行`sudo -l` 显示当前用户有哪些权限
-k: 删除/var/db/sudo/下面对应的时间戳的信息,下次执行sudo需要输入当前用户的密码,系统默认5分钟失效
"""
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
要知道,每次使用命令sudo,都会重新加载配置文件/etc/sudoers... 所以编辑后,不需要重启..
一个小实验:
root用户依次执行以下命令:
touch /opt/abc.txt
echo 111 >> /opt/abc.txt
chmod 00 0 /opt/abc.txt
touch def.txt
echo 222 >> def.txt
chmod 777 /opt/def.txt
"""
可以看到,数据准备阶段
我们使dc用户对文件a.txt没有任何权限;onepiece对文件a.txt
实验目的:
1> 让dc用户使用sudo后能通过cat查看文件a.txt和echo >> 追加内容到文件a.txt中..
2> 让onepiece用户使用sudo后能免密编辑任何文件,除了/opt/def.txt
"""
[root@localhost opt]# ll abc.txt
---------- 1 root root 0 8月 8 15:26 abc.txt
[root@localhost opt]# ll def.txt
-rwxrwxrwx 1 root root 7 8月 8 17:05 def.txt
[root@localhost opt]# ll -d /opt/
drwxr-xr-x. 2 root root 21 8月 8 15:26 /opt/
[root@localhost opt]# cat /opt/abc.txt
111
[root@localhost opt]# cat /opt/def.txt
222
"""
对/etc/sudoers配置文件进行编辑
`dc ALL=(ALL) ALL`
`onepiece ALL=(ALL) NOPASSWD:/user/bin/passed,/usr/bin/vim,!/usr/bin/vim /opt/def.txt`
"""
[root@localhost opt]# vim /etc/sudoers
[root@localhost opt]# visudo -c
/etc/sudoers:解析正确
"""
验证
PS:若达不到预期的实验效果,
第一步看文件权限后面是否有加号,若有即使用了ACL `getfacl abc.txt`
第二步检查有无文件特殊属性干扰 `lsattr abc.txt`
"""
[dc@localhost ~]$ cat /opt/abc.txt
cat: /opt/abc.txt: 权限不够
[dc@localhost ~]$ sudo cat /opt/abc.txt
[sudo] dc 的密码:
111
## 因为重定向符号“>>”也是bash的命令;sudo只是让echo命令具有了root权限
## 所以bash会认为这个命令没有写入信息的权限
[dc@localhost ~]$ sudo echo "123" >> /opt/abc.txt
-bash: /opt/abc.txt: 权限不够
## 解决方案: 利用“sh -c”命令,它可以让bash将一串字符作为完整的命令来执行
[dc@localhost ~]$ sudo sh -c "echo 123 >> /opt/abc.txt"
[dc@localhost ~]$ sudo cat /opt/abc.txt
111
123
## onepiece用户本身是有权限编辑def.txt文件的,但加上sudo就不行..
[onepiece@localhost ~]$ sudo vim /opt/def.txt
对不起,用户onepiece无权以root的身份在localhost.localdomain上执行/bin/vim /opt/def.txt
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62