su 命令
Linux 系统为了安全性考虑,使得许多系统命令和服务只能被 root 管理员来使用,但是这也让普通用户受到了更多的权限束缚,从而导致无法顺利完成特定的工作任务。
su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从 root 管理员切换至普通用户:
[root@servera /]# su - zhangxu //切换到zhangxu用户
[zhangxu@servera ~]$ id //查看用户ID
uid=1000(zhangxu) gid=1001(vimfstab) groups=1001(vimfstab) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[zhangxu@servera ~]$ su - root
Password:
尽管像上面这样使用 su 命令后,普通用户可以完全切换到root 管理员的身份来完成相应工作,但这将暴露root 管理员的密码,从而增大了系统密码被黑客获取的概率;这并不是最安全的方案。
sudo 命令
接下介绍如何使用 sudo 命令把特定命令的执行权限赋予指定用户,这样既可保证普通用户能够完成特定的工作,也可以避免泄露 root 管理员密码。要做的就是合理配置 sudo 服务,以便兼顾系统的安全性和用户的便捷性。
授权原则:在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限。
sudo 命令用于给普通用户提供额外的权限,语法格式为“ sudo [参数] 用户名 ”
使用sudo命令可以给普通用户提供额外的权限来完成原本只有 root管理员才能完成的任务,可以限制用户执行指定的命令,记录用户执行过的每一条命令,集中管理用户与权限(/etc/sudoers),以及可以在验证密码后的一段时间无须让用户再次验证密码。常见的 sudo 命令的可用参数如下表所示。
参数 | 作用 |
---|---|
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u 用户名 或 UID 值 | 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行 sudo 时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
当然,如果担心直接修改配置文件会出现问题,则可以使用 sudo 命令提供的 visudo 命令来配置用户权限。
visudo 命令用于编辑、配置用户 sudo 的权限文件,语法格式为“ visudo [参数] ”。这是一条会自动调用 vi 编辑器来配置/etc/sudoers 权限文件的命令,能够解决多个用户同时修改权限而导致的冲突问题。不仅如此,visudo 命令还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错提醒。这要比用户直接修改文件更友好、安全、方便。
使用 visudo 命令配置权限文件时,其操作方法与 Vim 编辑器中用到的方法完全一致,因此在编写完成后记得在末行模式下保存并退出。在配置权限文件时,按照下面的格式在第 101行(大约)填写上指定的信息。
[root@servera ~]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101 zhangxu ALL=(ALL) ALL
[zhangxu@servera ~]$ sudo -l
......省略
User zhangxu may run the following commands on servera:
(ALL) ALL
但是考虑到生产环境中不允许某个普通用户拥有整个系统中所有命令的最高执行权(这也不符合前文提到的权限赋予原则,即尽可能少地赋予权限),ALL 参数就有些不合适了。因此只能赋予普通用户具体的命令以满足工作需求,这也受到了必要的权限约束。如果需要让某个用户只能使用 root 管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。这时,可以先使用 whereis 命令找出命令所对应的保存路径:
[root@servera ~]# visudo
100 root ALL=(ALL) ALL
101 zhangxu ALL=(ALL) /usr/bin/cat,/usr/sbin/reboot //指定可以使用cat和reboot
是否发觉在每次执行 sudo 命令后都会要求验证一下密码。虽然这个密码就是当前登录用户的密码,但是每次执行 sudo 命令都要输入一次密码其实也挺麻烦的,这时可以添加 NOPASSWD 参数,使得用户下次再执行 sudo 命令时就不用密码验证:
[root@servera ~]# visudo
101 zhangxu ALL=(ALL) NOPASSWD:/usr/bin/cat,/usr/sbin/reboot