lee*_*d00 20 linux security scripting
这周我在搞 PowerShell,发现你需要对你的脚本进行签名才能运行它们。Linux 中是否有任何与阻止 bash 脚本运行相关的类似安全功能?
我所知道的与此类似的唯一功能是需要特定密钥的 SSH。
Gil*_*il' 13
是和否。
Linux 软件分发的工作方式与 Windows 软件分发有些不同。在(非嵌入式)Linux 世界中,分发软件的主要方法是通过分发版(Ubuntu、Debian、RHEL、Fedora、Arch 等)。大约十年以来,所有主要发行版都系统地签署了他们的软件包。
当软件独立分发时,由供应商决定他们将如何发布他们的软件。好的供应商提供与主要发行版兼容的软件包源(没有适用于所有 Linux 的统一分发机制:软件分发是发行版之间的主要区别点之一)并且用供应商的密钥签名。Linux 发行版很少充当第三方供应商的签名机构(Canonical 与 Ubuntu 合作伙伴一起这样做,但涵盖的供应商很少),而且我认为所有主要发行版都使用 PGP 信任网络而不是 TLS 公钥基础结构,因此由用户决定他们是否想要信任密钥。
没有特殊的机制可以从包含本地可执行文件、数据文件或多个文件的软件包中挑选出包含单个脚本的软件包。也没有任何签名验证内置到任何通用脚本解释器中,因为验证软件包与运行脚本完全正交。
我认为 Windows 会用它们的来源来注释文件,并且需要用户确认才能运行其来源是“下载”而不是“本地”的文件。Linux 确实没有类似的机制。最接近的是执行权限:下载的文件没有执行权限,用户需要显式启用它(chmod +x
在命令行上,或文件管理器中的等效操作)。
bat*_*tad 11
如果您要锁定用户运行脚本的能力,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
一句话,“不”。
Linux 并没有真正区分可执行文件和脚本。在#!
一开始是一种方法来告诉运行什么程序来评估输入的内核,但它不是可以被执行的脚本的唯一途径。
所以,例如,如果我有一个脚本
$ cat x
#!/bin/sh
echo hello
Run Code Online (Sandbox Code Playgroud)
然后我可以使用命令运行它
$ ./x
Run Code Online (Sandbox Code Playgroud)
这将导致内核尝试执行它,发现它#!
然后有效地运行/bin/sh x
。
但是,我也可以运行这些变体中的任何一个:
$ sh ./x
$ bash ./x
$ cat x | sh
$ cat x | bash
$ sh < x
Run Code Online (Sandbox Code Playgroud)
甚至
. ./x
Run Code Online (Sandbox Code Playgroud)
因此,即使内核试图在exec
层上强制签名,我们也可以通过仅以脚本作为参数运行解释器来绕过这一点。
这意味着签名代码必须在解释器本身中。什么会阻止用户在没有签名执行代码的情况下编译他们自己的 shell 副本?
对此的标准解决方案不是使用签名,而是使用强制访问控制 (MAC),例如SELinux
. 使用 MAC 系统,您可以准确指定允许每个用户运行和转换层的内容。因此,例如,您可以说“普通用户可以运行任何东西,但 Web 服务器和 CGI 进程只能访问/var/httpd
目录中的内容;其他一切都被拒绝”。
归档时间: |
|
查看次数: |
4586 次 |
最近记录: |