설정 가이드 - Azure Key Vault

설정 가이드 - Azure Key Vault

Azure Key Vault 키의 수명주기를 관리하려면 azurekeyvault 공급자를 사용해 키 관리 시크릿 엔진을 설정해야 해요.

출처: 문서

본문

설정(Setup)

  1. 키 관리 시크릿 엔진을 활성화해요.

    $ vault secrets enable keymgmt
    Success! Enabled the keymgmt secrets engine at: keymgmt/
    
  2. example-kms라는 KMS 공급자 리소스를 구성해요.

    $ vault write keymgmt/kms/example-kms \
        provider="azurekeyvault" \
        key_collection="keyvault-name" \
        credentials=client_id="a0454cd1-e28e-405e-bc50-7477fa8a00b7" \
        credentials=client_secret="eR%HizuCVEpAKgeaUEx" \
        credentials=tenant_id="cd4bf224-d114-4f96-9bbc-b8f45751c43f"
    

    이 명령은 다음을 지정해요.

    • Vault에서 이 KMS 공급자 인스턴스의 전체 경로(keymgmt/kms/example-kms)
    • Azure의 key vault 인스턴스 이름에 해당하는 키 컬렉션(key collection)
    • azurekeyvault로 설정된 KMS 공급자
    • AZURE_CLIENT_ID 환경 변수로도 지정할 수 있는 Azure client ID 자격 증명
    • AZURE_CLIENT_SECRET 환경 변수로도 지정할 수 있는 Azure client secret 자격 증명
    • AZURE_TENANT_ID 환경 변수로도 지정할 수 있는 Azure tenant ID 자격 증명

API 문서: 개별 구성 파라미터에 대한 자세한 설명은 Azure Key Vault API 문서를 참고하세요.

사용법(Usage)

  1. RSA-2048 키 쌍을 시크릿 엔진에 써요. 다음 명령은 keymgmt/key/rsa-1 경로에 rsa-2048 유형의 새 키를 써요.

    $ vault write keymgmt/key/rsa-1 type="rsa-2048"
    Success! Data written to: keymgmt/key/rsa-1
    

    키 관리 시크릿 엔진은 현재 Key Types에 지정된 키 유형의 생성을 지원해요. 문서의 Compatibility 섹션에 따르면 Azure Key Vault는 현재 RSA-2048, RSA-3072, RSA-4096 키 유형을 지원해요.

  2. 생성한 rsa-1 키를 읽어요. 출력을 JSON으로 지정하고 jq로 파이프해요.

    $ vault read -format=json keymgmt/key/rsa-1 | jq
    
  3. 작성한 키를 사용하려면 key vault에 배포해야 해요. rsa-1 키를 keymgmt/kms/example-kms/key/rsa-1 경로의 key vault에 배포해요.

    $ vault write keymgmt/kms/example-kms/key/rsa-1 \
        purpose="encrypt,decrypt" \
        protection="hsm"
    

    여기서 Vault에 키를 배포하고 목적이 encrypt와 decrypt뿐이라고 지정해요. 보호 유형은 클라우드 공급자에 따라 달라지며 값은 hsm 또는 software예요. Azure의 경우 보호 유형에 hsm을 지정해요. 키는 Azure Bring Your Own Key(BYOK) 사양에 따라 key vault 인스턴스로 안전하게 전달돼요.

  4. Azure Key Vault 인스턴스에 배포된 키를 나열할 수 있어요.

    $ vault list keymgmt/kms/keyvault/key/
    Keys
    ----
    rsa-1
    
  5. rsa-1 키를 회전시켜요.

    $ vault write -f keymgmt/key/rsa-1/rotate
    Success! Data written to: keymgmt/key/rsa-1/rotate
    
  6. 키를 읽고 .data.latest_version 값을 가져와 키 회전이 성공했는지 확인해요.

    $ vault read -format=json keymgmt/key/rsa-1 | jq '.data.latest_version'
    2
    

시크릿 엔진은 Azure Private Endpoints를 사용해 Azure Key Vault 인스턴스와 통신하도록 구성할 수 있어요. Azure에서 대상 Key Vault 인스턴스의 Private Endpoint를 설정하려면 Integrate Key Vault with Azure Private Link 가이드를 따라 하세요. Private Endpoint는 Vault가 네트워크로 도달할 수 있어야 해요. 즉 Vault가 같은 가상 네트워크 또는 피어링된 가상 네트워크에서 실행되어 Key Vault 도메인 이름을 Private Endpoint IP 주소로 제대로 해석해야 해요.

