Hashicorp Vault & Apache APISIX: APIセキュリティの強化

Chao Zhang

Chao Zhang

November 15, 2022

Products

現在、API(アプリケーションプログラミングインターフェース)は、異なるソフトウェアサービスを接続する最も一般的な方法となっています。例えば、天気APIを通じて今日の天気を取得したり、TwitterのAPIを通じて面白いメッセージをリツイートしたりします。APIの相互接続はインターネットを豊かで多彩なものにしますが、同時に暗い側面も示しています。それがAPIの脅威です。

データによると、APIは現在ウェブアプリケーションの攻撃対象の90%を占めており、APIが主要な攻撃ベクトルの1つとなっていることを意味します。では、APIのリスクをどのように軽減できるでしょうか?

現代のソフトウェアアーキテクチャでは、API Gatewayパターンを選択してAPI攻撃から防御することができます。API Gatewayは、ソフトウェアサービスのエントリーポイントであり、ロードバランシング、サービスディスカバリー、API認証などの機能を提供します。Apache APISIX最高のAPI Gatewayの1つであり、認証、認可、ACL(アクセス制御リスト)、IP拒否/許可リストなどの機能を通じてユーザーのAPIセキュリティを強化します。例えば、JWT認証はAPIを保護するための一般的な方法です。これは、API利用者がJSON Web Tokenを使用して自分自身を証明することを要求します。この場合、資格情報がないか、間違った資格情報を持つAPIリクエストはApache APISIXによって拒否されます。

Apache APISIXはまた、JSON Web Tokenの署名(サインインするためのシークレットが必要)も担当しています。Apache APISIXの観点から見ると、ユーザーのシークレットを保存することが重要な問題となります。なぜなら、シークレットが漏洩すると認証が機能しなくなるからです。デフォルトでは、Apache APISIXはシークレットをetcdに保存します。etcdは、ルートやアップストリームなどのApache APISIX設定の設定センターです。

残念ながら、etcdは機密データを保護するために設計されていません。不道徳な人物がetcdクラスターにアクセスできるようになると、その中のすべてのデータが暴露されます。APISIXのルートオブジェクトにとっては大した問題ではありませんが、シークレットやX509証明書の秘密鍵にとっては致命的です。機密データをよりよく保護するために、Apache APISIXはバージョン2.12.0以降でHashicorp Vaultを統合しました。では、Hashicorp Vaultとは何でしょうか?

Hashicorp Vaultとは何か?

Hashicorp Vaultは、ユーザーのシークレット(データベースの認証情報、パスワード、APIキーなど)を安全に保存するためのストレージインフラストラクチャです。Amazon Key Management ServiceやGoogle Cloud Key Managementなど、多くの外部システムとの統合をサポートしています。技術的には、Hashicorp VaultはRaftコンセンサスプロトコルを使用した分散システムです。データは複数のバックアップで保存されるため、データの単一障害点を心配する必要はありません。

assets.png

しかし、Hashicorp Vaultが特別な理由は何でしょうか?Hashicorp Vaultサーバーを起動すると、それはシールド状態になります。このサーバーをアンシールしない限り、データにアクセスすることはできません。Hashicorp Vaultサーバーをアンシールするには、キーシェア(Shamir Secret Sharingアルゴリズムを使用してHashicorp Vaultサーバーを初期化する際に生成される)を使用して、アンシール操作を繰り返し実行する必要があります。回数はキーシェアの数に依存します(キーシェアの数がXの場合、(X/2)+1回)。さらに、何か怪しい兆候が見られ、攻撃を受けていると感じた場合、実行中にHashicorp Vaultサーバーを再シールすることもできます。

Apache APISIXはどのようにHashicorp Vaultを使用するのか?

現在、Apache APISIXはHashicorp Vaultをjwt-authプラグインに統合しています。jwt-authプラグインは、JWT認証を行うために使用されます。

APISIX-Vault-Communication.png

Hashicorp VaultとApache APISIXの基本的な相互作用のロジックは以下の通りです:

  1. APIリクエストが入る
  2. JWT Authプラグインが実行される
  3. Apache APISIXがHashicorp Vaultからシークレットを取得しようとする
  4. Hashicorp Vaultがシークレットを返し、Apache APISIXがそれをキャッシュする
  5. Apache APISIXがシークレットを使用してJSON Web Tokenを検証する
  6. 認証が成功し、APIリクエストがバックエンドサービスに転送される
  7. APIレスポンスが返される

Apache APISIXのコンシューマーオブジェクトでjwt-authプラグインを設定し、vaultオプションを使用してApache APISIXにシークレットをHashicorp Vaultに保存/取得するように指示できます。Apache APISIXコンシューマーはAPIコンシューマーの抽象化です。APIの認証情報はコンシューマーレベルで設定できます。

curl http://127.0.0.1:9080/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
  "username": "jack",
  "plugins": {
    "jwt-auth": {
      "key": "your-api-key",
      "vault": {}
    }
  }
}'

Hashicorp Vaultの設定は、Apache APISIXのconfig.yamlで設定できます。

vault:
  host: 'http://0.0.0.0:8200'
  timeout: 10
  token: 's.KUWFVhIXgoRuQbbp3j1eMVGa'
  prefix: 'kv/apisix'

ここで注意すべき点は、トークンがパスkv/apisix/consumerに対する読み取り権限を持っている必要があることです。これは、Apache APISIX Admin APIがシークレットを保存する場所です。

path "kv/apisix/consumer/*" {
    capabilities = ["read"]
}

そのコンシューマーからのAPIリクエストが入ると、Apache APISIXは設定されたHashicorp Vaultサーバーからシークレットを取得しようとし(結果をメモリにキャッシュします)、このシークレットを使用してJSON Web Tokenを検証します。

Apache APISIXとHashicorp Vaultの統合の未来

Apache APISIXにはいくつかの種類の機密データがありますが、現在はJSON Web TokenのシークレットのみがHashicorp Vaultに保存できます。しかし、将来的には、APIキーやユーザーパスワードなどのすべてのAPI認証情報をHashicorp Vaultに保存できるようになるでしょう。さらに、証明書の秘密鍵やAdmin APIキーもそこに保存できるようになります。これらすべてのデータは設定から分離されます。このようにして、API認証を使用するだけでなく、API認証情報が適切に保護されるため、APIセキュリティが強化されます。

Tags: