AWS 기술 블로그

AWS Secrets Manager, AWS KMS and ACM을 이용한 DevOps 파이프라인 강화 및 데이터 보호 아키텍처

해당 블로그는 영문 블로그 Strengthen the DevOps pipeline and protect data with AWS Secrets Manager, AWS KMS, and AWS Certificate Manager를 번역하여 작성하였습니다.

이 블로그에서는 AWS의 데이터 주요 보안 서비스들(AWS Secrets Manager, AWS Key Management Service (AWS KMS)AWS Certificate Manager (ACM))을 이용한 DevOps 파이프라인의 보안과 데이터 보호 아키텍처에 대해서 소개하려고 합니다. “Amazon Elastic Kubernetes Service (Amazon EKS) 기반으로 배포된 3티어 워드프레스 웹 어플리케이션”로 구성한 예제 아키텍처 배포 구성을 기반으로 보안을 고려한 아키텍처 구현에 도움이 되는 인사이트를 얻을 수 있습니다.

클라우드에서 DevOps 파이프라인은 인프라와 어플리케이션의 CI/CD(지속적 통합, 전달, 배포)를 포함합니다. 파이프라인 구성에 따라 민감 정보(자격증명, 구성 파일, 인증서 등)를 저장하고 처리하기도 하며, 클라우드 인프라와 어플리케이션에서 DevOps 파이프라인 도입이 대중화되면서 민감 데이터 보호가 조직의 중요한 우선순위가 되었습니다.

DevOps 파이프라인에서 보호해야 하는 민감 데이터의 유형은 크게 4가지입니다.

  • 자격 증명(Credentials): 클라우드 리소스, 데이터베이스 및 애플리케이션에 액세스하는 데 사용되는 사용자 이름 및 비밀번호.
  • 구성 파일(Configuration files): 애플리케이션, 데이터베이스 및 기타 시스템에 대한 설정 및 구성 데이터가 포함된 파일.
  • 인증서(Certificates): 시스템 간의 통신을 암호화하는 데 사용되는 TLS 인증서
  • 암호(Secrets): 개인 키, 보안 토큰 또는 타사 서비스의 비밀번호와 같이 클라우드 리소스에 액세스하거나 인증하는 데 사용되는 기타 민감한 데이터

의도하지 않은 데이터 접근과 데이터 노출은 생산성 감소, 법적 책임, 금전적 손실, 평판 손상 등의 심각한 결과를 야기합니다. 이러한 위험을 효과적으로 완화하기 위해서는 데이터 보호에 우선순위를 높이 것이 중요합니다.

DevOps의 대표적인 CI/CD에 대해서 소개 드리겠습니다. 파이프라인 보안의 개념은 인프라, 도구, 프로세스 등 전체 DevOps 파이프라인을 잠재적인 보안 문제를 방지하기 위한 보안 조치를 구현하는 것을 포함합니다. 파이프라인의 보안 개념은 파이프라인 내의 개발 및 배포 프로세스에 직접 보안 관행과 제어를 통합하는 데 중점을 둡니다.

Secrets Manager, AWS KMS, ACM을 사용하면 DevOps 파이프라인의 보안을 강화하고, 중요한 데이터를 보호하며, 안전하고 규정을 준수하는 애플리케이션 배포를 손쉽게 할 수 있습니다. DevSecOps의 목표는 파이프라인 인프라의 무결성을 제공하고 소프트웨어 제공 프로세스 전반에 걸쳐 조직의 중요한 데이터를 보호하여 안전한 DevOps 환경을 구축하는 데 필요한 지식과 도구를 제공하는 것입니다.

샘플 어플리케이션 아키텍처 개요

