Node.js: シークレットの管理

Node.jsでシークレットを管理する方法

👋 Stackheroのドキュメントへようこそ!

Stackheroは、数多くの利点を提供するNode.jsクラウドソリューションを提供しています。主な利点は以下の通りです:

  • シンプルなgit push数秒でアプリケーションをデプロイ
  • 独自のドメイン名を使用し、HTTPS証明書の自動設定による強化されたセキュリティを享受。
  • 自動バックアップワンクリックアップデート、そしてシンプルで透明性があり、予測可能な価格設定で安心を提供。
  • プライベートで専用のVMによる最適なパフォーマンスと強固なセキュリティを実現。

時間を節約し、生活を簡素化:StackheroのNode.jsクラウドホスティングソリューションを試すのに5分しかかかりません

Node.jsプロジェクトがデータベース、オブジェクトストレージ、または外部APIと連携する際、ユーザー名、パスワード、トークンなどの認証情報(いわゆる「シークレット」)を安全に保管することが重要です。これらのシークレットを機密に保つことは、アプリケーションのセキュリティを維持する上で不可欠です。

最初は、以下のように認証情報をコード内に直接記述したくなるかもしれません。

// PostgreSQLデータベースへの接続
const pg = new Client({
  host: '<XXXXXX>.stackhero-network.com',
  user: 'admin',
  password: 'myPassword',
  database: 'admin'
});

しかし、この方法は安全ではありません。なぜなら、シークレットが簡単にGitリポジトリに含まれてしまい、アクセス権を持つ誰もが閲覧できてしまうからです。たとえ自分しかアクセスしないと思っていても、パスワードを書いた付箋をモニターに貼っておき、誰にも見られないことを願うようなものです。最終的には深刻なセキュリティ問題につながる可能性があります。

さらに、シークレットをハードコーディングすると、開発環境や本番環境など、異なる環境の管理が難しくなります。

業界で広く推奨されているベストプラクティスは、シークレットを環境変数として管理することです。

環境変数はコードの外部で定義され、Node.jsの起動前に設定されます。すべてのシークレットを環境変数で定義することで、アプリケーション内にハードコーディングされることがなくなります。

環境変数は、Node.jsコマンドの先頭で設定できます。例:

MY_PASSWORD=myDevelopmentPassword node app.js

このコマンドは、MY_PASSWORDという名前の変数にmyDevelopmentPasswordという値を設定します。フォーマットはシンプルで、<KEY>=<value>です。

一般的に、環境変数は大文字で記述します。また、環境変数には文字列のみ格納でき、配列やオブジェクトは使用できません。

app.jsファイル内では、process.envを使って環境変数にアクセスできます。

console.log(process.env.MY_PASSWORD);

このコードはmyDevelopmentPasswordを表示します。

これで、パスワードはコードの外部で定義されるため、誤ってGitリポジトリに含まれるリスクを減らせます。

本番環境でStackheroを利用している場合は、Node.jsサービスのダッシュボードからMY_PASSWORDという名前でmyProductionPasswordの値を持つ新しい環境変数を定義できます。これにより、環境ごとの切り替えもスムーズに行えます。

StackheroダッシュボードでのNode.js設定例StackheroダッシュボードでのNode.js設定例

この方法なら、パスワードはコードに保存されず、開発環境と本番環境で異なる認証情報を簡単に使い分けることができます。

実際のプロジェクトでは、複数のシークレットを管理する必要があることが多いです。たとえば、データベース接続にはホスト名、ユーザー名、パスワードが必要です。

シークレットが1つだけなら簡単ですが、複数になると管理が煩雑になります。例えば、次のようなコマンドでアプリケーションを起動することを想像してください。

POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com POSTGRESQL_USER=admin POSTGRESQL_PASSWORD=myPassword node app.js

このように変数が増えると、可読性や保守性が低下します。本番環境ではさらに多くの変数が必要になるため、この方法は現実的ではありません。

そこで役立つのがdotenvライブラリです。

dotenvを使えば、シークレットを.envという別ファイルにまとめて管理できます。

まず、dotenvライブラリをインストールします。

npm install dotenv

次に、変数を格納するための.envファイルを作成します。

POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com
POSTGRESQL_USER=admin
POSTGRESQL_PASSWORD=myPassword

シークレットを安全に保つため、.envファイルはGitリポジトリに追加しないようにしましょう。.gitignoreファイルに追加します。

echo ".env" >> .gitignore

最後に、app.jsファイルの先頭でdotenvライブラリを読み込みます。

require("dotenv").config();

この構成で、開発環境ではnode app.jsでアプリケーションを起動すると、dotenvが自動的に.envファイルを読み込みます。本番環境では.envファイルは不要で、環境変数はNode.jsサービスの設定から直接取得されます(Stackheroダッシュボードで管理可能)。

理論を説明したところで、実際のサンプルを見てみましょう。

完全な動作サンプルはこちらでご覧いただけます:https://github.com/stackhero-io/dotenvWithNodejs

これらのテクニックを活用することで、シークレットを柔軟かつ安全に管理でき、プロセスもシンプルかつ効率的になります。