기본적으로 AKS(Azure Kubernetes Service) 클러스터에서 실행되는 모든 Pod는 IMDS(Azure Instance Metadata Service) 엔드포인트에 액세스할 수 있습니다. 이제 필요에 따라 AKS(Azure Kubernetes Service) 클러스터에서 IMDS 엔드포인트에 대한 액세스를 제한하여 보안을 강화할 수 있습니다(미리 보기).
중요합니다
AKS 미리 보기 기능은 셀프 서비스에서 사용할 수 있습니다(옵트인 방식). 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. AKS 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다. 자세한 내용은 다음 지원 문서를 참조하세요.
AKS 클러스터에 대한 IMDS 제한 정보
Azure IMDS는 현재 실행 중인 가상 머신 인스턴스에 대한 정보를 제공하는 REST API입니다. 이 정보에는 SKU, 스토리지, 네트워크 구성 및 예정된 유지 관리 이벤트가 포함됩니다.
IMDS REST API는 AKS 클러스터에서 실행되는 모든 Pod에서 기본적으로 액세스할 수 있는 잘 알려진, 라우팅할 수 없는 IP 주소(169.254.169.254)에서 사용할 수 있습니다. 이 기본 액세스는 AKS 클러스터에 대한 특정 보안 위험을 초래합니다.
- 악의적인 사용자는 서비스를 악용하여 토큰 및 기타 플랫폼 정보와 같은 중요한 정보를 가져와 정보가 유출될 수 있습니다.
- 애플리케이션이 이러한 자격 증명을 오용할 수 있으므로 잠재적인 인증 취약성이 노출됩니다.
이제 클러스터에서 실행되는 호스트가 아닌 네트워크 Pod에 대한 IMDS 엔드포인트에 대한 액세스를 제한하도록 선택할 수 있습니다. 비 호스트 네트워크 Pod는 hostNetwork
해당 사양에서 false로 설정되었습니다. IMDS 제한을 사용하도록 설정하면 호스트가 아닌 네트워크 Pod가 IMDS 엔드포인트에 액세스하거나 관리 ID의 권한 부여를 위해 OAuth 2.0 토큰을 획득할 수 없습니다. 비 호스트 네트워크 Pod는 IMDS 제한을 사용하도록 설정한 후 Microsoft Entra 워크로드 ID 사용해야 합니다.
호스트 네트워크 Pod는 hostNetwork
해당 사양에서 true로 설정되었습니다. 호스트 네트워크 Pod는 호스트 프로세스와 동일한 네트워크 네임스페이스를 공유할 때 IMDS 제한을 사용하도록 설정한 후에도 IMDS 엔드포인트에 계속 액세스할 수 있습니다. 노드의 로컬 프로세스는 IMDS 엔드포인트를 사용하여 인스턴스 메타데이터를 검색할 수 있으므로 IMDS 제한을 사용하도록 설정한 후 엔드포인트에 액세스할 수 있습니다.
시작하기 전에
Azure CLI 버전 2.61.0 이상이 설치되어 있는지 확인합니다. 버전을 확인하려면
az --version
을 실행합니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.aks-preview
Azure CLI 확장 버전 7.0.0b2 이상을 설치합니다.확장이
aks-preview
아직 없는 경우 명령을 사용하여 설치합니다az extension add
.az extension add --name aks-preview
확장이
aks-preview
이미 있는 경우 명령을 사용하여 최신 버전이 있는지 확인하도록 업데이트합니다az extension update
.az extension update --name aks-preview
IMDSRestrictionPreview
az feature register 명령을 사용하여 기능 플래그를 등록합니다.az feature register --namespace Microsoft.ContainerService --name IMDSRestrictionPreview
az feature show 명령을 사용하여 등록 상태를 확인합니다. 상태가 등록됨으로 표시되는 데 몇 분 정도 걸립니다.
az feature show --namespace Microsoft.ContainerService --name IMDSRestrictionPreview
상태가 등록됨으로 표시되면 az provider register 명령을 사용하여 Microsoft.ContainerService 리소스 공급자의 등록을 새로 고칩니다.
az provider register --namespace Microsoft.ContainerService
AKS 클러스터에서 OIDC 발급자를 사용하도록 설정합니다. 새 클러스터를 만들거나 기존 클러스터를 업데이트하려면 OIDC 발급자를 사용하여 AKS 클러스터 구성을 참조하세요.
제한 사항
IMDS 엔드포인트에 액세스해야 하는 특정 추가 기능은 IMDS 제한으로 지원되지 않습니다. 클러스터에 이러한 추가 기능이 설치된 경우 IMDS 제한을 사용하도록 설정할 수 없습니다. 반대로 IMDS 제한을 사용하는 경우 이러한 추가 기능을 설치할 수 없습니다. 지원되지 않는 추가 기능은 다음과 같습니다.
- Application Gateway 수신 컨트롤러
- 컨테이너용 Azure Monitor(Container Insights)
- 가상 노드
- Azure Policy
- 클러스터 확장: Flux(GitOps), Dapr, Azure 앱 구성, Azure Machine Learning, Azure Container Storage, Azure Backup
- AI 도구 체인 연산자(미리 보기)
- 애플리케이션 라우팅
- HTTP 애플리케이션 라우팅
- 웹 애플리케이션 라우팅
- Azure 비용 분석
비밀 저장소 CSI(Container Storage 인터페이스) 드라이버용 Azure Key Vault 공급자는 이제 워크로드 ID 인증 모드를 지원하므로 IMDS 제한을 사용하도록 설정할 수 있습니다.
또한 Windows 노드 풀은 현재 IMDS 제한으로 지원되지 않습니다.
주의
지원되지 않는 추가 기능을 사용하는 클러스터에 IMDS 제한을 사용하도록 설정하면 오류가 발생합니다.
중요 사항
IMDS 제한을 사용하도록 설정하면 AKS는 노드에서 iptables 규칙을 관리합니다. iptables 규칙이 실수로 제거되거나 변조되지 않도록 하려면 다음 사항에 유의하세요.
- iptables 규칙은 SSH 또는 node-shell을 사용하여 수정할 수 있으므로 SSH를 사용하지 않도록 설정 하거나 정책을 사용하여 권한 있는 Pod를 사용하지 않도록 설정하는 것이 좋습니다.
- IMDS에 대한 액세스를 제한하는 iptables 규칙은 노드 가 이미지로 다시 설치 되거나 다시 시작될 때 복원됩니다.
새 클러스터에서 IMDS 제한 사용
새 클러스터에서 IMDS 제한을 사용하도록 설정하고 호스트가 아닌 네트워크 Pod에서 IMDS 엔드포인트로의 모든 트래픽을 차단하려면 매개 변수를 사용하여 az aks create
명령을 실행 --enable-imds-restriction
합니다.
az aks create \
--resource-group myResourceGroup \
--name myAKSCluster \
--enable-imds-restriction
기존 클러스터에서 IMDS 제한 사용
기존 클러스터에서 IMDS 제한을 사용하도록 설정하고 호스트가 아닌 네트워크 Pod에서 IMDS 엔드포인트로의 모든 트래픽을 차단하려면 매개 변수를 사용하여 az aks update
명령을 실행 --enable-imds-restriction
합니다.
az aks update \
--resource-group myResourceGroup \
--name myAKSCluster \
--enable-imds-restriction
클러스터를 업데이트한 후 클러스터의 Pod에 대한 트래픽 차단을 시작하려면 클러스터 의 노드를 이미지az aks upgrade --node-image-only
.
IMDS 제한이 설정된 클러스터의 트래픽 확인
IMDS 제한이 적용되는지 확인하려면 비 호스트 및 호스트 네트워크 Pod에 대한 트래픽을 테스트합니다.
호스트가 아닌 네트워크 Pod의 트래픽 확인
를 사용하여 Pod를 만듭니다
hostNetwork: false
. 테스트 PodhostNetwork: false
가 없는 경우 다음 명령을 실행하여 만들 수 있습니다.cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: non-host-nw spec: hostNetwork: false containers: - name: non-host-nw image: mcr.microsoft.com/azurelinux/base/nginx:1 command: ["sleep", "infinity"] EOF
을 사용하여 Pod
kubectl exec
의 셸에 연결합니다.kubectl exec -it non-host-nw -- /bin/bash
Pod에서 IMDS 엔드포인트로 트래픽을 테스트합니다.
curl -s -H Metadata:true --connect-timeout 10 --noproxy "*" "http://169.254.169.254/metadata/instance?api-version=2023-11-15"
약 10초 동안 기다렸다가 명령이 아무 것도 반환하지 않는지 확인합니다. 즉, 연결 시간이 초과되고 Pod가 IMDS 엔드포인트에 액세스할 수 없습니다.
그런 다음 Pod를 정리합니다 kubectl delete pod non-host-nw
.
호스트 네트워크 Pod의 트래픽 확인
를 사용하여 Pod를 만듭니다
hostNetwork: true
. 테스트 PodhostNetwork: true
가 없는 경우 다음 명령을 실행하여 만들 수 있습니다.cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: host-nw spec: hostNetwork: true containers: - name: host-nw image: mcr.microsoft.com/azurelinux/base/nginx:1 command: ["sleep", "infinity"] EOF
을 사용하여 Pod
kubectl exec
의 셸에 연결합니다.kubectl exec -it host-nw -- /bin/bash
Pod에서 IMDS 엔드포인트로 트래픽 테스트
curl -s -H Metadata:true --noproxy "*" "http://169.254.169.254/metadata/instance?api-version=2023-11-15"
명령이 결과를 반환하는 것을 관찰합니다. 즉, Pod가 예상대로 IMDS 엔드포인트에 액세스할 수 있습니다.
그런 다음 Pod를 정리합니다 kubectl delete pod host-nw
.
클러스터에 대한 IMDS 제한 사용 안 함
기존 클러스터에서 IMDS 제한을 사용하지 않도록 설정하고 모든 Pod에서 IMDS 엔드포인트로의 모든 트래픽을 허용하려면 매개 변수를 사용하여 az aks update
명령을 실행 --disable-imds-restriction
합니다.
az aks update \
--resource-group myResourceGroup \
--name myAKSCluster \
--disable-imds-restriction
클러스터 를 업데이트한 후 클러스터의 노드를 이미지로 다시 설치하여 클러스터의 Pod에 대한 모든 트래픽을 허용하도록 시작해야 합니다.
참고 항목
Azure Kubernetes Service