Private Endpoint 구성은 올바른 Azure Private DNS 통합에 의존해요. Vault가 실행 중인 호스트에서 Validate that the private link connection works 단계를 따라 Key Vault 도메인 이름이 설정한 Private Endpoint IP 주소로 해석되는지 확인해요.

$ nslookup <keyvault-name>.vault.azure.net
Non-authoritative answer:
Name:
Address:  10.0.2.5 (private IP address)
Aliases:  <keyvault-name>.vault.azure.net
          <keyvault-name>.privatelink.vaultcore.azure.net

시크릿 엔진은 Azure Private Endpoint로 Key Vault 인스턴스와 통신하기 위해 특별한 구성이 필요하지 않아요. 예를 들어 주어진 KMS 구성은 시크릿 엔진이 keyvault-name.vault.azure.net이라는 Key Vault 도메인 이름을 Private Endpoint IP 주소로 해석하게 해요. Key Vault DNS 접미사는 환경 구성 파라미터나 AZURE_ENVIRONMENT 환경 변수로 바꿀 수 있다는 점을 알아 두세요.

Terraform 예시(Terraform example)

Terraform에 익숙하다면, 필요한 Azure 인프라를 배포하는 데 Terraform을 사용할 수 있어요.

provider "azuread" {
  version = "=0.11.0"
}

provider "azurerm" {
  features {
    key_vault {
      purge_soft_delete_on_destroy = true
    }
  }
}

resource "random_id" "app_rg_name" {
  byte_length = 3
}

resource "random_id" "keyvault_name" {
  byte_length = 3
}

data "azurerm_client_config" "current" {}

resource "azuread_application" "key_vault_app" {
  name                       = "app-${random_id.app_rg_name.hex}"
  homepage                   = "http://homepage${random_id.app_rg_name.b64_url}"
  identifier_uris            = ["http://uri${random_id.app_rg_name.b64_url}"]
  reply_urls                 = ["http://replyur${random_id.app_rg_name.b64_url}"]
  available_to_other_tenants = false
  oauth2_allow_implicit_flow = true
}

resource "azuread_service_principal" "key_vault_sp" {
  application_id               = azuread_application.key_vault_app.application_id
  app_role_assignment_required = false
}

resource "random_password" "password" {
  length           = 24
  special          = true
  override_special = "%@"
}

resource "azuread_service_principal_password" "key_vault_sp_pwd" {
  service_principal_id = azuread_service_principal.key_vault_sp.id
  value                = random_password.password.result
  end_date             = "2099-01-01T01:02:03Z"
}

resource "azurerm_resource_group" "key_vault_rg" {
  name     = "learn-rg-${random_id.app_rg_name.hex}"
  location = "West US"
}

resource "azurerm_key_vault" "key_vault_kv" {
  name                = "learn-keyvault-${random_id.keyvault_name.hex}"
  location            = azurerm_resource_group.key_vault_rg.location
  resource_group_name = azurerm_resource_group.key_vault_rg.name
  sku_name            = "premium"
  soft_delete_enabled = true
  tenant_id           = data.azurerm_client_config.current.tenant_id

  access_policy {
    tenant_id = data.azurerm_client_config.current.tenant_id
    object_id = data.azurerm_client_config.current.object_id
    key_permissions = [
      "backup", "create", "decrypt", "delete", "encrypt", "get", "import",
      "list", "purge", "recover", "restore", "sign", "unwrapKey",
      "update", "verify", "wrapKey"
    ]
  }

  access_policy {
    tenant_id = data.azurerm_client_config.current.tenant_id
    object_id = azuread_service_principal.key_vault_sp.object_id
    key_permissions = [
      "create", "delete", "get", "import", "update"
    ]
  }
}

output "key_vault_1_name" {
  value = azurerm_key_vault.key_vault_kv.name
}

output "tenant_id" {
  value = data.azurerm_client_config.current.tenant_id
}

output "client_id" {
  value = azuread_application.key_vault_app.application_id
}

output "client_secret" {
  value = azuread_service_principal_password.key_vault_sp_pwd.value
}

더 알아보기 (Learn more)

  • Azure Key Vault 시크릿 엔진 개요와 인증·권한 요구 사항을 살펴보세요.
  • Azure Key Vault API 문서에서 구성 파라미터를 확인해 보세요.
  • key-management 시크릿 엔진 개요를 확인해 보세요.