我正在使用 Fedora 33。我对一个简单的事实感到困惑。
如果我尝试运行未安装的程序,dnf 将搜索存储库并建议安装它。如果我回答是,它将安装并且我可以正常使用它。
如果我尝试安装该软件 ( dnf install <package>
),系统会要求我输入超级用户密码。
对于我的示例,我尝试以两种方式安装“ranger”,但似乎找不到区别。两者都位于同一 bin 目录中,并且都在进程中的用户下运行。
我的问题如下:如果无论如何都可以简单地安装没有密码的软件,为什么dnf会要求它?
答案1
在您描述的场景中,“您”没有安装已安装的软件包 -封装套件服务(已经以 root 身份运行)正在代表您进行安装。 PackageKit 使用PolicyKit 来确定谁可以或不可以安装软件包 - 如果您不希望非特权用户能够安装软件,您可以更改PolicyKit 策略以禁止它。 PackageKit 存在的原因之一是用户不必了解正在使用的任何发行版上的包管理系统的详细信息(无论是dnf
、 、yum
、 、apt
、 或pacman
,还是其他) - 他们只需要求 PackageKit安装软件包,PackageKit 处理该特定发行版上软件包管理和安装的详细信息。当您在 Fedora 上手动dnf
安装软件包时,您直接与软件包管理系统交互 - PackageKit 不会代表您执行此操作 - 这就是为什么您需要以 root 身份运行(或提供 root 密码)才能运行在该级别安装软件包。但是,作为普通用户,您可以pkcon install <packagename>
要求 PackageKit 代表您进行安装(只要 PolicyKit 中配置的系统策略允许您这样做),而无需以 root 身份运行(通过su
或sudo
等等)。 ),或提供 root 密码。
您所讨论的行为,如果您尝试在命令行上运行由您尚未安装的软件包提供的某些内容,系统会提示您安装软件包,该行为是由名为“的软件包驱动的”PackageKit 命令未找到“。我绝对讨厌这种行为,我在任何新安装的 Linux 系统上做的第一件事就是删除软件包,PackageKit-command-not-found
这样就不会这样做......
答案2
当您键入未安装的程序名称时,它并不是在dnf
安装它,而是封装套件这是找不到命令插件(包PackageKit-command-not-found
)。 PackageKit 使用 PolicyKit 来决定在执行特权任务时是否要求输入密码,并且本地活动管理员用户不需要为软件包安装提供密码(这不是 Fedora 特定功能,它来自 usptream,请参阅这次 FESCO 讨论)。这也是为什么在从 GUI 工具(例如也使用 PackageKit 作为后端的 GNOME Software)安装或更新软件包时不需要提供密码的原因。
您还可以从命令行使用 PackageKit,该命令pkcon
也pkcon install <package>
不会要求输入密码。
以及为什么dnf
需要sudo
?它根本不使用PolicyKit。
答案3
限制 DNF 仅安装当前由现有存储库管理的软件包。实施两个都如果你偏执的话,明确允许和明确拒绝,但是至少执行显式允许,因为显式拒绝本身并不是那么好:
- 显式允许:
- 在 cron 中的某处缓存可用包的列表
- 即,可用的 dnf 列表
- 仅允许该列表中的安装包
- 只允许命名的包
[0-9A-Za-z][0-9A-Za-z._-]+
(不能以 - 开头) - 否认其他一切
- 明确否认:
- 拒绝任何以“-”开头的选项
- 拒绝任何包含“/”的选项,因此无法安装本地和远程软件包。
- 测试:
- 提供对包装器的 sudo 访问权限
- 如果尝试运行 /usr/bin/dnf,请验证 sudo 是否失败
- 验证您的脚本是命令注入安全
我错过了什么吗?我想不出一种方法来利用它来获取 root 权限,除非有一个可以安装的软件包(即,可利用的软件包具有 root 权限升级或默认值配置不当)。
如果您不希望用户构建二进制文件(这可能会被用来利用内核漏洞),那么也可以在您的脚本中排除这些二进制文件:
- 海湾合作委员会
- C++
- 铛
- 去
- 锈
- 福田语言
- 其他的?