エクセルやワードのマクロに署名を設定する
昔からよくセキュリティインシデントの種となっているエクセルやワードのマクロですが、便利で多くのユーザーに使われているから攻撃者から狙われているという面もあり、危険だからつかわなければいいというわけにもいかないのが実情です。
筆者は昔からデジタル署名がないというダイアログを無視してきましたが、マイクロソフトがオフィスにおけるマクロをデフォルトで無効にするなど状況の悪化を感じたので、自己署名だけでもを適用させてみようかなということでこの記事を書いています。
ちなみにマクロの無効化はデフォルト値が無効になっただけのようです。ワードやエクセルのマクロの設定で「警告を表示してすべてのマクロを無効にする」を選択しておいて、マクロを開いた時のダイアログから有効化すればファイルに更新があるまで有効であり続けるという運用は現時点では可能なようです。
Microsoftサポート:「マクロ プロジェクトにデジタル署名を追加する」を参考にWindows10の環境を例に進めていきます。
署名
ここで用いられる「署名」はインターネットのSSL通信などで広く使われている技術で、以前利用したLet's Encryptで証明書の発行する際などにも同じ仕組みが用いられています。
CAによる署名はユーザーの身元を保証してくれるものです。信頼できるCAから署名された信頼できるユーザーが作ったマクロなら稼働させても問題ないという理屈で、マクロは受け入れられます。
商用CAに自分を証明してもらえば一番いいのですが、あまりコストもかけられないという場合は自分で署名をします。そのためのツールもMSオフィスには備わっています。
SelfCert.exe
マイクロソフトが用意している自己署名プログラムはSelfCert.exeで、これはOfficeフォルダの中にあります。
アーキテクチャ(32,64)やバージョンによって、フォルダは分かれています。
365なら「C:¥Program Files¥Microsoft Office¥root¥Office..」、2013の32bit版なら「C:¥Program Files (x86)¥Microsoft Office¥root¥Office15」といった具合です。
筆者の場合2019の32bit版で「C:¥Program Files (x86)¥Microsoft Office¥root¥Office16」にありました。
ダブルクリックして実行すると、証明書用の名前を聞いてくるので入力して実行ます。これは識別用なのでわかりやすい名前にしておきましょう。
証明書の適用
作成された証明書は、コントロールパネルから表示できる「証明書マネージャー」の中の「個人」の証明書フォルダに入っています。削除したい場合はここから可能です。
作成した証明書利用するには(マクロに署名するには)オフィスの「開発」メニューから「Visual Basic」を立ち上げて、「ツール」タブの「デジタル署名」から選択可能になっています。証明書選択時、通常表示される候補はひとつですが、複数存在する場合は下段の「その他」をクリックすると他の利用可能な証明書も表示されます。
マクロに署名を適用すると証明書を作成したPCでは、マクロのセキュリティで「デジタル署名をされたマクロを除き、すべてのマクロを無効にする」が選択された状態でも警告なしでマクロが動くようになります。
ファイルを編集する
デジタル署名の設定をしたエクセルやワードのファイルをマクロのコードを編集した場合は、以前に署名した有効な証明書があれば自動で再署名してくれます。
この再署名の意味を説明するために、デジタル署名とは実際何をしているのかという話をします。
デジタル署名が実際に何をしているのかというと、マクロのコード全体を公開鍵暗号方式の秘密鍵で暗号化しています。通常、証明書というと公開鍵暗号方式の「公開鍵」を指すことが多いですが、今回作成された証明書は「公開鍵」と「秘密鍵」も含んだものになります。
秘密鍵で暗号化したものを公開鍵で、公開鍵で暗号化したものを秘密鍵で元にもどせるのが公開鍵暗号方式です。
秘密鍵を使って暗号化されたマクロのコードが「署名」にあたります。マクロのコードをそのまま暗号化すると場合によってはとても長くなるので実際にはハッシュを暗号化します。署名を「公開鍵」で復元したマクロのコード(のハッシュ)と、その内容が実際に書かれているマクロのコード(をハッシュ化したもの)が一致した際に、利用者は「署名に偽り無し」と判断できます。
このような仕組みになっているので、マクロのコードに変更があれば再度署名(秘密鍵での暗号化)が必要になるということです。
他のPCで署名済みのマクロを利用する
マイクロソフトのページでは紹介されていませんでしたが、証明書を発行したPCのから公開鍵を取り出して利用することで、デジタル署名済みのマクロ付ファイルを別のPCでも署名ありのマクロとして扱うこともできます。
秘密鍵がマクロを署名する本人にもわからないな為、本格的な管理には向きませんが小規模オフィスでの運用ならこれで問題ないかもしれません。
その方法を紹介します。
- 証明書を表示
まず、さきほど紹介したように証明書マネージャーから作成した証明書を表示させます。
- 証明書のエクスポート
証明書を右クリックし、メニューから「エクスポート」を選択します。ウィザードに沿って進ます。途中の項目で「秘密キーをエクスポートしません」を選択します(「します」側は選択できないと思います)。形式はそのままDERを選択してください。ファイル名を聞かれたら参照から「デスクトップ」や「USBメモリのドライブ」など好みの場所を選択し、適当な名前をつけて(vba.cerなど)「完了」を押します。
- 証明書をコピー
エクスポートした証明書を利用したいPCへコピーします。証明書からは秘密鍵が取り除かれていますが、それなりの管理をしましょう。
- 利用したいPCで証明書インポート
利用したいPCで証明書を右クリックして、「証明書をインストール」を選択します。続くウィザードで、「現在のユーザー」を選択したあと「証明書を次のストアに配置する」から参照ボタンで「信頼されたルート証明機関」を選んで完了させます。
- マクロ付ファイルをコピーして実行
マクロ付ファイルではマクロのセキュリティレベルが「警告を表示せずにすべてのマクロを無効にする」だとマクロは稼働しませんので確認してください。
これで、コピー先のPCで「デジタル署名をされたマクロを除き、すべてのマクロを無効にする」が選択された状態でマクロが動くようになります。
マクロ付ファイルをコピー先で利用する際ですが、ワードなら文章部分、エクセルなら表の部分を修正する場合は問題ありませんが、マクロ部を編集すると署名が消えてマクロが動かなくなるので注意してください。
秘密鍵は元のPCにしか存在しないので、新しいマクロのコードを署名できないのが原因です。言いかえれば、この仕組みがデジタル署名によるセキュリティそのものです。
思わぬセキュリティホールになる可能性もありますので、もしコピー先で証明書によるマクロの有効化が不要になったら「証明書マネージャー」の「信頼されたルート証明機関」から証明書を削除しておきましょう。ただし、この中にある証明書は重要なものが多いので間違えて削除しないように気を付けてください。
OpenSSLでデジタル署名用の証明書を作成する
OpenSSLを使って証明書を作成すれば、仮にPCが変わっても同じ証明書を使うことができます。セキュリティ的にはよくないことかもしれませんが。
OpenSSLがインストールされていればどのPCからでも作成できる作業です。ここではWindows10にOpenSSLをビルド・インストールした状態になっていると過程して進めます。
OpenSSLをインストールした際にできたmiscフォルダにCA作成用のPerlスクリプトがあるので利用しますが、手動でCAを作成してもいいです。(PerlはWindowsでOpenSSLをビルドする際に必要なのでこれもインストールされている前提です)
ターミナルはここではPower Shellを使っています。「C:¥Program Files」の下層のフォルダで作業をしますので、管理者権限で起動しています。
CA.plコマンドを実行したあと、CAの情報を対話式で入力することを求められますが、入力内容がわからない場合は、OpenSSLで認証局を作って証明書を発行した際の記事を参考にしてください。
PS C:¥Program Files¥Common Files¥SSL¥misc> .¥CA.pl -newca ... # 途中パスワード設定があるので覚えておいてください。※1 ... # CAの自己署名をします PS C:¥Program Files¥Common Files¥SSL¥misc> openssl x509 -req -in .¥demoCA¥careq.pem -signkey .¥demoCA¥private¥cakey.pem -days 730 -out .¥demoCA¥ca.crt ... # 途中※1で設定したパスワードを入力します。 ...
次に署名用のファイルを作成しておきます。テキストファイルに次の2行を入れて保存します。保存場所や名前に制限はありません。後でこのファイルへのファイルパスを引数にコマンドを実行します。この「extendedKeyUsage = codeSigning」の部分で、コード署名用の証明書となります。
.¥misc¥demoCA¥v3.txt
basicConstraints=CA:FALSE extendedKeyUsage = codeSigning
コードを記述するPCの秘密鍵と公開鍵(証明書)を作成します。コマンド入力後は対話式にPC情報の入力を求められます。
PC情報では、「Common Name」の箇所だけ先のCAと違う値にしておけばいいと思います。
C:¥Program Files¥Common Files¥SSL¥misc> openssl req -new -out .¥demoCA¥certs¥pc-request.csr -keyout .¥demoCA¥certs¥pc-private.key ... # 途中PC用のパスワードを入力します ※2 ... # CAでPCの証明書を作成(署名)します。 # ここで先ほど作成したテキストファイルへのパスを指定します C:¥Program Files¥Common Files¥SSL¥misc> openssl x509 -req -in .¥demoCA¥certs¥pc-request.csr -CA .¥demoCA¥ca.crt -CAkey .¥demoCA¥private¥cakey.pem -days 730 -out .¥demoCA¥certs¥pc.crt -extfile .¥demoCA¥v3.txt
最後に証明書配布用にp12形式にします。
このp12形式のファイルとそのパスワードを保存してけば、PCの環境が変わってもコード署名用の証明書を再インストールことができます。
C:¥Program Files¥Common Files¥SSL¥misc> openssl pkcs12 -in .¥demoCA¥certs¥pc.crt -inkey .¥demoCA¥certs¥pc-private.key -certfile .¥demoCA¥ca.crt -out .¥demoCA¥certs¥pc.p12 -export -name p12ForCodeSign # ※2で設定したパスワード入力の後に、p12形式の証明書をエクスポートする際のパスワード設定を求められますので新たに設定します。 ※3。
別の環境で証明書を作った場合はp12形式のファイルをPCに移動させます。
p12形式の証明書を右クリックメニューからの証明書のインストールで、証明書マネージャの「個人用」にインストールします。この時、証明書インストール用のパスワードを求められますので※3で設定したパスワードを入力します。
この証明書で署名したコードを別のPCで警告なく実行するためには、実行したいPCで「信頼されたルート証明機関に」CAの証明書(ca.crt)、「信頼された発行元」にPCの証明書(pc.crt)をインストールする必要があります。p12形式のファイルはデジタル署名のための秘密鍵を含みますのでマクロに署名するPC以外にはコピーやインストールしません。マクロを実行するだけの環境へは、証明書作成の過程でできた公開鍵をコピーしてインストールするようにしてください。
合わせて、証明書作成途中で生成された「cakey.pem」や「pc-private.key」は「秘密鍵」にあたり、これが漏洩するとセキュリティホールになりうるのでp12ファイルと合わせて管理を厳重にしてください。「cakey.pem」や「pc-private.key」は今回想定している運用では、p12形式のファイルを再生成したい時ぐらいしか使わないので、削除してもいいかもしれません。