대중성, 오픈소스, 컨테이너 지원 및 AWS 서비스와의 통합을 고려하여 워드프레스 기반의 웹 어플리케이션 배포 및 운영을 위한 파이프라인 구현을 샘플로 선정하였습니다. 해당 샘플 어플리케이션 구성을 위해 사용한 AWS 서비스는 다음과 같습니다.

  • Amazon Route 53: AWS 리소스로 트래픽을 라우팅하는 DNS 웹 서비스입니다.
  • Amazon CloudFront: 짧은 지연 시간과 빠른 전송 속도로 사용자에게 데이터와 동영상을 안전하게 전송하는 글로벌 콘텐츠 전송 네트워크(CDN) 서비스입니다.
  • AWS WAF(Web Application Firewall):일반적인 웹 공격으로부터 웹 애플리케이션을 보호하는 L7방화벽입니다.
  • AWS Certificate Manager (ACM): 통신 구간 암호화를 위해 SSL/TLS 인증서를 제공하는 서비스입니다.
  • Application Load Balancer (ALB): 트래픽을 Amazon EKS의 적절한 파드로 라우팅합니다.
  • Amazon Elastic Kubernetes Service (Amazon EKS): 컨테이너화된 애플리케이션을 배포하기 위한 관리형 Kubernetes 클러스터입니다.
  • Amazon Relational Database Service (Amazon RDS): 애플리케이션을 위한 확장 가능하고 안전한 데이터베이스를 제공하는 관리형 관계형 데이터베이스 서비스입니다.
  • AWS Key Management Service (AWS KMS): 저장된 데이터를 암호화하기 위한 암호화 키를 생성하고 관리할 수 있는 키 관리 서비스입니다.
  • AWS Secrets Manager: 데이터베이스 자격 증명 등 Secret 정보에 대한 생명 주기, 관리 및 검색하는 기능을 제공하는 서비스입니다.
  • AWS CodePipeline: 빠르고 안정적인 애플리케이션 및 인프라 업데이트를 위해 릴리스 파이프라인을 자동화하는 데 도움이 되는 완전 관리형 지속적 배포 서비스입니다.
  • AWS CodeBuild: 소스 코드를 컴파일하고 테스트를 실행하며 바로 빌드 및 배포할 수 있는 소프트웨어 패키지를 생성하는 완전 관리형 지속적 통합(CI) 서비스입니다.
  • AWS CodeCommit: 프라이빗 Git 리포지토리를 호스팅하는 완전 관리형 소스 제어 서비스입니다.

그림 1의 샘플 어플리케이션 아키텍처에서는 보안 관점에서의 아키텍처 설명에 집중하기 위해 하나의 가용 영역만 표시되어 있습니다. 실제 운영 환경에서는 고가용성을 고려하여 다중 가용 영역 환경을 구성하여 내결함성을 향상시키는 것을 고려해야 합니다.

그림 1: 샘플 어플리케이션 아키텍처

위의 아키텍처에서 데이터 보호 서비스의 흐름을 요약하면 아래와 같습니다:

먼저 왼쪽의 배포 파이프라인 보안부터 설명하면, Secrets Manager를 사용하여 시크릿 (Amazon RDS 자격 증명과 같은 중요한 정보)를 암호화하여 저장할 수 있습니다. Secrets Manager에서 시크릿을 검색하고, 데이터베이스에 액세스합니다. Secrets Manager를 사용하여 중요한 자격 증명을 보호하면 무단 액세스를 방지하여 파이프라인의 보안을 강화할 수 있습니다.

다음은 데이터 암호화로 AWS KMS를 사용하면 민감 데이터 저장시 암호화할 수 있습니다. AWS KMS 암호화를 사용하여 Amazon RDS에 저장된 데이터를 암호화하면 무단 액세스로부터 데이터를 안전하게 보호하는 방법을 설명합니다. KMS 암호화를 구현하면 데이터에 추가 보호 계층을 추가하고 파이프라인의 전반적인 보안을 강화할 수 있습니다.

마지막으로 워드프레스 애플리케이션의 연결(전송 중인 데이터) 보안에 대해 설명합니다. ACM은 SSL/TLS 인증서를 관리하는 데 사용됩니다. ACM을 사용하여 SSL/TLS 인증서를 프로비저닝 및 관리하고 사용자와 워드프레스 애플리케이션 간의 안전한 통신 구간 암호화를 위해 인증서를 사용하도록 Amazon EKS 클러스터를 구성하는 방법을 보여드리겠습니다. ACM을 사용하면 안전한 통신 채널을 설정하여 데이터 프라이버시를 제공하고 파이프라인의 보안을 강화할 수 있습니다.

참고: 블로그의 코드 샘플은 주요 개념을 보여주기 위한 코드의 일부입니다. 전체 코드는 GitHub에서 확인할 수 있습니다.

