AWS Secrets Manager を使用して Kong Gateway データベースの認証情報を保護する
アプリケーションシークレットには、パスワード、キー、証明書、トークンなど、保護すべき機密データが含まれます。Kong Gateway はシークレット管理をサポートしています。これにより、さまざまな安全なバックエンドシステムにシークレットを保存し、偶発的な漏洩から保護することができます。
従来、Kong Gatewayは外部データベースに接続するために静的認証情報で構成されていました。このガイドでは、従来のファイルまたは環境変数をベースにしたソリューションを使用する代わりに、Kong Gatewayを構成してAWS Secrets Managerを使用し、データベース認証情報を安全に読み取る方法を説明します。
このガイドでは、PostgreSQL と Kong Gateway を Docker 上でローカルに実行します。AWS Secrets Manager でシークレットを作成し、値を安全に読み取るために vault リファレンスを使用して Kong Gateway をデプロイします。
前提条件
-
AWSアカウント。AWS Secrets Managerサービスへのアクセスを許可するには、アカウントに適切なIAM権限が必要です。権限ポリシーの例については、AWS Secrets Managerのドキュメントを参照してください。さらに次の権限も必要です。
secretsmanager:CreateSecret
secretsmanager:PutSecretValue
secretsmanager:GetSecretValue
-
AWS CLIがインストールされ、構成されています。これは、Kong GatewayがSecrets Managerサービスに接続するために使用する方法であるため、AWS CLI環境変数を使用してゲートウェイ環境を構成できる必要があります。
-
Docker がインストールされている。
-
テストとしてゲートウェイにリクエストを送信するにはシステム上に
curl
が必要です。ほとんどのシステムにはcurl
がプリインストールされています。
AWS Secrets Managerを使用するためにKong Gatewayを構成
-
Kong Gatewayとデータベースが通信するための Docker ネットワークを作成します。
docker network create kong-net
-
データベースを構成して実行します。
docker run -d --name kong-database \ --network=kong-net \ -p 5432:5432 \ -e "POSTGRES_USER=admin" \ -e "POSTGRES_PASSWORD=password" \ postgres:9.6
上記で使用されたユーザー名とパスワードはPostgreSQLマスター認証情報であり、データベースを使用してKong Gatewayを認証するために使用するユーザー名とパスワードでは ありません 。
注: 本番環境へのデプロイでは、AWS Secrets Manager との直接統合をサポートする AWS RDS for PostgreSQL を使用できます。
-
Kong Gateway のデータベース用のユーザー名とパスワードを作成し このガイドで使用する環境変数に保存します。
KONG_PG_USER=kong KONG_PG_PASSWORD=KongFTW
-
PostgreSQL サーバーコンテナ内に Kong Gateway データベースユーザーを作成します。
docker exec -it kong-database psql -U admin -c \ "CREATE USER ${KONG_PG_USER} WITH PASSWORD '${KONG_PG_PASSWORD}'"
次のように表示されます。
CREATE ROLE
-
PostgreSQLコンテナ内に
kong
という名前のデータベースを作成します。docker exec -it kong-database psql -U admin -c "CREATE DATABASE kong OWNER ${KONG_PG_USER};"
次のように表示されます。
CREATE DATABASE
-
新しいAWSシークレットを作成します。
aws secretsmanager create-secret --name kong-gateway-database \ --description "Kong GW Database credentials"
-
上記で割り当てられた変数のユーザー名とパスワードを使用して、シークレット値を更新します。 後でシークレット値を更新する場合は、次のコマンドを使用します。
aws secretsmanager put-secret-value --secret-id kong-gateway-database \ --secret-string '{"pg_user":"'${KONG_PG_USER}'","pg_password":"'${KONG_PG_PASSWORD}'"}'
-
Kong Gateway を起動する前に、次のコマンドを実行してデータベースの移行を実施します。
注: 現在、
kong migrations
ツールはシークレット管理をサポートしていないため、この手順は従来のKong Gateway構成オプションを使用して行う必要があります。この例では、環境を介してシークレットをDockerに渡しています。docker run --rm \ --network=kong-net \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=kong-database" \ -e "KONG_PG_USER=$KONG_PG_USER" \ -e "KONG_PG_PASSWORD=$KONG_PG_PASSWORD" \ kong/kong-gateway:latest kong migrations bootstrap
-
データベースのユーザー名とパスワードとして参照できる値を使用するように構成されたKong Gatewayを起動します。Kong GatewayにAWS Secrets Managerへの接続を許可するには、環境変数を使用してIAMセキュリティ認証情報を指定する必要があります。
標準の
KONG_
環境変数名を使用してデータベース認証情報を指定しますが、静的な値を指定する代わりにリファレンス値を使用します。形式は、
{vault://aws/kong-gateway-database/pg_user}
のようになります。この例の参照形式には、バックエンドのVaultタイプとしてaws
が含まれ、kong-gateway-database
は以前作成したシークレット名と一致します。また、pg_user
はシークレット値で参照するJSONフィールド名です。詳細については、AWS Secrets Managerのドキュメントをご覧ください。
現在の環境で
AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
、AWS_REGION
、およびAWS_SESSION_TOKEN
を設定していると仮定して、次のようにKong Gatewayを開始します。docker run --rm \ --network=kong-net \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=kong-database" \ -e "AWS_ACCESS_KEY_ID" \ -e "AWS_SECRET_ACCESS_KEY" \ -e "AWS_REGION" \ -e "AWS_SESSION_TOKEN" \ -e "KONG_PG_USER={vault://aws/kong-gateway-database/pg_user}" \ -e "KONG_PG_PASSWORD={vault://aws/kong-gateway-database/pg_password}" \ kong/kong-gateway:3.8.x
しばらくすると、Kong Gateway 実行されるはずです。これは、Admin API で確認できます。
curl -s localhost:8001
Kong Gatewayからのさまざまな情報と共にJSON応答を受信します。
シークレット管理のドキュメントには、 利用可能なバックエンドと構成の詳細に関する詳細情報が含まれています。
詳細情報
- Kong Gatewayが統合できる、サポートされているVaultバックエンドについては、次のドキュメントを参照してください。
- Kong Gatewayのセキュリティ対策の詳細については、Kongを安全に起動するを参照してください