Linux命令:su 命令与 sudo 服务
  

小林同学丷 1990

{{ttag.title}}
实验环境中很少遇到安全问题,并且为了避免因权限因素导致配置服务失败,从
而建议使用 root 管理员来学习本书,但是在生产环境中还是要对安全多一份敬畏之心,不要用 root
管理员去做所有事情。因为一旦执行了错误的命令,可能会直接导致系统崩溃,这样一来,不但
客户指责、领导批评,没准奖金也会鸡飞蛋打。但转头一想,尽管 Linux 系统为了安全性考虑,
使得许多系统命令和服务只能被root管理员来使用,但是这也让普通用户受到了更多的权限束缚,
从而导致无法顺利完成特定的工作任务。
su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切
换到其他用户,比如从 root 管理员切换至普通用户:
[root@linuxprobe ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@linuxprobe ~]# su - linuxprobe
Last login: Wed Jan 4 01:17:25 EST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ id
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe) context=unconfined_
u:unconfined_r:unconfined_t:s0-s0:c0.c1023
细心的读者一定会发现,上面的 su 命令与用户名之间有一个减号(-),这意味着完全切
换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强
烈建议在切换用户身份时添加这个减号(-)。
另外,当从 root 管理员切换到普通用户时是不需要密码验证的,而从普通用户切换成 root
管理员就需要进行密码验证了;这也是一个必要的安全检查:
[linuxprobe@linuxprobe root]$ su root
Password:
[root@linuxprobe ~]# su - linuxprobe
Last login: Mon Aug 24 19:27:09 CST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]#
尽管像上面这样使用 su 命令后,普通用户可以完全切换到 root 管理员身份来完成相应工作,
但这将暴露 root 管理员的密码,从而增大了系统密码被黑客获取的几率;这并不是最安全的方案。
刘遄老师接下来将介绍如何使用 sudo 命令把特定命令的执行权限赋予给指定用户,
这样既可保证普通用户能够完成特定的工作,也可以避免泄露 root 管理员密码。我们要做
的就是合理配置 sudo 服务,以便兼顾系统的安全性和用户的便捷性。sudo 服务的配置原
则也很简单—在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限。
sudo 命令用于给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务,格式
为“sudo [参数] 命令名称”。sudo 服务中可用的参数以及相应的作用如下 所示。
参数                                          作用
-h                    列出帮助信息
-l                  列出当前用户可执行的命令
-u 用户名或 UID 值           以指定的用户身份执行命令
-k            清空密码的有效时间,下次执行 sudo 时需要再次进行密码验证
-b                     在后台执行指定的命令
-p                     更改询问密码的提示语
总结来说,sudo 命令具有如下功能:
¾限制用户执行指定的命令:
¾记录用户执行的每一条命令;
¾配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
¾验证密码的后 5 分钟内(默认值)无须再让用户再次验证密码。
当然,如果担心直接修改配置文件会出现问题,则可以使用 sudo 命令提供的 visudo 命令
来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改 sudoers 配置文件,还
可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。
注意:只有 root 管理员才可以使用 visudo 命令编辑 sudo 服务的配置文件。
visudo: >>> /etc/sudoers: syntax error near line 111 <<<
What now?
Options are:
(e)dit sudoers file again
(x)it without saving changes to sudoers file
(Q)uit and save changes to sudoers file (DANGER!)
使用 visudo 命令配置 sudo 命令的配置文件时,其操作方法与 Vim 编辑器中用到的方法
一致,因此在编写完成后记得在末行模式下保存并退出。在 sudo 命令的配置文件中,按照下
面的格式将第 99 行(大约)填写上指定的信息:
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) ALL
在填写完毕后记得要先保存再退出,然后切换至指定的普通用户身份,此时就可以用 sudo
-l 命令查看到所有可执行的命令了(下面的命令中,验证的是该普通用户的密码,而不是 root
管理员的密码,请读者不要搞混了):
[root@linuxprobe ~]# su - linuxprobe
Last login: Thu Sep 3 15:12:57 CST 2017 on pts/1
[linuxprobe@linuxprobe ~]$ sudo -l
[sudo] password for linuxprobe:此处输入 linuxprobe 用户的密码
Matching Defaults entries for linuxprobe on this host:
requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS
DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1
PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY
LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL
LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User linuxprobe may run the following commands on this host:
(ALL) ALL
接下来是见证奇迹的时刻!作为一名普通用户,是肯定不能看到 root 管理员的家目录
(/root)中的文件信息的,但是,只需要在想执行的命令前面加上 sudo 命令就可以了:
[linuxprobe@linuxprobe ~]$ ls /root
ls: cannot open directory /root: Permission denied
[linuxprobe@linuxprobe ~]$ sudo ls /root
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Videos
效果立竿见影!但是考虑到生产环境中不允许某个普通用户拥有整个系统中所有命令的
最高执行权(这也不符合前文提到的权限赋予原则,即尽可能少地赋予权限),因此 ALL 参
数就有些不合适了。因此只能赋予普通用户具体的命令以满足工作需求,这也受到了必要的
权限约束。如果需要让某个用户只能使用 root 管理员的身份执行指定的命令,切记一定要给
出该命令的绝对路径,否则系统会识别不出来。我们可以先使用 whereis 命令找出命令所对应
的保存路径,然后把配置文件第 99 行的用户权限参数修改成对应的路径即可:
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) /usr/bin/cat
在编辑好后依然是先保存再退出。再次切换到指定的普通用户,然后尝试正常查看某个
文件的内容,此时系统提示没有权限。这时再使用 sudo 命令就可以顺利地查看文件内容了:
[root@linuxprobe ~]# su - linuxprobe
Last login: Thu Sep 3 15:51:01 CST 2017 on pts/1
[linuxprobe@linuxprobe ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[linuxprobe@linuxprobe ~]$ sudo cat /etc/shadow
root6$GV3UVtX4ZGg6ygA6$J9pBuPGUSgZslj83jyoI7ThJla9ZAULku3BcncAYF00Uwk6Sqc4E36
MnD1hLtlG9QadCpQCNVJs/5awHd0/pi1:16626:0:99999:7:::
bin:*:16141:0:99999:7:::
daemon:*:16141:0:99999:7:::
adm:*:16141:0:99999:7:::
lp:*:16141:0:99999:7:::
sync:*:16141:0:99999:7:::
shutdown:*:16141:0:99999:7:::
halt:*:16141:0:99999:7:::
mail:*:16141:0:99999:7:::
operator:*:16141:0:99999:7:::
games:*:16141:0:99999:7:::
ftp:*:16141:0:99999:7:::
nobody:*:16141:0:99999:7:::
………………省略部分文件内容………………
在每次执行 sudo 命令后都会要求验证一下密码。虽然这个密码就是当前登录用户的密码,但
是每次执行 sudo 命令都要输入一次密码其实也挺麻烦的,这时可以添加 NOPASSWD 参数,
使得用户执行 sudo 命令时不再需要密码验证:
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]# whereis poweroff
poweroff: /usr/sbin/poweroff /usr/share/man/man8/poweroff.8.gz
[root@linuxprobe ~]# visudo
………………省略部分文件内容………………
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff
………………省略部分文件内容………………
这样,当切换到普通用户后再执行命令时,就不用再频繁地验证密码了,我们在日常工
作中也就痛快至极了。
[root@linuxprobe ~]# su - linuxprobe
Last login: Thu Sep 3 15:58:31 CST 2017 on pts/1
[linuxprobe@linuxprobe ~]$ poweroff
User root is logged in on seat0.
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl poweroff -i'.
[linuxprobe@linuxprobe ~]$ sudo poweroff









































