brunch

You can make anything
by writing

C.S.Lewis

by Master Seo May 28. 2022

EKS 7탄-2. EKS 컨트롤 플레인 로깅-2/5

7탄 =  2/5

<1> EKS 컨트롤 플레인 활동에 대한 로깅 활성화

<2> aws iam과  쿠버네티스 rbac 사용 클러스터액세스 확인.

<3> 서비스 어카운트 이용해  aws api 관리

<4> 네트워크 정책 적용 활성화!!!




<1> EKS 컨트롤 플레인 활동에 대한 로깅 활성화



1

eks API가 있는 컨트롤 플레인 로깅 확인?


콘솔에서 우선 확인

EKS  > Clusters >  Cluster name 에  클러스터 클릭 > Observability (관찰 가능성)  맨아래 

디폴트로 5개 모두 기본  off  이다.





2

콘솔로도 활성화 가능하지만..  cli로 해보자~


클러스터와 리전 이름 변수로 저장


CLUSTER=$(aws eks list-clusters | jq -r .clusters[0]) && echo $CLUSTER


export AWS_REGION=ap-northeast-2

echo $AWS_REGION



3

컨트롤 플래인 감사 로깅 활성화

aws eks update-cluster-config  명령어로 업데이트 한다!!


상태 변경 업데이트를 변수로 지정


UPDATEID=$(aws eks update-cluster-config  --region $AWS_REGION --name  $CLUSTER --logging '{"clusterLogging":[{"types":["api","audit","authenticator","controllerManager","scheduler"],"enabled":true}]}' | jq -r '.update.id') && echo $UPDATEID


또는


aws eks update-cluster-config  --region $AWS_REGION --name  $CLUSTER --logging '{"clusterLogging":[{"types":["api","audit","authenticator","controllerManager","scheduler"],"enabled":true}]}'



4

적용 확인

aws eks describe-update --region $AWS_REGION --name $CLUSTER --update-id $UPDATEID



5

# 콘솔에서 확인

EKS  > Clusters >  Cluster name 에  클러스터 클릭 > Observability (관찰 가능성)  맨아래 




6

# 클라우드 와치 로그스에 로그가 남는다!


콘솔에가서 확인하자.


cloudwatch  >  Logs   > Logs groups


/aws/eks/dev-cluster/cluster  가 있다.





7

# API 호출 기록등 원하는 부분에 대해 쿼리해서 기록을 볼수 있다.



cloudwatch  >   Logs >  Logs insights


select log groups -  dev-cluster 선택

쿼리 편집기

(쿼리 입력)


쿼리 실행




참고

https://aws.amazon.com/ko/premiumsupport/knowledge-center/eks-get-control-plane-logs/




<2> aws iam과  쿠버네티스 rbac 사용 클러스터액세스 확인.



1

IAM 그룹 및 역할을 생성하여 여러 팀의 EKS에 배포된 클러스터 및 노드에 액세스 할수 있도록 하여야 한다.

AWS IAM을 이용해 클러스터에 대한 자격증명을 인증한다음, 쿠버네티스 RBAC를 사용하여 리소스에 대한 권한부여를 제공하여 이를 달성하자.


IAM 역할을 쿠버네티스 그룹에 매핑하자.

AWS IAM역할을 쿠버네티스 역할기반 액세스 (RBAC)에 매핑하기



2

# IAM 역할을 쿠버네티스 그룹에 매핑하자.


aws-auth ConfigMap의 세부정보를 보자.

map role등 내용 확인하자!!!!




kubectl describe configmap -n kube-system aws-auth



Name:         aws-auth

Namespace:    kube-system

Labels:       <none>

Annotations:  <none>

Data

====

mapRoles:

----

- groups:

  - system:bootstrappers

  - system:nodes

  rolearn: arn:aws:iam::3x5:role/eksctl-dev-cluster-nodegroup-dev-n-NodeInstanceRole-mE3OU

  username: system:node:{{EC2PrivateDNSName}}

Events:  <none>




sh-4.2$

EksNodeRole 역할을 system:bootstrappers  , system:nodes  그룹에 매핑 하도록 되어 있다!!!

클러스터를 생성한 IAM 사용자 또는 역할은  aws-auth ConfigMAP에 포함되지 않는다.

전체 클러스터에 대한 숨겨진 관리자이며 변경할수 없다.



3

# web-namespace-role-rolebinding.yaml 내용 확인!


만들어 지는것?

web 네임스페이스

web 네임스페이스에 모든 리소스 액세스 권한을 부여하는 web-admins-role 역할

web-admin-role에 정의한 권한을  web-admin-group에 부여하는  web-admin-binding이라는 role binding.



cat << EOF > web-namespace-role-rolebinding.yaml

# Create a namespace named "web"

apiVersion: v1

kind: Namespace

metadata:

  name: web

---

# Create a role named "web-admins-role" with

# full access to objects in the "web" namespace

apiVersion: rbac.authorization.k8s.io/v1

