설명
RDS 인스턴스에 연결된 보안 그룹에서 0.0.0.0/0이나 ::/0을 출발지로 허용하면, 해당 규칙은 각각 모든 IPv4 또는 IPv6 주소에 적용됩니다. 데이터베이스에 연결할 필요가 있는 클라이언트로 수신 범위를 제한하세요.
실제 외부 연결은 허용된 포트, 데이터베이스의 수신 포트, 공인 IP와 네트워크 경로에 따라 달라집니다. 넓은 수신 규칙이 데이터베이스 인증이나 권한 검사를 대신하는 것은 아니지만, 필요한 클라이언트만 접근하도록 네트워크에서도 제한해야 합니다.
잠재적 영향
- 실제 데이터베이스 포트를 허용하는 규칙과 공용 연결 경로가 함께 존재하면, 전체 주소 대역의 클라이언트가 데이터베이스에 연결을 시도할 수 있습니다.
- 불필요한 외부 연결을 허용하면 무차별 대입이나 유출된 자격 증명을 이용한 공격에 노출될 수 있습니다. 데이터 읽기와 변경 가능 여부는 인증과 데이터베이스 권한에 따라 달라집니다.
해결 방법
- 실제 데이터베이스 포트와 필요한 클라이언트를 확인하고, 수신 규칙을 해당 포트와 필요한 출발지 보안 그룹 또는 좁은 CIDR로 제한하세요. 주소가
/0이 아니라는 이유만으로 신뢰할 수 있는 범위라고 판단하지 마세요. PubliclyAccessible, 서브넷, 라우팅 및 실제 보안 그룹 연결을 함께 점검하고, 사설 연결이 필요한 구조에서는 그 경로를 구성한 뒤 공용 접근 설정을 조정하세요. 인증과 데이터베이스 권한도 별도로 확인하세요.- 배포된 인스턴스에 의도한 보안 그룹이 연결되어 있는지 확인하세요. 변경 후 필요한 클라이언트는 연결할 수 있고, 그 밖의 출발지에서는 연결이 거부되는지 검증하세요.
예시
두 예제는 수신 주소 범위를 비교하며, 데이터베이스 엔진 등 완성된 배포에 필요한 속성이 빠져 있습니다. 포트 80은 예제 값이므로 실제 데이터베이스가 사용하는 포트를 확인하고 그에 맞게 수정하세요.
전체 IPv4 대역을 사용한 예시
yaml
Resources:
DBEC2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Open database for access
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
DBInstance:
Type: AWS::RDS::DBInstance
Properties:
PubliclyAccessible: true
VPCSecurityGroups:
- !GetAtt DBEC2SecurityGroup.GroupId
더 좁은 CIDR을 사용한 예시
yaml
Resources:
DBEC2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Open database for access
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 1.2.3.4/24
DBInstance:
Type: AWS::RDS::DBInstance
Properties:
PubliclyAccessible: true
VPCSecurityGroups:
- !GetAtt DBEC2SecurityGroup.GroupId
설명:
- 첫 번째 예시:
CidrIp: 0.0.0.0/0은 모든 IPv4 주소에서 포트80으로 들어오는 트래픽을 허용합니다. 실제 데이터베이스에 연결 가능한지는 데이터베이스 포트와 네트워크 경로를 함께 확인해야 합니다. - 두 번째 예시:
1.2.3.4/24는 단일 호스트가 아니라1.2.3.0/24네트워크를 나타냅니다. 신뢰할 수 있는 주소로 권장하는 값이 아니므로, 실제로 필요한 클라이언트의 범위로 바꾸세요.