암호화 및 키 관리: Secrets Manager를 이용한 민감 데이터 암호화

이 샘플 애플리케이션 아키텍처에서 Secrets Manager는 민감한 데이터를 저장하고 관리합니다. 제공된 AWS CloudFormation 템플릿은 Amazon RDS for MySQL 인스턴스를 설정하고 KMS 암호화를 사용하여 Secrets Manager에서 마스터 사용자 비밀번호를 검색하여 안전하게 설정합니다. 이 샘플 애플리케이션 아키텍처에서 Secrets Manager가 구현되는 방식은 다음과 같습니다:

  1. Secrets Manager 시크릿 만들기.
    1. CloudFormation을 사용하여 Amazon RDS 데이터베이스 자격 증명을 포함하는 Secrets Manager 비밀을 만듭니다.
    2. 이 비밀은 AWS KMS 고객 관리 키를 사용하여 암호화됩니다.
    3. 예제 코드:
      RDSMySQL:
          Type: AWS::RDS::DBInstance
          Properties: 
      		ManageMasterUserPassword: true
      		MasterUserSecret:
      KmsKeyId: !Ref RDSMySqlSecretEncryption

      CloudFormation 템플릿의 ManageMasterUserPassword: true는 스택이 Amazon RDS 인스턴스의 마스터 사용자 비밀번호를 관리할 것을 의미합니다. 마스터 사용자의 비밀번호를 안전하게 조회하기 위해 CloudFormation 템플릿은 Secrets Manager에서 비밀번호를 조회하는 MasterUserSecret 매개 변수를 사용합니다.
      KmsKeyId: !Ref RDSMySqlSecretEncryption  라인은 Secrets Manager에서 비밀을 암호화하는데 사용할 KMS 키 ID를 지정함을 의미합니다.

  1. Secrets Manager에서 시크릿 정보 조회
    1. 시크릿 스토어 CSI 드라이버는 Amazon EKS와 시크릿 저장소 연동을 위한 공통 인터페이스를 제공하는 쿠버네티스 네이티브 드라이버입니다. 이 중 AWS에서 제공하는 secrets-store-csi-driver-provider-aws를 통해 시크릿 매니저와 연동할 수 있습니다.
    2. Amazon EKS를 설정하기 위해 우선 Amazon RDS 데이터베이스의 시크릿 ID를 지정하는 SecretProviderClass를 생성합니다.이후 SecretProviderClass를 쿠버네티스 배포 오브젝트에서 사용하여 워드프레스 애플리케이션을 배포하고 배포 중에 시크릿 매니저에서 시크릿을 동적으로 조회합니다. 해당 프로세스는 완전히 동적으로 이루어지고, 시크릿이 어디에도 등록되어 있지 않았음을 증명합니다.
    3. 예제 코드:
      apiVersion: secrets-store.csi.x-k8s.io/v1
      kind: SecretProviderClass
      spec:
        provider: aws
        parameters:
          objects: |
              - objectName: 'rds!db-0x0000-0x0000-0x0000-0x0000-0x0000'

Secret Manager에서 시크릿을 관리하고 보호하기 위한 대표적인 모범 사례는 다음과 같습니다.

  • AWS Identity and Access Management (IAM) 정책을 사용하여 Secrets Manager 시크릿에 대해 읽기, 쓰기 또는 삭제와 같은 특정 작업을 수행할 수 있는 User 및 역할을 정의합니다.
  • Secrets Manager 리소스 정책을 사용하여 더 세분화된 수준에서 비밀에 대한 액세스를 관리합니다. (Ex: IP 주소, 시간 또는 인증 상태 등의 속성을 기준)
  • AWS KMS 키를 사용하여 Secrets Manager 를 암호화합니다.
  • CloudFormation 템플릿을 사용하여 로테이션을 포함한 Secrets Manager 비밀의 생성 및 관리를 자동화합니다.
  • AWS CloudTrail을 사용하여 Secrets Manager 비밀번호에 대한 액세스 및 변경 사항을 모니터링합니다.
  • CloudFormation Hook를 사용하여 배포 전후에 Secrets Manager 비밀의 유효성을 검사하고, 시크릿이 유효성 검사에 실패하면 배포가 롤백됩니다.

