다음을 통해 공유


앱, API 키 및 Azure Key Vault 비밀

Azure Key Vault는 암호화 키, 비밀 및 인증서를 보호하는 Azure 서비스입니다. API 키와 같은 중요한 정보에 대한 중앙 집중식 보안 및 고가용성 리포지토리를 제공합니다. 애플리케이션의 소스 코드에 직접 API 키를 포함하는 안전하지 않은 사례를 방지하는 한 가지 방법은 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에서 고유한 이름으로 바꿉니다. 일반적으로 다른 번호 및 식별자와 함께 개인 또는 회사 이름을 사용합니다.

Azure Key Vault에 API 키를 비밀로 추가

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일마다보다 더 자주 또는 덜 자주 키를 회전하도록 선택할 수 있습니다. "SecretNearExpiry" 이벤트에 대한 Event Grid 구독을 API 키 비밀 만료에 대한 알림을 받는 방법으로 구성할 수 있습니다.

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에 대해 구성하고, 보안 및 액세스 관련 이벤트를 추적하고, 모니터링, 분석 및 경고를 위해 지정된 Log Analytics 작업 영역으로 로그를 보내는 로그 범주를 사용하도록 AuditEvent 설정합니다. 이렇게 하면 액세스 패턴을 모니터링하고, 무단 액세스 시도를 감지하고, 중요한 보안 이벤트에 대한 경고를 구성할 수 있습니다(예: 누군가가 올바른 권한 없이 비밀에 액세스하려고 시도).

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에 대한 네트워크 액세스를 제한해야 합니다. 이 작업을 수행하는 데 사용할 수 있는 두 가지 일반적인 방법이 있습니다.

  • 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 Key Vault 비밀 라이브러리용 Azure ID 라이브러리를 설치합니다.

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에서 비밀을 검색합니다.

다음 단계