본문 바로가기
AWS/Systems Manager

AWS Parameter Store (feat. KMS)

by 알파해커 2022. 11. 27.
반응형

1. Parameter Store란?

AWS Systems Manager 서비스의 기능이다.

텍스트 블록, 이름의 리스트, 비밀번호, 키 값 등을 저장할 수 있는 기능이다.

  • 특히, 애플리케이션에서 사용되는 값들 중, 코드로 노출되면 안되는 (좋지 않은) 값들이 있다. 데이터베이스 아이디/비번, 외부 서비스에 접근하기 위한 액세스 키 등이 그런 것이다. 파라미터 스토어는 코드로 노출되어선 안되는 각종 파라미터들을 안전하게 저장하고 관리할 수 있도록 도와주는 기능이다.

대표적인 특징으로는 다음과 같은 것들이 있다.

  • 무료
  • Key-Value 형식
  • KMS를 통해 파라미터에 암복호화 적용 가능
  • IAM을 통해 접근 권한 제어 가능

 

2. Parameter 생성

AWS Systems Manager의 파라미터 스토어로 가서, 우측 상단에 있는 “파라미터 생성” 버튼을 클릭한다.

 

파라미터의 이름을 쓰고, 파라미터의 유형을 고른다. 예를 들어, 데이터베이스 패스워드와 같은 보안이 중요한 정보는 “보안 문자열” 유형을 선택하여, 암호화가 되도록 한다.

 

“보안 문자열”을 선택하게 되면, 기존에 생성해놓은 KMS Key를 선택할 수 있도록 되어있다. 그리고 저장하고자 하는 원본 파라미터 값을 “값”에 입력하고, “파라미터 생성”을 클릭한다.

 

참고로, 이름을 지을때는 보통 Path 형태로 짓는다. 예를 들어, “/TEST/A”, “/TEST/B” 와 같은 방식이다. 왜냐하면, 한번에 동일한 Path에 있는 파라미터를 모두 불러올 수 있는 기능이 제공되기 때문이다. 즉, “/TEST”라는 Path에 있는 모든 파라미터를 달라고 명령어를 보내거나 SDK를 호출하면, “/TEST/A”, “/TEST/B” 모두 불어와진다.

 

3. KMS를 이용한 Parameter 보호

KMS를 활용하여, 생성한 Parameter에 대한 접근 제어를 통해 Parameter를 보호할 수 있다. KMS에서 Key를 생성하면 Key Policy를 확인할 수 있는데, 예를 들면 아래와 같이 설정할 수 있다.

{
    "Id": "key-consolepolicy-3",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT_ID:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow access for Key Administrators",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT_ID:user/John"
            },
            "Action": [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:TagResource",
                "kms:UntagResource",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion"
            ],
            "Resource": "*"
        }
    ]
}

 

위 Statement의 첫번째 블록은 Default로 생성되는 구문으로 접근 제어를 할 때, (Key Policy에 더해) IAM Policy도 함께 사용하겠다는 의미이다. 두번째 구문은 John이라는 IAM User에게 KMS 기능에 대한 권한을 부여한 내용이다. 자세히 보면, 실제로 해당 Key를 이용해서 암복호화 할때 사용되는 Encrypt, Decrypt관련 권한은 빠져있다.

 

그러나 해당 권한은 IAM Policy를 이용해 부여 가능하기도 하다. 즉, 특정 Key에 대한 접근 권한은 Key Policy와 IAM Policy를 모두 활용하여 섬세하게 컨트롤 할 수도 있다는 것이다. (예시에서 Encrypt, Decrypt 권한이 빠져있는 진짜(?) 이유는 보통의 경우 Key 관리하는 관리자와 사용하는 사용자를 구분하여 권한을 부여하고 관리하기 때문이다.)

 

4. Parameter 불러오기

이렇게 만들어진 Parameter는 boto3를 이용하여 불러올 수 있다(물론 CLI나 다른 방식으로도 가능하다).

이때, Parameter를 불러오기 위해서는 기본적으로 “ssm:GetParameter” 권한이 있어야 한다.

  • 예를 들어, AWS Lambda에서 해당 코드가 동작한다면, Lambda에 적용되는 Role에 해당 권한이 적용되어 있어야 하며, 로컬에서 사용자가 로컬에 저장해놓은 프로파일(ACCESS ID/KEY)을 이용해 직접 실행시키는 거라면, 해당 사용자(IAM User)가 “ssm:GetParameter” 권한을 가지고 있어야 한다.

또한, 해당 Parameter가 KMS Key에 의해 암호화되어 있다면, 해당 KMS Key에 대한 Decrypt 권한이 있어야만 복호화된 내용을 볼 수 있다.

boto3를 이용해 Parameter를 불러오는 코드는 다음과 같다.

ssm = boto3.client("ssm", "ap-northeast-2")

response = ssm.get_parameters(
    Names=["parameter_name"],
    WithDecryption=True
)

parameter = response['Parameters'][0]['Value']

 

5. 레퍼런스

반응형

댓글