데이터 암호화: AWS KMS를 이용한 데이터 암호화

데이터 암호화에는 민감 정보를 복호화 키를 통해서만 액세스할 수 있도록 명시된 CloudFormation 코드가 포함되어 있습니다. 파이프라인 구간 전체에 데이터 암호화를 구성하면 권한이 없는 개인이 데이터에 접근하더라도 내용을 파악할 수 없습니다.

다음은 이 샘플 애플리케이션 아키텍처에서 AWS KMS를 사용한 미사용 데이터 암호화가 구현된 방식입니다:

  1. Amazon RDS 접속정보 암호화
    1. RDS 접속정보 암호화: AWS KMS 고객 관리 키는 Secrets Manager에 저장된 RDS 접속정보를 암호화하여 DevOps 빌드 프로세스 중에 기밀성을 보장합니다.
    2. 예제 코드는 다음과 같습니다:
      RDSMySQL:
          Type: AWS::RDS::DBInstance
          Properties:
            ManageMasterUserPassword: true
            MasterUserSecret:
              KmsKeyId: !Ref RDSMySqlSecretEncryption
      
      RDSMySqlSecretEncryption:
          Type: "AWS::KMS::Key"
          Properties:
            KeyPolicy:
              Id: rds-mysql-secret-encryption
              Statement:
                - Sid: Allow administration of the key
                  Effect: Allow
                  "Action": [
                      "kms:Create*",
                      "kms:Describe*",
                      "kms:Enable*",
                      "kms:List*",
                      "kms:Put*",
      			.
      			.
      			.
                  ]
                - Sid: Allow use of the key
                  Effect: Allow
                  "Action": [
                      "kms:Decrypt",
                      "kms:GenerateDataKey",
                      "kms:DescribeKey"
                  ]
  1. Amazon RDS 데이터 암호화
    1. CloudFormation을 사용하여 Amazon RDS 인스턴스에 대한 암호화를 사용 설정합니다. CloudFormation 스택에서 KMS 키 ARN을 지정하면 RDS가 지정된 KMS 키를 사용하여 저장된 데이터를 암호화합니다.
    2. 예제 코드:
      RDSMySQL:
          Type: AWS::RDS::DBInstance
          Properties:
        KmsKeyId: !Ref RDSMySqlDataEncryption
              StorageEncrypted: true
      
      RDSMySqlDataEncryption:
          Type: "AWS::KMS::Key"
          Properties:
            KeyPolicy:
              Id: rds-mysql-data-encryption
              Statement:
                - Sid: Allow administration of the key
                  Effect: Allow
                  "Action": [
                      "kms:Create*",
                      "kms:Describe*",
                      "kms:Enable*",
                      "kms:List*",
                      "kms:Put*",
      .
      .
      .
                  ]
                - Sid: Allow use of the key
                  Effect: Allow
                  "Action": [
                      "kms:Decrypt",
                      "kms:GenerateDataKey",
                      "kms:DescribeKey"
                  ]
  1. 쿠버네티스 파드 저장소 암호화
    1. 암호화된 Amazon EBS(Amazon Elastic Block Store) 볼륨을 사용하여 구성 데이터를 저장합니다. 다음 코드를 사용하여 관리되는 암호화된 Amazon EBS 볼륨을 생성하고, 영구 볼륨 클레임(PVC)이 볼륨으로 마운트된 Kubernetes 파드로 배포됩니다.
    2. 예제 코드:
      kind: StorageClass
      provisioner: ebs.csi.aws.com
      parameters:
        csi.storage.k8s.io/fstype: xfs
        encrypted: "true"
      
      kind: Deployment
      spec:
        volumes:      
            - name: persistent-storage
              persistentVolumeClaim:
                claimName: ebs-claim
  1. Amazon ECR
    1. Amazon ECR(Amazon Elastic Container Registry)에 저장된 데이터를 보호하려면, AWS 관리 콘솔 또는 AWS CLI(AWS 명령줄 인터페이스)를 사용하기 위해서는 Amazon ECR 리포지토리에 대해 저장된 데이터 암호화를 활성화화면 KMS를 이용하여 데이터를 암호화할 수 있습니다.
    2. Amazon ECR용 KMS 키를 생성하고 해당 키를 사용하여 저장된 데이터를 암호화합니다.
    3. 암호화된 ECR 리포지토리 생성을 자동화하고 DevOps 파이프라인을 사용하여 미사용 데이터 암호화를 활성화하고, CodePipeline을 사용하여 CloudFormation 스택의 배포를 자동화합니다.
    4. 아래의 예제 코드에서 파이프라인의 일부로 암호화된 Amazon ECR 리포지토리 생성을 정의합니다.
    5. 예제 코드:
      ECRRepository:
          Type: AWS::ECR::Repository
          Properties: 
            EncryptionConfiguration: 
              EncryptionType: KMS
              KmsKey: !Ref ECREncryption
      
      ECREncryption:
          Type: AWS::KMS::Key
          Properties:
            KeyPolicy:
              Id: ecr-encryption-key
              Statement:
                - Sid: Allow administration of the key
                  Effect: Allow
                  "Action": [
                      "kms:Create*",
                      "kms:Describe*",
                      "kms:Enable*",
                      "kms:List*",
                      "kms:Put*",
      .
      .
      .
       ]
                - Sid: Allow use of the key
                  Effect: Allow
                  "Action": [
                      "kms:Decrypt",
                      "kms:GenerateDataKey",
                      "kms:DescribeKey"
                  ]

