회사에서 클라우드 서비스를 기존에 쓰던 AWS에서 Azure로 변경을 진행하기로 했다.
기존에는 AWS SecretManager을 사용해서 시크릿 들을 관리했는데, Azure로 인프라를 변경하면서 Azure Key Vault라는 Azure의 서비스를 이용해야 할 것으로 보인다
그렇기에 해당 서비스에 대해서 간단히 조사를 해보려고 한다
Azure Key Vault는 Microsoft Azure 클라우드 플랫폼에서 제공하는 서비스로, 중요한 데이터를 안전하게 저장하고 관리하는 데 사용됩니다.
이를 통해 API 키, 비밀번호, 인증서와 같은 비밀 정보를 중앙에서 관리하고 보호할 수 있습니다.
Azure Key Vault는 데이터 암호화, 액세스 제어, 감사 로그 등의 보안 기능을 제공하여 민감한 정보를 보호합니다.
개발자는 애플리케이션에서 직접 비밀 정보를 사용하지 않고 Key Vault를 통해 안전하게 접근할 수 있습니다. 이를 통해 보안 취약성을 줄이고 관리의 편의성을 높일 수 있습니다.
Azure 포털에 로그인합니다.
“리소스 만들기”로 이동하여 “Key Vault”를 검색합니다.
“Key Vault”를 선택하고 “생성”을 클릭합니다.
필요한 정보를 입력하고 Key Vault를 생성합니다.
Azure 포털에서 Key Vault로 이동합니다.
“설정” 섹션에서 “Secrets”를 선택합니다.
“생성/가져오기”를 클릭하여 새 비밀을 추가합니다.
비밀의 이름과 값을 입력하고 “생성”을 클릭합니다.
의존성 추가:
build.gradle 파일에 다음과 같은 Azure SDK 의존성을 추가
implementation 'com.azure:azure-security-keyvault-secrets:4.5.2'
implementation 'com.azure:azure-identity:1.6.3'
애플리케이션이 Azure에서 실행 중인 경우, 관리 ID를 사용하여 인증을 설정할 수 있습니다. 이를 통해 클라이언트 비밀을 사용하지 않아도 됩니다.
• Azure 포털에서 관리 ID를 활성화합니다.
• Key Vault에서 “Access policies”를 선택하고 “Access Policy 추가”를 클릭합니다.
• 비밀에 대한 “Get” 권한을 선택하고 관리 ID를 설정합니다.
서비스 주체를 사용하려면 Azure AD 애플리케이션과 서비스 주체를 생성해야 합니다.
• 클라이언트 ID, 테넌트 ID, 클라이언트 비밀을 기록합니다.
• 서비스 주체에 Key Vault 접근 권한을 부여합니다.
다음은 비밀을 가져오는 코드 예제
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;
import com.azure.security.keyvault.secrets.models.KeyVaultSecret;
public class KeyVaultService {
private final SecretClient secretClient;
public KeyVaultService(String keyVaultUrl) {
this.secretClient = new SecretClientBuilder()
.vaultUrl(keyVaultUrl)
.credential(new DefaultAzureCredentialBuilder().build())
.buildClient();
}
public String getSecretValue(String secretName) {
KeyVaultSecret secret = secretClient.getSecret(secretName);
return secret.getValue();
}
}
사용 예
KeyVaultService keyVaultService = new KeyVaultService("https://<your-key-vault-name>.vault.azure.net/");
String secretValue = keyVaultService.getSecretValue("<your-secret-name>");
System.out.println("비밀 값: " + secretValue);