首页 > 教程 > FreeBSD 教程 > FreeBSD 基础 > 权限管理工具 > FreeBSD sudo 命令提升权限

FreeBSD sudo 命令提升权限

sudo(英文全称为 superuser do)能够实现权限管理,允许普通用户以超级用户或其他用户的身份来运行特定命令,而无需共享 root 密码。

sudo 采用插件式架构设计,主要由以下组件构成:

  1. 前端程序:sudosudoedit命令,为用户提供命令接口
  2. 策略插件:配置用户执行命令的权限,默认为sudoers.so,默认会自动加载
  3. 审计插件:记录所有 sudo 操作
  4. 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/whellwheel 组的用户权限配置。

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 是一个用于管理权限的重要工具,它能够提高系统操作的安全性,值得你去学习。