私はバックエンドを使い始めたばかりで、現在、機密データを安全に保管するためのベストプラクティスを知りません。
Node.jsサーバーをJWTで構成しました。 RSAキーでJWTに署名しました。サーバーはリクエストを受信するたびに、JWTの整合性を検証します。
今のところ2つのファイルがありますprivate.key
およびpublic.key
。最初のファイルはJWTの署名に使用され、2番目のファイルはJWTの検証に使用されます。
だから問題です。
これらのキー(ファイル)はどこに保存すればよいですか?現在、プロジェクトのソースファイルの横に保存していますが、リモートソース管理システムにプッシュしません。キーのコンテンツが必要なときはいつでも、readFileSync
を使用するだけなので、プロジェクトにファイルが存在する必要があります。
これらのファイルも暗号化する必要がありますか?または...
これらのファイルを削除サービスにプッシュして、HTTP経由で使用する必要がありますか?または..
ファイルを配置し、URLを使用してファイルにアクセスできるサービスはありますか?
公開キー:これは簡単な部分であり、ほとんどどこでも使用できます(既知のURL、S3/GCS/...のようなファイルストアのタイプなど)ソース管理)。唯一の懸念は、変更されていないことを確認することですが、誰でも読み取ることができます。
秘密鍵:ここがトリッキーになります。秘密鍵は、可能な限りアクセスを制限して、可能な限り安全である必要があります。誰かがあなたの秘密鍵を読んだ場合、彼らはあなたのサービスのふりをすることができます。あなたは正しいですソース管理にしてはいけません。
秘密鍵が常に暗号化されていることを確認する必要があります。問題は、キーをデコードするためのパスフレーズをサービスに提供する方法になります。暗号化されたファイル自体は、クラウドストレージシステム(S3、GCSなど)に置くことができます。暗号化されたファイルの一部のアクセス制御は、まだ良い考えです。
パスフレーズにアクセスするいくつかの方法(完全ではありません)。それぞれに長所と短所があります。どちらを使用するかは、環境と自動化とセキュリティのバランスに大きく依存します。
環境変数:多くのデプロイメントシステムでは、システムの管理者以外は誰も簡単に読み取れない方法で環境変数を指定できます。これは、実稼働環境や、VM /オーケストレーションシステムにアクセスできるユーザーによっては安全でない場合があります。
独自の管理:独自のインフラストラクチャを使用してシークレットを配布します。 keywhiz や Vault のようなものは非常に強力ですが、これらは展開して管理する単純なシステムではありません。
cloud KMS:クラウド固有のキー管理システム(例:Google/AWS KMS、Azure Vaultなど)を利用します。通常はファイルを保存できませんが、ファイルを暗号化するためのキーを保存できます。キーの使用に関する権限は非常に制限する必要があります。これは通常、ロールアカウントごとに実行でき、サービスにのみ割り当てることができます。
人による操作が必要:誰かが手動でシステムにログインし、バックエンドで使用するために秘密鍵を復号化する必要があります。明らかな欠点は、そこに自動化がないことです。VMがダウンした場合、自動的に再起動できません。
Marcの答えに追加する1つのオプションは、ハードウェアセキュリティモジュール(HSM)です。これらは高価であり、必ずしも実用的ではありません(クラウドプロバイダーはHSMベースのキーストレージを提供しているかもしれませんが、独自のHSMを接続することはできません)。ただし、鍵ファイルよりも安全にすることができます。 HSMがキーを公開する必要はありません。代わりに、一部のプログラム(サーバー)がキーを使用する場合、HSMに対して認証し(つまり、プログラムに資格情報を提供する必要がある場合があります)、一部のデータ(JWT本体など)をHSMに渡します。 「これに署名してください」と言います。もちろん、同じハードウェア上で実行されている、プログラムの認証を偽装できる他のプログラムも、偽造されたJWT(または他のデータ)に署名する可能性がありますが、キー自体を破棄することはできません。 HSMは物理的に削除できますが、通常、物理的なセキュリティはソフトウェアのセキュリティよりも簡単です。
一部のオペレーティングシステムやハードウェアで利用できるより簡単なオプションは、非常に安全なソフトウェアセキュリティモジュールを使用することです(ハードウェア機能によってサポートされている場合があります)。純粋なソフトウェアの実装(Windowsには、デフォルトの暗号APIを介してアクセスできるものがあります。キーは、他のプロセスが認証されたチャネルを介してのみアクセスできる非常に特権の高いプロセスに格納されています)から、ハードウェアでサポートされるオプションまで、さまざまな例があります。完全に危険にさらされたOSでさえ、理論的にはそこからシークレットを抽出できないような方法で、信頼性の高いプログラムがデータを実行および格納できる「安全な飛び地」または同様のもの。