打赏鼓励作者,期待更多好文!

打赏
2人已打赏

新手287577 发表于 2024-3-15 15:58
  
多谢分享Linux的相关经验,学习了
一个无趣的人 发表于 2024-2-22 11:29
  
多谢分享Linux的相关经验,学习了
发表新帖
热门标签
全部标签>
安全效果
西北区每日一问
技术盲盒
技术笔记
干货满满
【 社区to talk】
每日一问
信服课堂视频
GIF动图学习
新版本体验
技术咨询
2023技术争霸赛专题
产品连连看
功能体验
自助服务平台操作指引
标准化排查
秒懂零信任
技术晨报
安装部署配置
原创分享
排障笔记本
玩转零信任
排障那些事
SDP百科
技术争霸赛
深信服技术支持平台
通用技术
以战代练
升级&主动服务
畅聊IT
答题自测
专家问答
技术圆桌
在线直播
MVP
网络基础知识
升级
安全攻防
上网策略
测试报告
日志审计
问题分析处理
流量管理
每日一记
运维工具
云计算知识
用户认证
解决方案
sangfor周刊
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
加速技术
产品预警公告
信服圈儿
S豆商城资讯
「智能机器人」
追光者计划
社区帮助指南
答题榜单公布
纪元平台
卧龙计划
华北区拉练
天逸直播
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
每周精选
2024年技术争霸赛
北京区每日一练
场景专题
故障笔记
高手请过招
高频问题集锦
社区新周刊
POC测试案例
全能先锋系列
云化安全能力

本版达人

新手89785...

本周建议达人

YangZhe...

本周分享达人