応用編:セキュリティとベストプラクティス
パスワードや機密情報の安全な保護、コードの安全な実行、静的コード解析ツールを用いた品質担保、および保守性を高めるコーディング規約を解説します。
認証情報の安全な保護
スクリプト内にパスワードや API キーを平文(プレーンテキスト)で直接ハードコードすることは重大なセキュリティリスクとなります。
» PSCredential による対話的入力
パスワードをメモリ上で暗号化して保持する PSCredential オブジェクトを使用します。
# 対話的にユーザー名とパスワードを入力
$credential = Get-Credential
# 資格情報オブジェクトを用いた認証
Invoke-RestMethod -Uri "https://internal.service.local/api" -Credential $credential
» SecretManagement モジュールの活用
無人運用のスクリプトでは、公式の Microsoft.PowerShell.SecretManagement および Microsoft.PowerShell.SecretStore モジュールを用いて、OS のキーチェーンや暗号化ストアに機密情報を安全に保存・呼び出しを行います。
# 資格情報の保存
Set-Secret -Name "ProductionApiKey" -Secret "secret_value_12345"
# 資格情報の取得
$apiKey = Get-Secret -Name "ProductionApiKey" -AsPlainText
Invoke-Expression の危険性と安全な実行
文字列を PowerShell のコードとして評価・実行する Invoke-Expression(エイリアス iex)は、SQL インジェクションと同様の「コマンドインジェクション」を引き起こすリスクがあります。
外部からの入力値を含む文字列を直接実行することは避け、&(呼び出し演算子)やスクリプトブロックを使用します。
# 非推奨(危険):外部入力による任意のコマンド実行リスク
# Invoke-Expression "Get-Process -Name $userInput"
# 推奨:安全なコマンド実行
& "Get-Process" -Name $userInput
PSScriptAnalyzer による静的コード解析
PSScriptAnalyzer は、PowerShell スクリプトの品質、パフォーマンス、セキュリティ上の問題を自動検査する公式の静的コード解析ツールです。
# 現在のディレクトリ内の全スクリプトを検査
Invoke-ScriptAnalyzer -Path "." -Recurse
検査により、以下のような問題が事前に警告されます。
- エイリアスの使用(
ls,select等の未展開記述) - 平文のパスワード定義
- 承認されていない動詞の使用
- グローバル変数の乱用
スクリプト作成のベストプラクティス
長期間にわたり保守しやすく、共同開発でトラブルの起きにくいスクリプトを作成するための基本方針です。
» 1. スクリプト内では正式名称を使用する
対話操作ではエイリアスが便利ですが、スクリプトファイル(.ps1)内では必ず完全なコマンドレット名とパラメータ名を記述します。これにより、第三者が読んだ際にも意図が明確になります。
» 2. クロスプラットフォームを意識したパス指定
Windows だけでなく Linux や macOS 上の PowerShell 7 でも動作するよう、パス区切り文字にはスラッシュ(/)を使用するか、Join-Path コマンドレットを使用します。
» 3. 承認された動詞に従う
自作の関数を命名する際は、Get-Verb で確認できる標準動詞(Get, Set, New, Remove, Test, Update 等)を採用します。一貫した命名規則により、利用者がコマンドを探しやすくなります。