옵션
집 Skill 보안 azure-keyvault-py

azure-keyvault-py

microsoft/skills microsoft/skills

Python SDK를 사용하여 Azure Key Vault에서 비밀, 암호화 키 및 인증서를 관리합니다.

...모든 것을 확장하십시오
9
업데이트 된 시간 2026년 9월 12일

Azure Key Vault Python SDK

비밀번호, 암호화 키 및 인증서에 대한 안전한 저장 및 관리.

설치

# 비밀번호
pip install azure-keyvault-secrets azure-identity

# 키 (암호화 작업)
pip install azure-keyvault-keys azure-identity

# 인증서
pip install azure-keyvault-certificates azure-identity

# 전체
pip install azure-keyvault-secrets azure-keyvault-keys azure-keyvault-certificates azure-identity

환경 변수

AZURE_KEYVAULT_URL=https://<보관소이름>.vault.azure.net/  # 모든 인증 방식에 필수
AZURE_TOKEN_CREDENTIALS=prod # 프로덕션 환경에서 DefaultAzureCredential을 사용할 경우에만 필요
</보관소이름>

인증 및 수명 주기

🔑 아래 모든 코드 샘플에 적용되는 두 가지 규칙:

  1. DefaultAzureCredential을 선호하십시오. 코드 변경 없이 로컬(Azure CLI / VS Code / Developer CLI) 및 Azure(관리된 ID, 워크로드 ID)에서 작동합니다. 연결 문자열, 계정/API 키는 사용하지 마십시오. 이러한 키는 Entra 감사 및 회전 기능을 우회합니다.
    • 로컬 개발: DefaultAzureCredential은 그대로 작동합니다.
    • 프로덕션: AZURE_TOKEN_CREDENTIALS=prod(또는 AZURE_TOKEN_CREDENTIALS=<특정_credential></특정_credential>)를 설정하여 인증서 체인을 프로덕션 안전 인증서에 제한하십시오.
  2. 모든 클라이언트를 컨텍스트 관리자로 감싸십시오. 이를 통해 HTTP 전송, 소켓 및 토큰 캐시가 결정적으로 해제됩니다:
    • 동기: with <클라이언트>(...) as client:</클라이언트>
    • 비동기: async with <클라이언트>(...) as client:</클라이언트> async with DefaultAzureCredential() as credential: (azure.identity.aio에서 가져옴)

코드 조각은 이 설정을 축약할 수 있지만, 프로덕션 코드는 항상 두 규칙을 따라야 합니다.

비밀번호

SecretClient 설정

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

# 로컬 개발: DefaultAzureCredential. 프로덕션: AZURE_TOKEN_CREDENTIALS=prod 또는 AZURE_TOKEN_CREDENTIALS=<특정_credential> 설정
credential = DefaultAzureCredential(require_envvar=True)
# 또는 프로덕션에서 특정 인증서를 직접 사용:
# https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes 참조
# credential = ManagedIdentityCredential()
vault_url = "https://<보관소이름>.vault.azure.net/"

with SecretClient(vault_url=vault_url, credential=credential) as client:
    # 모든 비밀번호 작업은 이 블록 내부에서 수행됩니다(아래 예제 참조)
    ...
</보관소이름></특정_credential>

비밀번호 작업

# 비밀번호 설정
secret = client.set_secret("database-password", "super-secret-value")
print(f"생성됨: {secret.name}, 버전: {secret.properties.version}")

# 비밀번호 가져오기
secret = client.get_secret("database-password")
print(f"값: {secret.value}")

# 특정 버전 가져오기
secret = client.get_secret("database-password", version="abc123")

# 비밀번호 목록 가져오기(값이 아닌 이름만)
for secret_properties in client.list_properties_of_secrets():
    print(f"비밀번호: {secret_properties.name}")

# 버전 목록 가져오기
for version in client.list_properties_of_secret_versions("database-password"):
    print(f"버전: {version.version}, 생성일: {version.created_on}")