AWS 환경에서 암호화 키 관리를 위한 AWS 모범 사례 정리

AWS 환경에서 암호화 키를 효과적으로 관리하고 미사용 데이터의 보안을 확인하려면 다음 모범 사례를 권장합니다:

  • 데이터 분류를 위해 고객이 관리하는 별도의 AWS KMS 키를 사용하여 키를 더 잘 제어하고 관리합니다.
  • 키 생성 및 순환, 키 정책 설정 또는 권한 부여와 같은 키 관리 작업에 대해 서로 다른 역할과 책임을 할당하여 업무 분리를 시행합니다. 키 관리 업무를 분리하면 실수 또는 고의적인 키 유출 위험을 줄이고 전반적인 보안을 개선할 수 있습니다.
  • CloudTrail을 사용하여 AWS KMS API 활동을 모니터링하고, 잠재적인 보안 사고를 방지합니다.
  • 컴플라이언스 요건에 따라 KMS 키를 주기적으로 교체합니다
  • CloudFormation Hook를 사용하여 KMS 키 정책을 검증하여 조직 및 규정 요건에 부합하는지 확인합니다.

위의 모범 사례 뿐 아니라 Amazon RDS, Kubernetes Pods 스토리지, Amazon ECR과 같은 다양한 서비스에 대해 데이터 저장시 암호화를 구현하면 데이터가 미사용 시 암호화되는 것을 보장하는 데 도움이 됩니다.

통신 암호화: ACM을 이용한 통신 구간 암호화

