SSM Parameter Store
- 구성과 암호를 AWS에 안전하게 저장하기 위한 것으로
SSM 파라미터 스토어 내부에서 직접 암호를 KMS로 암호화하여 저장하도록 선택할 수 있음 - 매우 안전한 서러비스 서비스이며 확장 가능하며 오래감
- SDK 사용법도 매우 쉽기 때문에 암호를 암호화할 때 항상 사용함
- 구성과 암호의 버전 관리도 가능
- 구성 관리를 위한 모든 보안은 경로 및 IAM 정책을 사용해 이루어짐
- CloudWatch 이벤트를 통해 알림을 받을 수 있고 매개변수를 다듬기 위해 CloudFormation과 통합할 수도 있음
- 가장 중심에는 애플리케이션이 있고 애플리케이션은 파라미터 스토어에 저장된 매개변수를 가지고 있음
구성을 요청하면 파라미터 스토어는 IAM 권한을 확인한 후 회신
암호화된 구성을 요청하면 파라미터 스토어는 IAM과 KMS 권한 확인 후 KMS 서비스의 해독 API를 호출한 후 해독된 암호 제공
SSM Parameter Store Hierarchy
- 파라미터 스토어에 매개변수를 저장하기 위해서는 계층 구조가 필요
- 예)
/my-department/ 아래에
my-app/이 있고
dev/, prd/ 환경이 있고
그 아래 구성 이름인 db-url이나 암호인 db-password 등이 오게 됨
또 다른 애플리케이션이 있다면 계층 구조에 other-app/을 생성할 수 있고 /other-department/를 생성할 수 있음 - 암호 관리자로부터 암호를 참조하기 위해 파라미터 스토어를 사용할 수 있어
AWS로부터 직접 매개변수를 참조할 수 있음
/aws/reference/secretsmanager/secret_ID_in_Secrets_Manager - Amazon Linux2를 위한 가장 최근의 AMI ID를 AWS로부터 가져오게 할 수 있음
/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 - 람다와 파라미터 스토어 사용 방법
Dev 람다 함수가 있고 그 함수가 dev 매개변수에 접근하고 싶다면 환경변수를 설정한 후에
GetParameters 또는 GetParamaterByPath API를 사용해서 함수를 실행함으로써 dev의 값들을 가져올 수 있음
또 다른 환경 변수와 함께 Prod 람다 함수가 있다면 자동으로 prod의 값들을 가져오게 됨
Standard and advanced parameter tiers
- 파라미터 스토어에는 두 개의 티어가 존재
- 스탠다드 티어는 무료이지만 어드밴스 티어는 유료
- 스탠다드 티어는 계정당 최대 10000개의 매개변수를 가질 수 있으며 최대 용량은 4KB이며 매개변수 정책이 없음
- 어드밴스 티어는 계정당 최대 100000개의 매개변수를 가질 수 잇으면 최대 용량은 8KB이며 매개변수 정책이 있음
그러므로 매개변수에 대해 비용을 지불해야 함
Parameters Policies (for advanced parameters)
- 매개변수 정책에는 세 종류가 있으며 이들은 어드밴스 매개변수만을 위한 것으로
TTL 등을 사용해 매개변수에 배정할 수 있도록 함으로써 만료일을 효과적으로 생성해
매개변수 내에서 비밀번호 등 민감한 데이터를 업데이트하거나 삭제하도록 강제하는 것
즉, 정책들을 고급 매개변수에 연결하여 일종의 자동화를 실행시키고 사용자 스스로 매개변수를 자주 변경하도록 강제 - 한 번에 여러 개의 정책을 배정할 수 있음
- Expiration (to delete a parameter)
예) 내 매개변수가 2020년 12월에 만료된다 - ExpirationNofication (CW Events)
예) 만료되기 15일 전에 CloudWatch 이벤트를 통해 알림을 보내달라 - NoChangeNotification (CW Events)
예) 매개변수가 최근 20일 동안 변경된 적이 없다면 CloudWatch 이벤트를 통해 알림을 보내달라
<SSM 매개변수 저장소 실습 (CLI)>
- 파라미터 스토어 콘솔
파라미터 스토어는 보안 및 구성 데이터를 관리하고 관련된 모든 매개변수를 AWS 계정 내에 중앙 집중화하는 방법
작동 방식의 경우 새로운 매개변수를 생성하고 매개변수의 유형과 값을 명시한 후
코드의 명령 내에서 그 매개변수를 참조하면 됨
- 파라미터 스토어 매개변수 생성
Create parameter를 클릭한 후 Standard Tier를 클릭
매개변수를 만들기 위해 이름은 /my-app/dev/db-url이라고 설정한 후 개발 중인 앱의 데이터베이스 URL이라고 설명을 입력
세 가지 유형 중에서 String을 선택하면 모든 문자열을 넣을 수 있고 StringList는 쉼표가 있는 문자열 목록이고
SecureString은 KMS로 암호화된 것을 뜻하므로 String을 선택한 후 데이터베이스 URL을 입력하고 매개변수를 생성
매개변수를 수정하면 마지막으로 수정된 날짜가 갱신되고 마지막으로 수정한 사람도 추적할 수 있음
또한 누가 무엇을 수정했는지 알 수 있으며 개요를 보게 되면 값의 히스토리 및 태그 확인도 가능함
다음으로 또 다른 매개변수인 개발 중인 앱의 데이터베이스 비밀번호인 /my-app/dev/db-password 매개변수를 생성
그리고 이전에 만든 alias/tutorial 키를 KMS 키로 설정하고 암호 값은 thisisthedevpassword로 설정
생성된 매개변수를 보면 SecrueString이므로 암호화되었다는 뜻이며 키 ID는 alias/tutorial이고 버전은 1
그리고 개요에서 Show를 클릭하면 값이 복호화되여 thisisthedevpassword가 나타나게 됨
마지막으로 프로덕션 환경 내 앱의 데이터베이스 URL을 뜻하는 /my-app/prod/db-url과
데이터베이스 비밀번호를 뜻하는 /my-app/prod/db-password 매개변수를 prodpassword로 비밀번호를 설정하여 생성
총 4개의 매개변수 생성
- CLI를 통한 파라미터 매개변수 스토어 매개변수 액세스
매개변수에 액세스하려면 CLI를 사용해 매개변수를 가져와야 함
get-parameters를 입력하고 --names에 원하는 매개변수의 이름을 제공해야 함
/my-app/dev/db-url과 /my-app/deb/db-password를 매개변수 이름으로 제공할 경우 API에서 두 가지 결과가 나오게 됨
결과를 보면 db-url의 String이고 해당하는 문자열 값이 있으며 암호화되지 않아서 값은 복호화되고 버전은 1
이를 보고 데이터베이스 URL을 확인 및 사용할 수 있음
하지만 비밀번호의 경우 SecureString이고 그 값이 암호화된 상태이므로 이를 복호화해야 함
이를 위한 매개변수인 with-decryption을 사용해 KMS tutorial로 암호화되어 있었던 암호를 복호화할 수 있음
굉장히 빠른 속도로 암호화된 값을 얻을 수 있고 또한 비밀번호를 보호하는 KMS에 액세스하지 못할 경우에는 접근할 수 없음
다음으로 aws ssm get-parameters-by-path에 경로 이름을 제공하면 해당 경로의 모든 매개변수를 쿼리하게 됨
경로 이름에 /my-app/dev/를 입력하면 이에 해당하는 기존의 매개변수를 볼 수 있음
또한 my-app/ --recursive로 my-app에서 매개변수를 가져오게 되면 위에서 생성한 네 개의 매개변수를 볼 수 있음
여기에서도 with-decryption으로 복호화를 할 수 있음
즉 트리 구조를 사용해서 암호를 정리할 수 있으며 한 번에 가져올 수 있으니 굉장히 편리한 작업임
<SSM 매개변수 저장소 실습 (AWS Lambda)>
- Lambda와 SDK를 통한 파라미터 매개변수 스토어 액세스
hello-word-SSM 이름으로 설정하며 런타임은 Python 3.7을 선택하고 람다 함수의 IAM 역할이 있어야 하므로 실행 규칙 생성
이를 통해 hello-world-SSM-role-xxx라는 실행 역할이 생성되며 이후 CloudWatch 로그에 쓰기 할 권한을 제공
다음은 이 역할을 가지고 다른 권한을 추가해서 SSM 파라미터 스토어에 읽기 및 쓰기를 할 수 있도록 하기 위해
수정할 람다 함수 코드에서 Boto를 사용하여 SDK를 호출하도록 하기 위해 DB URL과 DB 비밀번호를 가져오도록 함
다음으로 SSM API를 사용하도록 하기 위해 람다 함수 코드를 또 다시 수정
마지막으로 이벤트 이름을 helloworld로 설정하여 생성하여 함수를 저장함
이를 저장하고 나먼 GetParameter 작업 호출 시 AccessDeniedException 오류가 발생하게 되며
이는 hello-world-ssm-role-xxxxxx은 ssm:GetParamters를 실행할 권한이 없다는 뜻이므로IAM 역할을 바꿔야 함
이를 위해 Roles 메뉴로 가서 hello-world-ssm 역할을 찾고 인라인 정책에 SSMAccessForMyApp 정책을 생성 추가하도록 함
이후 다시 Lambda 콘솔에서 새로고침을 하면 Amazon SSM에 액세스할 수 있게 됨을 볼 수 있음
이를 살펴보면 dev/db_url의 값과 deb/db_password가 있고 password의 경우 SecureString이라서 값이 암호화되어 있음
이를 복호화하기 위해서는 WithDecryption = True 플래그를 추가하면 고객 마스터 키를 사용할 수 없기 때문에
AccessDeniedException 오류가 뜨게 되므로 IAM 역할에 KMS 액세스를 주도록 KMSDecryptTutorialKey 정책을 추가
그러면 이를 통해 키에 액세스할 수 있고 복호화가 가능해지며 이는 KMS 기능을 람다 함수에게 제공하게 됨
그리고 다시 테스트를 하게 되면 db_password가 값이 복호화되어 나타남을 볼 수 있음
dev를 prod로 바꾸기 위해서는 환경 변수로 이동한 후 DEV_OR_PROD라고 입력한 후
람다 함수에서 import os를 한 후 dev_or_prod = os.environ['DEV_OR_PROD']을 하면 dev 또는 prod를 참조할 수 있게 됨
이를 통해 dev 또는 prod를 빠르게 바꿀 수 있음
즉 단순히 환경 변수만 변경해서 람다 함수가 SSM의 올바른 파라미터를 표시하도록 만들 수 있음
'Cloud > AWS' 카테고리의 다른 글
[SAA] CloudHSM (0) | 2022.04.22 |
---|---|
[SAA] AWS Secrets Manager 개요 (0) | 2022.04.22 |
[SAA] KMS 키 순환 (0) | 2022.04.22 |
[SAA] KMS 개요 (0) | 2022.04.21 |
[SAA] 암호화 101 (0) | 2022.04.21 |