# 비밀번호 삭제(소프트 삭제)
poller = client.begin_delete_secret("database-password")
deleted_secret = poller.result()

# 영구 삭제(소프트 삭제 활성화 시)
client.purge_deleted_secret("database-password")

# 삭제된 비밀번호 복구
client.begin_recover_deleted_secret("database-password").result()

KeyClient 설정

from azure.identity import DefaultAzureCredential
from azure.keyvault.keys import KeyClient

credential = DefaultAzureCredential()
vault_url = "https://<보관소이름>.vault.azure.net/"

with KeyClient(vault_url=vault_url, credential=credential) as client:
    # 모든 키 작업은 이 블록 내부에서 수행됩니다(아래 예제 참조)
    ...
</보관소이름>

키 작업

from azure.keyvault.keys import KeyType

# RSA 키 생성
rsa_key = client.create_rsa_key("rsa-key", size=2048)

# EC 키 생성
ec_key = client.create_ec_key("ec-key", curve="P-256")

# 키 가져오기
key = client.get_key("rsa-key")
print(f"키 유형: {key.key_type}")

# 키 목록 가져오기
for key_properties in client.list_properties_of_keys():
    print(f"키: {key_properties.name}")

# 키 삭제
poller = client.begin_delete_key("rsa-key")
deleted_key = poller.result()

암호화 작업

from azure.keyvault.keys.crypto import CryptographyClient, EncryptionAlgorithm

# 특정 키에 대한 암호화 클라이언트 가져오기
# crypto_client = CryptographyClient(key, credential=credential)
# 또는 키 ID에서 가져오기
with CryptographyClient(
    "https://<보관소>.vault.azure.net/keys/<키이름>/<버전>",
    credential=credential
) as crypto_client:
    # 암호화
    plaintext = b"Hello, Key Vault!"
    result = crypto_client.encrypt(EncryptionAlgorithm.rsa_oaep, plaintext)
    ciphertext = result.ciphertext

    # 복호화
    result = crypto_client.decrypt(EncryptionAlgorithm.rsa_oaep, ciphertext)
    decrypted = result.plaintext

    # 서명
    from azure.keyvault.keys.crypto import SignatureAlgorithm
    import hashlib

    digest = hashlib.sha256(b"data to sign").digest()
    result = crypto_client.sign(SignatureAlgorithm.rs256, digest)
    signature = result.signature

    # 검증
    result = crypto_client.verify(SignatureAlgorithm.rs256, digest, signature)
    print(f"유효: {result.is_valid}")
</버전></키이름></보관소>

인증서

CertificateClient 설정

from azure.identity import DefaultAzureCredential
from azure.keyvault.certificates import CertificateClient, CertificatePolicy

credential = DefaultAzureCredential()
vault_url = "https://<보관소이름>.vault.azure.net/"

with CertificateClient(vault_url=vault_url, credential=credential) as client:
    # 모든 인증서 작업은 이 블록 내부에서 수행됩니다(아래 예제 참조)
    ...
</보관소이름>

인증서 작업

# 자체 서명 인증서 생성
policy = CertificatePolicy.get_default()
poller = client.begin_create_certificate("my-cert", policy=policy)
certificate = poller.result()

# 인증서 가져오기
certificate = client.get_certificate("my-cert")
print(f"지문: {certificate.properties.x509_thumbprint.hex()}")

# 개인 키가 포함된 인증서 가져오기(비밀번호로)
from azure.keyvault.secrets import SecretClient
with SecretClient(vault_url=vault_url, credential=credential) as secret_client:
    cert_secret = secret_client.get_secret("my-cert")
    # cert_secret.value에는 PEM 또는 PKCS12가 포함됨

# 인증서 목록 가져오기
for cert in client.list_properties_of_certificates():
    print(f"인증서: {cert.name}")

# 인증서 삭제
poller = client.begin_delete_certificate("my-cert")
deleted = poller.result()

클라이언트 유형 표

