포드당 보안 그룹 - Amazon EKS

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

포드당 보안 그룹

AWS 보안 그룹은 EC2 인스턴스가 인바운드 및 아웃바운드 트래픽을 제어하는 가상 방화벽 역할을 합니다. 기본적으로 AmazonVPCCNI은 ENI 노드의 기본 와 연결된 보안 그룹을 사용합니다. 보다 구체적으로, 인스턴스와 ENI 연결된 모든 에는 동일한 EC2 보안 그룹이 있습니다. 따라서 노드의 모든 포드는 노드가 실행되는 노드와 동일한 보안 그룹을 공유합니다.

아래 이미지와 같이 작업자 노드에서 작동하는 모든 애플리케이션 포드는 RDS 데이터베이스 서비스에 액세스할 수 있습니다(RDS인바운드 허용 노드 보안 그룹 고려). 보안 그룹은 노드에서 실행되는 모든 포드에 적용되기 때문에 너무 조대합니다. 포드용 보안 그룹은 워크로드에 대한 네트워크 세분화를 제공하며, 이는 심층 방어 전략의 중요한 부분입니다.

보안 그룹이 에 연결된 노드의 그림 RDS

포드용 보안 그룹을 사용하면 공유 컴퓨팅 리소스에서 다양한 네트워크 보안 요구 사항이 있는 애플리케이션을 실행하여 컴퓨팅 효율성을 개선할 수 있습니다. 및 Pod-to-External AWS 서비스와 같은 Pod-to-Pod 여러 유형의 보안 규칙을 EC2 보안 그룹을 사용하여 한 곳에서 정의하고 Kubernetes 네이티브 를 사용하여 워크로드에 적용할 수 있습니다APIs. 아래 이미지는 포드 수준에서 적용된 보안 그룹과 이러한 그룹이 애플리케이션 배포 및 노드 아키텍처를 간소화하는 방법을 보여줍니다. 이제 포드가 Amazon RDS 데이터베이스에 액세스할 수 있습니다.

에 서로 다른 보안 그룹이 연결된 포드 및 노드의 그림 RDS

를 VPC 로 설정하여 포드ENABLE_POD_ENI=true에 대한 보안 그룹을 활성화할 수 있습니다CNI. 활성화되면 제어 영역(로 관리됨EKS)에서 실행되는 VPC 리소스 컨트롤러는 '`aws-k8s-trunk-eni''이라는 트렁크 인터페이스를 생성하고 노드에 연결합니다. 트렁크 인터페이스는 인스턴스에 연결된 표준 네트워크 인터페이스 역할을 합니다. 트렁크 인터페이스를 관리하려면 Amazon 클러스터와 함께 사용되는 EKS 클러스터 역할에 AmazonEKSVPCResourceController 관리형 정책을 추가해야 합니다.

또한 컨트롤러는 'aws-k8s-branch-eni'이라는 브랜치 인터페이스를 생성하고 이를 트렁크 인터페이스와 연결합니다. 포드에는 SecurityGroupPolicy 사용자 지정 리소스를 사용하여 보안 그룹이 할당되며 브랜치 인터페이스와 연결됩니다. 보안 그룹은 네트워크 인터페이스로 지정되므로 이제 이러한 추가 네트워크 인터페이스에서 특정 보안 그룹이 필요한 포드를 예약할 수 있습니다. 배포 사전 조건을 포함하여 EKS 포드용 보안 그룹에 대한 사용 설명서 섹션을 검토합니다.

와 연결된 보안 그룹이 있는 작업자 서브넷의 그림 ENIs

브랜치 인터페이스 용량은 보조 IP 주소의 기존 인스턴스 유형 제한에 추가됩니다. 보안 그룹을 사용하는 포드는 최대 포드 공식에서 설명되지 않으며 포드에 보안 그룹을 사용하는 경우 최대 포드 값을 늘리거나 노드가 실제로 지원할 수 있는 것보다 더 적은 포드를 실행하는 것이 좋습니다.

m5.large에는 최대 9개의 브랜치 네트워크 인터페이스와 표준 네트워크 인터페이스에 할당된 최대 27개의 보조 IP 주소가 있을 수 있습니다. 아래 예제와 같이 m5.large의 기본 최대 포드는 29이며 보안 그룹을 사용하는 포드를 최대 포드로 EKS 계산합니다. 노드의 최대 포드를 변경하는 방법에 대한 지침은 EKS 사용 설명서를 참조하세요.

포드의 보안 그룹을 사용자 지정 네트워킹 과 함께 사용하는 경우 포드의 보안 그룹에 정의된 보안 그룹이 에 지정된 보안 그룹이 아닌 사용됩니다ENIConfig. 따라서 사용자 지정 네트워킹이 활성화되면 포드당 보안 그룹을 사용하는 동안 보안 그룹 순서를 신중하게 평가합니다.

