是否有一个 shell 可以检查以确保代码已签名?

是否有一个 shell 可以检查以确保代码已签名?

这周我在摆弄 PowerShell,发现您需要签署脚本才能运行它们。 Linux 中是否有任何与防止 bash 脚本运行相关的类似安全功能?

据我所知,与此类似的唯一功能是需要特定密钥的 SSH。

答案1

是的,也不是。

Linux 软件分发的工作方式与 Windows 软件分发有些不同。在(非嵌入式)Linux 世界中,分发软件的主要方法是通过发行版(Ubuntu、Debian、RHEL、Fedora、Arch 等)。大约十年来,所有主要发行版都系统地签署了他们的软件包。

当软件独立分发时,由供应商决定如何发布软件。好的供应商提供与主要发行版兼容的软件包源(所有 Linux 没有统一的发行机制:软件发行版是发行版之间的主要区别点之一),并且使用供应商的密钥进行签名。 Linux 发行版很少充当第三方供应商的签名机构(Canonical 与 Ubuntu 合作伙伴一起这样做,但覆盖的供应商很少),而且我认为所有主要发行版都使用 PGP 信任网络而不是 TLS 公钥基础设施,因此由用户决定是否信任密钥。

没有特殊的机制可以从由本机可执行文件、数据文件或多个文件组成的软件包中挑选出由单个脚本组成的软件包。任何常见的脚本解释器中也没有内置任何签名验证,因为验证软件包与运行脚本是完全正交的问题。

我认为 Windows 用其来源来注释文件,并且需要用户确认才能运行来源为“下载”而不是“本地”的文件。 Linux 实际上并没有类似的机制。最接近的是执行权限:下载的文件没有执行权限,用户需要显式启用它(chmod +x在命令行上或文件管理器中的等效操作)。

答案2

如果您要锁定用户运行脚本的能力,sudo那么您可以使用该digest功能。
您可以指定脚本/可执行文件的哈希值,在执行之前sudoers将对其进行验证。sudo因此,虽然与签名不同,但它为您提供了基本保证,即在不修改 sudoers 的情况下,脚本至少没有被修改。

如果命令名称以 Digest_Spec 为前缀,则仅当可以使用指定的 SHA-2 摘要进行验证时,该命令才会成功匹配。这在调用 sudo 的用户对命令或其父目录具有写访问权限的情况下可能很有用。支持以下摘要格式:sha224、sha256、sha384 和 sha512。该字符串可以以十六进制或 base64 格式指定(base64 更紧凑)。有多种实用程序能够生成十六进制格式的 SHA-2 摘要,例如 openssl、shasum、sha224sum、sha256sum、sha384sum、sha512sum。

http://www.sudo.ws/man/1.8.13/sudoers.man.html

答案3

Linux不提供基于数字签名限制bash脚本执行的能力。

有一些关于验证二进制可执行文件的工作。看https://lwn.net/Articles/488906/获取信息。

答案4

Linux 发行版通常有格努普格。在我看来,您想要的只是一个简单的 bash 包装器,它根据参数脚本检查分离的 gpg 签名,并且仅在检查成功时才继续运行脚本:

#!/bin/sh
gpgv2 $1.asc && bash "$@"

相关内容