통신 구간 암호화는 현대 환경의 중요한 요구 사항입니다. DevOps 파이프라인에서 통신 구간 암호화를 구현하면 인프라를 안전하고 일관된 방식으로 다양한 환경에 적용할 수 있습니다. Amazon EKS에서 실행되는 워드프레스 애플리케이션에서 ACM을 사용하여 종단간 통신을 구성하는 방법을 소개 드리겠습니다. 방법은 다음과 같습니다:

  1. CloudFormation기반으로 ACM TLS 인증서 프로비저닝
    1. AWS CloudFormation 템플릿을 기반으로 ACM TLS 인증서를 만들고 코드형 인프라를 통해 배포합니다. 이렇게 하면 인증서가 여러 환경에서 일관되고 안전하게 생성 및 배포되는지 확인할 수 있습니다.
    2. 예제 코드:
      DNSDomainCertificate:
          Type: AWS::CertificateManager::Certificate
          Properties:
            DomainName: !Ref DNSDomainName
            ValidationMethod: 'DNS'
      
      DNSDomainName:
          Description: dns domain name 
          TypeM: String
          Default: "example.com"
  1. 쿠버네티스 AWS ALB Ingress 컨트롤러를 사용한 ALB 프로비저닝 및 TLS 인증서 통합
    1. DevOps파이프라인을 사용하여 TLS 인증서 및 ALB를 만들고 구성하면, 인프라가 코드를 기반으로 일관되게 관리되고, 안전하게 프로비저닝 할 수 있습니다.
    2. 예제 코드:
      kind: Ingress
      metadata:
        annotations:
          alb.ingress.kubernetes.io/scheme: internet-facing
          alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-east-1:000000000000:certificate/0x0000-0x0000-0x0000-0x0000-0x0000
          alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
          alb.ingress.kubernetes.io/security-groups:  sg-0x00000x0000,sg-0x00000x0000
      spec:
      ingressClassName: alb
  1. CloudFront ALB 통신 암호화
    1. CloudFront와 ALB 간의 통신 구간을 암호화하려면 클라이언트에서 CloudFront로 전송하는 구간과 CloudFront에서 ALB로 전송되는 트래픽이 TLS 인증서를 사용하여 암호화되고 있는지 확인해야 합니다.
    2. 예제 코드:
      CloudFrontDistribution:
          Type: AWS::CloudFront::Distribution
          Properties:
            DistributionConfig:
              Origins:
                - DomainName: !Ref ALBDNSName
                  Id: !Ref ALBDNSName
                  CustomOriginConfig:
                    HTTPSPort: '443'
                    OriginProtocolPolicy: 'https-only'
                    OriginSSLProtocols:
                      - LSv1
      	    ViewerCertificate:
      AcmCertificateArn: !Sub 'arn:aws:acm:${AWS::Region}:${AWS::AccountId}:certificate/${ACMCertificateIdentifier}'
                  SslSupportMethod:  'sni-only'
                  MinimumProtocolVersion: 'TLSv1.2_2021'
      
      ALBDNSName:
          Description: alb dns name
          Type: String
          Default: "k8s-wp-ingressw-x0x0000x000-x0x0000x000.us-east-1.elb.amazonaws.com"
  1. ALB와 쿠버네티스 파드 통신 구간 암호화
    1. ALB와 쿠버네티스 파드 간의 통신을 보호하기 위해, 쿠버네티스 인그레스 리소스를 사용하여 ALB에서 SSL/TLS Termination을 활성화합니다. 이후에 ALB는 PROTO 메타데이터 http 연결 헤더를 워드프레스 웹 서버로 전송합니다. 웹 서버는 들어오는 트래픽 유형(http 또는 https)을 확인하고 이후에만 HTTPS 연결을 활성화합니다. 이렇게 하면 파드 응답이 HTTPS를 통해서만 ALB로 다시 전송되는지 확인합니다.
    2. 추가적으로 X-Forwarded-Proto 헤더를 사용하면 원본 프로토콜(클라이언트 à ALB 혹은 Proxy) 정보를 확인할 수 있어 워드프레스의 $_SERVER[‘HTTPS’] 변수와 관련된 문제를 방지할 수 있습니다.
    3. 예제 코드:
      define('WP_HOME', 'https://example.com/');
      define('WP_SITEURL','https://example.com/');
      
      define('FORCE_SSL_ADMIN', true);
      if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
          $_SERVER['HTTPS'] = 'on';
  1. 쿠버네티스 파드와 Amazon RDS 통신 구간 암호화
    1. Amazon EKS와 Amazon RDS 인스턴스 간 통신 암호화를 위해서는 Database 연결에서 SSL/TLS 암호화를 사용해야 합니다.
    2. 보안 설정이 강화된 Amazon RDS MySQL 인스턴스를 구성하여 데이터베이스에 대한 TLS 암호화 연결만 허용할 수 있습니다. require_secure_transport라는 매개변수를 ‘1’로 설정한 DB 파라미터 그룹을 생성하고, 워드프레스 구성 파일도 MySQL 데이터베이스와의 SSL/TLS 통신을 활성화하도록 업데이트합니다. 이후 MySQL 클라이언트에서 TLS 플래그를 활성화하면 Amazon RDS 공개 인증서가 전달되어 연결이 TLS_AES_256_GCM_SHA384 프로토콜을 사용하여 암호화됩니다.
      다음 예제 코드는 암호화된 연결을 적용하고 데이터베이스와의 통신에 SSL/TLS를 사용하도록 워드프레스에서 구성하여 RDS MySQL 인스턴스의 보안을 강화하는 데 중점을 둡니다.
    3. 예제 코드:
      RDSDBParameterGroup:
          Type: 'AWS::RDS::DBParameterGroup'
          Properties:
            DBParameterGroupName: 'rds-tls-custom-mysql'
            Parameters:
              require_secure_transport: '1'
      
      RDSMySQL:
          Type: AWS::RDS::DBInstance
          Properties:
            DBName: 'wordpress'
            DBParameterGroupName: !Ref RDSDBParameterGroup
      
      wp-config-docker.php:
      // Enable SSL/TLS between WordPress and MYSQL database
      define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);//This activates SSL mode
      define('MYSQL_SSL_CA', '/usr/src/wordpress/amazon-global-bundle-rds.pem');

