sudo 命令
另一方面,超级用户 do 或者 sudo 命令允许我们从当前用户以 root 身份运行命令。
默认情况下,这将要求我们再次提供密码作为安全措施。
非 root 用户帐户需要 sudo 权限才能执行此操作,这通常是通过将用户或者组添加到 /etc/sudoers 文件或者将用户添加到 wheel 组来设置的。
[jack@onitroad ~]# usermod -aG wheel user1 [jack@onitroad ~]# id user1 uid=1000(user1) gid=1000(user1) groups=1000(user1),10(wheel) [jack@onitroad ~]# su - user1 Last login: Tue Aug 30 11:42:46 AEST 2014 on pts/0 [jack@onitroad ~]$ sudo whoami We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for user1: root
在本示例中,root 用户将 user1 添加到 wheel 组,该组在 /etc/sudoers 配置文件中定义,以通过 sudo 命令提供 root 权限。
从那里我们使用 sudo 以 root 身份运行 whoami 命令,在提供 user1 的密码后,我们被告知我们是 root。
请注意,在此之后我们不会被放入 root shell。
sudo第一次输入用户密码后,后续的sudo使用不需要密码,如下图。
在这里我们还看到 user1 没有权限单独列出 /root 的内容,但是它可以与 sudo 一起正常工作。
[jack@onitroad ~]$ ls -l /root ls: cannot open directory /root: Permission denied [jack@onitroad ~]$ sudo ls -l /root total 3244 -rw-------. 1 root root 984 Aug 29 14:21 anaconda-ks.cfg
我们还可以将 sudo 与 su 命令结合使用以进入交互式 root shell,而不是输入带有 sudo 前缀的每个命令。
[jack@onitroad ~]$ sudo su Last login: Tue Aug 30 11:49:01 AEST 2014 on pts/0 [jack@onitroad ~]# whoami root
同样,我们可以获得带有 -i 标志的 shell。
[jack@onitroad ~]$ sudo -i [sudo] password for user1: [jack@onitroad ~]# whoami root
为了定义可能以root权限执行的特定命令,我们修改/etc/sudoers文件。
例如,我们可以将以下配置添加到 /etc/sudoers 文件中,这将允许 user1 执行 systemctl 命令,允许他们使用 sudo 停止和启动服务(除其他外,systemctl 在 RHEL 7 中可以做很多事情)。
user1 ALL=(ALL) /bin/systemctl
这将是他们可以用 sudo 做的所有事情,任何其他尝试都将被拒绝。
[jack@onitroad ~]$ sudo systemctl restart httpd [jack@onitroad ~]$ sudo ls /root Sorry, user user1 is not allowed to execute '/bin/ls /root' as root on centos7.example.com. [jack@onitroad ~]$ exit logout [jack@onitroad ~]# su - user2 Last login: Tue Aug 30 12:42:20 AEST 2014 on pts/0 [jack@onitroad ~]$ sudo systemctl restart httpd user2 is not in the sudoers file. This incident will be reported.
正如预期的那样,user1 可以重新启动 Apache,但不允许 user2.
我们还看到 user1 无法执行其他需要 root 的任务,例如列出 /root 目录的内容。
su 命令
su 命令允许我们切换用户并以其他用户的身份在其用户 ID 下运行命令。
当你不带任何参数运行 su 时,它会默认尝试打开一个 root shell,因此会提示你输入 root 密码以继续。
输入 root 密码后,我们现在是 root 用户,我们在此会话期间运行的任何内容都将以 root 身份运行。
[jack@onitroad ~]$ whoami user1 [jack@onitroad ~]$ su Password: [jack@onitroad user1]# whoami root
或者,我们可以指定要更改为的用户,除非我们是 root,否则通常需要他们的密码。
[jack@onitroad ~]# su - user1 Last login: Tue Aug 30 11:30:32 AEST 2014 on pts/0 [jack@onitroad ~]$ whoami user1 [jack@onitroad ~]$ su - user2 Password: Last login: Tue Aug 30 11:29:59 AEST 2014 on pts/0
如图所示,如果 user1 想要切换到 user2,他们需要密码,但是 root 可以切换到任何其他用户而无需提供密码。
虽然不需要指定“-”,但建议用于交互式 shell。
如下图如果不指定'-'切换用户,/root的路径或者当前工作目录不会改变,这可能会导致user1去运行命令时出现问题。
[jack@onitroad ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [jack@onitroad ~]# su user1 [jack@onitroad root]$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [jack@onitroad root]$ exit exit [jack@onitroad ~]# su - user1 Last login: Tue Aug 30 11:32:02 AEST 2014 on pts/0 [jack@onitroad ~]$ echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin
本质上,我们几乎总是想在使用 su 时使用“-”。
我们不仅需要输入新用户的 shell,我们还可以选择使用 -c 标志以该用户身份执行命令。
[jack@onitroad ~]$ su -c whoami Password: root
现在我们了解了 su 命令,让我们看看 sudo 提供了什么。
su 和 sudo 的区别
通过对每个命令的解释,希望我们已经可以看到两者之间的主要区别。
它们在某些方面确实非常相似,“su”命令基本上等同于“sudo -i”,而“sudo”命令基本上等同于“su -c”。
一个主要的关键区别在于谁获得了 root 密码。
如果用户希望 su 成为 root,那么他们需要 root 帐户的密码。
相反,如果用户使用 sudo 执行命令,则他们只需要自己的密码和 sudo 权限。
因此,如果我们有多个用户在系统上需要 root 权限,则提供 sudo 访问被认为更安全,因为我们可以审核特定用户执行的命令,而无需与其他人共享 root 用户的密码。
默认情况下,非 root 用户可以使用 sudo 权限来更改 root 密码,但是 /etc/sudoers 文件可用于仅授予 root 访问用户需要以 root 身份运行的特定命令的权限,而不是能够以 root 身份运行任何命令根。
使用 sudo 我们可以定义安全策略,允许一组用户以 root 用户身份仅执行明确定义的命令的特定子集。