0부터 시작하는 Kubernetes 공부 - Service Account & Role

Jaehong Lee·2022년 9월 8일
1
post-thumbnail

1. Service Account & RBAC

RBAC 는 Role Based Access Control 이다

  • userAccount : K8S 에 있는 오브젝트들을 동작시키는 등은 K8S 시스템에서 제어한다는 의미에서 ServiceAccount 를 사용한다. 우리가 알고 싶은 일반적인 UserAccount 의 개념도 있지만, 주로 SA 를 사용하고, 만약 UserAccount 를 사용하고 싶다면, 이는 외부 인증 서버를 연결해야 한다
  • ServiceAccount 축약어 : SA

userAccount & ServiceAccount

  • userAccount : K8S 는 일반 사용자를 나타내는 오브젝트가 없다. K8S 에서는 이 사용자에 대한 관리를 외부에서 맡기고 있다
  • ServiceAccount : 주로 파드에 할당하는 계정으로, 사람이 아니라 애플리케이션이나 시스템 프로그램의 식별, 인증, 인가를 위한 계정 이다

  • namespace 별로 default 계정이 생성된다. 인증을 위해서 해당 계정의 SECRET 도 있다
export KUBECONFIG=/etc/kubernetes/admin.conf 
  • 위의 과정을 통하면 api-server 에 접속할 수 있는 권한을 현재 계정 ( root ) 에게 부여하게 된다 ( kubernetes-admin )
  • 실제 환경이라면 적절한 권한을 부여한 SA 를 별도로 생성하여 운영해야한다. 만약 고객 관리가 필요하다면 고객에게는 해당 프로젝트( 네임스페이스 ) 내에서 get 등을 할 수 있는 SA 발행해서 제공해 줄 수 있어야 한다
  • 각 네임프레이스 별로 기본적으로 default 라는 SA 가 있다

2. 공인인증서 인증과 암호화 통신 절차

출처: https://brunch.co.kr/@ka3211/13

  1. PC : 사용자의 패스워드 입력
  2. PC : 인증서 전달
  3. 서버: 인증서 검증 요청
  4. 기관: 발급자의 전자서명으로 검증
  5. 서버: A의 공개키 추출
  6. 서버: 대칭키 생성
  7. 서버: 암호화된 대칭키 파일 생성
  8. 서버: 파일 전달
  9. PC : 대칭키 획득
  10. PC, 서버: 대칭키로 파일 암호화
  11. PC, 서버: 안전한 파일 송수신 가능

3. 특정 user 로 명령 실행

Service Account 배포 및 확인

  • SA 를 하나 배포하자
  • 잘 생성되었다
  • user1 에 대한 인증 정보가 포함되어있는 Secret 이 발행되었다

특정 ServiceAccount 로 명령

root@manager:~/k8slab/pvpvclab# kubectl get svc --as system:serviceaccount:default:user1
Error from server (Forbidden): services is forbidden: User "system:serviceaccount:default:user1" cannot list resource "services" in API group "" in the namespace "default"
  • 특정 SA 의 권한으로 명령을 내릴려면 ' --as system:serviceaccount:namespace 이름:SA 이름 ' 을 뒤에 써줘야 한다
    • user1 은 권한이 없다

Secrets Token 확인

root@manager:~/k8slab/0908# k describe secret default-token-229bg
Name:         default-token-229bg
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: default
              kubernetes.io/service-account.uid: f70822af-2bb8-4fec-a2c6-a435aeab0b91

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1066 bytes
namespace:  7 bytes
token:      [ 토큰 ]
  • Secret 의 상세 정보를 확인하면 Token 을 확인할 수 있다

User Token 으로 명령 --token

  • default secret 의 token 을 복사하자
  • Secret 의 token 을 복사해서 위와 같이 --token 을 통해 token 으로 해당 SA 권한으로 명령을 내릴 수 있다. default 계정의 Token 을 사용했다
root@manager:~/k8slab/pvpvclab# k --token=dldld get svc   <-- 토큰 무시됨 - 토큰 입력란에 아무거나 입력시
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   26h
root@manager:~/k8slab/pvpvclab# k get svc --as system:serviceaccount:default:user1 <-- 정상동작
  • 위와 같이 올바르지 않은 토큰을 작성할 경우, 토큰은 무시되고 명령이 실행된다. 이는 올바른 방법이 아니다

4. Role & Cluster Role

Role : Pod, Deployment, Svc 등과 같이 특정 네임스페이스에 포함되는 오브젝트에 대한 명령 실행

  • 해당 네임스페이스에만 제한적
  • SA 와의 연결을 위해서는 RoleBinding 이 필요하다

Cluster Role : Namespace, Node, PV 등과 같이 특정 네임스페이스에 속하지 않는 오브젝트에 대한 명령 뿐만 아니라, 클러스터 전반에 걸쳐 지정된 몇몇 네임스페이스에게 반복적인 명령등을 전달하고자 하는 경우에 활용한다

  • 네임스페이스에 제한적이지 않다
  • SA 와의 연결을 위해서는 ClusterRoleBinding 이 필요하다
profile
멋진 엔지니어가 될 때까지

0개의 댓글