권한을 찾아서: Github Team을 이용하여 Kubernetes 계정 인증하기 (2)

유희철
Banksalad Tech
Published in
9 min readSep 7, 2018

이전 포스트에 이어서 이번 포스트에서는 Guard를 적용하여 어떻게 인증Auth 문제를 해결하였는지에 대해 소개합니다.

“A person holding a black iPhone in their hand” by Oliur Rahman on Unsplash

어떻게 하면 팀원들이 괴로워하지 않으면서 보안도 챙길 수 있을까요?

고통이라는 건 중요하다고 생각합니다. 어떤 일을 반복할 때 고통이 느껴진다면 그 태스크가 제대로 수행되는데에 있어서 큰 장애물 또는 방해요소가 있다라고 정의할 수 있을 것 같네요.

이전 포스트에 적었던 것 처럼 managed Kubernetes(이하 k8s) service 를 사용하지 않고 직접 k8s 클러스터를 운영할 경우에는 Auth 관련 기능을 이용하기가 굉장히 까다롭기 때문에 인증처리를 제대로 하지 않게 될 확률도 높아지게 됩니다.

자 그렇다면 문제를 조금 쉽게 바꿔봅시다. 여러분들이 회사 또는 팀에서 Github 을 사용하고 개발자들이 각각 Github 계정을 가지고 있다고 한다면 각 팀원들이 특정 팀에 속할 수 있겠죠. 예를 들면 A 와 B 개발자는 ops 라는 팀에 들어갈 수 있구요. B 와 C 개발자는 back-end 라는 팀에 들어갈 수 있습니다. 그러면 Github 팀 별로 각각 k8s에 대한권한을 부여할 수는 없을까요?

정리해보면 Github라는 플랫폼을 통해서 우리 팀원으로서 Sign-in 을 할 수 있고(Authentication, 이하 Authn), 각 팀에 맞는 접근 권한을 가질 수는(Authorization, 이하 Authz) 없을까요?

네, 가능합니다! 여러 방법이 있는데 그 중에서 Guard를 이용한 방법을 공유해 보겠습니다. 그리고 이미 여러분이 kops를 사용해서 클러스터를 구성했다는 가정 하에 kops에 대한 자세한 설명은 생략 하도록 하겠습니다.

먼저 우리가 사용하려는 클러스터는 kops 를 이용해서 구성되어 있었는데 혹시나 Guard에서 kops를 위한 문서가 있었으나, 해당 페이지만 읽어서는 이해가 어렵고 기본적인 install 문서도 읽어야만 이해할 수 있습니다.

위에 언급한 문서를 읽어보면 kops가 설치된 머신에 Guard CLI 를 설치하도록 안내하고 있습니다. Linux 또는 macOS 등 사용하는 OS에 맞는 CLI 를 설치하신 후 PKI 관련 파일들을 생성하도록 안내하고 있습니다.

문서만 보고 그대로 따라하실 경우 조금 헷갈릴 수 있는데 모든 명령어를 그대로 입력해야 하는 것 아니고요. 제가 조금 더 정제된 과정을 하나씩 설명을 해드리겠습니다.

우선 $ guard init ca 를 실행해서 CA 인정서를 생성 한 후에 $ guard init server --ips=100.64.10.96 을 실행하여 서버용 인증서를 만듭니다. 여기서 주의해야 하는 부분은 일반적인 install 페이지에서 보여주는 IP와 kops 용 install 페이지에서 보여주는 IP가 다릅니다. 우리는 kops 를 사용하고 있으니 kops 용 페이지를 보면서 해당 IP를 입력합시다.

IP가 다른 이유는 kops 에서 내부적으로 Pods 에 할당하는 가상 IP의 대역이 기본적으로 100.64.x.x 으로 설정되기 때문입니다. 이 부분은 $ kops edit cluster 명령어를 통해서 확인해보실 수 있습니다. 혹시라도 기존에 이미 동작 중인 pod 이나 service 에서 100.64.10.96 IP를 사용 중이라면 충돌이 날 수 있으니 주의 및 확인 할 수 있는 방법이 kops 용 인스톨 페이지에서 언급되고 있습니다.

🎉 이제 서버용 인증서 설정이 완료되었습니다. 🎉

이제는 클라이언트용 인증서를 생성해야 하는데 우리는 Github을 통해서 인증 할 것 이기 때문에 $ guard init client your-org -o github 이라고 입력 해줍니다. 여기서 your-org 를 인증할 때 사용하고자 하는 org 네임으로 변경해 주셔야겠죠 예: Rainist

