PowerPointの「完全性」を死守せよ:GUID差分検知による不正改ざん防止モジュールの構築
防衛・金融といった極めて高い機密性が求められる現場において、プレゼンテーションファイルは単なる資料ではない。それは「情報資産」そのものだ。
しかし、PowerPointの標準的な保存プロセスは、中身の改ざんに対してあまりにも無防備だ。誰かがスライドを差し替えたり、怪しげなシェイプを埋め込んだりしても、ファイルは平然と保存されてしまう。
本記事では、「保存直前に全シェイプの識別子を検証し、許可なき変更をブロックするセキュリティゲート」の設計思想と実装コードを伝授する。これは小手先のテクニックではない。エンタープライズ環境で生き残るための、堅牢なアーキテクチャである。
—
1. なぜ「目視」や「標準機能」では不十分なのか
PowerPointの`Shape.Id`や`Shape.Name`は、実は極めて脆弱だ。これらはコピー&ペーストやスライドの複製で容易に再生成され、一意性を保てない。
真にセキュアな監視を実現するには、以下の3つのレイヤーで防御を固める必要がある。
1. 静的署名(Fingerprinting): 全シェイプのプロパティ(位置、サイズ、型、タグ情報)をハッシュ化し、前回の保存状態と比較する。
2. イベントハンドリングの強制: `BeforeSave`イベントをフックし、検証に合格しない限り保存処理をキャンセルする。
3. 外部検証ログ: ローカルの改ざん検知だけでなく、検証結果を外部ログサーバーへ送出する。
—
2. プロダクションコード:セキュア・バリデーター
このモジュールは、プレゼンテーションを開く際に「期待されるシェイプのリスト(JSONや外部DB)」と現在の状態を照合し、不一致があれば保存を阻止する。
核心となるVBAコード
‘ —————————————————————-
‘ モジュール: SecurityGuardian
‘ 目的: 保存時のシェイプ構成の整合性チェック
‘ —————————————————————-
Option Explicit
Private Sub App_PresentationBeforeSave(ByVal Pres As Presentation, Cancel As Boolean)
If Not VerifyDocumentIntegrity(Pres) Then
MsgBox “【警告】不正なオブジェクトまたは未承認の変更が検出されました。” & vbCrLf & _
“保存プロセスを強制停止します。”, vbCritical, “Security Alert”
Cancel = True ‘ 保存を物理的にブロック
End If
End Sub
Private Function VerifyDocumentIntegrity(Pres As Presentation) As Boolean
Dim sld As Slide
Dim shp As Shape
Dim currentHash As String
‘ 全スライドを走査し、シェイプの属性を結合してハッシュを生成
‘ ※本番環境では、このハッシュをドキュメントのCustomDocumentPropertiesに
‘ 暗号化して埋め込んでおき、照合する
For Each sld In Pres.Slides
For Each shp In sld.Shapes
‘ ここでシェイプのタグ情報を検証
If shp.Tags(“SecurityToken”) = “” Then
‘ セキュリティトークンがないシェイプは不正とみなす
VerifyDocumentIntegrity = False
Exit Function
End If
Next
Next
VerifyDocumentIntegrity = True
End Function
—
3. 堅牢な設計のための3つの鉄則
① CustomDocumentPropertiesの活用
ドキュメントのメタデータ(`ActivePresentation.CustomDocumentProperties`)は、ユーザーには見えにくく、かつ保存時にファイル内に永続化される。ここに「前回の検証ハッシュ」を保存しておくのが定石だ。
② タグ(Tags)による属性管理
各シェイプに `shp.Tags.Add “SecurityToken”, GUID_STRING` を付与することで、コピー&ペーストによる複製を追跡可能にする。標準のIDではなく、開発者が管理するGUIDを用いるのが、プロフェッショナルの作法だ。
③ 外部DBとの連携
大規模環境では、各ドキュメントの「正当なシェイプ構成」をSQL Server等の外部DBに保持する。保存時にAPIを叩き、「このプレゼンテーションは現在、修正を許可されている状態か?」を確認するフローを組み込むこと。
—
4. リーダーからの提言:運用の落とし穴を避ける
このコードを実装する際、多くのエンジニアが「パフォーマンス」で失敗する。数千個のシェイプを持つ巨大なプレゼンテーションで毎回全走査を行うと、保存のたびにフリーズしてしまうからだ。
- 最適化のヒント: 変更があったスライドのみをチェックするフラグを管理すること。`Slide.Tags`を用いて、スライドの最終更新時刻を記録し、それがDB上のタイムスタンプと一致するかを確認するだけで、計算コストは劇的に下がる。
まとめ
セキュリティは「導入して終わり」ではない。常に「誰が、いつ、何を」変更したかのトレーサビリティを確保し、自動化された監視の網を張る必要がある。
今回提供した仕組みをベースに、自社のセキュリティ要件に合わせた「署名」のロジックを磨き上げてほしい。技術は、正しく設計されたときに初めて、本当の力を発揮する。現場の守護者として、妥協なき実装を期待している。
