当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。
記事そのもののリンクについてはご自由に行っていただいてよいです。

テクてく Lotus 技術者 Slack に参加しよう!

2017年3月27日月曜日

IDボールトによる文書の暗号化(1)・・・LotusScriptでIDボールトの情報を取得する

皆さん、こんにちは。

今週で3月も終わりです。
というか、本ブログはなんとまぁ、10年目に突入してました!\(^o^)/
現時点で540本の記事(これが541本目)を書いていました。平均すると、1週間に1本程度です。
でも、最初から1週間に1本のペースで書いていたらきっと続いていないと思います。
好きな時(書ける時、書こうと思った時)に書いてきたからこそ、ここまで続いたのかな?という感じです。
これからもテキトーに書き続けようと思いますので、ご愛顧ください。


さて、今日もIBM Notes/Domino 9.0.1 Feature Pack 8のお話です。

新機能のうちの一つに「XPagesでの文書の暗号化」というものがあります。

今回のFPの中では、かなりのボリュームを占めているのではないでしょうか?
これは調べないわけにはいかないです。
と言っていますが、・・・実は、この機能は私自身は2年もの間、待ち焦がれていたものです(笑)

ですので、これから何度かに分けて、この暗号化についての記事を書いていこうと思います。

おさらいとして、以下の記事を読んでおいていただくと、わかりやすいでしょう。

フィールドの暗号化(1)・・・暗号キーを作成する
フィールドの暗号化(2)・・・暗号キーをマージする
フィールドの暗号化(3)・・・文書のフィールドを手動で暗号化する
フィールドの暗号化(4)・・・特殊フィールドを使って文書のフィールドを暗号化する
フィールドの暗号化(5)・・・LotusScriptを使って文書のフィールドを暗号化する


では、1回目の今日は、LotusScriptで文書の暗号化を実現してみようかと思います。

え?XPagesじゃないの?とお思いでしょうが、LotusScriptにも機能強化の余波が来ているので、先に紹介しておきましょうということです。

LotusScriptで文書の暗号化を行うこと自体は、上の記事でも紹介しています。
今回は、何を行うのかというと、タイトルにあるように
IDボールトの情報を取得してこようというものです。
というのも、暗号キーの一覧を取得する方法が用意されていなかったのです(少なくとも私は知らないです)。

[ファイル][セキュリティ][ユーザーセキュリティ]メニューで自分のユーザIDの情報を画面上に表示させて、さらに自分が保有する暗号キーの一覧を表示させることはできますが、その一覧をプログラムで利用することができなかったのです。
暗号キーの一覧

それを今回の新機能を利用することで取得できるようになるのです。

サンプルコードを記載します。

    Dim session As New NotesSession
    Dim idvault As     NotesIDVault
    Dim userid  As     NotesUserID
    Dim svname  As     String
    Dim uname   As     String
    
    'サーバ名とユーザ名を取得
    svname = session.CurrentDatabase.Server
    uname  = session.UserName
    
    'IDボールトからユーザ情報及び暗号キー情報を取得
    Set idvault = session.GetIdVault()
    If idvault.IsIdInVault( uname, svname ) = True Then
        Set userid = idvault.getUserID( uname, pswd, svname )
        
        'IDボールト情報が取得できたら、戻り値にセットする
        If Not( userid Is Nothing ) Then
            secUserName = userid.userName
            GetSecretKey = userid.getEncryptionKeys
        End If
    End If


1~5行目は、情報を取得するのに必要な変数です。
2行目と3行目が新しいクラスで、IDボールトとそこに格納されているユーザ情報を表すものです。

12行目で、IDボールトのオブジェクトを生成しています。
13行目で、指定したIDボールトのサーバと取得したいユーザ名(今回は自分自身)の名前を渡して、IDボールト内に情報が格納されているかどうかを判断しています。
14行目で改めて、ユーザ名、パスワード、サーバ名(引数の順序に注意!)を渡してIDボールト内の情報を取得して、NotesUserIDオブジェクト変数に格納します。

ここで重要なのがパスワード情報を渡す必要があるということです。
私の環境に問題があるのか、それとも仕様なのかは分かっていませんが、パスワードを省略することはできませんでした。
また、このパスワードは当然のことながら、ノーツユーザIDのパスワードです。

正しく情報が取得できたら、19行目の「userid.getEncryptionKeys」で暗号キーの一覧を取得できます。
前回の記事を書いたときに作成したサンプルDBにこの機能を追加してみました。
その画面ショットがこちらです。
IDボールトから暗号キーを取得

ここまで来たら、あとは選択した暗号キーを「SecretEncryptionKeys」というフィールドに格納して、文書を保存すればOKです。

文書の保存は、特に細工は必要ありません。
なんなら、@Command([FileSave])コマンド関数で保存してもいいくらいです。
私のサンプルは実際にこのコマンド関数で保存しています。


また、文書の復号化はNotesクライアントが自動で行ってくれるため、プログラムの実装は不要です。
下図は、暗号キーを持たないユーザが文書を開いたときの状態です。
ステータスバーにエラーメッセージが表示されて、暗号データの箇所は見えなくなっています。
暗号キーを持たないユーザが文書を開いた

※この暗号キーは複数選択できるようになっているので、プログラムで実装する場合は、「SecretEncryptionKeys」フィールドは複数値を許可しておく必要があります。




いかがでしょうか?
割と簡単にできましたよね。IDボールトが設定されてさえいれば、ここまでできます。
他のユーザに見せたくない情報はこのように暗号化しておけば、文書だけが漏れても安心で安全です。
非表示にしても、文書のプロパティで参照できますし、読者フィールドが設定してあっても、DBごと盗まれたら解除は可能です。
ですが、暗号キーだけは、ノーツIDがないと復号できません。
これはとても強力なセキュリティになります。

今まででもこの設定はできたのですが、暗号キーを直接入力するしかなかったので、使い勝手が悪かったですが、この機能を使えば、一覧から選択できるようになります。

人事情報(特に個人情報)を格納しているNotes DBに設定してみるのもいいのではないでしょうか。



次回はXPagesで、文書を暗号化するにあたっての条件について書いてみようかと思います。




それでは、今日はこの辺で・・・




Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

0 件のコメント: