OCI Vault Secret를 사용하면 Application에 파일로 관리하던 password나 암호화키 정보를 안전하게 OCI Vault Secret에 보관하고 API를 통해 필요시 가져와 사용할 수 있다.
1. API Key생성하기
Java SDK로 Vault Secret를 호출하기 위한 APi Key를 생성한다.
> 다운 받은 pem파일을 home/.oci 폴더 밑에 위치
> Add후 나오는 Configuration File Preview내용을 가지고 config파일 생성하여 home/.oci 폴더 밑에 위치
config(접속정보)와 primery key를 가지고 OCI SDK인증 처리
key file은 같은 폴더에 두고 경로 입력: key_file=~/.oci/~privatekey.pem
2. Java SDK로 Secret정보 가져오기
> Maven Dependency
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-secrets</artifactId>
</dependency>
> Java Code
public class Vault_Secret_Test {
public static void main(String[] args) throws IOException {
String secretOcid = "ocid1.vaultsecret.oc1.ap-seoul-1.~";
String regionIdString = "ap-seoul-1";
String result = Vault_Secret_Test.getSecreteFromVault(false, regionIdString,
secretOcid);
System.out.println("result: "+result);
}
/*
* isInstancePrincipal: Instance Principal을 사용하는 경우엔 true값 전달
*/
static String getSecreteFromVault(boolean isInstancePrincipal, String regionIdString,
String secretOcid) throws IOException {
SecretsClient secretsClient;
if (isInstancePrincipal) {
// InstancePrincipal으로 접속하는 Provider
secretsClient = new SecretsClient(
InstancePrincipalsAuthenticationDetailsProvider.builder().build());
} else {
// ConfigFile을 통해 접속하는 Provider
secretsClient = new SecretsClient(
new ConfigFileAuthenticationDetailsProvider("~/.oci/config", "DEFAULT"));
}
secretsClient.setRegion(regionIdString);
// 특정 Secret정보를 요청하는 Request 생성
GetSecretBundleRequest getSecretBundleRequest =
GetSecretBundleRequest
.builder()
.secretId(secretOcid)
.stage(GetSecretBundleRequest.Stage.Current)
.build();
// Secret정보를 받은 Response
GetSecretBundleResponse getSecretBundleResponse =
secretsClient.getSecretBundle(getSecretBundleRequest);
Base64SecretBundleContentDetails base64SecretBundleContentDetails =
(Base64SecretBundleContentDetails) getSecretBundleResponse.getSecretBundle()
.getSecretBundleContent();
byte[] secretValueDecoded =
Base64.decodeBase64(base64SecretBundleContentDetails.getContent());
return new String(secretValueDecoded);
}
}
3. Instance Principal을 사용하여 Secret정보 가져오기
> Dynamic Group을 생성하고 API를 호출할 Instance에 대한 matching rule을 설정
> 위에서 설정한 Dynamic Group에 해당하는 Instance가 Secret API를 호출할 수 있도록 권한설정
> Secret API를 호출하는 Java코드를 위 Instance에 jar로 배포한 뒤에 코드실행해 보자
위에 코드에서 설명한 것처럼 배포전에 Instance Principal을 사용하도록 코드를 수정한다.
java -cp secret_test.jar vault.Vault_Secret_Test
- secret_test.jar: Secret API를 호출하는 java코드를 배포한 jar
- vault.Vault_Secret_Test: Secret정보를 가져오는 API를 호출하는 Java class
※ JDK가 없는 경우 설치
sudo yum install java-1.8.0-openjdk-devel
※ Resource Principal
Instance가 없는 serverless resource에 대한 인증시 사용
- ex) Data Science, Functions, Language, Vision등
https://feellikeghandi.tistory.com/45
4. Secret Versions and Rotation States
Secret정보가 변경이 되면 Secret Version을 추가하여 적용할 수 있다.
Secret Version은 status가 Deprecated(current, pending, previous이 아닌 상태)일 때만 삭제가 가능하다
5. Rules for Secrets
아래처럼 Secret에 대해 Reuse rule과 Expiry rule을 적용할 수 있다.
7. 참고
https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdk.htm
https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkgettingstarted.htm#Configur
https://github.com/oracle/oci-java-sdk/tree/master/bmc-examples/src/main/java
http://taewan.kim/oci_docs/80_oci_tools/sdk/java_sdk/configuration/
https://www.youtube.com/watch?v=u8OINXxfOvI
작성자: 손창호(primelyson@gmail.com) / Cloud Engineer, 정보시스템감리사, DAP, PIA
개인의 시간을 할애하여 작성된 글로서 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.
'6. 보안 Security' 카테고리의 다른 글
OCI Certificates Service - 로드밸런서에 무료 SSL 구성하기 (0) | 2022.10.04 |
---|---|
Vault Key를 사용하여 Data암호화 하기 - Java SDK (0) | 2022.10.03 |
DBCS with Vault (0) | 2022.09.22 |
Block Volume with Vault (0) | 2022.09.22 |
Object Storage with Vault (0) | 2022.09.22 |
댓글