클라이언트패키지목적
`SecretClient``azure-keyvault-secrets`비밀번호 저장/검색
`KeyClient``azure-keyvault-keys`암호화 키 관리
`CryptographyClient``azure-keyvault-keys`암호화/복호화/서명/검증
`CertificateClient``azure-keyvault-certificates`인증서 관리

비동기 클라이언트

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

async def get_secret():
    async with DefaultAzureCredential() as credential:
        async with SecretClient(vault_url=vault_url, credential=credential) as client:
            secret = await client.get_secret("my-secret")
            print(secret.value)

import asyncio
asyncio.run(get_secret())

오류 처리

from azure.core.exceptions import ResourceNotFoundError, HttpResponseError

try:
    secret = client.get_secret("nonexistent")
except ResourceNotFoundError:
    print("비밀번호를 찾을 수 없음")
except HttpResponseError as e:
    if e.status_code == 403:
        print("접근 거부 - RBAC 권한 확인")
    raise

모범 사례

  1. 동기 또는 비동기 중 하나를 선택하고 일관성을 유지하십시오. 동일한 호출 경로에서 azure.xxx 동기 클라이언트와 azure.xxx.aio 비동기 클라이언트를 혼합하지 마십시오. 모듈당 하나의 모드를 선택하십시오.
  2. 클라이언트 및 비동기 인증서에 항상 컨텍스트 관리자를 사용하십시오. 모든 클라이언트를 with Client(...) as client:(동기) 또는 async with Client(...) as client:(비동기)로 감싸십시오. azure.identity.aio의 비동기 DefaultAzureCredential의 경우 토큰과 전송을 정리하기 위해 async with credential:도 사용하십시오.
  3. 로컬에서 실행되는 코드에는 DefaultAzureCredential을 사용하십시오. Azure에서 실행되는 코드에는 특정 토큰 인증서를 사용하십시오.
  4. Azure 호스팅 애플리케이션에서는 관리된 ID를 사용하십시오.
  5. 복구를 위해 소프트 삭제를 활성화하십시오(기본값으로 활성화됨).
  6. 세분화된 제어를 위해 액세스 정책 대신 RBAC를 사용하십시오.
  7. 버전 관리를 사용하여 비밀번호를 정기적으로 회전하십시오.
  8. App Service/Functions 구성에서 Key Vault 참조를 사용하십시오.
  9. API 호출을 줄이기 위해 적절하게 비밀번호를 캐시하십시오.
  10. 높은 처리량 시나리오에는 비동기 클라이언트를 사용하십시오.
GitHub에서 보기
---
name: azure-keyvault-py
description: Manage secrets, cryptographic keys, and certificates in Azure Key Vault using the Python SDK.
license: MIT
---

# Azure Key Vault SDK for Python

Secure storage and management for secrets, cryptographic keys, and certificates.

## Installation

```bash
# Secrets
pip install azure-keyvault-secrets azure-identity

# Keys (cryptographic operations)
pip install azure-keyvault-keys azure-identity

# Certificates
pip install azure-keyvault-certificates azure-identity

# All
pip install azure-keyvault-secrets azure-keyvault-keys azure-keyvault-certificates azure-identity
```

## Environment Variables

```bash
AZURE_KEYVAULT_URL=https://<vault-name>.vault.azure.net/  # Required for all auth methods
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
```

## Authentication & Lifecycle

> **🔑 Two rules apply to every code sample below:**
>
> 1. **Prefer `DefaultAzureCredential`.** It works locally (Azure CLI / VS Code / Developer CLI) and in Azure (managed identity, workload identity) with no code change. Avoid connection strings, account/API keys — they bypass Entra audit and rotation.
>    - Local dev: `DefaultAzureCredential` works as-is.
>    - Production: set `AZURE_TOKEN_CREDENTIALS=prod` (or `AZURE_TOKEN_CREDENTIALS=<specific_credential>`) to constrain the credential chain to production-safe credentials.
> 2. **Wrap every client in a context manager** so HTTP transports, sockets, and token caches are released deterministically:
>    - Sync: `with <Client>(...) as client:`
>    - Async: `async with <Client>(...) as client:` **and** `async with DefaultAzureCredential() as credential:` (from `azure.identity.aio`)
>
> Snippets may abbreviate this setup, but production code should always follow both rules.