자 이렇게 모든 인증서certificates~/.guard/pki 폴더에 준비 되었습니다.

ls ~/.guard/pki 를 입력해서 6개 파일your-org@github.crt|key, ca.crt|key, server.crt|key 이 생성 되었을테고요.

아직 네 가지 작업이 남았습니다.

  1. 만들어둔 인증서를 이용하여 서버를 띄우는 것
  2. k8s 가 webhook 인증방식을 사용할 수 있도록 kops 의 설정 변경
  3. kubectl config~/.kube/config 변경하여 유저 인증Authn 하기
  4. ClusterRole 또는 Role 을 사용하여 권한 관리Authz 하기

먼저 서버를 띄우기 위해 아래의 절차를 거치고요.

$ guard get installer --auth-providers=github > installer.yaml 
# installer.yaml 의 spec/clusterIP 의 값을 100.64.10.96 으로 변경 후
$ kubectl apply -f installer.yaml

kops 의 설정을 변경하기 위해 kops edit cluster 명령어를 입력하여 아래 내용을 추가 합니다.

spec:
kubeAPIServer:
authenticationTokenWebhookConfigFile: /srv/kubernetes/webhook-guard-config
fileAssets:
- content: |
(guard get webhook-config your-org -o github --addr=100.64.10.96:443 의 결과)
name: guard-github-auth
path: /srv/kubernetes/webhook-guard-config
roles:
- Master

이제 이 설정된 부분이 적용되기 위해서는 k8s의 master nodes를 재시작해야 합니다.

kops 명령어를 이용해서 update 및 master node group에 대한 rolling-update를 진행하시면 클러스터에서 이제 Github 팀을 이용한 인증을 진행할 준비를 마쳤습니다.

이 부분 (kops rolling-update) 에 익숙하지 않은 상태에서 프로덕션용 클러스터를 대상으로 진행할 경우 만약 롤링 업데이트 과정에서 문제가 발생해 낭패를 보실 수 있으니 꼭 사용법을 충분히 숙지하신 후, 연습용 클러스터에서 미리 수행해 보시고 작업하시는 것을 권장합니다.

이제 kubectl 의 config 파일을 수정하여 Github Team 을 이용하여 Authn을 할 차례입니다.

kops 로 클러스터를 처음 만들었을 때 ~/.kube/config 를 제공 받으셨을 테고 이 파일에는 모든 권한을 가진 admin 용 credentials 가 포함 되어 있습니다. 해당 파일은 필요할테니 반드시 잘 보관해 두시고 이 파일을 기반으로 아래와 같이 수정하시면 Github Team 에 설정된 팀원으로 인증을 할 수 있습니다.

apiVersion: v1
clusters:
- cluster:
certificate-authority-data: ...
server: https://my.cluster.server
name: my.cluster.k8s.local
contexts:
- context:
cluster: my.cluster.k8s.local
user: my-github-token
name: my.cluster.k8s.local
current-context: my.cluster.k8s.local
kind: Config
preferences: {}
users:
- name: my-github-token
user:
token: {github-token}
  • users > username은 임의로 적어셔도 상관은 없으나 contexts > contextuser 와 동일해야 합니다.
  • tokenhttps://github.com/settings/tokens/new 에 접속한 후 admin:org >read:org 만 체크하신 후 Token description에 이 토큰이 무슨 용도인지 알 수 있도록 적당히 적어주신 후에 Generate Token 을 눌러서 발급을 받은 토큰을 {github-token} 항목에 적어주시면 되고 나중에는 Github을 통해 해당 토큰을 다시 볼 수 있는 방법이 없으니 잘 보관을 해두시거나 잃어버렸을 경우는 당황할 필요 없이 기존 토큰을 삭제하고 새 토큰을 발급받아서 사용하시면 됩니다. (그리고 새 토큰을 위의 config 파일에도 업데이트 해주셔야겠죠)

이제 kubectl cluster-info 를 입력했을 때 에러 메세지가 없으면 Github Organization을 이용해서 Authn를 구현하였습니다.

이제 마지막으로 인증된 유저의 권한을 관리해줘야 하는데요. (Authn은 되었지만 기본적으로는 권한이 거의 없다시피 하기 때문에 지금 당장으로써는 사용할 수 있는 기능이 거의 없습니다.)

이제 Authz를 다뤄 볼 시간이죠!

이 내용은 k8s의 RBAC도 언급해야 하는 등 내용이 생각보다 길어질 것 같아서 다음 글에서 이어 진행하도록 하겠습니다!

--

--