kind: Role

metadata:

 name: web-admins-role

 namespace: web

rules:

- apiGroups: ["*"]

  resources: ["*"]

  verbs: ["*"]

---

# Create a role binding named "web-admins-binding"

# to attach the "web-admins-role" role to the "web-admins" group

apiVersion: rbac.authorization.k8s.io/v1

kind: RoleBinding

metadata:

  name: web-admins-binding

  namespace: web

roleRef:

  apiGroup: rbac.authorization.k8s.io

  kind: Role

  name: web-admins-role

subjects:

- apiGroup: rbac.authorization.k8s.io

  kind: Group

  name: web-admins-group

EOF


kubectl apply -f web-namespace-role-rolebinding.yaml



namespace/web created

role.rbac.authorization.k8s.io/web-admins-role created

rolebinding.rbac.authorization.k8s.io/web-admins-binding created


#  web role 안만들어짐 !!!   어디 있나??  콘솔에서 안보임.



4

# aws-auth configmap을 업데이트해서  webadminrole iam 역할을  web-admin rbac 그룹에 매핑.



5

# webadmin role에 대해 환경 변수 생성하자.

# 환경변수 ARN이 안나온다.  콘솔상에서 확인해보니 web이름으로 된 role이 없다 - -!!!



export WEB_ADMIN_ARN=$(aws iam list-roles | jq -r '.[] | .[] | .Arn' | grep -i web) && echo "The ARN for the WebAdminRole is" $WEB_ADMIN_ARN


The ARN for the WebAdminRole is arn:aws:iam::26810:role/WebAdminRole


export WEB_ADMIN_ARN=


6

# iam 역할을 입력해 새 iam 역할을  aws-auth configmap  에 대한  rbac 그룹에 매칭해 추가하자.


사용자 웹 어디민 , 웹 어드민 그룹에 웹 어디민 롤 ???


echo ${CLUSTER}

echo ${AWS_REGION}


eksctl create iamidentitymapping --cluster ${CLUSTER} --group web-admins-group --username web-admin --region ${AWS_REGION} --arn ${WEB_ADMIN_ARN}



sh-4.2$ eksctl create iamidentitymapping --cluster ${CLUSTER} --group web-admins-group --username web-admin --region us-west-2 --arn ${WEB_ADMIN_ARN}

2022-05-27 09:01:03 [ℹ]  eksctl version 0.98.0

2022-05-27 09:01:03 [ℹ]  using region us-west-2

2022-05-27 09:01:03 [ℹ]  adding identity "arn:aws:iam::9126810:role/WebAdminRole" to auth ConfigMap



7

# aws-auth configmap 정보는 어떻게 확인?


kubectl describe configmap -n kube-system aws-auth

Name:         aws-auth

Namespace:    kube-system

Labels:       <none>

Annotations:  <none>

Data

====

mapRoles:

----

- groups:

  - system:bootstrappers

  - system:nodes

  rolearn: arn:aws:iam::126810:role/EksNodeRole

  username: system:node:{{EC2PrivateDNSName}}

- groups:

  - web-admins-group

  rolearn: arn:aws:iam::126810:role/WebAdminRole

  username: web-admin

mapUsers:

----

[]

Events:  <none>



8

# 현재 역할 확인은 ?


aws sts get-caller-identity



9

# 리소스 나열은?


kubectl get all

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE

service/kubernetes   ClusterIP   172.20.0.1   <none>        443/TCP   72m



10

# config 백업


cp ~/.kube/config ~/.kube/config.back



11

# config 업데이트


aws eks update-kubeconfig --name ${CLUSTER} --role-arn ${WEB_ADMIN_ARN} --alias web-admin --region ${AWS_REGION}



12

# web 네임스페이스의 모든 리소스 나열?


kubectl get all -n web

No resources found in web namespace.



13

# web 네임스페이스에 nginx 웹 서버 배포는??


kubectl create deployment nginx --image=nginx -n web



14

# nginx deployment 를 인터넷에 노출하는 서비스 생성은?

네임스페이스는 web 네임스페이스에 하라.


kubectl expose deployment nginx --port=80 --name nginx --type=LoadBalancer -n web



15

# 서비스 도메인 이름 확인?


kubectl get service nginx -n web

NAME    TYPE           CLUSTER-IP       EXTERNAL-IP                                             PORT(S)        AGE

nginx   LoadBalancer   172.20.224.206   a23455e3b41064303b95725d90116892-1310555972.us-west-2.elb.amazonaws.com   80:30638/TCP   9s



kubectl get all


Error from server (Forbidden): pods is forbidden: User "web-admin" cannot list resource "pods" in API group "" in the namespace "default"

Error from server (Forbidden): replicationcontrollers is forbidden: User "web-admin" cannot list resource "replicationcontrollers" in API group "" in the namespace "default"

Error from server (Forbidden): services is forbidden: User "web-admin" cannot list resource "services" in API group "" in the namespace "default"