추천

Liveness Probe용 TCP Early Demux 비활성화

라이브니스 또는 준비 프로브를 사용하는 경우 kubelet이 를 통해 브랜치 네트워크 인터페이스의 포드에 연결할 수 있도록 TCP 조기 해제도 비활성화해야 합니다TCP. 이는 엄격한 모드에서만 필요합니다. 이렇게 하려면 다음 명령을 실행합니다.

kubectl edit daemonset aws-node -n kube-system

initContainer 섹션에서 의 값을 DISABLE_TCP_EARLY_DEMUX 로 변경합니다. true.

Security Group For Pod를 사용하여 기존 AWS 구성 투자를 활용합니다.

보안 그룹을 사용하면 RDS 데이터베이스 또는 EC2 인스턴스와 같은 VPC 리소스에 대한 네트워크 액세스를 더 쉽게 제한할 수 있습니다. 포드당 보안 그룹의 분명한 이점 중 하나는 기존 AWS 보안 그룹 리소스를 재사용할 수 있다는 것입니다. 보안 그룹을 네트워크 방화벽으로 사용하여 AWS 서비스에 대한 액세스를 제한하는 경우 브랜치를 사용하여 포드에 보안 그룹을 적용하는 것이 좋습니다ENIs. EC2 인스턴스에서 로 앱을 전송EKS하고 보안 그룹이 있는 다른 AWS 서비스에 대한 액세스를 제한하는 경우 포드에 대한 보안 그룹을 사용하는 것이 좋습니다.

포드 보안 그룹 적용 모드 구성

Amazon VPC CNI 플러그인 버전 1.11에 POD_SECURITY_GROUP_ENFORCING_MODE ('강제 모드')라는 새 설정이 추가되었습니다. 적용 모드는 포드에 적용되는 보안 그룹과 소스NAT가 활성화되어 있는지 여부를 모두 제어합니다. 적용 모드를 엄격 또는 표준으로 지정할 수 있습니다. 엄격은 가 로 VPC CNI ENABLE_POD_ENI 설정된 의 이전 동작을 반영하는 기본값입니다true.

엄격한 모드에서는 브랜치 ENI 보안 그룹만 적용됩니다. 소스도 비활성화NAT됩니다.

표준 모드에서는 기본 ENI 및 브랜치ENI(포드와 연결됨)와 연결된 보안 그룹이 적용됩니다. 네트워크 트래픽은 두 보안 그룹을 모두 준수해야 합니다.

주의

모드 변경은 새로 시작된 포드에만 영향을 미칩니다. 기존 포드는 포드가 생성될 때 구성된 모드를 사용합니다. 고객은 트래픽 동작을 변경하려는 경우 보안 그룹으로 기존 포드를 재활용해야 합니다.

적용 모드: 포드 및 노드 트래픽을 격리하기 위해 엄격한 모드 사용:

기본적으로 포드의 보안 그룹은 “엄격 모드”로 설정됩니다. 노드의 나머지 트래픽과 포드 트래픽을 완전히 분리해야 하는 경우 이 설정을 사용합니다. 엄격한 모드에서는 브랜치 ENI 아웃바운드 보안 그룹을 사용할 수 있도록 소스NAT가 꺼집니다.

주의

엄격한 모드가 활성화되면 포드의 모든 아웃바운드 트래픽이 노드를 떠나 VPC 네트워크에 들어갑니다. 동일한 노드의 포드 간 트래픽은 를 통과합니다VPC. 이렇게 하면 VPC 트래픽이 증가하고 노드 기반 기능이 제한됩니다. NodeLocal DNSCache 는 엄격한 모드에서 지원되지 않습니다.

적용 모드: 다음 상황에서 표준 모드 사용

포드의 컨테이너에 표시되는 클라이언트 소스 IP

클라이언트 소스 IP를 포드의 컨테이너에 계속 표시해야 하는 경우 를 POD_SECURITY_GROUP_ENFORCING_MODE로 설정하는 것이 좋습니다standard. Kubernetes 서비스는 클라이언트 소스 IP(기본 유형 클러스터)의 보존을 지원하는 externalTrafficPolicy로컬을 지원합니다. 이제 표준 모드에서 로컬로 externalTrafficPolicy 설정된 인스턴스 대상을 LoadBalancer 사용하여 유형 NodePort 및 의 Kubernetes 서비스를 실행할 수 있습니다. 는 클라이언트 소스 IP를 Local 보존하고 LoadBalancer 및 NodePort 유형의 서비스에 대한 두 번째 홉을 방지합니다.

배포 NodeLocal DNSCache

