본문 바로가기

AWS EKS 실습/EKS Intermediate

OPA Policy - Example 1: 승인된 Container Registry 만 사용하도록 정책 정의

Amazon EKS Cluster 내에서 컨테이너 이미지에 대해 승인된 내부 레지스트리를 사용하도록 사용자를 제한할 수 있다. 기본적으로 Cluster는 공개 이미지 리포지토리를 사용하도록 허용되어 있다.

 

먼저 Public Repository에서 nginx 이미지를 풀링하도록 허용하는 test Pod manifest를 생성한다.

 

cat > public-nginx.yaml <<EOF
kind: Pod
apiVersion: v1
metadata:
  name: nginx
  labels:
    app: nginx
  namespace: default
spec:
  containers:
  - image: nginx
    name: nginx
EOF

 nginx Pod를 생성한다.

kubectl apply -f public-nginx.yaml

정상적으로 생성된 것을 확인 한 이후 다시 지워본다.

kubectl delete -f public-nginx.yaml

ㅁ OPA Policy Solution 

 

1. rego를 사용하여 OPA 정책을 만든다. 

 

rego에 정리된 정책은 Pod 이미지

 

cat > image_source.rego <<EOF
package kubernetes.admission                                                

deny[msg] {                                                                
  input.request.kind.kind == "Pod"                                        
  image := input.request.object.spec.containers[_].image                 
  not startswith(image, "${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com") 
  msg := sprintf("image '%v' comes from untrusted registry", [image])  
}
EOF

 

The policy written in rego denies all the authenticated and authorised requests from the Kubernetes API server if the Pod image source does not start with ${ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com and returns an error message image '%v' comes from untrusted registry.

 

2. OPA 정책을 ConfigMapp으로 배포

 

kubectl create configmap image-source --from-file=image_source.rego

 

OPA Validating Webhook Configuration에서 정책 구현을 확인

 

kubectl get configmap image-source -o jsonpath="{.metadata.annotations}"

 

3. Private ECR Repository 생성

 

nginx 이름의 ECR repository 생성

 

aws ecr create-repository --repository-name nginx

 

ECR API에서 저장소 이름을 가져와서 로컬 nginx 인스턴스에 Tag를 지정할 수 있다.

 

export REPOSITORY=$(aws ecr describe-repositories --repository-name nginx --query "repositories[0].repositoryUri" --output text)

 

Docker Hub Public nginx를 Local로 가져와서 Tag를 다시 지정한다.

 

docker pull nginx

 

latest repository 이름으로 Tag를 다시 지정하고 이미지를 자신의 Amazon ECR로 Push 한다. Amazon ECR에 Login 하여 구성한다.

 

aws ecr get-login-password \
    --region <region> \
| docker login \
    --username AWS \
    --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com

여기서 region은 실제 구성되는 region, aws_account_id 는 ECR Console에서 확인하여 적용한다.

 

로컬 Docker 이미지를 등록하여 이미지 ID 를 캡쳐한다. 

 

 $ sudo docker images                                                                                                         
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE                                                               
nginx               latest              6084105296a9        5 days ago          133MB                                                              
lambci/lambda       python3.8           094248252696        6 weeks ago         524MB                                                              
lambci/lambda       nodejs12.x          22a4ada8399c        6 weeks ago         390MB                                                              
lambci/lambda       nodejs10.x          db93be728e7b        6 weeks ago         385MB                                                              
lambci/lambda       python3.7           22b4b6fd9260        6 weeks ago         946MB                                                              
lambci/lambda       python3.6           177c85a10179        6 weeks ago         894MB                                                              
lambci/lambda       python2.7           d96a01fe4c80        6 weeks ago         763MB                                                              
lambci/lambda       nodejs8.10          5754fee26e6e        6 weeks ago         813MB  

nginx의 Tag ID를 기록하여 ECR 저장소에 다시 Tag를 지정한다.

docker tag <IMAGE ID> $REPOSITORY
docker tag latest $REPOSITORY

Amazon ECR에 최신 태그 푸시

docker push ${REPOSITORY}:latest

 

4. Private ECR Repository를 사용하는 Pod Manifest를 만든다.

cat > private-nginx.yaml <<EOF
kind: Pod
apiVersion: v1
metadata:
  name: nginx
  labels:
    app: nginx
  namespace: default
spec:
  containers:
  - image: ${REPOSITORY}:latest
    name: nginx
EOF

 

  

Test 수행

 

1. public repository를 사용하여 pod 사용 테스트 --> 실패해야 함

kubectl apply -f public-nginx.yaml

2. private repository를 사용하여 pod 사용 테스트 --> 성공해야 함

kubectl apply -f private-nginx.yaml

'AWS EKS 실습 > EKS Intermediate' 카테고리의 다른 글

Deploying Jenkins for Kubernetes  (0) 2021.03.19
Advanced POD CPU and Memory management  (0) 2021.03.18
Pod Priority And Preemption  (0) 2021.03.18
Resource Quotas  (0) 2021.03.18
Resource management 기본  (0) 2021.03.18