无论是Linux还是其他类的UNIX系统,都只允许root用户运行全部命令并执行软件包的安装、更新、移除以及其他一些会对系统造成重要修改的特定操作。
然而,也有部分系统管理员允许其他用户正常使用sudo配置以运行此类重要命令并进行关键性系统操作。
也有一些系统管理员会共享root用户密码(这种作法并不推荐),这意味着普通系统用户也能够通过su命令访问root用户账户。另外,sudo也允许用户作为root(或者其他用户身份)执行命令,具体由安全策略指定:
读取并解析/etc/sudoers,查看调用用户及其权限。
而后提示该调用用户输入密码(通常为该用户的密码,也可为目标用户的密码,或者以NOPASSWD标签跳过此步骤)。
在此之后,sudo会创建一个名为setuid()的子进程,用以切换至该目标用户。
而后,它执行一条shell或者命令,并配合子进程中给定的参数。
以下为10个/etc/sudoers文件配置,能够对sudo命令的Defaults效果做出修改。
$ 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条目类型
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类型。它的参数可以是标记、整数值、字符串或者列表。
需要注意的是,各标记为明确boolean且可利用'!'运算符进行关闭。另外,两项赋值运算符分别为+=(添加至列表)与-=(移除自列表)。
Defaults parameter OR Defaults parameter=value OR Defaults parameter -=value Defaults parameter +=value OR Defaults !parameter
1. 设置安全PATH
此为每一条命令配合sudo运行时所使用的路径,其中包含两项重点:
当系统管理员不信任sudo用户掌握安全PATH环境变量时使用。
用于划分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调用sudo,而非使用cron或者cgi-bin脚本等方法:
Defaults requiretty
3.利用pty运行sudo命令
有时候,攻击者会利用sudo运行恶意程序(例如病毒或者恶意软件),它会在主程序停止执行后继续在用户终端设备上fork一个后台进程。
为了避免此类问题,大家可以利用use_pty参数配置sudo以要求它仅可通过psuedo-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得以在pseudo-tty中运行命令,同时分别记录全部用户的输入与输出结果。
默认I/O日志目录为/var/log/sudo-io,如果其中存在一条会话序列号,则将被存储在该目录中。大家可以通过iolog_dir参数指定您需要的目录。
Defaults log_input, log_output