Cloud/Cloud 공부일기

Day 71 - RBAC, Network policy

갬미 2022. 4. 21. 23:12

오늘 한 내용

- kubernetes RBAC / Network Policy 

- AWS ecr 사용하기

 


쿠버네티스 클러스터에 보안을 적용할 수 있는 방법으로는 두가지가 있다

1. RBAC

2. Network Policy

 

 

1. RBAC

RBAC은 사용자에게 권한을 주는 방법과, 리소스에 권한을 주는 방법(servicr account)으로 나눠진다 

<< 리소스에 권한을 주는 방법(servicr account)은 따로 포스팅하지 않는다 >>

user에게 eks 권한주기

순서

1. IAM User를 만든다

2. Role (yaml)

3. RoleBinding (yaml)

   - 어떤 role을 누구에게 연결할 지 결겅

   - 누구에게 연결 = subject : 1. 서비스 어카운트 2. User/Group 

4. kube-system namespace에 있는 aws-auth configmap에 아래와 같이 User정보 추가

    kubectl edit cm aws-auth -n kube-system

------ kubectl aws-auth cm 수정

참고 https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/add-user-role.html

 

클러스터에 대한 IAM 사용자 및 역할 액세스 사용 설정 - Amazon EKS

클러스터에 대한 IAM 사용자 및 역할 액세스 사용 설정 AWS IAM 엔터티를 사용하는 클러스터에 대한 액세스는 Amazon EKS 제어 영역에서 실행되는 AWS IAM Authenticator for Kubernetes에 의해 사용 설정됩니다.

docs.aws.amazon.com

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  mapRoles: |
    - groups:
      - system:bootstrappers
      - system:nodes
      rolearn: arn:aws:iam::--:role/eksctl-gymin-nodegroup-
      username: system:node:{{EC2PrivateDNSName}}
      
## 여기 추가
  mapUsers: |
    - groups:
      - student
      userarn: arn:aws:iam::--:user/gymin-2
      username: gymin-2
##

kind: ConfigMap
metadata:
  creationTimestamp:
  name: aws-auth
  namespace: kube-system
  resourceVersion: "17437"
  uid:

 

** 권한을 받은 IAM User에서 차이를 확인해본다

   1. EC2하나 생성 - aws config로 계정인증 (새로운 IAM)

   2. cluster config 파일을 업데이트

      aws eks update-kubeconfig --region us-west-1 --name gymin

   3. kubectl 설치

      https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html

   4. 확인 (kubectl get ~~)

 

권한을 주었던 ns와 안준 ns 차이 확인

클러스터 모든 권한을 주기

role.yml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: gymin2-cr
rules:
- apiGroups: ["*"] # 모든 권한
  verbs: ["*"]
  resources: ["*"]

rolebinding.yml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: gymin2-rb
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: gymin2-cr
subjects:
- kind: User
  name: gymin-2

이미 kube-system의 cm은 수정되어있어 따로 추가하지 않았다

 

2. Network Policies

network policy란 k8s의 네인스페이스별로 보안사항을 따로 가져갈 수 있도록 하는것

https://kubernetes.io/docs/concepts/services-networking/network-policies/

 

Network Policies

If you want to control traffic flow at the IP address or port level (OSI layer 3 or 4), then you might consider using Kubernetes NetworkPolicies for particular applications in your cluster. NetworkPolicies are an application-centric construct which allow y

kubernetes.io

network policy를 적용하기 전에 칼리코를 먼저 설치해야 한다!!

https://docs.aws.amazon.com/eks/latest/userguide/calico.html

manifest로 설치한다

kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-operator.yaml
kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-crs.yaml

칼리코는 데몬셋 형태로 설치된다

설치 확인

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

network policy yaml은 다음을 참고하여 생성하였다

https://kubernetes.io/ko/docs/concepts/services-networking/network-policies/#networkpolicy-resource

 

네트워크 정책

IP 주소 또는 포트 수준(OSI 계층 3 또는 4)에서 트래픽 흐름을 제어하려는 경우, 클러스터의 특정 애플리케이션에 대해 쿠버네티스 네트워크폴리시(NetworkPolicy) 사용을 고려할 수 있다. 네트워크폴

kubernetes.io

이때 from --> podSelector는 같은 ns 안에서만 ! 사용함 // ns가 다른 pod에 적용할 수 없다

 

이 기능을 활용하여

3tier를 구성할때 front-ns (nginx) back-ns(tomcat / django) DB-ns(DB statefulset)를 구분하고

front-ns에서 DB로 바로 접근하지 못하도록 보안을 더 강화할 수 있다

 

오늘의 회고

  • 사실 너무 피곤해서 network policy 부분에서 졸았다 ,, 눈떠보니 실습이 훅 건너가 있어서 어쩌지 하던참에 팀원분들과 사용할때 같이 공부하고 써보기로 했다
  • 세미플젝은 따로 글을 업로드할 예정이다~