私は、PowerShellスクリプトをWindowsサーバーに配信する構成管理を使用してソフトウェアをリモート展開するプロジェクトに取り組んでいます。このスクリプトは、セットアップおよび/または構成の一部を実行するために実行されます。Windows以外のプラットフォームのPowerShellスクリプトに署名しますか?
現在の展開方法では、スクリプトをディスクに書き込みますが、ファイルハンドルは閉じません。これは、ファイルが実行される前に他のプロセスがファイルを改ざんするのを防ぐことによって、スクリプトをより安全にするために行われました。スクリプトを実行するには、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関数を掘り下げようとしましたが、Windows固有のCryptui.dllを使用しています。
この時点では、とにかく署名をスクリプトに追加することができます。そうでなければ、実際にはネイティブではないスクリプトを実行する別の方法に代替する必要があります。可能であれば、私はスクリプトの文字列表現でメモリ内の署名を計算できるようにしたいと思いますが、それが私が得ることができるのであればファイルベースの方法をとるでしょう。
起動時にテキストファイルに署名し、VBox Windows VM(スタートアップ時にコピーされたSHAハッシュファイルベースのボリューム)を使用してビルドマシンでスピンアップし、WinRbを使用して 'Set-AuthenticodeSignature'をonファイルをシャットダウンし、ファイルベースのボリュームコピーを捨てました...本当に醜いですが、実際にはうまくいきます...最終的に 'osslsigncode'のカスタムバージョンに置き換えられました – SushiHangover
私はモノに入りましたAuthenticodeクラスと私は十分だと思うstdinからのデータに動作する修正版を作るために考え出した。私は私の構成管理ソフトウェアにmono exeを呼び出し、文字列を渡してから、署名されたバージョンのstdoutを読むようにしました。 私たちの設定管理ソフトウェアはネイティブでルビーで動作するので、opensslライブラリを使ってモノコードを複製するためにrubyクラスを構築しようと思います。 – AresonDeladious
フォルダセキュリティを使用して他のアカウントの書き込みアクセスをブロックしたり、Webサーバー上でスクリプトをホストしてから、 'iex((New-Object System.Net.WebClient)を実行することで、改ざんを防止できますか?DownloadString( 'https://myServer/myScript.ps1')) '?あなたはあなたの署名スクリプトでそれを必要とするだけで、スクリプトを取り戻し、必要に応じて署名することができます。その後あなたの説明に従って使用することができます。 – JohnLBevan