포드에 보안 그룹을 사용하는 경우 를 사용하는 포드를 지원하도록 표준 모드를 구성합니다NodeLocal DNSCache. NodeLocal DNSCache 는 클러스터 노드에서 DNS 캐싱 에이전트를 로 실행하여 클러스터 DNS 성능을 개선합니다 DaemonSet. 이렇게 하면 로컬 캐시가 있는 로컬 kube-dns/CoreDNS를 쿼리하기 위한 DNS QPS 요구 사항이 가장 높은 포드가 지연 시간을 개선하는 데 도움이 됩니다.

NodeLocal DNSCache 는 노드에 대한 모든 네트워크 트래픽이 에 들어가므로 엄격한 모드에서 지원되지 않습니다VPC.

Kubernetes 네트워크 정책 지원

연결된 보안 그룹이 있는 포드와 함께 네트워크 정책을 사용할 때는 표준 적용 모드를 사용하는 것이 좋습니다.

클러스터의 일부가 아닌 AWS 서비스에 대한 네트워크 수준 액세스를 제한하려면 포드에 대한 보안 그룹을 사용하는 것이 좋습니다. 네트워크 정책을 고려하여 클러스터 내의 포드 간 네트워크 트래픽을 제한합니다. 이를 동서 트래픽이라고 합니다.

포드당 보안 그룹과의 비호환성 식별

Windows 기반 및 비nitro 인스턴스는 포드에 대한 보안 그룹을 지원하지 않습니다. 포드가 있는 보안 그룹을 활용하려면 인스턴스에 로 태그를 지정해야 합니다 isTrunkingEnabled. 포드가 내외부의 AWS 서비스에 의존하지 않는 경우 네트워크 정책을 사용하여 보안 그룹 대신 포드 간의 액세스를 관리합니다VPC.

포드당 보안 그룹을 사용하여 AWS 서비스 트래픽을 효율적으로 제어

EKS 클러스터 내에서 실행되는 애플리케이션이 RDS 데이터베이스VPC와 같은 내 다른 리소스와 통신해야 하는 경우 포드SGs에 를 사용하는 것이 좋습니다. CIDR 또는 DNS 이름을 지정할 수 있는 정책 엔진이 있지만 내에 엔드포인트가 있는 AWS 서비스와 통신할 때는 최적의 선택이 아닙니다VPC.

반대로 Kubernetes 네트워크 정책은 클러스터 내부와 외부 모두에서 수신 및 발신 트래픽을 제어하는 메커니즘을 제공합니다. 애플리케이션에 다른 AWS 서비스에 대한 종속성이 제한적인 경우 Kubernetes 네트워크 정책을 고려해야 합니다. 와 같은 AWS 기본 의미 체계가 아닌 AWS 서비스에 대한 액세스를 제한하기 위해 CIDR 범위를 기반으로 송신 규칙을 지정하는 네트워크 정책을 구성할 수 있습니다SGs. Kubernetes 네트워크 정책을 사용하여 포드 간(종종 동서 트래픽이라고 함) 및 포드와 외부 서비스 간의 네트워크 트래픽을 제어할 수 있습니다. Kubernetes 네트워크 정책은 OSI 수준 3 및 4에서 구현됩니다.

Amazon을 EKS 사용하면 CalicoCilium과 같은 네트워크 정책 엔진을 사용할 수 있습니다. 기본적으로 네트워크 정책 엔진은 설치되지 않습니다. 설정 방법에 대한 지침은 해당 설치 가이드를 참조하세요. 네트워크 정책을 사용하는 방법에 대한 자세한 내용은 EKS 보안 모범 사례 섹션을 참조하세요. DNS 호스트 이름 기능은 네트워크 정책 엔진의 엔터프라이즈 버전에서 사용할 수 있으며, 이는 Kubernetes 서비스/팟과 외부에서 실행되는 리소스 간의 트래픽을 제어하는 데 유용할 수 있습니다AWS. 또한 기본적으로 보안 그룹을 지원하지 않는 AWS 서비스에 대한 DNS 호스트 이름 지원을 고려할 수도 있습니다.

AWS Loadbalancer 컨트롤러를 사용하도록 단일 보안 그룹에 태그 지정

많은 보안 그룹이 포드에 할당되는 경우 Amazon은 kubernetes.io/cluster/$name 공유 또는 소유로 단일 보안 그룹에 태그를 지정하는 것이 EKS 좋습니다. 태그를 사용하면 AWS Loadbalancer 컨트롤러가 보안 그룹의 규칙을 업데이트하여 트래픽을 포드로 라우팅할 수 있습니다. 포드에 하나의 보안 그룹만 할당되는 경우 태그 할당은 선택 사항입니다. 보안 그룹에 설정된 권한은 추가적이므로 단일 보안 그룹에 태그를 지정하면 로드밸런서 컨트롤러가 규칙을 찾고 조정할 수 있습니다. 또한 보안 그룹에서 정의한 기본 할당량을 준수하는 데 도움이 됩니다.

