次の方法で共有


アプリ、API キー、Azure Key Vault シークレット

Azure Key Vault は、暗号化キー、シークレット、証明書を保護する Azure サービスです。 これは、API キーなどの機密情報に対して、一元化された安全で可用性の高いリポジトリを提供します。 アプリケーションのソース コードに API キーを直接埋め込むという安全でない方法の回避策の 1 つとして、Azure Key Vault に格納されている API キーを安全に操作するようにアプリを構成する方法があります。

この記事では、Key Vault インスタンスを作成し、API キーをシークレットとしてこのキー コンテナーに追加し、ベスト プラクティスを使用してキー コンテナーを構成する方法について説明します。 これらのベスト プラクティスには、ロールベースのアクセス制御 (RBAC) を使用したアクセスの制限、監視の有効化、ネットワーク アクセスの制限が含まれます。

Azure Key Vault インスタンスの作成とセキュリティ保護

Azure Key Vault を使用すると、暗号化キー、シークレット、証明書を安全に格納できます。 異なる環境 (開発、ステージング、運用) とアプリケーションに対して個別のキー コンテナーを配置する必要があります。

リソース グループとキー コンテナー インスタンスを作成する

キー コンテナー インスタンスを作成するために、Azure CLI または Azure Cloud Shell から次のコマンドを使用できます。

  1. リソース グループを作成するには、az group create コマンドを使用します。

    az group create --name myResourceGroup --location eastus
    

    必要に応じて、"eastus" をお近くの場所に変更することができます。

  2. az keyvault create を使用して、キー コンテナーを作成します。

    az keyvault create --name <your-unique-keyvault-name> --resource-group myResourceGroup
    

    <your-unique-keyvault-name> を Azure 全体で一意の名前に置き換えます。 通常、個人名または会社名は、その他の数字や識別子と併せて使用します。

API キーを Azure Key Vault にシークレットとして追加する

Azure Key Vault インスタンスを作成したら、この Azure Key Vault インスタンスに API キーをシークレットとして追加できます。

以下では、Azure CLI の az keyvault secret set コマンドを使用して、MyApiKey という名前のシークレットを keyvault に追加し、180 日後に有効期限が切れるようにシークレットを設定します。

az keyvault secret set \
    --vault-name "<YourKeyVaultName>" \
    --name "MyApiKey" \
    --value "<YourSecretValue>"
    --expires "$(date -u -d '+180 days' +'%Y-%m-%dT%H:%M:%SZ')"

API キーは定期的にローテーションするようにしてください。 組織のセキュリティ ニーズに応じて、キーのローテション頻度を 180 日よりも長くしたり短くしたりすることができます。 期限切れ間近の API キー シークレットに関する通知を受信する方法として、"SecretNearExpiry" イベントの Event Grid サブスクリプションを構成できます。

RBAC を使用して Key Vault へのアクセスを制限する

アプリケーションの ID のみが Azure Key Vault にアクセスできるように、Azure Key Vault インスタンスへのアクセスを制限できます。

これを行うには、Azure CLI の az role assignment create コマンドを使用して、ロールベースのアクセス制御 (RBAC) ロールを構成します。

az role assignment create --role "Key Vault Secrets User" \
  --assignee <object-id-of-app-or-user> \
  --scope /subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<key-vault-name>

Key Vault のログとアラートを有効にする

疑わしい可能性のあるアクティビティを検出する方法として、Key Vault インスタンスでログとアラートを有効にします。

Azure Key Vault のログとアラートを有効にするには、Azure CLI の az monitor diagnostic-settings create コマンドを使用します。

az monitor diagnostic-settings create \
    --name myDiagnosticSettings \
    --resource {key-vault-resource-id} \
    --logs '[{"category": "AuditEvent","enabled": true}]' \
    --workspace {log-analytics-workspace-id}

このコマンドは、myDiagnosticSettings という名前の診断設定を作成し、それを指定された Azure Key Vault 用に構成し、AuditEvent ログ カテゴリを有効にします。これにより、セキュリティとアクセス関連のイベントが追跡され、監視、分析、アラートを行うために、指定された Log Analytics ワークスペースにログが送信されます。 この設定により、アクセス パターンの監視、未承認のアクセス試行の検出、重要なセキュリティ イベント (たとえば、誰かが適切なアクセス許可なしでシークレットにアクセスしようとするなど) に対するアラートの構成が可能になります。

