我正在开发一个项目,我们使用配置管理远程部署软件,其中一部分将PowerShell脚本提供给Windows服务器,然后执行这些脚本以执行部分设置和/或配置.
当前部署方法将脚本写入磁盘,但不关闭文件句柄.这样做是为了通过防止任何其他进程在执行之前篡改文件来使脚本更"安全".为了运行脚本,PowerShell必须从stdin读取它,因为如果它无法获得独占访问权限,它就不会运行脚本.调用看起来像这样:
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,但开箱即用它只适用于exes和dll.我试过深入了解PowerShell .Net函数,但发现它们使用的是Cryptui.dll,这是特定于Windows的.
在这一点上,我正在抓住,无论如何我可以将签名添加到脚本中,否则我将不得不回退到运行非原生脚本的其他方式.如果可能的话,我希望能够在脚本的字符串表示中计算内存中的签名,但是如果我能得到的话,我将采用基于文件的方法.