🔑

Node.jsでのセキュアな情報の取り扱い

2020/12/01に公開

Node.jsでのセキュアな情報の取り扱い

  • トークンやパスワード等の機密情報をpublicなrepositoryにcommitすると漏洩してしまう
  • 機密情報の扱いについて調べて、取り回しのよい方法を検討する

1. 直接書く

なにも考えずに生の値を書いてしまう。

const HogeToken = "hogehoge";
  • pro: 楽
  • con: 漏洩し放題

「とりあえず」書いてしまうことはあるが、そのままcommitするとあとから削除するのは面倒なことに...

2. とりあえず環境変数にする

見られたら困るものは見えないようにする

# .zprofile
export HOGE_TOKEN="hogehoge"
const HogeToken = process.env.HOGE_TOKEN;

pro: commitすることは防げる
con: 設定ファイルが汚れる

プロジェクト固有じゃない情報ならアリかもしれない

3. VSCodeのワークスペースに設定する

/.vscode/settings.jsonに設定を書くことでVSCodeの統合ターミナルにおいて環境変数として読み込むことができる

{
  "terminal.integrated.shell.osx": "/bin/zsh", // これがないと反映されない
  "terminal.integrated.env.osx": {
    "HOGE_VSCODE": "vscode"
  }
}
const SettingsToken = process.env.HOGE_VSCODE;
console.log(SettingsToken);
  • pro: ローカルならかなりよい
  • con: VSCode以外では使用できない
  • con: 環境変数を切り替えるのは難しい

4. dotenvを用いる

環境変数は.envファイルに書き、

DOTENV_TOKEN="dotenv"
require('dotenv').config()

console.log(process.env.DOTENV_TOKEN);
  • pro: .env.production等ファイルを分割すればまるっと差し替えられる
  • con: 切り替えにソース側の変更が必要
  • con: CI環境では.envファイルの扱いにこまる

5. node -r

require or importで.envファイルを読み込まなくても、nodeオプションでenvファイルを読み込みできる

node -r dotenv/config example/preload.js  

dotenv_config_pathを渡すことでenvファイルを指定することもできる

node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/.env

6. GitHub Secrets

GitHubのrepositoryのSettings/Ssecretsから暗号化された機密情報を保存できる
保存したものはGitHub Actionsでsecrets.hogeから参照できる

サンプルコード割愛

  • pro: GitHub Actionsで使うならこれ
  • con: 管理が大変?

7. GitHub Secretsからenvファイルを生成する

workflowの中でSecretsを読み込んでenvファイルを作り、それを用いる

Actionsとして公開されているものもある
https://github.com/marketplace/actions/create-env-file

8. 設定ファイルをAWS S3の等別の場所にアップロードして管理する

割愛

参考リンク

Encrypted secrets

9. dotenv-cliを用いる

dotenv -f node .env your_script.js
  • pro: 5案よりすっきりする

実際どうするか

.envファイルがいらないなら3+6の組み合わせでよい
ファイル作るなら5または9と7か?

NODE_ENVの値で設定ファイルを切り替えるスクリプトこの実装例はアリかも
https://537.io/magic-configuration-using-module-preloading

備考

ほかにもあれば追加します

Discussion