Azure Key Vault를 사용하여 비밀 및 인증서 관리

Azure Key Vault를 사용하여 비밀 및 인증서 관리

2024년 8월 14일

이 기술 및 교육 문서는 보안 분석가, IT 관리자 및 시스템 엔지니어가 Azure Key Vault를 사용하여 비밀(예: 암호, API 키, 연결 문자열) 및 인증서(SSL/TLS)를 안전하게 관리하도록 안내하는 것을 목표로 합니다. Azure Key Vault는 이러한 중요한 항목을 저장하고 액세스하기 위한 중앙 집중식 보안 솔루션을 제공하는 클라우드 서비스로, 이를 코드나 구성 파일에 직접 포함할 필요가 없습니다. 이는 열악한 보안 관행입니다[1].

소개

최신 애플리케이션의 개발 및 운영에서 비밀과 인증서를 관리하는 것은 끊임없는 과제입니다. 데이터베이스 자격 증명, 타사 서비스 API 키, 암호화 키 및 SSL/TLS 인증서는 손상될 경우 심각한 데이터 침해로 이어질 수 있는 민감한 자산입니다. 일반 텍스트 파일, 환경 변수 또는 소스 코드에 직접 저장하는 등 안전하지 않은 방식으로 저장하면 상당한 위험이 따릅니다. Azure Key Vault는 이러한 자산을 보호하기 위한 안전한 하드웨어 기반 리포지토리(HSM)를 제공하고 액세스를 엄격하게 제어하며 수명 주기 관리를 단순화함으로써 이러한 문제를 해결하도록 설계되었습니다[2].

이 방법 가이드에서는 Azure Key Vault 생성, 비밀 및 인증서 추가 및 검색, 액세스 정책 구성, Azure App Service와 같은 다른 Azure 서비스와의 통합을 다룹니다. 독자가 비밀과 인증서의 안전한 관리를 구현하여 애플리케이션과 클라우드 인프라의 보안 태세를 강화할 수 있도록 단계별 지침, 예제 Azure CLI 명령 및 유효성 검사 방법이 제공됩니다.

Azure Key Vault가 중요한 이유는 무엇인가요?

  • 보안 저장소: FIPS 140-2 레벨 2 검증 하드웨어 보안 모듈(HSM)을 사용하여 비밀과 암호화 키를 보호합니다.
  • 중앙 집중식 액세스 제어: Azure RBAC(역할 기반 액세스 제어) 또는 Key Vault 액세스 정책을 사용하여 세부적인 수준에서 비밀 및 인증서에 대한 액세스 권한을 관리할 수 있습니다.
  • 수명 주기 관리: 비밀 및 인증서 순환, 자동 만료, 이벤트 알림을 촉진합니다.
  • 위험 감소: 코드나 구성 파일에 자격 증명을 저장할 필요가 없어 유출 위험이 최소화됩니다.
  • 모니터링 및 감사: Key Vault에서 수행된 모든 작업을 기록하여 규정 준수 및 보안 조사에 대한 감사 추적을 제공합니다.
  • 간소화된 통합: Azure App Service, Azure Functions, Azure Virtual Machines, Azure DevOps 등 다른 Azure 서비스와 쉽게 통합됩니다.

전제조건

Azure Key Vault를 사용하려면 다음 항목이 필요합니다.

  1. 활성 Azure 구독: 리소스를 생성하고 관리하기 위한 Azure 구독입니다.
  2. 관리 액세스: Azure 구독에서 '소유자' 또는 '기여자' 역할이 있는 계정이거나 Key Vault를 만들고 관리할 수 있는 권한이 있는 사용자 지정 역할입니다.
  3. Azure CLI 또는 Azure PowerShell: Azure와 상호 작용하기 위한 명령줄 도구를 설치하고 구성했습니다.
  4. 선택 사항: Visual Studio Code: 개발 및 통합 테스트용입니다.

단계별: Azure Key Vault를 사용하여 비밀 및 인증서 관리

