在Linux及其他类Unix操作系统中,只有 root 用户能够执行所有命令并进行关键系统操作,例如安装更新软件包、删除程序、创建用户与用户组、修改重要系统配置文件等。
但担任 root 角色的系统管理员可通过配置sudo
命令,允许普通系统用户执行特定命令及完成上述重要系统操作。另一种不推荐的方式是直接共享 root 用户密码,使普通用户能通过su
命令获取 root 账户权限。
sudo
的功能是依据安全策略,允许授权用户以 root(或其他用户)身份执行命令,其工作机制如下:
1)读取并解析/etc/sudoers
文件,核查调用用户及其权限;
2)提示输入密码(通常为当前用户密码,也可设置为目标用户密码。若配置NOPASSWD
标签则可跳过此步骤);
3)接着sudo
创建子进程,在其中调用setuid()
切换至目标用户;
4)最后在该子进程中执行指定的shell
或命令。
下文将通过 8 个/etc/sudoers
文件配置示例,展示如何利用默认条目修改sudo
命令行为。
[admin@monitor ~]$ sudo cat /etc/sudoers
[sudo] admin 的密码:
1.设置安全 PATH
为了确保系统的安全性,sudo
提供了配置选项来管理 PATH
环境变量,以防止潜在的安全风险。
它的重要性如下:
1)防止恶意路径注入:如果用户能够通过 PATH
环境变量注入恶意路径,可能会导致执行非预期的命令或脚本,从而引发安全问题。
2)隔离用户和 root 的路径:通过设置安全的 PATH
,可以确保 sudo
命令运行时使用的是系统定义的安全路径,而不是用户可能修改的路径。
要设置安全的 PATH
,需要在 sudoers
文件中添加以下内容:
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
这样,secure_path
指定了 sudo
命令运行时使用的路径。
如果需要定义 exempt_group
,可以添加类似以下的行:
Defaults:%exempt_group !secure_path
这样,属于 exempt_group
的用户在使用 sudo
时,将不受 secure_path
的限制,而是使用它们自己的 PATH
环境变量。
2.启用TTY用户登录会话的sudo权限
若需限制 sudo
仅能在真实终端(tty
)会话中调用,而禁止通过cron
计划任务或cgi-bin
脚本等方式执行,可添加如下配置项:
Defaults requiretty
3.通过伪终端(pty)执行sudo命令
某些情况下,攻击者可能利用 sudo
运行恶意程序(如病毒或恶意软件),这些程序会派生后台进程并持续驻留在用户的终端设备上,即使主程序已执行完毕。
为防止此类情况,可通过use_pty
参数强制 sudo
始终在伪终端中执行命令(无论是否启用I/O
日志功能),配置示例如下:
Defaults use_pty
4.配置自定义sudo日志文件
默认情况下,sudo
通过syslog(3)
记录日志。如需指定自定义日志文件,可使用logfile
参数配置:
Defaults logfile="/var/log/sudo.log"
若需在日志中记录主机名和四位数的年份,可分别添加log_host
和log_year
参数:
Defaults log_host, log_year, logfile="/var/log/sudo.log"
5.记录sudo 命令的输入/输出
通过 log_input
和 log_output
参数,可以让 sudo
在伪终端(pseudo-tty
)中运行命令,并分别记录所有用户输入和屏幕输出。
默认的 I/O
日志目录是 /var/log/sudo-io
,如果启用了会话序列号,日志会存储在该目录下。也可以使用 iolog_dir
参数自定义日志目录。
Defaults log_input, log_output
支持一些转义序列,例如 %{seq}
,它会扩展为单调递增的 36 进制序列号(例如 000001
),每两位数字用于形成一个新的目录层级,例如在以下示例中的 00/00/01
:
$ cd /var/log/sudo-io/
$ ls
$ cd 00/00/01
$ ls
$ cat log
6.设置 sudo 用户提示信息
通过 lecture
参数可向使用 sudo
的用户显示系统密码使用规范提示。该参数支持以下三种配置方式:
-
always:每次执行
sudo
命令时都显示提示 -
once:仅在用户首次执行
sudo
时显示提示(默认值) -
never:不显示提示
配置示例:
Defaults lecture="always"
如需自定义提示内容,可通过 lecture_file
参数指定包含提示信息的文件路径:
Defaults lecture_file="/path/to/custom_message"
[imoonrong@backup2 ~]$ sudo ll
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] imoonrong 的密码:
7.自定义 sudo 密码错误提示信息
当用户输入错误的 sudo
密码时,系统默认会显示"sorry, try again"提示。可以通过 badpass_message
参数修改该提示内容,配置示例如下:
Defaults badpass_message="Password is wrong, please try again"
或者
Defaults badpass_message="密码错误,请重新输入"
8.增加 sudo 密码尝试次数限制
passwd_tries
参数用于指定用户尝试输入密码的次数。默认值为 3,现在将尝试次数修改为 5:
Defaults passwd_tries=5
若要设置密码超时时间(默认为 5 分钟),可以使用 passwd_timeout
参数,添加以下行(比如,设为2分钟):
Defaults passwd_timeout=2
上面介绍了 8 条配置 sudoers 的实践技巧,那么 su
和 sudo
之间有何区别,以及如何在 Linux 中配置 sudo,接下来会进一步介绍。