在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_hostlog_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,接下来会进一步介绍。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