Key Vault를 만들고, 비밀과 인증서를 추가하고, 액세스를 구성해 보겠습니다.

1. Azure Key Vault 만들기

Azure CLI를 사용하여 Key Vault를 만들어 보겠습니다. Azure Portal을 사용할 수도 있습니다.

  1. 터미널 또는 PowerShell을 열고 Azure에 로그인합니다. ``배쉬 az 로그인 ````
  2. 리소스 그룹을 만듭니다(아직 없는 경우). ``배쉬 az group create --name RG-KeyVault-Artigos --location eastus ````

  3. Azure Key Vault를 생성합니다. Key Vault에 대해 전역적으로 고유한 이름을 선택합니다. ``배쉬 az keyvault create --name kv-artigos-seguranca-01 --resource-group RG-KeyVault-Artigos --location eastus --enabled-for-template-deployment true ````

    • --enabled-for-template-deployment true: 자동화에 유용한 템플릿 배포에 Key Vault를 사용할 수 있습니다.

2. Key Vault에 비밀 추가

데이터베이스 비밀번호를 비밀로 추가해 보겠습니다.그만큼.

  1. 예시 값과 함께 DatabasePassword라는 비밀을 추가합니다. ``배쉬 az keyvault secret set --vault-name kv-artigos-seguranca-01 --name DatabasePassword --value "S3cur3P@ssw0rd!" ````

  2. 비밀을 검색하여 올바르게 저장되었는지 확인합니다. ``배쉬 az keyvault secret show --vault-name kv-artigos-seguranca-01 --name DatabasePassword --query value -o tsv ````

3. Key Vault에 인증서 추가

데모용으로 자체 서명된 인증서를 추가해 보겠습니다. 프로덕션에서는 신뢰할 수 있는 CA의 인증서를 사용합니다.

  1. Key Vault에서 자체 서명된 인증서를 만듭니다. ``배쉬 az keyvault 인증서 생성 --vault-name kv-artigos-seguranca-01 --name MyWebAppCert --policy "$(az keyvault 인증서 get-default-policy)" ````

  2. 인증서 세부정보를 확인하세요. ``배쉬 az keyvault 인증서 표시 --vault-name kv-artigos-seguranca-01 --name MyWebAppCert ````

4. 액세스 정책 구성

애플리케이션이나 사용자가 비밀 및 인증서에 액세스하도록 허용하려면 액세스 정책을 구성해야 합니다. Azure RBAC(역할 기반 액세스 제어)를 사용해 보겠습니다.

  1. 접근이 필요한 애플리케이션이나 사용자의 객체 ID를 얻습니다. 애플리케이션(서비스 주체)의 경우 Azure AD에 등록한 후 가져올 수 있습니다. 사용자의 경우 az ad user show --id <user-principal-name> --query id -o tsv를 사용합니다.
  2. Key Vault에 역할을 할당합니다. 예를 들어 애플리케이션이 비밀을 읽을 수 있도록 허용하려면 다음을 수행하세요. ``배쉬 # 예: 서비스 주체에 'Key Vault 비밀 사용자' 역할 할당 az 역할 할당 create --role "Key Vault 비밀 사용자" --signee-object-id <개체 애플리케이션/사용자 ID> --scope /subscriptions/<구독 ID>/resourceGroups/RG-KeyVault-Artigos/providers/Microsoft.KeyVault/vaults/kv-artigos-seguranca-01 ````
    • : 인증서의 경우 'Key Vault 인증서 사용자' 기능을 사용할 수 있습니다.

5. Azure App Service와 통합(예제)

