在 Linux 中设置 'sudo' 的 10 个有用的 Sudoers 配置
在 Linux 和其他类 Unix 操作系统中,只有root用户才能运行所有命令并在系统上执行某些关键操作,例如安装和更新、删除软件包、创建用户和组、修改重要的系统配置文件等。
但是,担任 root 用户角色的系统管理员可以借助sudo 命令和一些配置允许其他普通系统用户运行某些命令以及执行许多重要的系统操作,包括上面提到的操作。
或者,系统管理员可以共享 root 用户密码(这不是推荐的方法),以便普通系统用户可以通过su命令访问 root 用户帐户。
sudo允许允许的用户以 root(或其他用户)身份执行命令,如安全策略所指定:
- 它读取并解析/etc/sudoers,查找调用用户及其权限,
- 然后提示调用用户输入密码(通常是用户的密码,但也可以是目标用户的密码。或者可以使用 NOPASSWD 标签跳过),
- 之后,sudo 创建一个子进程,并在其中调用setuid()切换到目标用户
- 接下来,它执行上面的子进程中的 shell 或作为参数给出的命令。
下面是十个/etc/sudoers文件配置,使用默认条目修改sudo命令的行为。
$ 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 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 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
为了能够从真实tty调用 sudo ,而不是通过cron或cgi-bin脚本等方法调用,请添加以下行:
Defaults requiretty
3. 使用 pty 运行 Sudo 命令
有时候,攻击者可以使用 sudo 运行恶意程序(例如病毒或恶意软件),这会再次分叉一个后台进程,即使主程序已执行完毕,该进程仍会保留在用户的终端设备上。
为了避免这种情况,您可以使用参数将 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 能够在伪 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
您可以使用cat 命令查看该目录中的其余文件。
6. 向 Sudo 用户讲课
要向 sudo 用户讲解系统上的密码使用方法,请使用以下lesson参数。
它有 3 个可能的值:
- 总是 – 总是教训用户。
- once – 仅在用户第一次执行 sudo 命令时对其进行指导(未指定值时使用)
- 永不 – 永远不要教训用户。
Defaults lecture="always"
此外,您可以使用lesson_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 将使用 insults 参数在终端上显示侮辱性的内容。这会自动关闭badpass_message参数。
Defaults insults
阅读更多:当你输入错误密码时,让 Sudo 侮辱你
10.了解更多 Sudo 配置
此外,您可以通过阅读了解更多sudo命令配置:su 和 sudo 之间的区别以及如何在 Linux 中配置 sudo。
就是这样!您可以通过下面的评论部分与 Linux 用户分享其他有用的 sudo 命令配置或技巧和提示。