且为了避免因权限因素导致配置服务失败,从而建议使用 root
管理员来学习本书,但是在生产环境中还是要对安全多一份敬畏之心,不要用 root 管理员去做所有事情。因为一旦执行了错误的命令,可能会直接导致系统崩溃。尽管
Linux
系统为了安全性考虑,使得许多系统命令和服务只能被root
管理员来使用,但是这也让普通用户受到了更多的权限束缚,从而导致无法顺利完成特定的工作任务。
su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从 root 管理员切换至普通用户:
su
命令与用户名之间有一个减号(
-
),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-
)。
另外,当从
root 管理员切换到普通用户时是不需要密码验证的,而从普通用户切换成 root 管理员就需要进行密码验证了;这也是一个必要的安全检查:
接下来将介绍如何使用
sudo
命令把特定命令的执行权限赋予给指定用户,这样既可保证普通用户能够完成特定的工作,也可以避免泄露 root
管理员密码。我们要做的就是合理配置 sudo
服务,以便兼顾系统的安全性和用户的便捷性。
sudo
服务的配置原则也很简单—
在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限。
sudo
命令用于给普通用户提供额外的权限来完成原本
root
管理员才能完成的任务,格式
为“
sudo [
参数
]
命令名称”。
sudo 服务中可用的参数以及相应的作用如表所示。
总结来说,
sudo
命令具有如下功能:
- 限制用户执行指定的命令:
- 记录用户执行的每一条命令;
- 配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
- 验证密码的后 5 分钟内(默认值)无须再让用户再次验证密码。
当然,如果担心直接修改配置文件会出现问题,则可以使用 sudo 命令提供的 visudo 命令来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改 sudoers 配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。
使用
visudo
命令配置
sudo
命令的配置文件时,其操作方法与
Vim
编辑器中用到的方法一致,因此在编写完成后记得在末行模式下保存并退出。在 sudo
命令的配置文件中,按照下面的格式将第 99
行(大约)填写上指定的信息:
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
[root@localhost ~]# visudo
95 ## The COMMANDS section may have other options added to it.
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 zhangxu ALL=(ALL) ALL
在填写完毕后记得要先保存再退出,然后切换至指定的普通用户身份,此时就可以用 sudo -l 命令查看到所有可执行的命令了(下面的命令中,验证的是该普通用户的密码,而不是 root 管理员的密码,不要搞混了):
[root@localhost ~]# su zhangxu
[zhangxu@localhost root]$ sudo -l
[sudo] password for zhangxu:
Matching Defaults entries for zhangxu 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 zhangxu may run the following commands on this host:
(ALL) ALL
(ALL) ALL
作为一名普通用户,是肯定不能看到
root
管理员的家目录(/root
)中的文件信息的,但是,只需要在想执行的命令前面加上
sudo
命令就可以了:
效果立竿见影!但是考虑到生产环境中不允许某个普通用户拥有整个系统中所有命令的最高执行权(这也不符合前文提到的权限赋予原则,即尽可能少地赋予权限),因此 ALL 参数就有些不合适了。因此只能赋予普通用户具体的命令以满足工作需求,这也受到了必要的权限约束。如果需要让某个用户只能使用 root 管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。我们可以先使用 whereis 命令找出命令所对应的保存路径,然后把配置文件第 99 行的用户权限参数修改成对应的路径即可:
[zhangxu@localhost root]$ ls /root
ls: cannot open directory /root: Permission denied
[zhangxu@localhost root]$ sudo ls /root
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Videos
效果立竿见影!但是考虑到生产环境中不允许某个普通用户拥有整个系统中所有命令的最高执行权(这也不符合前文提到的权限赋予原则,即尽可能少地赋予权限),因此 ALL 参数就有些不合适了。因此只能赋予普通用户具体的命令以满足工作需求,这也受到了必要的权限约束。如果需要让某个用户只能使用 root 管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。我们可以先使用 whereis 命令找出命令所对应的保存路径,然后把配置文件第 99 行的用户权限参数修改成对应的路径即可:
[root@localhost ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@localhost ~]# visudo
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 zhangxu ALL=(ALL) /usr/bin/cat
在编辑好后依然是先保存再退出。再次切换到指定的普通用户,然后尝试正常查看某个文件的内容,此时系统提示没有权限。这时再使用 sudo 命令就可以顺利地查看文件内容了:
大家千万不要以为到这里就结束了,刘遄老师还有更压箱底的宝贝。不知大家是否发觉
在每次执行
sudo
命令后都会要求验证一下密码。虽然这个密码就是当前登录用户的密码,但
是每次执行
sudo
命令都要输入一次密码其实也挺麻烦的,这时可以添加
NOPASSWD
参数,
使得用户执行
sudo
命令时不再需要密码验证:
[root@localhost ~]# whereis poweroff
poweroff: /usr/sbin/poweroff
[root@localhost ~]# visudo
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 zhangxu ALL=(ALL) /usr/sbin/poweroff