설명
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 주소를 사용하지 않습니다. 필요한 프라이빗 연결과 인증, 비밀번호 및 백업 관리는 함께 검증해야 합니다.