애플리케이션이 Key Vault의 비밀을 어떻게 사용할 수 있는지 살펴보겠습니다.

  1. Azure App Service를 생성합니다(아직 없는 경우). ``배쉬 az appservice plan create --name AppServicePlan-Artigos --resource-group RG-KeyVault-Artigos --sku B1 --is-linux az webapp create --resource-group RG-KeyVault-Artigos --plan AppServicePlan-Artigos --name webapp-artigos-seguranca-01 ````
  2. App Service에 대한 관리 ID를 활성화합니다. 이를 통해 App Service는 명시적 자격 증명 없이 Azure Key Vault에 인증할 수 있습니다. ``배쉬 az webapp ID 할당 --resource-group RG-KeyVault-Artigos --name webapp-artigos-seguranca-01 ````

  3. App Service 관리 ID에 Key Vault의 비밀에 액세스할 수 있는 권한을 부여합니다. 이전 단계에서 얻은 principalId를 사용합니다. ``배쉬 az keyvault set-policy --name kv-artigos-seguranca-01 --object-id --secret-permissions 목록 가져오기 ````

    • : RBAC를 사용하려면 관리 ID의 'principalId'에 'Key Vault 비밀 사용자' 역할을 할당하세요.
  4. App Service에서 비밀 참조를 구성합니다. 이를 통해 애플리케이션은 환경 변수로 비밀에 액세스할 수 있습니다. ``배쉬 az webapp config appsettings set --resource-group RG-KeyVault-Artigos --name webapp-artigos-seguranca-01 --settings DatabasePassword="@Microsoft.KeyVault(SecretUri=https://kv-artigos-seguranca-01.vault.azure.net/secrets/DatabasePassword/)" ````

  5. 이제 애플리케이션(예: ASP.NET Core, Node.js)은 'DatabasePassword' 비밀을 일반 환경 변수로 읽을 수 있으며, Azure App Service는 안전한 방식으로 Key Vault에서 이를 검색합니다.

검증 및 테스트

비밀 및 인증서 관리의 유효성을 검사하려면 승인된 엔터티에만 액세스 권한이 부여되고 비밀을 올바르게 검색할 수 있는지 확인하는 것이 포함됩니다.

1. Azure CLI를 통해 비밀에 대한 액세스 테스트

  1. 권한이 없는 계정으로 보안 비밀에 액세스해 보십시오. ``배쉬 az login # 권한이 없는 계정으로 로그인 az keyvault secret show --vault-name kv-artigos-seguranca-01 --name DatabasePassword --query value -o tsv ````

    • 예상 결과: 'AuthorizationFailed' 오류와 함께 명령이 실패해야 합니다.
  2. 권한이 있는 계정(예: Key V를 생성한 계정)으로 비밀에 액세스해 보십시오.애플리케이션 내에서 테스트하는 경우 ault 또는 App Service 관리 ID). ``배쉬 az login # 권한이 있는 계정으로 로그인 az keyvault secret show --vault-name kv-artigos-seguranca-01 --name DatabasePassword --query value -o tsv ````

    • 예상 결과: 명령은 비밀 값을 반환해야 합니다.

2. 인증서 액세스 테스트

  1. 인증된 엔터티가 인증서를 나열하고 검색할 수 있는지 확인합니다. ``배쉬 az keyvault 인증서 목록 --vault-name kv-artigos-seguranca-01 az keyvault 인증서 표시 --vault-name kv-artigos-seguranca-01 --name MyWebAppCert ````
    • 예상 결과: 명령은 인증서 세부 정보를 반환해야 합니다.

3. Key Vault 감사 로그 확인

Key Vault의 모든 작업은 기록되고 감사될 수 있습니다.

  1. Azure Portal에서 Key Vault(kv-articles-seguranca-01)로 이동합니다.
  2. 왼쪽 탐색 창에서 활동 로그를 선택합니다.
  3. 비밀, 인증서 및 액세스 시도 생성을 포함하여 수행된 모든 작업에 대한 로그가 표시됩니다.

