Amazon ECS 네트워크 보안 모범 사례
Amazon ECS 네트워크 보안 모범 사례
네트워크 보안은 여러 하위 주제를 포함하는 광범위한 주제예요. 여기에는 전송 중 암호화(encryption-in-transit), 네트워크 세분화 및 격리, 방화벽, 트래픽 라우팅, 관측성(observability)이 포함돼요.
출처: 문서
본문
전송 중 암호화 네트워크 트래픽을 암호화하면 데이터가 네트워크를 통해 전송될 때 무단 사용자가 데이터를 가로채고 읽는 것을 방지할 수 있어요. Amazon ECS에서는 다음 방법 중 하나로 네트워크 암호화를 구현할 수 있어요.
- Nitro 인스턴스 사용: 기본적으로 다음 Nitro 인스턴스 유형 간에는 트래픽이 자동으로 암호화돼요: C5n, G4, I3en, M5dn, M5n, P3dn, R5dn, R5n. 트래픽이 트랜짓 게이트웨이, 로드 밸런서 또는 유사한 중개자를 통해 라우팅되면 암호화되지 않아요.
- Encryption in transit
- What's new announcement from 2019
- re:Inforce 2019 talk
- Application Load Balancer와 함께 SNI(Server Name Indication) 사용: Application Load Balancer(ALB)와 Network Load Balancer(NLB)는 SNI를 지원해요. SNI를 사용하면 단일 리스너 뒤에 여러 보안 애플리케이션을 배치할 수 있어요. 이를 위해 각각에 자체 TLS 인증서가 있어요. AWS Certificate Manager(ACM)를 사용해 로드 밸런서용 인증서를 프로비저닝한 다음 리스너의 인증서 목록에 추가할 것을 권장해요. AWS 로드 밸런서는 SNI와 함께 스마트 인증서 선택 알고리즘을 사용해요. 클라이언트가 제공한 호스트 이름이 인증서 목록의 단일 인증서와 일치하면 로드 밸런서가 해당 인증서를 선택해요. 클라이언트가 제공한 호스트 이름이 목록의 여러 인증서와 일치하면 로드 밸런서는 클라이언트가 지원할 수 있는 인증서를 선택해요. 예시로 자체 서명 인증서 또는 ACM을 통해 생성된 인증서가 있어요.
- SNI with Application Load Balancer
- SNI with Network Load Balancer
- TLS 인증서로 종단 간 암호화: 여기에는 태스크에 TLS 인증서를 배포하는 것이 포함돼요. 이는 자체 서명 인증서이거나 신뢰할 수 있는 인증 기관의 인증서일 수 있어요. 인증서의 시크릿을 참조해 인증서를 얻을 수 있어요. 그렇지 않으면 ACM에 CSR(Certificate Signing Request)을 발급하는 컨테이너를 실행한 후 결과 시크릿을 공유 볼륨에 마운트하도록 선택할 수 있어요.
- Maintaining transport layer security all the way to your containers using the Network Load Balancer with Amazon ECS part 1
- Maintaining Transport Layer Security (TLS) all the way to your container part 2: Using AWS Private Certificate Authority
태스크 네트워킹
다음 권장 사항은 Amazon ECS가 작동하는 방식을 고려한 것이에요. Amazon ECS는 오버레이 네트워크를 사용하지 않아요. 대신 태스크는 서로 다른 네트워크 모드에서 작동하도록 구성돼요. 예를 들어 bridge 모드를 사용하도록 구성된 태스크는 각 호스트에서 실행되는 Docker 네트워크에서 라우팅할 수 없는 IP 주소를 획득해요. awsvpc 네트워크 모드를 사용하도록 구성된 태스크는 호스트의 서브넷에서 IP 주소를 획득해요. 호스트 네트워킹으로 구성된 태스크는 호스트의 네트워크 인터페이스를 사용해요.
awsvpc 가 선호하는 네트워크 모드예요. 이는 태스크에 보안 그룹을 할당할 수 있는 유일한 모드이기 때문이에요. 또한 Amazon ECS의 AWS Fargate 태스크에 사용할 수 있는 유일한 모드이기도 해요.
태스크용 보안 그룹
태스크가 awsvpc 네트워크 모드를 사용하도록 구성할 것을 권장해요. 태스크가 이 모드를 사용하도록 구성하면 Amazon ECS 에이전트가 태스크에 ENI(Elastic Network Interface)를 자동으로 프로비저닝하고 연결해요. ENI가 프로비저닝되면 태스크가 AWS 보안 그룹에 등록돼요. 보안 그룹은 인바운드 및 아웃바운드 트래픽을 제어하는 데 사용할 수 있는 가상 방화벽 역할을 해요.
태스크 또는 서비스와 함께 사용자 지정 방화벽을 사용한다면 Amazon ECS 에이전트 관리 엔드포인트(" ecs-a-. region .amazonaws.com "), 텔레메트리 엔드포인트(" ecs-t-. region .amazonaws.com "), Service Connect Envoy 관리 엔드포인트(" ecs-sc. region .api.aws ")에 대한 트래픽을 허용하는 아웃바운드 규칙을 추가해 주세요.
AWS PrivateLink와 Amazon ECS AWS PrivateLink는 Amazon ECS를 포함한 다양한 AWS 서비스에 대한 프라이빗 엔드포인트를 만들 수 있게 해 주는 네트워킹 기술이에요. 엔드포인트는 Amazon VPC에 IGW(Internet Gateway)가 연결되지 않고 인터넷에 대한 대체 경로도 없는 샌드박스 환경에서 필요해요. AWS PrivateLink를 사용하면 Amazon ECS 서비스에 대한 호출이 Amazon VPC 내에 유지되고 인터넷을 통과하지 않도록 보장돼요. Amazon ECS 및 기타 관련 서비스용 AWS PrivateLink 엔드포인트를 만드는 방법은 Amazon ECS interface Amazon VPC endpoints 를 참고해 주세요.
중요 AWS Fargate 태스크에는 Amazon ECS용 AWS PrivateLink 엔드포인트가 필요하지 않아요.
Amazon ECR과 Amazon ECS는 모두 엔드포인트 정책을 지원해요. 이러한 정책을 사용해 서비스의 API에 대한 액세스를 세밀하게 제어할 수 있어요. 예를 들어 특정 AWS 계정의 레지스트리에만 이미지가 푸시되도록 허용하는 Amazon ECR용 엔드포인트 정책을 만들 수 있어요. 이러한 정책은 사용자가 승인된 Amazon ECR 레지스트리에 푸시하는 것을 허용하면서 컨테이너 이미지를 통한 데이터 유출을 방지하는 데 사용할 수 있어요. 자세한 내용은 Use VPC endpoint policies 를 참고해 주세요.
다음 정책은 내 계정의 모든 AWS 보안 주체가 내 Amazon ECR 리포지토리에 대해서만 모든 작업을 수행할 수 있게 해 줘요.
{
"Statement": [
{
"Sid": "LimitECRAccess",
"Principal": "*",
"Action": "*",
"Effect": "Allow",
"Resource": "arn:aws:ecr:region:account_id:repository/*"
}
]
}
새로운 PrincipalOrgID 속성을 사용하는 조건을 설정해 이를 더욱 강화할 수 있어요. 이는 내 AWS Organizations에 속하지 않은 IAM 보안 주체가 이미지를 푸시하고 풀하는 것을 방지해요. 자세한 내용은 aws:PrincipalOrgID 를 참고해 주세요. 동일한 정책을 com.amazonaws. region .ecr.dkr 및 com.amazonaws. region .ecr.api 엔드포인트 모두에 적용할 것을 권장해요.
컨테이너 에이전트 설정
Amazon ECS 컨테이너 에이전트 구성 파일에는 네트워크 보안과 관련된 여러 환경 변수가 포함돼요. ECS_AWSVPC_BLOCK_IMDS 와 ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST 는 태스크의 Amazon EC2 메타데이터 액세스를 차단하는 데 사용돼요. HTTP_PROXY 는 에이전트가 인터넷에 연결하기 위해 HTTP 프록시를 통해 라우팅하도록 구성하는 데 사용돼요. 에이전트와 Docker 런타임이 프록시를 통해 라우팅하도록 구성하는 방법은 HTTP Proxy Configuration 을 참고해 주세요.
중요 이러한 설정은 AWS Fargate를 사용할 때는 사용할 수 없어요.
네트워크 보안 권장 사항 Amazon VPC, 로드 밸런서 및 네트워크를 설정할 때 다음을 수행할 것을 권장해요.
- 해당되는 경우 Amazon ECS와 함께 네트워크 암호화 사용 - 해당되는 경우 네트워크 암호화를 사용해야 해요. PCI DSS 같은 특정 규정 준수 프로그램은 데이터에 카드 소지자 데이터가 포함되어 있으면 전송 중 데이터 암호화를 요구해요. 워크로드에 유사한 요구 사항이 있다면 네트워크 암호화를 구성해 주세요. 최신 브라우저는 안전하지 않은 사이트에 연결할 때 사용자에게 경고해요. 서비스가 공개 로드 밸런서 뒤에 있다면 TLS/SSL을 사용해 클라이언트 브라우저에서 로드 밸런서로의 트래픽을 암호화하고, 필요하다면 백엔드로 다시 암호화해 주세요.
- 태스크와 Amazon ECS의 다른 리소스 간 트래픽 제어에 awsvpc 네트워크 모드와 보안 그룹 사용 - 태스크 간, 태스크와 다른 네트워크 리소스 간 트래픽을 제어해야 할 때
awsvpc네트워크 모드와 보안 그룹을 사용해야 해요. 서비스가 ALB 뒤에 있다면 ALB와 동일한 보안 그룹을 사용하는 다른 네트워크 리소스의 인바운드 트래픽만 허용하도록 보안 그룹을 사용해 주세요. 애플리케이션이 NLB 뒤에 있다면 Amazon VPC CIDR 범위와 NLB에 할당된 정적 IP 주소의 인바운드 트래픽만 허용하도록 태스크의 보안 그룹을 구성해 주세요. 보안 그룹은 태스크와 Amazon VPC 내의 Amazon RDS 데이터베이스 같은 다른 리소스 간의 트래픽을 제어하는 데도 사용해야 해요. - 네트워크 트래픽을 엄격히 격리해야 할 때 별도의 Amazon VPC에 Amazon ECS 클러스터 만들기 - 네트워크 트래픽을 엄격히 격리해야 할 때 별도의 Amazon VPC에 클러스터를 만들어야 해요. 엄격한 보안 요구 사항이 있는 워크로드를 그런 요구 사항을 지킬 필요가 없는 워크로드와 같은 클러스터에서 실행하는 것을 피해 주세요. 엄격한 네트워크 격리가 필수라면 별도의 Amazon VPC에 클러스터를 만들고 Amazon VPC 엔드포인트를 사용해 서비스를 다른 Amazon VPC에 선택적으로 노출해 주세요. 자세한 내용은 VPC endpoints 를 참고해 주세요.
- 해당되는 경우 Amazon ECS용 AWS PrivateLink 엔드포인트 구성 - 해당되는 경우 AWS PrivateLink 엔드포인트를 구성해야 해요. 보안 정책이 Amazon VPC에 IGW(Internet Gateway) 연결을 방지한다면 Amazon ECS 및 Amazon ECR, AWS Secrets Manager, Amazon CloudWatch 같은 다른 서비스용 AWS PrivateLink 엔드포인트를 구성해 주세요.
- Amazon VPC Flow Logs를 사용해 Amazon ECS의 장기 실행 태스크와의 트래픽 분석 - 장기 실행 태스크와의 트래픽 분석에 Amazon VPC Flow Logs를 사용해야 해요.
awsvpc네트워크 모드를 사용하는 태스크는 자체 ENI를 갖게 돼요. 이렇게 하면 Amazon VPC Flow Logs를 사용해 개별 태스크와의 트래픽을 모니터링할 수 있어요. Amazon VPC Flow Logs(v3)에 대한 최근 업데이트는 vpc ID, 서브넷 ID, 인스턴스 ID를 포함한 트래픽 메타데이터로 로그를 보강해요. 이 메타데이터를 사용해 조사를 좁히는 데 도움을 줄 수 있어요. 자세한 내용은 Amazon VPC Flow Logs 를 참고해 주세요.
참고 컨테이너의 일시적 특성 때문에 플로우 로그가 서로 다른 컨테이너 간 또는 컨테이너와 다른 네트워크 리소스 간의 트래픽 패턴을 분석하는 데 항상 효과적인 방법은 아닐 수 있어요.