Java로 AWSSDK를 이용하여 AWS Secret 조회

David Jeon·2023년 12월 20일
0
post-thumbnail

Java로 AWSSDK를 이용하여 AWS Secret 조회

형상 관리를 위해 Git을 사용하고 웹서비스를 개발할때
주요 계정정보(DB 접속)나 연동 Key 정보등을 Properties나 소스에 포함하는 경우가 대부분이다.
물론 암호화하여 사용하는 것이 일반적이지만 해킹이 되어 복호화를 통한 시스템 공격이 가능하다.

정보를 보호하기 위해 시스템 환경변수나 톰캣을 사용하는 경우 root만 관리할 수 있는 톰캣 env 디렉토리에 정보를 보관하며 WAS가 기동될 때 참조하도록 하는 등 조치를 취하지만 이것은 관리의 어려움도 있고 root 계정이 탈취될 경우 마찬가지로 해팅의 우려가 있다.

이것을 해결하기 위해 AWS에서는 Secret Manager Service를 제공하고 있다.

<AWS Secret Manager 정의>
AWS Secrets Manager을(를) 사용하면 수명 주기 동안 데이터베이스 보안 인증, 애플리케이션 보안 인증, OAuth 토큰, API 키 및 기타 암호를 관리, 검색, 교체할 수 있습니다. 다수의 AWS 서비스는 Secrets Manager에 보안 암호를 저장하고 사용합니다.
Secrets Manager를 사용하면 더 이상 애플리케이션 소스 코드에 하드 코딩된 보안 인증 정보가 필요하지 않으므로 보안 태세를 개선할 수 있습니다. Secrets Manager에 보안 인증 정보를 저장하면 애플리케이션 또는 구성 요소를 조사할 수 있는 누군가로 인해 손상될 가능성을 방지할 수 있습니다. 하드 코딩된 보안 인증 정보를 Secrets Manager 서비스에 대한 런타임 호출로 대체하여 필요할 때 동적으로 보안 인증 정보를 검색합니다.
Secrets Manager를 사용하면 암호에 대한 자동 교체 일정을 구성할 수 있습니다. 따라서 단기 보안 암호로 장기 보안 암호를 교체할 수 있어 손상 위험이 크게 줄어듭니다. 보안 인증 정보가 더 이상 애플리케이션에 저장되지 않으므로 보안 인증 정보를 교체할 때 더 이상 애플리케이션을 업데이트하거나 애플리케이션 클라이언트에 변경 사항을 배포하지 않아도 됩니다.

URL : https://docs.aws.amazon.com/ko_kr/secretsmanager/latest/userguide/intro.html

<개발 환경>

  • 개발 OS : Windows
  • Java : 17
  • IDE : 인텔리제이
  • Cloud : AWS

<사전작업>

<작업 순서>
1) Secret 생성
2) AWS 액세스 키 생성
3) Java Web Project 생성 및 코딩
4) Local PC의 AWS 환경 세팅
5) 테스트

1. Secret 생성

기존에 작성한 Secret 생성 블로그 참조
호출할 Secret Name : db-test-secret
Secret을 생성한 Region : 서울 => AP_NORTHEAST_2

2. AWS 액세스 키 생성

1) AWS Console의 우측 상단의 계정을 클릭하고 보안자격증명 을 선택 후 화면의 중간 아랫부분의 "액세스 키 만들기"를 클릭한다.

2) 액세스 키 모범 사례 및 대안 화면에서 "로컬코드" 를 선택하고 "다음"을 클릭한다.

3) "설명 태그 값"을 입력하고 "엑세스 키 만들기"를 클릭한다.

4) "액세스 키"가 생성되는데 "액세스 키"와 "비밀 액세스 키"를 copy하여 잘 관리한다.

  • CSV로 다운로드 하여 관리해도 됨

    5) "완료"를 클릭하면 엑세스 키가 생성된다.

3. Java Web Project 생성 및 코딩

3.1 Java Web Project 생성

1) 인텔리제이 상단의 File > New > Project를 선택 후
Generators > Spring Initializr (zr 오타인가요?^^) 선택하고 값을 입력한다.

"Next" 클릭
2) Lombok, Spring Boot DevTools, Spring Web Dependency를 선택하고 "Create" 클릭한다.

3) 생성된 프로젝트에서 build.gradle을 Open하여 AWSSDK Dependencies를 추가한다

    implementation platform('software.amazon.awssdk:bom:2.21.44')
    implementation 'software.amazon.awssdk:secretsmanager'
    implementation 'software.amazon.awssdk:regions'

인텔리제이 오른쪽의 "Gradle" 탭을 선택하고 화살표 표시의 "Reload All Gradle Projects"를 클릭하면 수정한 Gradle 정보가 프로젝트에 반영이 된다.(자동 빌드로 설정한 경우는 Skip)

3.2 AWSSDK를 호출하는 Configuration Class 구현

1) 생성된 프로젝트이 하위 Package를 com.sample.aws.secretmanager.config.aws 생성하고 SecretManagerConfig.java를 구현한다.

package com.sample.aws.secretmanager.config.aws;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;
import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest;
import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse;
import software.amazon.awssdk.services.secretsmanager.model.SecretsManagerException;

@Slf4j
@Configuration
public class SecretManagerConfig {

    public void getValue( String secretName) {

		// Secret이 존재하는 Region 값 입력
        Region region = Region.AP_NORTHEAST_2;
        SecretsManagerClient secretsClient = SecretsManagerClient.builder()
                .region(region)
                .build();

        try {
            GetSecretValueRequest valueRequest = GetSecretValueRequest.builder()
                    .secretId(secretName)
                    .build();

            GetSecretValueResponse valueResponse = secretsClient.getSecretValue(valueRequest);
            String secret = valueResponse.secretString();
            log.info(secret);
        } catch (SecretsManagerException e) {
            log.warn(e.awsErrorDetails().errorMessage());
        }
    }
}

2) 테스트를 위해 Web호출이 가능한 MainController.java를 구현한다.

package com.sample.aws.secretmanager.web;

import com.sample.aws.secretmanager.config.aws.SecretManagerConfig;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@Slf4j
public class MainController {

    private final SecretManagerConfig secretManagerConfig;
    @GetMapping("/secret")
    String getSecret() {

		// Secret Name으로 호출
        secretManagerConfig.getValue("db-test-secret");
        return "AWS Secret Retrieval Success!!!";
    }
}

4. Local PC의 AWS 환경 세팅

4.1 액세스 키 설치

위의 "2. AWS 액세스 키 생성"에서 생성한 Key를 Local PC에 세팅을 해야 해당 엑세스 키를 이용하여 AWS Secret Manager 서비스로 접근이 가능하다.

aws configure list 명령으로 설치된 액세스 키를 확인할 수 있다

5. 테스트

1) Postman으로 GET Request를 만들고 호출 URL을 입력하고 Send를 클릭한다.

호출한 결과인 "AWS Secret Retrieval Success!!!" 가 Body에 출력이 된다.

2) Server가 AWS Secret을 호출한 로그는 아래와 같이 표시가 된다.

이렇게 조회된 값을 이용하여 원하는 부분에 사용하면 된다.

End~~~!!!

profile
코딩이 즐거운 아저씨

0개의 댓글