在Linux和其他类Unix操作系统中,只有root用户可以运行所有命令并执行系统上的某些关键操作,例如安装和更新、删除软件包、创建用户和组、修改重要的系统配置文件等。
然而,扮演root用户角色的系统管理员可以通过sudo命令和一些配置,允许其他普通系统用户运行一些命令以及执行一些重要的系统操作,包括上述提到的操作。
另外,系统管理员可以共享root用户密码(这不是推荐的方法),以便普通系统用户通过su命令访问root用户账户。
sudo允许被授权的用户按照安全策略的规定以root(或其他用户)的身份执行命令:
- 它读取和解析/etc/sudoers,查找调用用户及其权限,
- 然后提示调用用户输入密码(通常是用户的密码,但也可以是目标用户的密码。或者可以使用NOPASSWD标记跳过密码验证),
- 之后,sudo创建一个子进程,在其中调用setuid()切换到目标用户
- 接下来,在上述子进程中执行一个shell或作为参数给出的命令。
以下是修改/etc/sudoers文件配置以修改sudo命令行为的十个Defaults条目。
$ sudo cat /etc/sudoers
# # This file MUST be edited with the 'visudo' command as root. # # Please consider adding local content in /etc/sudoers.d/ instead of # directly modifying this file. # # See the man page for details on how to write a sudoers file. # Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" Defaults logfile="/var/log/sudo.log" Defaults lecture="always" Defaults badpass_message="Password is wrong, please try again" Defaults passwd_tries=5 Defaults insults Defaults log_input,log_output
Defaults条目类型
Defaults parameter, parameter_list #affect all users on any host Defaults@Host_List parameter, parameter_list #affects all users on a specific host Defaults:User_List parameter, parameter_list #affects a specific user Defaults!Cmnd_List parameter, parameter_list #affects a specific command Defaults>Runas_List parameter, parameter_list #affects commands being run as a specific user
在本指南范围内,我们将专注于以下形式的第一种Defaults。参数可以是标志、整数值、字符串或列表。
您应该注意,标志隐式为布尔值,并且可以使用'!'
运算符关闭,列表有两个额外的赋值运算符,+=
(添加到列表)和-=
(从列表中删除)。
Defaults parameter OR Defaults parameter=value OR Defaults parameter -=value Defaults parameter +=value OR Defaults !parameter
1. 设置安全路径
这是每个使用sudo运行的命令所使用的路径,它有两个重要性:
- 当系统管理员不信任sudo用户具有安全的PATH环境变量时使用
- 用于分隔“根路径”和“用户路径”,只有由exempt_group定义的用户不受此设置影响。
要设置它,请添加以下行:
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
2. 在TTY用户登录会话上启用sudo
要使sudo能够从真实tty中调用,但不能通过诸如cron或cgi-bin脚本等方法调用,请添加以下行:
Defaults requiretty
3. 使用pty运行Sudo命令
A few times, attackers can run a malicious program (such as a virus or malware) using sudo, which would again fork a background process that remains on the user’s terminal device even when the main program has finished executing.
为了避免这种情况,您可以配置sudo仅从伪pty中运行其他命令,使用use_pty
参数,无论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"
以下是自定义 sudo 日志文件的示例:

5. 记录 Sudo 命令输入/输出
log_input 和 log_output 参数使 sudo 能够在伪终端中运行命令,并分别记录所有用户输入和所有输出发送到屏幕。
默认的 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

您可以使用 cat 命令查看该目录中的其余文件。
6. 讲解 Sudo 用户
要向系统中的 sudo 用户讲解密码使用,请使用以下 lecture 参数。
它有 3 个可能的值:
- always – 始终向用户讲解。
- 一次 – 仅在用户第一次执行sudo命令时讲解(当未指定值时使用)
- 从不 – 从不对用户进行讲解。
Defaults lecture="always"
此外,您可以使用lecture_file参数设置自定义讲解文件,在文件中输入适当的消息:
Defaults lecture_file="/path/to/file"

7. 输入错误的sudo密码时显示自定义消息
当用户输入错误密码时,命令行会显示特定消息。默认消息为“对不起,再试一次”,您可以使用badpass_message参数修改消息如下:
Defaults badpass_message="Password is wrong, please try again"
8. 增加sudo密码尝试次数限制
参数passwd_tries用于指定用户可以尝试输入密码的次数。
默认值为3:
Defaults passwd_tries=5

使用passwd_timeout参数设置密码超时时间(默认为5分钟),添加以下行:
Defaults passwd_timeout=2
9. 让Sudo在您输入错误密码时侮辱您
如果用户输入错误密码,sudo将在终端上显示侮辱性言论,这将自动关闭badpass_message参数。
Defaults insults

阅读更多: 让Sudo在您输入不正确密码时侮辱您
10. 了解更多Sudo配置
您可以通过阅读以下文章了解更多sudo命令配置信息:su和sudo之间的区别以及如何在Linux中配置sudo。
就是这样!您可以通过下面的评论部分与其他Linux用户分享其他有用的sudo命令配置或技巧和提示。
Source:
https://www.tecmint.com/sudoers-configurations-for-setting-sudo-in-linux/