- vừa được xem lúc

Blog#197: 🔐Node.js Expressで API キーとシークレットを安全に保管および管理する方法

0 0 6

Người đăng: NGUYỄN ANH TUẤN

Theo Viblo Asia

197

こんにちは、私はトゥアンと申します。東京からフルスタックWeb開発者です。 将来の有用で面白い記事を見逃さないように、私のブログをフォローしてください。😊

イントロダクション

API キーとシークレットは、アプリケーションで認証と認可の目的で使用される機密情報です。これらの資格情報が漏洩すると、アプリケーションのリソースへの不正アクセスなどの深刻なセキュリティ脆弱性が発生する可能性があります。この記事では、Node.js Express アプリケーションで API キーとシークレットを安全に保管および管理するためのベストプラクティスについて説明します。

1. 環境変数

環境変数に API キーを格納する

API キーとシークレットを管理するためのベストプラクティスの一つは、環境変数として格納することです。環境変数はアプリケーションのコードベースの外にあるため、より安全でポータブルです。Node.js Express アプリケーションでこれを行うには:

  1. プロジェクトのルートディレクトリに.envファイルを作成します。
  2. API キーとシークレットを .envファイルに追加し、API_KEY_NAME=API_KEY_VALUEの形式で記述します。例:
API_KEY=あなたの-api-キー
API_SECRET=あなたの-api-シークレット
  1. dotenvパッケージをインストールします。npm install dotenvを実行します。
  2. アプリケーションで環境変数をロードするために、app.jsまたはindex.jsファイルの先頭に以下の行を追加します:
require('dotenv').config();
  1. これで、process.env.API_KEY_NAMEを使用して API キーとシークレットにアクセスできます。例:
const apiKey = process.env.API_KEY;
const apiSecret = process.env.API_SECRET;

環境変数を安全に保つ

環境変数のセキュリティを確保するために:

.envファイルを.gitignoreファイルに追加し、バージョン管理システムにコミットされないようにします。 異なる環境(開発、ステージング、本番)に対して異なる環境変数を使用し、それぞれぞれの環境で安全に保管します。

2. 暗号化されたシークレット管理

暗号化されたシークレット管理サービスの使用

さらなるセキュリティを提供するために、AWS Secrets Manager、Azure Key Vault、HashiCorp Vaultなどの暗号化されたシークレット管理サービスを利用することを検討してください。これらのサービスは、API キーとシークレットなどの機密データを安全に保管および管理します。

  1. シークレット管理サービスにサインアップし、API キー用の新しいシークレットを作成します。
  2. API キーとシークレットをシークレット管理サービスに追加します。
  3. Node.js Express アプリケーションで、シークレット管理サービス用の適切な SDK をインストールします。
  4. SDK を使用して、シークレット管理サービスから API キーとシークレットを取得するようにアプリケーションを更新します。例えば、AWS Secrets Manager の場合:
const AWS = require('aws-sdk');
const secretsManager = new AWS.SecretsManager(); async function getSecrets() { const data = await secretsManager.getSecretValue({ SecretId: 'あなたの-シークレット-id' }).promise(); return JSON.parse(data.SecretString);
} (async () => { const secrets = await getSecrets(); const apiKey = secrets.API_KEY; const apiSecret = secrets.API_SECRET;
})();

暗号化されたシークレット管理の利点

暗号化されたシークレット管理サービスを使用することで、いくつかの利点が得られます:

  • 機密データの集中化された保管および管理。
  • データの機密性を確保するための、休止状態および転送中の暗号化。
  • より良いセキュリティとコンプライアンスのためのアクセス制御ポリシーと監査証跡。

3. 定期的な API キーとシークレットのローテーション

API キーとシークレットを定期的にローテーションすることで、資格情報が侵害された場合の不正アクセスのリスクを軽減できます。多くの API プロバイダーやシークレット管理サービスは、このプロセスを助ける機能を提供しています。例えば、AWS Secrets Manager はシークレットの自動ローテーションを提供しています。

  1. シークレット管理サービスで API キーとシークレットのローテーションスケジュールを設定します。
  2. API キーとシークレットの変更に対応できるように、Node.js Express アプリケーションを更新します。アプリケーションがローテーションされた API キーとシークレットを最新の状態で取得できるようにします。これには、キャッシュメカニズムの実装や、変更を通知するための Webhook の使用が含まれる場合があります。

