TranslateProject/translated/tech/20170107 10 Useful Sudoers Configurations for Setting sudo in Linux.md

9.4 KiB
Raw Blame History

Linux 中设置 sudo 的十条使用的 Sudoers 配置

在 Linux 和其他的类 Unix 操作系统中,只有 root 用户可以运行所有的命令,以及在系统中执行那些需要鉴权的操作,比如安装、升级和移除软件包、创建用户和用户组、修改系统重要的配置文件等等。

然而,作为使用 root 用户角色的系统管理员可以通过 sudo 命令 和一些配置选项来给普通用户进行授权,从而让该普通用户可以运行某些命令已经上述的那些相当重要的系统级操作。

另外,系统管理员还可以共用 root 用户密码 (这个做法是不值得提倡的),这样普通用户就可以通过 su 命令来转化为 root 用户角色。

sudo 允许已授权用户按照指定的安全策略、以 root 用户 (或者是其他的用户角色) 权限来执行某个命令。

  1. sudo 会读取和解析 /etc/sudoer 文件、查找调用命令的用户及其权限。
  2. 然后提示调用命令的用户输入密码 (通常是用户密码,但也可能是目标用户的密码。也可以通过 NOPASSWD 标志来跳过密码验证)。
  3. after that, sudo creates a child process in which it calls setuid() to switch to the target user
  4. next, it executes a shell or the command given as arguments in the child process above.

一下列出十个 /etc/sudoers 文件配置,使用默认入口来执行 sudo 命令是会有不同的动作。

$ sudo cat /etc/sudoers

/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     #对任意主机登录的所有用户起作用
Defaults@Host_List      parameter,   parameter_list     #对指定主机登录的所有用户起作用
Defaults:User_List      parameter,   parameter_list     #对指定用户起作用
Defaults!Cmnd_List      parameter,   parameter_list     #对指定命令起作用
Defaults>Runas_List     parameter,   parameter_list     #对指定目标用户运行命令起作用

在本文讨论范围内,我们下面的将以第一个 Defaults 作为基准来参考。Parameter 可以是标记 (flags)、整数值或者是列表 (lists)。

值得注意的是,标记 (flag) 是指布尔类型值,可以使用 '!' 操作符来进行取反,列表 (lists) 有两个赋值运算符:+= (添加到列表) and -= (从列表中移除)。

Defaults     parameter
或
Defaults     parameter=值
或
Defaults     parameter -=值
Defaults     parameter +=值
或
Defaults     !parameter

1. 安置一个安全的 PATH

该 PATH 应用于每个通过 sudo 执行的命令,需要注意两点:

  1. 当系统管理员不信任 sudo 用户,便可以设置一个安全的 PATH 环境变量。
  2. 该设置将 “root PATH” 和 “user PATH” 分离,只有在 exempt_group 组的用户不受该设置的影响。

可以添加一下内容来设置:

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

2. 启用允许 tty 用户回话使用 sudo

该设置允许在一个真实的 tty 中进行调用,但不允许通过 cron 或者 cgi-bin 脚本等方法来调用。添加一下内容来设置:

Defaults  requiretty   

3. 使用 pty 运行 sudo 命令

少数情况下,攻击者可以通过 sudo 来运行一个而已程序 (比如病毒或者恶意代码),这种恶意程序可能会复制一个后台运行的进程,即时主程序完成执行,它仍能够运行在用户的终端设备上。

为了防止出现这样的情况,你可以通过 use_pty 参数来设置 sudo 使用伪终端来运行其他命令,而不必管 I/O 登录的开启状态。如下:

Defaults  use_pty

4. 创建 sudo log 文件

默认下sudo 通过 syslog(3) 来记录到 logs。但是我们可以通过 logfile 参数来指定一个自定义的 log 文件。如下:

Defaults  logfile="/var/log/sudo.log"

使用 use log_host 和 log_year 参数可以对应记录登录主机名和 4 位数年份到自定义 log 文件。如下:

Defaults  log_host, log_year, logfile="/var/log/sudo.log"

下面是自定义 sudo log 文件的例示:

Create Custom Sudo Log File

创建 sudo log 文件

5. 记录 sudo 命令的输入/输出

log_input 和 log_output 参数可以让 sudo 命令运行在伪终端,并可以对应的记录所有用户在屏幕上的输入和输出。

默认的 I/O log 目录为 /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

Log sudo Input Output

记录 sudo 命令的输入/输出

cat 命令 来查看 该目录的其余部分。

6. 为 sudo 用户提示命令用法

如下,使用 lecture 参数可以在系统中为 sudo 用户提示命令的用法:

参数属性值有三个选择:

  1. always 一直提示
  2. once 用户首次运行 sudo 时提示 (未指定参数属性值时的默认值)
  3. never 从不提示
Defaults  lecture="always"

此外,你还可以使用 lecture_file 参数类自定义提示内容,在指定的文件中输入适当的提示内容即可:

Defaults  lecture_file="/path/to/file"

Lecture Sudo Users

为 sudo 用户提示命令用法

7. 输入错误的 sudo 密码是显示自定义信息

当某个用户输错密码时,会有一个对应的信息显示在屏幕上。默认是“抱歉,请重新尝试。(sorry, try again)”,你可以通过 badpass_message 参数来修改该信息:

Defaults  badpass_message="Password is wrong, please try again"

8. 增加 sudo 密码尝试限制次数

passwd_tries 参数用于指定用户尝试输入密码的次数。

默认为 3。

Defaults   passwd_tries=5

Increase Sudo Password Attempts

增加 sudo 密码尝试限制次数

使用 passwd_timeout 参数设置密码超时 (默认为 5 分钟),如下:

Defaults   passwd_timeout=2

9. 在输错密码时让 sudo 羞辱用户

使用了 insults 参数之后一旦你输出了密码sudo 便会在命令窗口中显示羞辱你的信息。这个参数会自动关闭 badpass_message 参数。

Defaults  insults

Let's Sudo Insult You When Enter Wrong Password

在输错密码时让 sudo 羞辱用户

10. 更多关于 sudo 的配置

此外,欲了解更多 sudo 命令的配置,请自行阅读:su 与 sudo 的差异以及如何配置 sudo

文毕。你也可以在评论区分享其他有用的 sudo 配置或者 Linux 技巧


作者简介Aaron Kili 是一名 Linux 和 F.O.S.S 忠实拥护者、高级 Linux 系统管理员、Web 开发者,目前在 TecMint 是一名活跃的博主,热衷于计算机并有着强烈的只是分享意愿。

译者简介:GHLandy —— 欲得之,则为之奋斗 (If you want it, work for it.)。

GHLandy


via: http://www.tecmint.com/sudoers-configurations-for-setting-sudo-in-linux/

作者:Aaron Kili 译者:GHLandy 校对:校对者ID

本文由 LCTT 原创编译,Linux中国 荣誉推出