【実務・中級編】【上級プロフェッショナル向け】Windows CipherコマンドとFSOを連動させた機密ファイルの自動暗号化フォルダ格納パイプライン – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを極める:FSOとCipherコマンドで構築する「堅牢な暗号化パイプライン」の設計思想

世の中には「動けばいい」というレベルのスクリプトが溢れている。だが、我々が扱うのは機密情報だ。FSO(FileSystemObject)でファイルを生成し、無防備にディスクへ放置する……そんな実装は、エンジニアとしての怠慢以外の何物でもない。

今回は、VBScriptの堅牢なファイル操作と、Windows標準のEFS(Encrypting File System)を司る`cipher.exe`を融合させ、「生成した瞬間に暗号化される」という、妥協なき機密データハンドリングの自動化パイプラインを伝授する。

—

1. なぜ「Cipherコマンド」を選択するのか

多くの開発者は、暗号化のためにサードパーティ製ライブラリの導入を検討する。しかし、企業環境において外部依存は脆弱性の温床だ。

WindowsのEFSは、ファイルシステムレベルで透過的な暗号化を行う。一度`cipher /e`を適用すれば、OSが自動的にファイルを保護し、権限のないユーザーがそのファイルへアクセスすることは物理的に不可能となる。FSOで書き出した直後にこのコマンドをキックする手法こそ、「最小のオーバーヘッドで最大のセキュリティ」を実現する最適解だ。

2. 実装の極意:プロセス同期とエラーハンドリング

ただコマンドを叩くだけでは甘い。VBScriptの`WScript.Shell`オブジェクトは非同期実行になりがちだ。暗号化が終わる前に次の処理へ進んでしまえば、それは「脆弱な状態のファイル」を世に晒すことになる。

以下のポイントを徹底せよ。

  • 排他制御: `Run` メソッドの第3引数 `bWaitOnReturn` を必ず `True` にし、暗号化完了を待機させる。
  • パスのサニタイズ: スペースを含むパスは必ずダブルクォーテーションで囲む。ここを疎かにする者は、複雑な環境で必ず事故を起こす。
  • オブジェクトの破棄: `Set obj = Nothing` を忘れることは、メモリリークを招く。特にループ内でファイルを生成する場合、この規律は必須だ。

—

3. プロダクションコード:セキュア・ファイル・パイプライン

このコードは、ファイル生成直後に即時暗号化を行い、さらにログ出力で整合性を担保するプロ仕様のテンプレートだ。

Option Explicit

‘ ———————————————————
‘ 機密ファイル生成・即時暗号化パイプライン
‘ ———————————————————
Call SecureWriteFile(“C:\SecureData\Confidential.txt”, “ここに機密データを書き込む”)

Sub SecureWriteFile(strPath, strContent)
Dim fso, ts, shell, cmd
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set shell = CreateObject(“WScript.Shell”)

‘ 1. ファイルの書き込み
On Error Resume Next
Set ts = fso.CreateTextFile(strPath, True)
If Err.Number <> 0 Then
WScript.Echo “エラー: ファイル作成失敗 – ” & Err.Description
Exit Sub
End If
ts.WriteLine strContent
ts.Close
On Error GoTo 0

‘ 2. EFS暗号化属性の付与 (Cipherコマンド)
‘ /e: 暗号化, /a: ファイルとフォルダ両方に適用
‘ bWaitOnReturn = True でコマンド完了まで待機
cmd = “cipher /e “”” & strPath & “”””

If shell.Run(cmd, 0, True) = 0 Then
WScript.Echo “成功: ファイルを暗号化しました: ” & strPath
Else
WScript.Echo “警告: 暗号化に失敗しました: ” & strPath
End If

‘ 3. 後始末 (メモリリークを防ぐ鉄則)
Set ts = Nothing
Set fso = Nothing
Set shell = Nothing
End Sub

—

4. 運用のための注意点:ここがエンジニアの分かれ道

  • 暗号化の継承: EFSはフォルダ単位での設定も可能だ。可能であれば、対象フォルダ自体に`cipher /e`を適用しておくことを強く推奨する。そうすれば、フォルダ内に作成されたファイルは自動的に暗号化属性を継承する。
  • バックアップと鍵: EFSはユーザーの証明書に紐づく。「暗号化したユーザーが退職したらファイルが開けなくなる」という地獄のような事態を避けるため、暗号化用の専用サービスアカウントを作成し、証明書を適切にバックアップしておくこと。
  • データベース連携時の罠: データベースから抽出したデータをファイル化する場合、一時ディレクトリのセキュリティが脆弱なことが多い。抽出先は必ず暗号化済みの特定のフォルダ内に限定せよ。

最後に:自動化の真髄

「自動化」とは、ただ作業を速くすることではない。「作業をミスが起きない状態に固定すること」だ。

今回紹介したCipherコマンドとの連動は、OSの機能を最大限に活用する、極めて「VBScriptらしい」解決策だ。このコードをベースに、君たちの業務環境に合わせてカスタマイズしてほしい。コードは語る。君がどれだけ「品質」に対して誠実であったかを。

さあ、退屈な手作業から脱却し、設計の美しさをコードに刻み込め。

タイトルとURLをコピーしました