본문 바로가기

CS 라이프

AWS secrets 관리 방법 - ACM, KMS, Parameter store, Secrets Management

나의 인턴십 두 번째 업무는 AWS와 굉장히 친해져야하는 일이다. 다행인 것이 SDLC를 통해서 AWS Academy를 찍먹 해본 터라 AWS GUI랑 조금은 친해져 있었다. 역시 SDLC는 유용한 스킬을 많이 가르친 수업이었다.

AWS Academy와 찐 AWS의 차이점은 IAM에서 온다고 했다.

IAM이란?

What is IAM? - AWS Identity and Access Management

Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.

docs.aws.amazon.com

… IAM을 사용하면 사용자가 액세스할 수 있는 AWS 리소스를 제어하는 권한을 중앙에서 관리할 수 있습니다. IAM을 사용하여 리소스를 사용하도록 인증(로그인) 및 권한 부여(권한 있음)된 대상을 제어합니다.

지금 내가 하는 SRE 업무가 이 회사의 모든 앱들에 관한 권한들을 통제하고 관리하는 업무를 맡고있듯, IAM은 AWS 전체에 그런 일을 하는 것같다. 하지만 AWS Academy는 IAM을 생성하는 권한을 막고 있기 때문에 이 부분에 대해서 자세히 알아볼 기회가 없었다.


지금 하는 일을 bash script를 AWS Lambda로 바꿔야하는데 이걸 하기 위해서는 고려해야할 부분이 많았다. 기존의 bash script는 그 특성상 환경 변수를 설정해서 그걸 읽어들여서 스크립트가 돌아간다. 그렇기 때문에 코드를 보면 단순하지만 이 업무에서 가장 중요한 부분은 이 환경 변수들을 얼마나 편리하고 안전하게 저장하고 사용할지가 아닐까 싶다.

AWS 에서는 이를 관리하는 방법을 다양하게 제공하기 어떤 방식으로 이를 처리할지 확실하지 않았다. 때문에 최대한 알아보기 쉽게 시각화를 한 후 용기내서 회의 시간에 질문을 했다. 의사 결정을 내려야 하는 부분을 짚어가며 환경 변수를 저장하고 사용하기 위해서 AWS의 어떤 방식을 채택하냐 팀에 물었는데 best practice 기회라며 pros & cons를 비교해서 나보고 결정을 내리라고 했다. 거 인턴한테 의사결정을 내리라니 너무 한거 아니오…라고 생각이 들었지만 이번 기회에 관련 개념을 정리하면 좋을 것 같아서 이것저것 찾아보기 시작했다.


Secrets

Typical examples of secrets include credentials, passwords, API keys, and database connection strings.

내가 지금 환경변수로 설정된 것들도 어떻게 보면 Secrets에 묶인다고 보면 된다. AI 모델을 이용할 때 인증받은 키, DB 접근을 위해 설정하는 인증 정보들 모두가 Secrets으로 통칭되고 있다.


AWS Secrets 관련

  • Secrets Manager
  • Parameter Store
  • Key Management Service(KMS)
  • AWS Certificate Manager(ACM)

내가 필요로 하는 기능을 제공하는 AWS 관련 서비스는 이렇게 총 네 개가 있다.


ACM 예시 및 사용

[SDLC] AWS CloudFront + S3 배포하기

[SDLC] Google OAuth2 & HTTPS와 SSL/TLS자 웹사이트는 발급 받았으니 한 번 연결시켜볼까? 라고 생각했다.우리가 만든 앱에서는 로그인을 간편화 시키고자 Google OAuth2를 사용했다. Google OAuth2Google OAuth2란?

trippy-sanfran.tistory.com

ACM은 지난 번 내가 도메인을 발급받고 SSL/TLS을 CloudFront랑 연결할 때 썼던 경험이 있다. 설명을 읽어보니 그런 경우에 많이 사용하는 것 같다.


KMS 예시 및 사용

KMS는 Lambda에서 Environment Variable 등록할 때 쓸 수 있는 것 같다. 단순 텍스트로 등록을 해도 되지만 lambda에 액세스 가능한 유저들이 다 읽을 수 있다는 점에서 암호화를 할 때 사용할 수 있는 것이 KMS다.

Lambda configuration

이렇게 Lambda에서 사용하는 environment variables 이 있다고 하자. 이 변수들을 암호화 하기 위해서는 KMS를 통해 새로운 키를 생성해야 한다.

새로 생성된 key in KMS

KMS 생성 시에 Key Administratiors, Key Users 설정을 해두어야 하기 때문에 여기서 액세스 가능한 권한을 통제할 수 있다. 이 Key를 사용할 수 있는 유저들은 아마 Administator과는 권한이 다를 것이기 때문에 쉽게 decrypt 할 수 없을 것.

다시 돌아와, 이 키를 사용해서 다시 Lambda로 돌아와 암호화를 해보자.

설정 업데이트

Custom master key를 선택해주면 이제 변수를 암호화 할 수 있다.

변수 Encrypt를 누른다
암호화 완료!

이렇게 설정해두면 lambda에서

os.environ[‘TOKEN’]

이런 식으로 그냥 갖다 쓸 수 있다.


Secrets Manager 예시 및 사용

Secrets Manager에 'Store a new secret’을 통해 새로운 secret을 생성할 수 있다.

이때, default role 대신 내가 생성한 KMS를 이용해서 관리할 수 있다.
이 secret 아래에 이제 key:value pair로 새롭게 등록 가능하다.  

Test_token 이라는 key에 value는 password

Secret이 생성되고 나면 어떻게 갖다 쓰면 되는지는 친절하게 KMS에서 코드로 제공되고 있다.

def get_secret():

    secret_name = "aws-managed-secrets"
    region_name = "us-east-1"

    # Create a Secrets Manager client
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    )

    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
    except ClientError as e:
        # For a list of exceptions thrown, see
        # https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
        raise e

    secret = get_secret_value_response['SecretString']
    print(secret)

이렇게 시크릿을 갖다쓰면,

설정한 값이 잘 불러들어지는 것을 확인할 수 있다.


Doppler and AWS Secrets Manager

Effective secrets management, such as securing tokens and passwords, is essential to Kubernetes security. Learn how to secure Kubernetes secrets and best practices using AWS Secrets Manager.

www.doppler.com

In addition to AWS Secrets Manager, other solutions like Key Management Service (KMS), AWS Certificate Manager (ACM), and Parameter Store also handle sensitive data. AWS Secrets Manager stands out due to its specialized focus on secret management.

Here's how Secrets Manager differs from other AWS services:

  • AWS Parameter Store: While AWS Systems Manager's Parameter Store can store secrets, it lacks features like automated rotation, and it's more suitable for static configuration values. It’s important to note AWS Parameter store is not capable of automatic cross-region and cross-account replication. If you require parameters to be available across regions or even AWS accounts, you will need an external process to cover this limitation.
  • AWS KMS: KMS manages the generation and storage of symmetric and asymmetric encryption keys. KMS differs from Secrets Manager and Parameter store in that KMS does not directly manage secrets. Instead KMS APIs are used to perform data encryption using these KMS-managed keys
  • ACM: ACM manages x509 SSL/TLS certificates for securing network traffic, whereas Secrets Manager manages a broader range of secrets. ACM certificates are supported for use with AWS Elastic Load Balancer, AWS CloudFront, and AWS API Gateway. In contrast, AWS ACM Certificate will not work for other use cases such as code signing or TLS client mutual authentication.

이 블로그도 잘 정리해뒀다.


결론적으로, 나는 아마 Secrets Manager를 통해 환경변수를 저장하고 불러들일 것 같다!