Hashicorp Vault & Apache APISIX: APIセキュリティの強化
November 15, 2022
現在、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コンセンサスプロトコルを使用した分散システムです。データは複数のバックアップで保存されるため、データの単一障害点を心配する必要はありません。
しかし、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認証を行うために使用されます。
Hashicorp VaultとApache APISIXの基本的な相互作用のロジックは以下の通りです:
- APIリクエストが入る
- JWT Authプラグインが実行される
- Apache APISIXがHashicorp Vaultからシークレットを取得しようとする
- Hashicorp Vaultがシークレットを返し、Apache APISIXがそれをキャッシュする
- Apache APISIXがシークレットを使用してJSON Web Tokenを検証する
- 認証が成功し、APIリクエストがバックエンドサービスに転送される
- 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セキュリティが強化されます。