보안 팁 및 모범 사례

  • 최소 권한의 원칙: 비밀 및 인증서에 필요한 권한(가져오기, 나열, 설정, 삭제)만 부여합니다. 과도한 권한 부여를 피하세요.
  • 비밀의 정기적인 교체: 손상 위험을 줄이기 위해 비밀과 인증서를 정기적으로 교체하는 프로세스를 구현합니다.
  • 관리 ID: Key Vault에 인증할 수 있을 때마다 Azure 리소스에 대한 관리 ID(관리 ID)를 사용하여 코드에서 자격 증명을 관리할 필요가 없습니다.
  • 세분화된 액세스 정책: Key Vault 또는 Azure RBAC 액세스 정책을 사용하여 누가 무엇에 액세스할 수 있는지 제어합니다. 보다 미세한 제어를 위해서는 RBAC를 선호합니다.
  • 모니터링 및 경고: 실패한 액세스 시도 또는 비밀 삭제와 같은 Key Vault의 의심스러운 활동에 대한 경고를 구성합니다.
  • 일시 삭제 및 제거 보호: 비밀 및 인증서의 우발적이거나 악의적인 손실을 방지하기 위해 Key Vault에서 일시 삭제 및 제거 보호를 활성화합니다.
  • 정기 백업: Key Vault는 가용성이 높지만 특히 재해 복구 시나리오의 경우 비밀과 인증서를 백업하는 것이 좋습니다.
  • 비밀 만료: 비밀 및 인증서의 만료 날짜를 설정하여 강제 교체하고 이전 자격 증명 사용을 방지합니다.

일반적인 문제 해결

  • 권한 부여 오류(403 금지): 액세스하려는 엔터티에 대한 Key Vault 액세스 정책 또는 RBAC 역할 할당을 확인하세요. 올바른 'Object ID' 또는 'principalId'가 사용되었는지 확인하세요.
  • 비밀/인증서를 찾을 수 없음: 비밀/인증서 이름과 Key Vault 이름을 확인하세요. 비밀/인증서가 존재하고 삭제되거나 만료되지 않았는지 확인하세요.
  • 관리 ID 문제: Azure 리소스에 대해 관리 ID가 활성화되어 있고 Key Vault에 올바른 권한이 부여되었는지 확인하세요.
  • 비밀 검색 지연 시간: 경우에 따라 비밀 검색 시 약간의 지연 시간이 발생할 수 있습니다. 애플리케이션이 이를 비동기적으로 처리하는지 확인하세요.
  • 연결 오류: 애플리케이션 또는 가상 머신의 네트워크 설정을 확인하세요. Key Vault에 대한 액세스를 차단하는 방화벽이나 네트워크 보안 그룹이 없는지 확인하세요.

결론

Azure Key Vault는 클라우드에서 가장 민감한 디지털 자산을 보호하려는 모든 조직에 중요한 서비스입니다. 안전하고 가용성이 높은 리포지토리에 비밀 및 인증서 관리를 중앙 집중화함으로써 규정 준수를 단순화하고 데이터 침해 위험을 줄이며 전반적인 보안 상태를 개선합니다. 보안 및 자동화 모범 사례와 결합된 Azure Key Vault의 효과적인 구현을 통해 개발자와 운영자는 자격 증명과 키가 보호된다는 사실을 알고 혁신에 집중할 수 있습니다. 이 실용적인 가이드를 통해 보안 전문가는 Azure Key Vault를 사용하여 비밀과 인증서를 안전하고 효율적으로 관리하여 Azure에서 애플리케이션과 데이터의 무결성과 기밀성을 보장할 수 있습니다.


참고자료:

[1]마이크로소프트 런. Azure Key Vault란 무엇인가요?. 사용 가능: https://learn.microsoft.com/pt-br/azure/key-vault/general/overview [2] 마이크로소프트 런. Azure Key Vault에서 비밀을 관리하기 위한 모범 사례. 사용 가능: https://learn.microsoft.com/pt-br/azure/key-vault/secrets/secrets-best-practices [3] 마이크로소프트 런. Azure Key Vault 인증서 정보. 사용 가능: https://learn.microsoft.com/pt-br/azure/key-vault/certificates/about-certificates