<1> AWS IAM과 쿠버네티스 rbac 사용 클러스토 엑세스 확인. <2> 서비스 어카운트 이용해 aws api 관리 <1> AWS IAM과 쿠버네티스 rbac 사용 클러스토 엑세스 확인. AWS IAM역할을 쿠버네티스 역할기반 액세스(RBAC)를 사용하여 클러스터 액세스 관리 IAM 그룹 및 역할을 생성하여 여러 팀의 EKS에 배포된 클러스터 및 노드에 액세스 할수 있도록 하여야 한다. AWS IAM을 이용해 클러스터에 대한 자격증명을 인증한다음, 쿠버네티스 RBAC를 사용하여 리소스에 대한 권한부여를 제공하여 이를 달성하자. IAM 역할을 쿠버네티스 그룹에 매핑하자. AWS IAM역할을 쿠버네티스 역할기반 액세스 (RBAC)에 매핑하기 1 IAM 역할을 쿠버네티스 그룹에 매핑하자. aws-auth ConfigMap의 세부정보를 보자. map role등 내용 확인하자!!!! kubectl describe configmap -n kube-system aws-auth Name: aws-auth Namespace: kube-system Labels: Annotations: Data ==== mapRoles: ---- - groups: - system:bootstrappers - system:nodes rolearn: arn:aws:iam::9126810:role/EksNodeRole username: system:node:{{EC2PrivateDNSName}} Events: sh-4.2$ EksNodeRole 역할을 system:bootstrappers , system:nodes 그룹에 매핑 하도록 되어 있다!!! 클러스터를 생성한 IAM 사용자 또는 역할은 aws-auth ConfigMAP에 포함되지 않는다. 전체 클러스터에 대한 숨겨진 관리자이며 변경할수 없다. 2 cat << EOF > 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 3 aws-auth configmap을 업데이트해서 webadminrole iam 역할을 web-admin rbac 그룹에 매핑하자. 4 webadmin 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 5 iam 역할을 입력해 새 iam 역할을 aws-auth configmap 에 대한 rbac 그룹에 매칭해 추가하자. 사용자 웹 어디민 , 웹 어드민 그룹에 웹 어디민 롤 ??? 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 6 aws-auth configmap 정보는 어떻게 확인? kubectl describe configmap -n kube-system aws-auth sh-4.2$ kubectl describe configmap -n kube-system aws-auth Name: aws-auth Namespace: kube-system Labels: Annotations: 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: 7 현재 역할 확인은 ? aws sts get-caller-identity 8 리소스 나열은? kubectl get all NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 172.20.0.1 443/TCP 72m 9 config 백업 cp ~/.kube/config ~/.kube/config.back 10 config 업데이트 aws eks update-kubeconfig --name ${CLUSTER} --role-arn ${WEB_ADMIN_ARN} --alias web-admin --region ${AWS_REGION} 11 web 네임스페이스의 모든 리소스 나열? kubectl get all -n web No resources found in web namespace. 12 web 네임스페이스에 nginx 웹 서버 배포는?? kubectl create deployment nginx --image=nginx -n web 13 nginx deployment 를 인터넷에 노출하는 서비스 생성은? 네임스페이스는 web 네임스페이스에 하라. kubectl expose deployment nginx --port=80 --name nginx --type=LoadBalancer -n web 14 서비스 도메인 이름 확인? 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 30 컨피그 파일 복원? 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 443/TCP 77m <2> 서비스 어카운트 이용해 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} 3 콘솔가서 iam 가서 access management 가서 프로바이더를 확인한다. 만들어진 프로바이더가 있는지 보자. 3 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" } 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 11 리전 환경 변수 생성 export AWS_REGION=$(curl --silent http://169.254.169.254/latest/meta-data/placement/region) 12 echo $AWS_REGION 13 현재 리전 ec2 확인? aws ec2 describe-instances --region ${AWS_REGION} 권한이 없다고 에러~ 정상 s3 권한만 있음 exit 감사합니다.