## Secrets

### SecretClient Setup

```python
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.keyvault.secrets import SecretClient

# Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# Or use a specific credential directly in production:
# See https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()
vault_url = "https://<vault-name>.vault.azure.net/"

with SecretClient(vault_url=vault_url, credential=credential) as client:
    # All secret operations go inside this block (see examples below)
    ...
```

### Secret Operations

```python
# Set secret
secret = client.set_secret("database-password", "super-secret-value")
print(f"Created: {secret.name}, version: {secret.properties.version}")

# Get secret
secret = client.get_secret("database-password")
print(f"Value: {secret.value}")

# Get specific version
secret = client.get_secret("database-password", version="abc123")

# List secrets (names only, not values)
for secret_properties in client.list_properties_of_secrets():
    print(f"Secret: {secret_properties.name}")

# List versions
for version in client.list_properties_of_secret_versions("database-password"):
    print(f"Version: {version.version}, Created: {version.created_on}")

# Delete secret (soft delete)
poller = client.begin_delete_secret("database-password")
deleted_secret = poller.result()

# Purge (permanent delete, if soft-delete enabled)
client.purge_deleted_secret("database-password")

# Recover deleted secret
client.begin_recover_deleted_secret("database-password").result()
```

## Keys

### KeyClient Setup

```python
from azure.identity import DefaultAzureCredential
from azure.keyvault.keys import KeyClient

credential = DefaultAzureCredential()
vault_url = "https://<vault-name>.vault.azure.net/"

with KeyClient(vault_url=vault_url, credential=credential) as client:
    # All key operations go inside this block (see examples below)
    ...
```

### Key Operations

```python
from azure.keyvault.keys import KeyType

# Create RSA key
rsa_key = client.create_rsa_key("rsa-key", size=2048)

# Create EC key
ec_key = client.create_ec_key("ec-key", curve="P-256")

# Get key
key = client.get_key("rsa-key")
print(f"Key type: {key.key_type}")

# List keys
for key_properties in client.list_properties_of_keys():
    print(f"Key: {key_properties.name}")

# Delete key
poller = client.begin_delete_key("rsa-key")
deleted_key = poller.result()
```

### Cryptographic Operations

```python
from azure.keyvault.keys.crypto import CryptographyClient, EncryptionAlgorithm

# Get crypto client for a specific key
# crypto_client = CryptographyClient(key, credential=credential)
# Or from key ID
with CryptographyClient(
    "https://<vault>.vault.azure.net/keys/<key-name>/<version>",
    credential=credential
) as crypto_client:
    # Encrypt
    plaintext = b"Hello, Key Vault!"
    result = crypto_client.encrypt(EncryptionAlgorithm.rsa_oaep, plaintext)
    ciphertext = result.ciphertext

    # Decrypt
    result = crypto_client.decrypt(EncryptionAlgorithm.rsa_oaep, ciphertext)
    decrypted = result.plaintext

    # Sign
    from azure.keyvault.keys.crypto import SignatureAlgorithm
    import hashlib

    digest = hashlib.sha256(b"data to sign").digest()
    result = crypto_client.sign(SignatureAlgorithm.rs256, digest)
    signature = result.signature

    # Verify
    result = crypto_client.verify(SignatureAlgorithm.rs256, digest, signature)
    print(f"Valid: {result.is_valid}")
```

## Certificates

### CertificateClient Setup

```python
from azure.identity import DefaultAzureCredential
from azure.keyvault.certificates import CertificateClient, CertificatePolicy

credential = DefaultAzureCredential()
vault_url = "https://<vault-name>.vault.azure.net/"

with CertificateClient(vault_url=vault_url, credential=credential) as client:
    # All certificate operations go inside this block (see examples below)
    ...
```

