フロー上の認証情報の扱いについて確認してみる

以前書いた記事で、Node-RED起動時に「フローのクレデンシャルファイルはシステム生成キーで暗号化されています。」なるメッセージが出力されることを確認しました。このメッセージからは「システム生成キー」や「暗号化されたフローのクレデンシャルファイル」がどこに保存されているのかは読み取れません。今回は、フロー内の認証情報がどのように保存されるか確認してみます。

確認用フロー

今回使うフローはこんな感じです。


http requestノードではBasic認証を有効化してユーザ名とパスワードを設定済みです。


http requestノードを書き出すとこんな感じになります。
[
    {
        "id": "5a89ce70.db6d5",
        "type": "http request",
        "z": "cad6f983ee9de5e2",
        "name": "",
        "method": "GET",
        "ret": "txt",
        "paytoqs": "ignore",
        "url": "http://localhost:1880/hello",
        "tls": "",
        "persist": false,
        "proxy": "",
        "authType": "basic",
        "credentials": {},
        "x": 350,
        "y": 100,
        "wires": [
            [
                "18b48ed8.1072e1"
            ]
        ]
    }
]
autyTypeに「basic」と設定されているのは確認できますが、認証情報そのもの(ユーザ名/パスワード)は見当たりません。Stack Overflowで調べてみると、以下のファイルに保存されるようです。
  • 暗号化されたクレデンシャル:~/.node-red/*_cred.json
  • システム生成キー:~/.node-red/.config.runtime.json
公式ドキュメントではどのファイルにクレデンシャルやキーが保存されているかといった情報は見つけられませんでした。わりと重要だと思うのですが。

動作確認

この情報が正しいか確認のため、まずは「システム生成キー」ファイルを削除後にnode-redを再起動してみます。
$ rm ~/.node-red/.config.runtime.json
$ node-red
〜〜省略〜〜
22 Sep 17:52:51 - [warn] クレデンシャルの読み込みエラー: SyntaxError: Unexpected token � in JSON at position 0
22 Sep 17:52:51 - [warn] フローの読み込みエラー: Error: Failed to decrypt credentials
画面にはこんな警告が表示されました。


期待通り暗号鍵が存在しないと判断されました。http requestノードのプロパティを確認すると、先のメッセージ通り認証情報が消えました。いい感じですね。


Node-REDを再起動すると、先程削除した「システム生成キー」ファイルが再生成されていました。http requestノードのプロパティ画面で「完了」ボタンを選択して認証情報の削除状態を保存後に「デプロイ」して古い認証情報を削除します。次の実験のために再びBasic認証のユーザ名/パスワードを設定&デプロイしておきます。

続いて、「暗号化されたクレデンシャル」を削除後にNode-REDを再起動してみます。

$ rm ~/.node-red/flows_cred.json
$ node-red
〜〜省略〜〜
22 Sep 18:11:11 - [info] フローを開始します
22 Sep 18:11:11 - [info] フローを開始しました
今度は先ほどのような警告は表示されません。http requestノードのプロパティを確認すると、認証情報だけ消えていました。flows_cred.jsonには認証情報が保存されていて、それが削除されたことになります。

まとめ

暗号化されたクレデンシャルとシステム生成キーのありかが確認できました。案外仕組みはシンプルなようです。バックアップや環境を復元する際はこの辺のファイルの扱いに気をつければよさそうです。

コメント

このブログの人気の投稿

Joinノードを使う(その1)

Execノードを使う

Joinノードを使う(その4)