シークレットの概要、および Java でのその扱い方

完了

シークレットは、外部と共有すべきではない文字の文字列です。それらは、データベース パスワード、秘密暗号化キー、個人用アクセス トークンなどである可能性があります。 セキュリティを強化するために、多くの人は、攻撃者に役立つ可能性のあるものはすべてシークレットと見なすべきだと考えます。たとえば、運用データベースへの URL はシークレットと見なされる可能性があります。 データベースにパブリックにアクセスできるべきではありません。 その根拠は、この種の情報は性質上機密性が高く、コードで使用できる情報が少ない方が良いということです。

ゼロ トラストおよびゼロ シークレットとは

ゼロ トラストの概念は、誰もむやみに信じるべきではなく、検証や承認を受けずに会社のリソースにアクセスできるべきではないというものです。

この概念は Web アプリケーションにも適用されます。シークレットをそれらのコードや最終的なバイナリに格納すべきではありません。 これがいわゆるゼロ シークレットというものです。

シークレットは、攻撃リスクを減らすために、厳しいアクセス規則と検証を使用して外部システムによって管理する必要があります。

シークレットを Git リポジトリに格納しない

Git リポジトリがプライベートである場合でも、ソース コードにシークレットを格納するのは不適切な方法です。

  • リポジトリにアクセスできる人は誰でも機密データを知ることができる
  • アプリケーション バイナリにアクセスできる人は誰でも、そこからシークレットを抽出できる

また、一度シークレットが Git リポジトリに保存され、長い時間が経過すると、忘れられてしまう可能性がありますが、攻撃者はリポジトリの履歴を調べていつでもそれを見つけることができます。

実用的と思われる場合でも、ソース コード リポジトリにシークレットを保存しないでください。 この問題を回避するために、リポジトリを定期的にチェックし、パスワードやデータベース URL が誤って保存されていることがわかった場合は警告を送信する自動ツールを使用できます。

環境変数の使用

シークレットを管理するための最も簡単なソリューションは、環境変数を使用することです。 これには次のいくつかの利点があります。

  • 使いやすい
  • すべてのシステム (クラウド以外のシステムでも) で動作する
  • 誰もが知っており、そのしくみを理解している

しかし、セキュリティが十分ではありません。システムでのすべてのプロセスで読み取ることができ、Java システムで Java Management Extensions (JMX) を使用して簡単に公開されてしまいます。

その結果、環境変数は多くの場合、ゼロ トラストへの最初のステップと見なされます。シークレットをソース コードに直接格納するよりも安全ですが、管理機能が欠けており、攻撃者が簡単にアクセスできます。

Kubernetes シークレットの使用

Kubernetes には、もう 1 つの優れたソリューションである secrets という概念があります。 これらのシークレットは、アプリケーションのファイルシステム上のファイルとして読み込むことができます。その後、Java プログラムでは起動時にそのファイルを読み取り、それらのシークレットにアクセスできます。 Spring Framework のようなツールには、このメカニズムの標準サポートも含まれています。これにより、これらのシークレットを簡単かつ効率的な方法で使用できます。

このメカニズムは、これらのファイルを必要とするプロセスによってのみ読み取り可能であるため、環境変数よりも安全です。 また、豊富な Kubernetes エコシステムからの利点があり、クラウド プロバイダーによって提供されるツールを含む、さまざまな管理ツールで管理できます。

Kubernetes シークレットは Kubernetes に最適なソリューションですが、やはり Kubernetes に限定され、Kubernetes インフラストラクチャの管理に使用されるツールによっては、高度な管理機能が欠けます。

シークレット ストアの使用

Hashicorp Vault や Azure Key Vault などのシークレット ストアは、シークレットを管理するための専用ソフトウェアです。 ユーザーを承認し、セキュリティ キーをローテーションし、どのアプリケーションがどのシークレットにアクセスできるかを検証する豊富な管理システムが提供されます。

また、外部 API も提供されるため、任意のシステムで使用できます。 たとえば、Virtual Machines、Azure App Service、Azure Kubernetes Service、Azure Spring Apps を含む、すべての Azure サービスで Azure Key Vault を使用できます。

シークレット ストアは、シークレットを管理するための最も安全なソリューションですが、専用ツールを使用する必要があります。