아웃바운드 트래픽에 NAT 대해 구성

보안 그룹이 할당된 포드의 아웃바운드 트래픽에 대해서는 소스가 비활성화NAT됩니다. NAT 게이트웨이 또는 인스턴스로 구성된 프라이빗 서브넷에서 인터넷 시작 작업자 노드에 액세스해야 하는 보안 그룹을 사용하는 포드의 경우 에서 외부SNAT를 활성화합니다CNI.

kubectl set env daemonset -n kube-system aws-node AWS_VPC_K8S_CNI_EXTERNALSNAT=true

보안 그룹이 있는 포드를 프라이빗 서브넷에 배포

보안 그룹이 할당된 포드는 프라이빗 서브넷에 배포된 노드에서 실행해야 합니다. 퍼블릭 서브넷에 배포된 보안 그룹이 할당된 포드는 인터넷에 액세스할 수 없습니다.

포드 사양 파일에서 terminationGracePeriod초 확인

포드 사양 파일에서 가 0terminationGracePeriodSeconds이 아닌지 확인합니다(기본값은 30초). 이는 Amazon이 작업자 노드에서 포드 네트워크를 삭제VPCCNI하는 데 필수적입니다. 0으로 설정하면 CNI 플러그인이 호스트에서 Pod 네트워크를 제거하지 않고 브랜치ENI가 효과적으로 정리되지 않습니다.

Fargate에서 포드에 보안 그룹 사용

Fargate에서 실행되는 포드의 보안 그룹은 EC2 작업자 노드에서 실행되는 포드와 매우 유사하게 작동합니다. 예를 들어 Fargate 포드와 연결된 에서 참조 SecurityGroupPolicy 하기 전에 보안 그룹을 생성해야 합니다. 기본적으로 클러스터 보안 그룹은 Fargate 포드에 를 명시적으로 할당하지 않으면 모든 Fargate 포드 SecurityGroupPolicy 에 연결됩니다. 단순성을 위해 Fagate Pod에 클러스터 보안 그룹을 추가해야 할 수 있습니다. SecurityGroupPolicy 그렇지 않으면 보안 그룹에 최소 보안 그룹 규칙을 추가해야 합니다. describe-cluster 를 사용하여 클러스터 보안 그룹을 찾을 수 있습니다API.

aws eks describe-cluster --name CLUSTER_NAME --query 'cluster.resourcesVpcConfig.clusterSecurityGroupId'
cat >my-fargate-sg-policy.yaml <<EOF apiVersion: vpcresources.k8s.aws/v1beta1 kind: SecurityGroupPolicy metadata: name: my-fargate-sg-policy namespace: my-fargate-namespace spec: podSelector: matchLabels: role: my-fargate-role securityGroups: groupIds: - cluster_security_group_id - my_fargate_pod_security_group_id EOF

최소 보안 그룹 규칙은 여기에 나열되어 있습니다. 이러한 규칙을 통해 Fargate Pod는 kube-apiserver, kubelet 및 Core와 같은 클러스터 내 서비스와 통신할 수 있습니다DNS. 또한 Fargate 포드와의 인바운드 및 아웃바운드 연결을 허용하는 규칙을 추가해야 합니다. 이렇게 하면 포드가 의 다른 포드 또는 리소스와 통신할 수 있습니다VPC. 또한 Fargate가 Amazon ECR 또는 와 같은 다른 컨테이너 레지스트리에서 컨테이너 이미지를 가져오는 규칙을 포함해야 합니다 DockerHub. 자세한 내용은 AWS 일반 참조 의 AWS IP 주소 범위를 참조하세요.

아래 명령을 사용하여 Fargate 포드에 적용된 보안 그룹을 찾을 수 있습니다.

kubectl get pod FARGATE_POD -o jsonpath='{.metadata.annotations.vpc\.amazonaws\.com/pod-eni}{"\n"}'

위 명령 eniId 에서 를 기록해 둡니다.

aws ec2 describe-network-interfaces --network-interface-ids ENI_ID --query 'NetworkInterfaces[*].Groups[*]'

새 보안 그룹을 적용하려면 기존 Fargate 포드를 삭제하고 다시 생성해야 합니다. 예를 들어 다음 명령은 example-app의 배포를 시작합니다. 특정 포드를 업데이트하려면 아래 명령에서 네임스페이스 및 배포 이름을 변경할 수 있습니다.

kubectl rollout restart -n example-ns deployment example-pod

📝 에서 이 페이지 편집 GitHub