FreeBSD sudo 命令提升权限
sudo(英文全称为 superuser do)能够实现权限管理,允许普通用户以超级用户或其他用户的身份来运行特定命令,而无需共享 root 密码。
sudo 采用插件式架构设计,主要由以下组件构成:
- 前端程序:
sudo和sudoedit命令,为用户提供命令接口 - 策略插件:配置用户执行命令的权限,默认为
sudoers.so,默认会自动加载 - 审计插件:记录所有
sudo操作 - I/O插件:记录命令的输入与输出
sudo 命令的模块化设计,使得用户可以按照需求扩展功能。
安装 sudo
在 FreeBSD 系统中,默认没有安装 sudo 软件包,可以使用 pkg 或者 ports 两种方式在 freebsd 系统中安装 sudo:
1)通过 pkg 安装 sudo 软件包:
pkg install sudo
2)通过 ports 安装 sudo 软件包:
# 首先要转到 sudo 的软件包目录
cd /usr/ports/security/sudo
# 配置编译选项(可选)
make config
# 编译并安装
make install clean
3)安装后 sudo 命令的目录为:
/usr/local/bin/sudo
注:也可以使用 sudo-rs 软件包,其基本的使用方式基本一致。
为用户配置 sudo 权限
如果你只是想为用户配置 sudo 权限,可以使用两种方式为用户配置 sudo 权限。
- 把用户加入 wheel 组,赋予 wheel 组执行
sudo的权限 - 直接赋予用户执行
sudo的权限
赋予 wheel 组 sudo 权限
1)以 root 用户权限,在 /usr/local/etc/sudoers.d 目录中创建文件:
visudo -f /usr/local/etc/sudoers.d/groupwheel
2)添加如下的配置:
%wheel ALL=(ALL:ALL) ALL
3)把需要以 root 权限运行命令的用户 fu 添加到 whell 组,运行命令:
pw groupmod wheel -m fu # 修改为你自己系统中的用户名
直接赋予用户执行 sudo 的权限
本例以 fu 用户为例,你只需修改为自己系统中使用的用户名即可。
1)以 root 用户权限,在 /usr/local/etc/sudoers.d 目录中创建文件:
visudo -f /usr/local/etc/sudoers.d/userfu
2)添加如下的配置:
fu ALL=(ALL:ALL) ALL
想进一步学习 sudo 命令,可以继续往下看。
配置文件详解
sudo 命令的主要配置文件有如下几个:
/usr/local/etc/sudo.conf:主配置文件,主要用于为程序配置插件/usr/local/etc/sudoers:用户权限配置文件,配置用户是否可以运行,以什么方式运行 sudo。/usr/local/etc/sudoers.d/:用户权限配置目录,可以把用户权限配置分到多个文件中,便于管理配置,用户自定义的配置最好在该目录中添加。
编辑工具 visudo
推荐使用专用的配置文件编辑命令 visudo,它会在一个临时文件中编辑文件,在保存时会对编辑的内容做语法检查,如果格式正确,再保存到对应的文件中,这样可以防止配置文件错误。
直接 vi 命令编辑文件,会直接修改配置文件,不会检查语法错误,可能导致系统出现问题。\
visudo 命令的具体使用与 vi 相同。
visudo 命令的参数:
- 不带任何选项:编辑默认
sudoers系统配置文件/usr/local/etc/sudoers - 使用
-c选项:检查配置文件的语法,有错误时输出错误信息,无错误时不输出任何信息 - 使用
-f选项:指定编辑的具体配置文件,如:visudo -f /usr/local/etc/sudoers.d/wheel
用户权限配置详解
用户权限配置文件为 /usr/local/etc/sudoers,或者在 /usr/local/etc/sudoers.d/ 目录中创建配置文件,名称任意,最好以文件中的配置内容命名,如 /usr/local/etc/sudoers.d/whell 为 wheel 组的用户权限配置。
sudoers 文件的内容主要由三种类型的内容,配置内容的优先级从高到底为:
Defaults:用户权限的一些默认配置Alias:别名,可以看作是名称定义为另一种称呼,或者是把一些名称集合定义为一种称呼,这样会简化名称的使用User_Spec:用户权限规则,具体的用户权限配置。
Defaults 配置
Defaults 用于设置一些默认值,可以设置全局的默认值,也可以按照主机、用户、命令、运行身份分类设置默认值。
Defaults 配置形式
1)设置全局配置
Defaults 参数
配置示例:
Defaults timestamp_timeout=10
2)按分类设置默认值
不同的分类前需要使用不同的符号来标记。
-
按主机分类设置:
Defaults@主机 参数 -
按用户分类设置:
Defaults:用户/组 参数,示例:Defaults:FULL_ADMINS !log_output -
按命令分类设置:
Defaults!命令 参数 -
按运行身份分类设置:
Defaults>运行身份 参数
常用 Defaults 参数说明
如下以表格的形式给出常用的使用解释说明:
| 常见参数 | 作用 | 类型 | 使用方法 |
|---|---|---|---|
env_reset |
重置环境变量 | 布尔值 | 启用:env_reset,禁用:!env_reset |
requiretty |
仅允许在 tty0 中执行 sudo | 布尔值 | 启用:requiretty,禁用:!requiretty |
log_input |
记录命令输入 | 布尔值 | 启用:log_input,禁用:!log_input |
log_output |
记录命令输出 | 布尔值 | 启用:log_output,禁用:!log_output |
insults |
输错密码时显示调侃语 | 布尔值 | 启用:insults,禁用:!insults |
timestamp_timeout |
密码缓存时间,默认单位为分钟,-1 表示设置为永久 |
整数 | timestamp_timeout=5 |
passwd_tries |
尝试输入密码的次数 | 整数 | passwd_tries=3 |
secure_path |
sudo 执行时的PATH | 字符串 | secure_path=/usr/bin |
logfile |
日志文件路径 | 字符串 | 字符串中含特殊值时,需要使用引号包裹,logfile=/var/log/sudo.log |
env_keep |
需要保留的环境变量 | 列表 | 需要使用引号包裹,env_keep+="DISPLAY HOME" |
env_delete |
需要强制删除的环境变量 | 列表 | env_delete=LD_PRELOAD |
别名
别名的主要作用是简化复杂或重复的配置,可以为用户、主机、命令、运行身份设置别名,在用户权限配置中使用别名代替对应的内容,这样能够减少重复配置,也能够便于维护。
别名规则
别名的命名必须大写字母开头,由大写字母、数字、下划线组成,可以定义 4 种类型的别名,可以在同一行中定义同一类型的多个别名,需要使用:分隔开来。
别名的定义格式如下:
Alias_Type NAME = 条目1, 条目2, ...
别名类型详解
用户别名
用户别名使用 User_Alias 定义,用户别名定义示例如下:
User_Alias FULL_ADMINS = alice, bob, %admin
注:用户别名中可以包含用户、用户 ID、组等
主机别名
用户别名使用 Host_Alias 定义,主机别名定义示例如下:
Host_Alias PROD_HOSTS = web01, 192.168.1.0/24
注:主机别名中可以包含主机名、IP、IP 地址段等
运行身份别名
运行身份别名使用 Runas_Alias 定义,运行身份别名定义示例如下:
Runas_Alias DB_ADMINS = mysql, postgres
注:运行身份别名中可以包含用户、组等
命令别名
命令别名使用 Cmnd_Alias 定义,命令名定义示例如下:
Cmnd_Alias DB_COMMANDS = /usr/bin/mysql, /usr/bin/pg_dump ""
注:命令别名中命令可以使用绝对路径,目录会匹配该目录下的所有命令,也可使用正则表达式匹配命令,同时可以携带参数,当参数为 "" 时,命令运行时不能携带任何参数。
用户权限规则
用户权限规则主要是定义用户执行命令的权限,在配置文件中一行为一个权限配置,基本的权限配置形式为:
用户/组 主机 = [(运行身份)] [标签] 命令
核心语义为:谁在哪些主机上,以什么身份,执行哪些命令。
各部分的解释说明:
1)用户/组:为用户或组配置运行 sudo 命令的规则,可以使用的值主要有:
- 用户名:
alice - 用户ID:
#1001 - 组:
%wheel - 用户别名,需要定义用户别名
2)主机:允许在哪些主机上运行 sudo 命令,可以使用的主要:
- 主机名:
server1 - IP地址:
192.168.1.1 - 主机别名:
WEBSERVERS
3)运行身份:可以以哪些用户 / 组的身份运行命令,要使用 () 包裹,可以使用的主要有:
ALL:所有用户和组ALL:ALL:所有用户、所有组- 用户:
root - 用户:组:
root:wheel - 用户别名:
WEBSERVERS
4)标签:用户修改默认的设置,常用的内容有:
NOPASSWD:执行命令时无需输入密码NOEXEC:禁止命令执行子进程LOG_INPUT/LOG_OUTPUT:记录该命令的输入/输出
5)命令:可以执行的命令,可以使用的内容有:
- 命令,可以使用绝对路径,目录,正则表达式来匹配对应的命令
- 命令别名
总结
sudo 是一个用于管理权限的重要工具,它能够提高系统操作的安全性,值得你去学习。