設定ファイルからシークレットを抽出する、もしくはパッケージを利用して暗号化する
一段落説明
Node.js アプリケーションにキーやシークレットを渡すための最も一般的で安全な方法は、実行環境における環境変数にそれらの値を格納することです。環境変数に設定することで、それらの値にグローバルオブジェクトである process.env
オブジェクトからアクセスできるようになります。
アプリケーションが全ての設定をコードから正しく抽出できているかどうかのリトマステストとしては、クレデンシャルを晒すことなくコードをいつでもオープンソースにすることができるかどうか、というものがあります。
シークレットをソースコントロールの中に格納しなければならない稀な状況の場合においては、cryptr のようなパッケージを使用することで、平文ではなく暗号化された形で保存することができます。
git-secrets のように、git commit においてコミットやコミットメッセージを監査して、誤ってシークレットを追加されていないかをチェックするツールが多く存在します。
コード例
環境変数に格納された API キーにアクセスする:
const azure = require('azure');
const apiKey = process.env.AZURE_STORAGE_KEY;
const blobService = azure.createBlobService(apiKey);
cryptr
を使用して暗号化されたシークレットを保存する:
const Cryptr = require('cryptr');
const cryptr = new Cryptr(process.env.SECRET);
let accessToken = cryptr.decrypt('e74d7c0de21e72aaffc8f2eef2bdb7c1');
console.log(accessToken); // ソースコントロールに保存されていない、復号化された文字列を出力します
他のブロガーが言っていること
環境変数は、コードを変更することなくデプロイごとに簡単に変更できる。設定ファイルとは異なり、誤ってリポジトリにチェックインされる可能性はほとんどない。また、独自形式の設定ファイルや Java System Properties など他の設定の仕組みとは異なり、環境変数は言語や OS に依存しない標準である。The 12 factor app より