例えば、特定の間隔でシークレットをキャッシュおよび更新する関数を作成できます:

const API_KEY_REFRESH_INTERVAL = 3600000; // 1 時間をミリ秒単位で表したもの
let cachedSecrets = null; async function getSecrets() { if (!cachedSecrets) { cachedSecrets = await fetchSecrets(); } return cachedSecrets;
} async function fetchSecrets() { const data = await secretsManager.getSecretValue({ SecretId: 'あなたの-シークレット-id' }).promise(); return JSON.parse(data.SecretString);
} function refreshSecrets() { fetchSecrets() .then((secrets) => { cachedSecrets = secrets; }) .catch((error) => { console.error('シークレットの更新に失敗しました:', error); });
} setInterval(refreshSecrets, API_KEY_REFRESH_INTERVAL);
  1. アプリケーションが API キーとシークレットのローテーションをダウンタイムやエラーなしで処理できることを確認するために、アプリケーションをテストします。

4. API キーの使用状況を監視およびログ

API キーとシークレットの使用状況を監視およびログに記録することで、不正アクセス、セキュリティ侵害の可能性、およびアプリケーションのパフォーマンスの改善点を検出できます。

  1. Node.js Express アプリケーションでログおよび監視メカニズムを実装します。winstonbunyanなどのログライブラリを使用して、APIキーの使用状況をログに記録します。
const winston = require('winston');
const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [new winston.transports.Console()],
}); // ... // API リクエストを行う際に API キーの使用状況をログに記録
logger.info('API リクエストを行います', { apiKey });
  1. API キーの使用状況が通常とは異なるパターンや、セキュリティ侵害が疑われる場合にアラートや通知を設定します。AWS CloudWatch、Logz.io、Datadog などのログ管理および監視サービスを利用して、ログデータに基づいた自動アラートを設定できます。

  2. 定期的にログとアラートを確認し、セキュリティ問題や改善点を特定します。

まとめ

Node.js Express アプリケーションで API キーとシークレットを安全に保管および管理することは、アプリケーションのセキュリティと完全性を確保するために重要です。この記事で説明したベストプラクティス、環境変数の使用、暗号化されたシークレット管理サービス、API キーとシークレットの定期的なローテーション、API キー使用状況の監視などに従うことで、不正アクセスのリスクを大幅に減らし、アプリケーション全体のセキュリティを向上させることができます。

最後

いつもお世話になっています。この記事を楽しんで、新しいことを学べたら嬉しいです。😊

今度の記事でお会いしましょう!この記事が気に入ったら、私を応援するために「LIKE」を押して登録してください。ありがとうございました。

Ref

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 502

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 414

- vừa được xem lúc

Một số phương thức với object trong Javascript

Trong Javascript có hỗ trợ các loại dữ liệu cơ bản là giống với hầu hết những ngôn ngữ lập trình khác. Bài viết này mình sẽ giới thiệu về Object và một số phương thức thường dùng với nó.

0 0 136

- vừa được xem lúc

Tìm hiểu về thư viện axios

Giới thiệu. Axios là gì? Axios là một thư viện HTTP Client dựa trên Promise.

0 0 117

- vừa được xem lúc

Imports và Exports trong JavaScript ES6

. Giới thiệu. ES6 cung cấp cho chúng ta import (nhập), export (xuất) các functions, biến từ module này sang module khác và sử dụng nó trong các file khác.

0 0 93

- vừa được xem lúc

Bài toán đọc số thành chữ (phần 2) - Hoàn chỉnh chương trình dưới 100 dòng code

Tiếp tục bài viết còn dang dở ở phần trước Phân tích bài toán đọc số thành chữ (phần 1) - Phân tích đề và những mảnh ghép đầu tiên. Bạn nào chưa đọc thì có thể xem ở link trên trước nhé.

0 0 229