이 아키텍처에서는 일반적인 웹 익스플로잇(Web Exploit)으로부터 워드프레스 애플리케이션을 보호하기 위해 CloudFront, 즉 Edge레벨에서 AWS WAF가 활성화되어 있습니다. CloudFront용 AWS WAF를 권장하며, AWS 관리형 WAF 규칙을 사용하여 웹 애플리케이션이 알려진 위협과 최신 위협으로부터 보호할 수 있습니다.

다음은 ACM과의 통신 보안을 위한 몇 가지 AWS 모범 사례입니다:

  • SSL/TLS 인증서를 사용: 클라이언트와 서버 간에 전송 중인 데이터를 암호화하고, ACM을 사용하면 인프라 전반에서 사용 가능한 SSL/TLS 인증서를 손쉽게 생성, 관리 및 배포할 수 있습니다.
  • ACM에서 발급한 인증서를 사용: 주요 브라우저에서 인증서를 신뢰하고 필요에 따라 정기적으로 갱신 및 교체하는지 확인합니다.
  • 인증서 해지 구현: 손상되었거나 더 이상 사용하지 않는 SSL/TLS 인증서에 대해 인증서 해지를 구현합니다.
  • 엄격한 전송 보안(HSTS, HTTP Strict Transport Security) 구현: 이는 프로토콜 다운그레이드 공격으로부터 보호하고 세션 전반에서 SSL/TLS가 일관되게 사용되는지 확인하는 데 도움이 됩니다.
  • 적절한 암호 제품군을 구성: 가장 강력하고 안전한 암호 모음만 사용하도록 SSL/TLS 연결을 구성합니다.

모니터링 및 감사: CloudTrail를 통한 모니터링 및 감사

CloudTrail은 AWS 계정의 API 활동을 기록하는 로깅 및 추적 서비스로서 문제 해결, 규정 준수 및 보안 모니터링에 중요한 서비스합니다. 인가되지 않는 사용자의 무단 액세스를 방지하려면 AWS 계정에서 CloudTrail을 활성화하고, 감사 로그를 Amazon Simple Storage Service (Amazon S3)와 같은 높은 내구성의 스토리지에 암호화하여 저장하는 것을 권장합니다. CloudWatch 로그를 사용하여 CloudTrail 로그를 실시간으로 모니터링하고 분석하면 보안 사고를 신속하게 감지하고 대응할 수 있습니다.

DevOps 파이프라인에서 CloudFormation, CodePipeline, CodeBuild와 같은 코드형 인프라 도구를 사용하여 다양한 환경 전반에서 CloudTrail을 일관되게 생성하고 관리할 수 있습니다. CloudTrail 구성으로 CloudFormation 스택을 생성하고 CodePipeline 및 CodeBuild를 사용하여 스택을 빌드하고 다른 환경에 배포할 수 있습니다. CloudFormation Hook를 이용하여 CloudTrail 구성의 유효성을 검사하고, 보안 요구 사항 및 정책에 부합하는지 확인할 수 있습니다.

앞서 설명드린 내용은 AWS Organization 및 CloudTrail Organization 추적 기능을 사용하는 경우에는 적용되지 않을 수 있습니다. 이러한 서비스를 사용하면 여러 계정과 환경 전반에서 CloudTrail 구성 관리가 간소화됩니다. 이 중앙 집중식 접근 방식은 보안 정책 적용 프로세스를 간소화합니다.

