본문 바로가기
6. 보안 Security

Vault Secret 정보 Java SDK로 가져오기

by primely 2022. 9. 26.

OCI Vault Secret를 사용하면 Application에 파일로 관리하던 password나 암호화키 정보를 안전하게 OCI Vault Secret에 보관하고 API를 통해 필요시 가져와 사용할 수 있다.

 

1. API Key생성하기

Java SDK로 Vault Secret를 호출하기 위한 APi Key를 생성한다.

메뉴: Identity > Users > User Details > API Keys

> 다운 받은 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을 설정

메뉴:&nbsp;Identity & Security > Identity > Dynamic Groups

> 위에서 설정한 Dynamic Group에 해당하는 Instance가 Secret API를 호출할 수 있도록 권한설정

메뉴: Identity & Security > Identity > Policy

> 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

개인의 시간을 할애하여 작성된 글로서 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

댓글