### Certificate Operations

```python
# Create self-signed certificate
policy = CertificatePolicy.get_default()
poller = client.begin_create_certificate("my-cert", policy=policy)
certificate = poller.result()

# Get certificate
certificate = client.get_certificate("my-cert")
print(f"Thumbprint: {certificate.properties.x509_thumbprint.hex()}")

# Get certificate with private key (as secret)
from azure.keyvault.secrets import SecretClient
with SecretClient(vault_url=vault_url, credential=credential) as secret_client:
    cert_secret = secret_client.get_secret("my-cert")
    # cert_secret.value contains PEM or PKCS12

# List certificates
for cert in client.list_properties_of_certificates():
    print(f"Certificate: {cert.name}")

# Delete certificate
poller = client.begin_delete_certificate("my-cert")
deleted = poller.result()
```

## Client Types Table

| Client | Package | Purpose |
|--------|---------|---------|
| `SecretClient` | `azure-keyvault-secrets` | Store/retrieve secrets |
| `KeyClient` | `azure-keyvault-keys` | Manage cryptographic keys |
| `CryptographyClient` | `azure-keyvault-keys` | Encrypt/decrypt/sign/verify |
| `CertificateClient` | `azure-keyvault-certificates` | Manage certificates |

## Async Clients

```python
from azure.identity.aio import DefaultAzureCredential
from azure.keyvault.secrets.aio import SecretClient

async def get_secret():
    async with DefaultAzureCredential() as credential:
        async with SecretClient(vault_url=vault_url, credential=credential) as client:
            secret = await client.get_secret("my-secret")
            print(secret.value)

import asyncio
asyncio.run(get_secret())
```

## Error Handling

```python
from azure.core.exceptions import ResourceNotFoundError, HttpResponseError

try:
    secret = client.get_secret("nonexistent")
except ResourceNotFoundError:
    print("Secret not found")
except HttpResponseError as e:
    if e.status_code == 403:
        print("Access denied - check RBAC permissions")
    raise
```

## Best Practices

1. **Pick sync OR async and stay consistent.** Do not mix `azure.xxx` sync clients with `azure.xxx.aio` async clients in the same call path. Choose one mode per module.
2. **Always use context managers for clients and async credentials.** Wrap every client in `with Client(...) as client:` (sync) or `async with Client(...) as client:` (async). For async `DefaultAzureCredential` from `azure.identity.aio`, also use `async with credential:` so tokens and transports are cleaned up.
3. **Use `DefaultAzureCredential`** for code that runs locally. Use a specific token credential for code that runs in Azure.
4. **Use managed identity** in Azure-hosted applications
5. **Enable soft-delete** for recovery (enabled by default)
6. **Use RBAC** over access policies for fine-grained control
7. **Rotate secrets** regularly using versioning
8. **Use Key Vault references** in App Service/Functions config
9. **Cache secrets** appropriately to reduce API calls
10. **Use async clients** for high-throughput scenarios

모든 파일

0개 파일

azure-keyvault-py 설치

스킬 파일을 다운로드하여 .claude/skills/ 디렉토리에 추출하세요.

ZIP 다운로드

저장소를 클론하고 스킬 파일을 프로젝트에 복사하세요.

git clone https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-python/skills/azure-keyvault-py # Copy SKILL.md to your .claude/skills/ directory

복사 복사
빠른 설정: 스킬 폴더를 .claude/skills/에 복사하세요. Claude가 자동으로 감지하고 사용합니다.
저장소 microsoft/skills

관련 스킬

gmgn-portfolio
업데이트 된 시간 2026년 7월 1일
zeroize-audit
업데이트 된 시간 2026년 7월 1일
device-integrity
업데이트 된 시간 2026년 6월 29일
flutter-use-http-package
업데이트 된 시간 2026년 6월 30일
OR