위의 모범 사례에 따라 AWS 환경을 구성하면 계정 및 리소스를 효과적으로 감사하고, 트러블 슈팅 및 보안 사고를 사전에 감지하고 대응할 수 있습니다.

샘플 어플리케이션 배포를 위한 전체 코드

예제 워드프레스 애플리케이션 아키텍처에 대한 전체 코드 리포지토리는 다양한 AWS 서비스를 사용하여 DevOps 파이프라인에서 데이터 보호를 구현하는 방법을 보여줍니다. 이 리포지토리에는 예제 아키텍처와 구현 단계의 모든 측면을 다루는 인프라 코드와 애플리케이션 코드가 모두 포함되어 있습니다.

인프라 코드는 AWS 환경에서 워드프레스 애플리케이션을 배포하는 데 필요한 리소스를 정의하는 일련의 CloudFormation 템플릿으로 구성됩니다. 여기에는Amazon VPC, 서브넷, 보안 그룹, Amazon EKS 클러스터, Amazon RDS 인스턴스, AWS KMS 키 및 Secrets Manager 시크릿이 포함됩니다. 또한 RDS 인스턴스의 미사용 암호화 및 EKS 클러스터의 전송 중 암호화와 같은 필요한 보안 구성도 포함되어 있습니다.

애플리케이션 코드는 Docker기반으로 Amazon EKS 클러스터에 배포되는 워드프레스 애플리케이션입니다. 구성 내에는 다음과 같은 DevOps 파이프라인에서 고려해야할 다양한 데이터 보호에 대해서 정의되어 있습니다.

  • 어플리케이션 구성: ALB를 사용하여 트래픽을 EKS 클러스터의 적절한 컨테이너로 라우팅 및 Amazon RDS 인스턴스를 사용하여 애플리케이션 데이터를 저장
  • 데이터 암호화: AWS KMS를 사용하여 애플리케이션의 데이터를 암호화 및 해독
  • 암호화 키 관리: Secrets Manager를 사용하여 비밀번호를 저장 및 검색
  • 전송 중 암호화: 이 코드는 ACM을 사용하여 CloudFront와 ALB 간의 보안 통신

결론

클라우드 환경에서 애플리케이션의 보안과 규정 준수를 강화하려면 DevOps 파이프라인에서도 데이터 보호 조치를 자동화해야 합니다. 데이터 저장 및 통신 구간 암호화를 위해 사용된 Secrets Manager, AWS KMS, ACM  뿐 아니라 AWS CloudFormation, AWS CloudTrail과 같은 AWS 서비스를 사용하는 것이 포함됩니다.

  • 리소스 배포: AWS CloudFormation으로 데이터 보호 메커니즘을 자동화하면 재현, 제어 및 감사가 가능한 보안 파이프라인을 효율적으로 생성할 수 있습니다. 이를 통해 일관되고 안정적인 인프라를 유지할 수 있습니다.
  • 모니터링: 규정 준수와 보안을 유지하려면 AWS CloudTrail로 DevOps 파이프라인을 모니터링하고 감사하는 것이 중요합니다. 이를 통해 API 활동을 추적 및 분석하고, 잠재적인 보안 사고를 감지하고, 신속하게 대응할 수 있습니다.

AWS 클라우드 환경에서 위와 같은 모범 사례를 구현을 통해 데이터 보호 메커니즘을 구성하면 안전한 DevOps 파이프라인을 구축할 수 있습니다. 이를 통해 전반적인 보안과 규정 준수를 자동화하고, 배포를 위한 안정적이고 보호된 환경을 제공할 수 있습니다.

이 게시물에 대한 피드백이 있으면 아래의 댓글 섹션에 의견을 제출하세요. 이 게시물에 대한 질문이 있는 경우, AWS re:Post에서 새 쓰레드를 시작하거나 AWS 지원팀에 문의하세요.

Taekyung Han

Taekyung Han

한태경 솔루션즈 아키텍트는 AWS 클라우드 고객을 대상으로 고객의 비즈니스 성과 달성을 위해 고객과 함께 최적의 아키텍처를 구성하는 역할을 수행하고 있습니다. 백엔드 엔지니어와 DevOps 경험을 기반으로 안전한 클라우드 환경을 구성하는 방법에 대한 기술적인 도움을 드리고 있습니다.