Azure CLI の az monitor scheduled-query create コマンドを実行し、指定された Log Analytics ワークスペース内のログを監視して Azure Key Vault シークレットへの未承認のアクセス試行がないか確認し、一致する未承認のアクセス試行が検出された場合にアラートをトリガーできます。

az monitor scheduled-query create \
    --name "Suspicious Access Alert" \
    --resource-group myResourceGroup \
    --scopes {log-analytics-workspace-resource-id} \
    --condition "AzureDiagnostics | where ResourceType == 'VAULTS' | where OperationName == 'SecretGet' | where ResultSignature == 'Unauthorized'"

Key Vault へのネットワーク アクセスを制限する

コンテナーが既知のネットワークの場所からの要求のみを受け入れるように、Azure Key Vault へのネットワーク アクセスを制限する必要があります。 これを行うために使用できる一般的な方法には 次の 2 つがあります。

  • Azure Private Link。 これにより、仮想ネットワーク内にプライベート エンドポイントが作成され、アプリケーションがパブリック インターネットを通過することなく Azure Key Vault に接続できるようになります。 このオプションは、トラフィックがネットワーク内に留まるため最も安全ですが、プライベート エンドポイントを作成して DNS を構成する必要があります。
  • 「ファイアウォール ルール」というタイトルのセクションで説明されています。 許可されている IP 範囲の一覧を使用して、[ネットワーク] の下にある Azure Key Vault ファイアウォール設定を構成できます。 この方法を使用して、既存の仮想ネットワークへのアクセスを許可することもできます。ただし、選択したサブネットで Microsoft.KeyVault のサービス エンドポイントを有効にする必要があります。

Azure CLI の az network private-endpoint create コマンドを使用して、プライベート エンドポイントを作成できます。

az network private-endpoint create \
    --name myPrivateEndpoint \
    --resource-group myResourceGroup \
    --vnet-name myVNet \
    --subnet mySubnet \
    --private-connection-resource-id /subscriptions/{subscription}/resourceGroups/{rg}/providers/Microsoft.KeyVault/vaults/{key-vault-name} \
    --group-id vault \
    --connection-name myConnection

You can create firewall rules on the Azure Key Vault instance using the Azure CLI [az keyvault network-rule add](/cli/azure/keyvault/network-rule#az-keyvault-network-rule-add) command, substituting the appropriate key vault names, resource groups, subnet, and subnet mask information:

```azurecli
az keyvault network-rule add \
    --name {key-vault-name} \
    --resource-group myResourceGroup \
    --ip-address {trusted-ip-address}/32

Azure Key Vault では、すべての通信に HTTPS が使用されます。 これにより、API キーやその他の機密データが転送中に暗号化され、盗聴や中間者攻撃からそれらが確実に保護されます。

Python を使用して Azure Key Vault を操作する

Python を使用して Azure Key Vault を操作するには、Microsoft Entra ID 用の Azure ID ライブラリと Azure Key Vault シークレット ライブラリをインストールします。

pip install azure-identity
pip install azure-keyvault-secrets

Azure ID および Azure Key Vault シークレット クライアント ライブラリを使用して、シークレットをプログラムで管理できます。

from azure.keyvault.secrets import SecretClient
from azure.identity import DefaultAzureCredential

key_vault_name = "<your-key-vault-name>"
KVUri = f"https://{key_vault_name}.vault.azure.net"
secret_name = "<your-secret-name>"

credential = DefaultAzureCredential()
client = SecretClient(vault_url=KVUri, credential=credential)

retrieved_secret = client.get_secret(secret_name)

# Now you can use the API key:

api_key = retrieved_secret.value
print(f"The API key is: {api_key}")

このサンプル コードでは:

  • DefaultAzureCredential: このクラスは、さまざまな方法 (環境変数、マネージド ID など) を使用して認証を試み、さまざまな Azure 環境に適合するようにします。
  • SecretClient: このクラスは、Key Vault 内のシークレットを操作するためのメソッドを提供します。
  • get_secret(): Key Vault からシークレットを取得します。

次のステップ