kubectl get all  -n web




16

# 컨피그 파일 복원?


cp ~/.kube/config.back ~/.kube/config


kubectl get all


sh-4.2$ more ~/.kube/config.back


sh-4.2$ more ~/.kube/config


current-context: web-admin




# 백업으로 복원후 되는 이유??


sh-4.2$ kubectl get all

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE

service/kubernetes   ClusterIP   172.20.0.1   <none>        443/TCP   77m




<3> 서비스 어카운트 이용해  aws api 관리


# 서비스 어카운트로  API 엔세스를 제한하여 위험을 줄이자..

# 특정 사용자만  API 호출 할수 있도록 하자..



1

# 공급자 리스트 확인


aws iam list-open-id-connect-providers


sh-4.2$ aws iam list-open-id-connect-providers

{

    "OpenIDConnectProviderList": [

        {

            "Arn": "arn:aws:iam::6810:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/CE7FBBF7806E04FCB454CA212863118A"

        }

    ]

}



2

# iam 롤과  쿠버네이스 서비스 어카운트 생성?


# s3 읽는 권한만 가지자~~


eksctl create iamserviceaccount --name aws-s3-read --namespace default --cluster ${CLUSTER} --attach-policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess --approve --region ${AWS_REGION}



2024-12-22 12:51:26 [!]  no IAM OIDC provider associated with cluster, try 'eksctl utils associate-iam-oidc-provider --region=ap-northeast-2 --cluster=dev-cluster'

Error: unable to create iamserviceaccount(s) without IAM OIDC provider enabled




3

# 콘솔


iam 가서   access management 가서  프로바이더를 확인한다.

만들어진 프로바이더가 있는지 보자.


iam > role 가서   eck -dev-cloud-addon-iamserveraccoutn 롤 확인

권한 확인?

s3 readonly만 있다.

트러스트 엔트리 확인하자!!!



4

# 새 컨테이서 생성, 컨테이너 들어가서 명령어 사용해보자~~


kubectl run my-shell --rm -i --tty --image amazonlinux --overrides='{ "spec": { "serviceAccount": "aws-s3-read" } }' -- bash



5

# cli 설치?


curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.6.2.zip" -o "awscliv2.zip"

yum install unzip less groff -y

unzip awscliv2.zip

./aws/install

aws --version



현재 프로필 확인?


aws sts get-caller-identity


{

    "UserId": "AROAZJWOLDSNAG7Y6DGC3:botocore-session-1653642883",

    "Account": "126810",

    "Arn": "arn:aws:sts::126810:assumed-role/eksctl-dev-cluster-addon-iamserviceaccount-d-Role1-SO0DBACHVZFW/botocore-session-1653642883"

}



6

# s3 조회해 보자!!!!!!!


bash-4.2# aws s3 ls

2022-05-27 07:39:54 ql-cf-templates-1653637192-d3002831ecaab4f0-us-west-2

2022-05-27 07:40:03 qls-5818458-c6cfbf34c130879c-appbucket-1ewm37obvacu1

2022-05-27 07:39:58 qltrail-lab-14145-1653637195


aws s3 ls



7

# 리전 환경 변수 생성


export AWS_REGION=$(curl --silent http://169.254.169.254/latest/meta-data/placement/region)



export AWS_REGION=ap-northeast-2

echo $AWS_REGION




9

# 현재 리전 ec2 확인?


aws ec2 describe-instances --region ${AWS_REGION}


권한이 없다고 에러~


정상

s3 권한만 있음

exit




<4> 네트워크 정책 적용 활성화!!!



1

# 칼리코 데몬 세트 확인?


kubectl get daemonset calico-node --namespace kube-system


NAME     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE

calico-node   3         3         3       3            3           beta.kubernetes.io/os=linux   71m




2

# 서비스 정보 확인?


kubectl get service nginx -n web



3

웹 접속 확인



4

# 웹서비스 네임 스페이스의 모든 객체에 대한 트래픽 거부?


kubectl apply -f deny-all-traffic.yaml


more 로 확인


sh-4.2$ more deny-all-traffic.yaml

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: default-deny

  namespace: web

spec:

  podSelector: {}

  policyTypes:

  - Ingress

  - Egress

sh-4.2$



ingrgess, pod seletor  등 빠져 있어 모두 거부하는 것이다.

다른  브라우저에서 접속 확인?

안된다.



5

# nginx 에 대해 허용 하는 정책?


kubectl apply -f allow-external-web-access.yaml


sh-4.2$ more allow-external-web-access.yaml

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: nginx-allow-external

  namespace: web

spec:

  podSelector:

    matchLabels:

      app: nginx

  ingress:

  - ports:

    - port: 80

    from: []



6

웹 브라우저 접속

잘됨!!



EKS 7탄 전체보기 


https://brunch.co.kr/@topasvga/2468



다음

https://brunch.co.kr/@topasvga/2470



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari