网站搜索

在 Linux 中设置“sudo”的 10 个有用的 Sudoers 配置


在Linux和其他类Unix操作系统中,只有root用户可以运行所有命令并在系统上执行某些关键操作,例如安装和更新、删除软件包、创建用户和组、修改重要系统配置文件等等。

但是,承担 root 用户角色的系统管理员可以借助 sudo 命令和一些配置来允许其他普通系统用户运行某些命令以及执行许多重要的系统操作,包括上述操作。

或者,系统管理员可以共享 root 用户密码(这不是推荐的方法),以便普通系统用户可以通过 su 命令访问 root 用户帐户。

sudo 允许允许的用户以 root(或其他用户)身份执行命令,如安全策略所指定:

  1. 它读取并解析 /etc/sudoers,查找调用用户及其权限,
  2. 然后提示调用用户输入密码(通常是用户的密码,但也可以是目标用户的密码。或者可以使用 NOPASSWD 标签跳过),
  3. 之后,sudo创建一个子进程,在该子进程中调用setuid()来切换到目标用户
  4. 接下来,它执行 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 运行的每个命令所使用的路径,它有两个重要性:

  1. 当系统管理员不信任 sudo 用户拥有安全的 PATH 环境变量时使用
  2. 将“根路径”和“用户路径”分开,只有exempt_group定义的用户不受此设置的影响。

要设置它,请添加以下行:

Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

2. 在 TTY 用户登录会话上启用 sudo

要从真实的 tty 调用 sudo,而不是通过 croncgi-bin 脚本等方法调用,请添加以下行:

Defaults  requiretty   

3. 使用 pty 运行 Sudo 命令

有时,攻击者可以使用 sudo 运行恶意程序(例如病毒或恶意软件),这会再次分叉一个后台进程,即使主程序已完成执行,该进程仍保留在用户的终端设备上。

为了避免这种情况,您可以使用 use_pty 参数将 sudo 配置为仅从 psuedo-pty 运行其他命令,无论 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"

以下是自定义 sudo 日志文件的示例:

5. 记录 Sudo 命令输入/输出

log_inputlog_output 参数使 sudo 能够在伪 tty 中运行命令并记录所有用户输入和所有发送到屏幕的输出。

默认的I/O日志目录是/var/log/sudo-io,如果有会话序列号,则存储在该目录中。您可以通过iolog_dir参数指定自定义目录。

Defaults   log_input, log_output

支持一些转义序列,例如 %{seq},它扩展为单调递增的 base-36 序列号,例如 000001,其中每两个数字用于形成一个新目录,例如00/00/01 如下例所示:

cd /var/log/sudo-io/
ls
cd  00/00/01
ls
cat log

您可以使用 cat 命令查看该目录中的其余文件。

6. 讲座Sudo用户

要向 sudo 用户讲解系统上的密码使用情况,请使用下面的 lecture 参数。

它有 3 个可能的值:

  1. 总是——总是教导用户。
  2. 一次 – 仅在用户第一次执行 sudo 命令时对他们进行讲授(在未指定值时使用)
  3. 从不——从不教训用户。
 
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配置

此外,您可以通过阅读:su 和 sudo 之间的区别以及如何在 Linux 中配置 sudo 来了解更多 sudo 命令配置。

就是这样!您可以通过下面的评论部分与 Linux 用户分享其他有用的 sudo 命令配置或技巧和技巧。