공개 접근을 활성화한 RDS 인스턴스

RDS의 공개 접근은 불필요한 외부 연결 경로를 만들 수 있습니다. 내부용 데이터베이스에는 프라이빗 연결을 사용하고, 실제 네트워크 경로와 접근 권한도 제한하세요.

설명

publiclyAccessible: true는 RDS 인스턴스에 퍼블릭 IP 주소를 사용할 수 있도록 설정합니다. 인터넷에서 실제로 연결하려면 서브넷 라우팅, 보안 그룹, DNS 등 네트워크 조건도 맞아야 하며, 데이터베이스 인증과 권한은 별도로 적용됩니다.

내부 애플리케이션만 사용하는 데이터베이스에는 공개 주소가 필요하지 않습니다. 공개 접근을 끄고 필요한 애플리케이션 및 관리 경로만 허용하면 불필요한 외부 연결 가능성을 줄일 수 있습니다.

잠재적 영향

  • 인터넷 경로와 보안 그룹이 광범위한 출처의 연결을 허용하면, 예상하지 않은 사용자가 로그인이나 취약점 악용을 시도할 수 있습니다. 계정이 탈취되거나 권한이 오용되면 데이터가 유출되거나 변경될 수 있습니다.
  • 현재 보안 그룹이 접근을 제한하더라도, 불필요한 퍼블릭 IP 주소는 이후 네트워크 규칙 변경으로 외부 접속 경로가 열릴 가능성을 남깁니다.

해결 방법

  • 내부용 데이터베이스에는 publiclyAccessible: false를 명시하세요. 변경 전에 VPC 내부 연결이나 VPN 등 필요한 프라이빗 경로를 확보하세요.
  • DB 서브넷 그룹, 라우팅과 보안 그룹을 함께 검토하세요. pulumi preview로 변경을 확인하고 적용 후 필요한 연결이 유지되는지 시험하세요.
  • 공개 접근이 꼭 필요하다면 승인된 출처와 데이터베이스 포트만 허용하세요. 데이터베이스 인증, 최소 권한과 전송 구간 암호화를 적용하고 비밀번호를 안전하게 관리하세요.

예시

두 예시는 공개 접근 설정을 비교합니다. 실제 배포에서는 DB 서브넷 그룹과 보안 그룹을 지정하고 지원되는 엔진 버전·인스턴스 클래스·스토리지를 선택하세요. 비밀번호는 manageMasterUserPassword로 RDS가 Secrets Manager에서 관리하도록 설정했습니다. skipFinalSnapshot: true는 삭제 시 최종 스냅샷을 생략하므로 운영 환경의 백업·복구 요구 사항에 맞게 변경하세요.

변경 전

yaml
name: aws-rds
runtime: yaml
description: An RDS Instance
resources:
  default:
    type: aws:rds:Instance
    properties:
      allocatedStorage: 20
      dbName: mydb
      engine: mysql
      instanceClass: db.t3.micro
      manageMasterUserPassword: true
      skipFinalSnapshot: true
      username: foo
      publiclyAccessible: true

변경 후

yaml
name: aws-rds
runtime: yaml
description: An RDS Instance
resources:
  default:
    type: aws:rds:Instance
    properties:
      allocatedStorage: 20
      dbName: mydb
      engine: mysql
      instanceClass: db.t3.micro
      manageMasterUserPassword: true
      skipFinalSnapshot: true
      username: foo
      publiclyAccessible: false

설명: 공개 접근을 끄면 퍼블릭 IP 주소를 사용하지 않습니다. 필요한 프라이빗 연결과 인증, 비밀번호 및 백업 관리는 함께 검증해야 합니다.

참조