기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
컨테이너를 다시 시작하지 않고 데이터베이스 보안 인증 교체
작성자: Josh Joy(AWS)
환경: 프로덕션 | 기술: 컨테이너 및 마이크로서비스, 데이터베이스 DevOps, 인프라, 보안, 자격 증명, 규정 준수, 관리 및 거버넌스 | AWS 서비스: Amazon ECS, Amazon Aurora, AWS Fargate, AWS Secrets Manager, Amazon VPC |
요약
Amazon Web Services(AWS) 클라우드에서 AWS Secrets Manager를 사용하여 수명 주기 동안 데이터베이스 자격 증명을 교체, 관리 및 검색할 수 있습니다. 사용자 및 애플리케이션은 Secrets Manager 를 호출하여 보안 암호를 검색하므로 민감한 정보를 일반 텍스트로 하드코딩할 필요가 API없습니다.
마이크로서비스 워크로드에 컨테이너를 사용하는 경우 AWS Secrets Manager에 보안 인증을 안전하게 저장할 수 있습니다. 구성과 코드를 분리하기 위해 일반적으로 이러한 보안 인증이 컨테이너에 삽입됩니다. 하지만 보안 인증을 주기적으로 자동으로 교체하는 것이 중요합니다. 해지 후 보안 인증을 새로 고칠 수 있는 기능을 지원하는 것도 중요합니다. 동시에 애플리케이션에는 다운스트림 가용성에 미치는 잠재적 영향을 줄이면서 보안 인증을 교체할 수 있는 기능이 필요합니다.
이 패턴은 컨테이너를 다시 시작하지 않고도 컨테이너 내에서 AWS Secrets Manager로 보안되는 보안 암호를 교체하는 방법을 설명합니다. 또한 이 패턴은 Secrets Manager 클라이언트 측 캐싱 구성 요소를 사용하여 Secrets Manager에 대한 보안 인증 조회 횟수를 줄입니다. 클라이언트 측 캐싱 구성 요소를 사용하여 애플리케이션 내에서 보안 인증을 새로 고치는 경우 교체된 보안 인증을 가져오기 위해 컨테이너를 다시 시작할 필요가 없습니다.
이 접근 방식은 Amazon Elastic Kubernetes Service(Amazon EKS) 및 Amazon Elastic Container Service(Amazon )에서 작동합니다ECS.
두 가지 시나리오가 다루어집니다. 단일 사용자 시나리오에서는 만료된 보안 인증을 탐지하여 보안 암호 교체 시 데이터베이스 보안 인증을 새로 고칩니다. 보안 인증 캐시에 보안 암호를 새로 고치라는 명령이 내려지면 애플리케이션이 데이터베이스 연결을 다시 설정합니다. 클라이언트 측 캐싱 구성 요소는 애플리케이션 내에서 보안 인증을 캐시하므로 보안 인증을 조회할 때마다 Secrets Manager에 접속하지 않아도 됩니다. 컨테이너를 다시 시작하여 보안 인증을 강제로 새로 고칠 필요 없이 애플리케이션 내에서 보안 인증이 교체됩니다.
두 번째 시나리오에서는 두 사용자를 번갈아 가며 보안 암호를 교체합니다. 활성 사용자가 두 명이면 한 사용자의 보안 인증이 항상 활성 상태이므로 가동 중지 가능성이 줄어듭니다. 두 명의 사용자 보안 인증 교체는 보안 인증 업데이트의 전파 지연이 약간 발생할 수 있는 클러스터를 포함한 대규모 배포의 경우 유용합니다.
사전 조건 및 제한 사항
사전 조건
활성 상태의 AWS 계정.
Amazon EKS 또는 Amazon 의 컨테이너에서 실행되는 애플리케이션입니다ECS.
보안 인증은 교체가 활성화된 상태로 Secrets Manager에 저장됩니다.
두 번째 보안 인증 집합은 두 명의 사용자 솔루션을 배포하는 경우 Secrets Manager에 저장됩니다. 코드 예제는 GitHub repo aws-secrets-manager-rotation-lambdas
에서 찾을 수 있습니다. Amazon Aurora 데이터베이스.
제한 사항
이 예제는 Python 애플리케이션을 대상으로 합니다. Java 애플리케이션의 경우 Java 클라이언트 측 캐싱 구성 요소
또는 Secrets Manager용 JDBC 클라이언트 측 캐싱 라이브러리 를 사용할 수 있습니다.
아키텍처
대상 아키텍처
시나리오 1 — 단일 사용자의 보안 인증 교체
첫 번째 시나리오에서는 Secrets Manager가 단일 데이터베이스 보안 인증을 주기적으로 교체합니다. 애플리케이션 컨테이너는 Fargate에서 실행됩니다. 첫 번째 데이터베이스 연결이 설정되면 애플리케이션 컨테이너는 Aurora의 데이터베이스 보안 인증을 가져옵니다. 그러면 Secrets Manager 캐싱 구성 요소가 향후 연결 설정을 위해 보안 인증을 캐시합니다. 교체 기간이 경과하면 보안 인증이 만료되고 데이터베이스에서 인증 오류가 반환됩니다. 그런 다음 애플리케이션은 교체된 보안 인증을 가져와 캐시를 무효화하고 Secrets Manager 클라이언트 측 캐싱 구성 요소를 통해 보안 인증 캐시를 업데이트합니다.
이 시나리오에서는 보안 인증을 교체하고 오래된 연결에서 오래된 보안 인증을 사용하는 동안 중단이 최소화될 수 있습니다. 이 문제는 두 명의 사용자 시나리오를 사용하여 해결할 수 있습니다.
시나리오 2 — 단일 사용자의 보안 인증 교체
두 번째 시나리오에서는 Secrets Manager가 두 개의 데이터베이스 사용자 보안 인증(Alice와 Bob의 보안 인증)을 주기적으로 교체합니다. 애플리케이션 컨테이너는 Fargate 클러스터에서 실행됩니다. 첫 번째 데이터베이스 연결이 설정되면, 애플리케이션 컨테이너는 첫번째 사용자(Alice)를 위한 Aurora의 데이터베이스 보안 인증을 가져옵니다. 그러면 Secrets Manager 캐싱 구성 요소가 향후 연결 설정을 위해 보안 인증을 캐시합니다.
두 명의 사용자와 보안 인증이 있지만 Secrets Manager는 활성 보안 인증을 하나만 관리합니다. 이 경우 캐싱 구성 요소는 주기적으로 만료되어 최신 보안 인증을 가져옵니다. Secrets Manager 교체 기간이 캐시 제한 시간보다 더 길면 캐싱 구성 요소가 두 번째 사용자(Bob)의 교체된 보안 인증을 선택합니다. 예를 들어 캐시 만료가 분 단위로 측정되고 순환 기간이 일 단위로 측정되는 경우 캐싱 구성 요소는 정기적인 캐시 새로 고침의 일환으로 새 보안 인증을 가져옵니다. 이렇게 하면 각 사용자의 보안 인증이 한 번의 Secrets Manager 교체 동안 활성화되므로 가동 중지 시간이 최소화됩니다.
자동화 및 규모 조정
AWS CloudFormation 를 사용하여 인프라를 코드로 사용하여 이 패턴을 배포할 수 있습니다. 그러면 애플리케이션 컨테이너를 빌드 및 생성하고, Fargate 작업을 생성하며, 컨테이너를 Fargate에 배포하고, Aurora를 사용하여 Secrets Manager를 설정 및 구성합니다. step-by-step 배포 지침은 readme
도구
도구
AWS Secrets Manager를 사용하면 암호를 포함하여 하드코딩된 보안 인증 정보를 Secrets Manager에 API 호출하여 보안 암호를 검색할 수 있습니다. Secrets Manager는 일정에 따라 자동으로 보안 암호를 교체할 수 있으므로 장기 보안 암호를 단기 보안 암호로 대체하여 보안 침해 위험을 줄일 수 있습니다.
Docker
를 사용하면 개발자가 모든 애플리케이션을 가볍고 휴대가 간편하며 자급자족할 수 있는 컨테이너로 포장, 배송 및 실행할 수 있습니다.
code
Python 코드 예제
이 패턴은 Secrets Manager의 Python 클라이언트 측 캐싱 구성 요소를 사용하여, 데이터베이스 연결을 설정하는 동안 인증 보안 인증을 검색합니다. 클라이언트 측 캐싱 구성 요소를 사용하면 매번 Secrets Manager에 접속하지 않아도 됩니다.
이제 교체 기간이 경과하면 캐시된 보안 인증이 만료되고, 데이터베이스에 연결하면 인증 오류가 발생합니다. 내 SQL의 경우 인증 오류 코드는 1045입니다. 이 예제에서는 Postgre 와 같은 다른 엔진을 사용할 수 SQL있지만 Amazon Aurora for My 를 사용합니다SQL. 인증 오류가 발생하면 데이터베이스 연결 예외 처리 코드가 오류를 캐시합니다. 그런 다음 Secrets Manager 클라이언트 측 캐싱 구성 요소에 암호를 새로 고친 다음 다시 인증하고 데이터베이스 연결을 재설정하도록 알립니다. PostgreSQL 또는 다른 엔진을 사용하는 경우 해당 인증 오류 코드를 찾아야 합니다.
이제 컨테이너 애플리케이션은 컨테이너를 다시 시작하지 않고도 교체된 암호로 데이터베이스 암호를 업데이트할 수 있습니다.
데이터베이스 연결을 처리하는 애플리케이션 코드에 다음 코드를 넣습니다. 이 예제에서는 Django를 사용하며, 연결용으로 데이터베이스 래퍼를 사용하여 데이터베이스 백엔드를 하위 클래스
def get_new_connection(self, conn_params): try: logger.info("get connection") databasecredentials.get_conn_params_from_secrets_manager(conn_params) conn =super(DatabaseWrapper,self).get_new_connection(conn_params) return conn except MySQLdb.OperationalError as e: error_code=e.args[0] if error_code!=1045: raise e logger.info("Authentication error. Going to refresh secret and try again.") databasecredentials.refresh_now() databasecredentials.get_conn_params_from_secrets_manager(conn_params) conn=super(DatabaseWrapper,self).get_new_connection(conn_params) logger.info("Successfully refreshed secret and established new database connection.") return conn
AWS CloudFormation 및 Python 코드
에픽
작업 | 설명 | 필요한 기술 |
---|---|---|
캐싱 구성 요소를 설치합니다. | Python용 Secrets Manager 클라이언트 측 캐싱 구성 요소를 다운로드하여 설치합니다. 다운로드 링크는 관련 리소스 섹션을 참조하십시오. | 개발자 |
작동 가능한 자격증명을 캐싱합니다. | Secrets Manager 클라이언트 측 캐싱 구성 요소를 사용하여 작동 가능한 보안 인증을 로컬로 캐싱합니다. | 개발자 |
데이터베이스 연결에서 승인되지 않은 오류가 발생한 경우 보안 인증을 새로 고치도록 애플리케이션 코드를 업데이트합니다. | Secrets Manager를 사용하여 데이터베이스 보안 인증을 가져오고 새로 고치도록 애플리케이션 코드를 업데이트합니다. 승인되지 않은 오류 코드를 처리하는 로직을 추가한 다음 새로 교체된 보안 인증을 가져옵니다. 예제 Python 코드 섹션을 참조하십시오. | 개발자 |
관련 리소스
Secrets Manager 보안 암호 생성
Amazon Aurora 클러스터 생성
Amazon ECS 구성 요소 생성
Download and install the Secrets Manager 클라이언트 측 캐싱 구성 요소 다운로드 및 설치
첨부
이 문서와 관련된 추가 콘텐츠에 액세스하려면 attachment.zip 파일의 압축을 풉니다.