linux - 在非 Windows 平台上签署 PowerShell 脚本?

标签 linux powershell mono signature authenticode

我正在开展一个项目,在该项目中,我们使用配置管理远程部署软件,其中一部分将 PowerShell 脚本传送到 Windows 服务器,然后执行这些脚本以执行部分​​设置和/或配置。

当前部署方法将脚本写入磁盘,但不关闭文件句柄。这样做是为了通过防止任何其他进程在执行文件之前篡改文件来使脚本更加“安全”。为了运行脚本,PowerShell 必须从标准输入中读取它,因为如果它不能获得独占访问权限,它就不会运行脚本。调用看起来像这样:

powershell.exe -Command - < C:\temp\some_name.ps1

这有很多缺点,主要是我无法将参数传递给脚本。此外,从 stdin 读取大型脚本会遇到错误字符、换行等问题。

我想以更传统的方法调用脚本,例如

powershell.exe -File C:\temp\some_name.ps1 -Param value ...

但也要本着确保在执行脚本之前没有任何东西可以篡改脚本的精神。为此,我想签署 powershell 脚本并使用“AllSigned”执行策略运行 powershell。

问题在于我无法真正在目标服务器上签署脚本,因为它与运行脚本的 PowerShell 存在相同的问题...我必须释放独占锁才能让 PowerShell 签署文件,但是它可能会被篡改。

然后我决定,如果我可以在将脚本传送到目标机器的服务器上签署脚本,那效果会更好。然而,我们的配置管理软件服务器都是 Linux,我一直在努力寻找在 Linux 上签署 PowerShell 脚本的方法。 Mono 支持 Authenticode,但开箱即用,它仅适用于 exe 和 dll。我尝试深入研究 PowerShell .Net 函数,但发现它们使用 Windows 特定的 Cryptui.dll。

在这一点上,无论如何我都可以将签名添加到脚本中,否则我将不得不回退到其他一些不是真正原生的脚本运行方式。如果可能的话,我希望能够在脚本的字符串表示形式上计算内存中的签名,但如果我只能这样做的话,我将采用基于文件的方法。

最佳答案

不确定这是否适合您,但每当我遇到签名错误时,我都会将其添加到脚本底部:

# SIG # Begin signature block
# SIG # End signature block

我知道它看起来很温和,但这对我有用。

关于linux - 在非 Windows 平台上签署 PowerShell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34670560/

相关文章:

nginx - 错误 : "Failed to process connection. Reason: The object was used after being disposed." with nginx, fastcgi-mono-server4 和 ServiceStack

python - SSH 在短时间后超时的选项? ClientAlive 和 ConnectTimeout 似乎没有做我需要他们做的事情

linux - 为什么使用 "set var = value"采购脚本会破坏 $@?

linux - 在 AWK 生成的命令字符串中嵌入引号?

python - Visual Studio Code 终端在 Powershell 中继续运行 Python 脚本

.net - Mono 在哪里存储 xml 文档?

linux - 如何在 R 中找到以 system 或 system2 启动的子进程的 pid?

powershell - 如何使用powershell删除所有临时文件

Powershell 脚本可根据程序的版本或安装路径远程更改注册表设置

c# - 客户端终结点配置 '*' 未在 1 个终结点、WCF、Mono 中找到