[Kubernetes] Teleport: 액세스 관리 도구 구축하기 (삽질기)

Mr.Song·2023년 5월 20일
0

Docker / Kubernetes

목록 보기
13/13
post-thumbnail
Teleport는 인증, 권한 부여 및 세션 관리 기능을 제공하여 보안을 강화하고, 접근 제어를 효과적으로 관리할 수 있는 Tool이다. Teleport는 오픈 소스로 제공되며, 클라우드 환경 뿐만 아니라 온프레미스 환경에서도 사용할 수 있다. 또한 유용한 기능들이 옵셔너블하게 제공이 되어서 필요하면 사용하고, 필요하지 않다면 가볍게 무시하고 넘어가도 된다. 엔터프라이즈 라이선스에서는 더 많은 기능이 제공되지만, 기본적인 레벨에서는 오픈소스도 충분하다고 판단했다.
이와 비슷한 상용제품들이 많지만 비용문제로 제한적이라면 좋은 선택지가 될 수 있다고 믿는다.

접근제어시스템 사용 이유

가장 큰 이유는 보안 강화와 규정준수다. 골자는 민감한 정보와 자산에 대한 접근을 제한하고 보호하고 인가되지 않은 사용자의 무단 접근을 방지하여 데이터 유출과 보안 위협을 감소시키는 것이다.
텔레포트를사용하면서 장점이라고 생각되는 것들이 몇가지 있다.
  1. 웹 기반 SSH 세션
  2. SSH 세션 쉐어링
  3. 서버 계정 패스워드 인증 방식이 아닌 x.509인증 방식
터미널SSH는 기본이며 웹 기반 SSH가 되는 점은 의외였고, 어떠한 고안에서 나온 결과물인지는 알 수 없으나 SSH 쉐어링 기능은 흥미로웠다. 리더-주니어 간의 리뷰(?), 개발자와 운영자 간의 원활한 커뮤니케이션을 위한 도움(?), 예측 불가능한 유용함도 있겠지만, 보안성도 있지않을까 사료된다.
무튼(?) 이 오픈소스의 동작방식을 이해하는데 많은 시간이 할애됐고, 공식 Docs를 통해서 도움을 많이 받았다.
이 포스트는 helm 패키지 매니저로 설치했으며, Values파일을 수정하여 구축을 해보았다.

1. helm 리포지토리 추가

steve@MacBookPro ~/eks/prd/# h repo add teleport  https://charts.releases.teleport.dev
steve@MacBookPro ~/eks/prd/# h search repo teleport-cluster
NAME                     	CHART VERSION	APP VERSION	DESCRIPTION
teleport/teleport-cluster	13.0.0       	13.0.0     	Teleport is an access platform for your infrast...
teleport/teleport        	0.0.13       	6          	[This chart is deprecated, use teleport-cluster...

2. Chart 다운로드 & Values.yaml 수정

steve@MacBookPro ~/eks/prd/# h pull teleport-cluster
steve@MacBookPro ~/eks/prd/# tar zxvf teleport-cluster.tgz
steve@MacBookPro ~/eks/prd/# vi teleport-cluster/values.yaml
--- values.yaml
##################################################
# Values that must always be provided by the user.
##################################################
clusterName: "Teleport-ClusterName"
kubeClusterName: "EKS-ClusterName"

proxy:
  teleportConfig: {}

authentication:
  localAuth: true # 외부 인증이 아닌 로컬 사용자 인증 (Teleport DB)
  secondFactor: "otp" # 2차 인증을 지원한다.

proxyListenerMode: "separate"
sessionRecording: "node"

separatePostgresListener: true
separateMongoListener: false

publicAddr: ["subdomain.domain.com:443"]
postgresPublicAddr: ["subdomain.domain.com:5432"]
sshPublicAddr: ["subdomain.domain.com:3023"]
tunnelPublicAddr: ["subdomain.domain.com:3024"]

chartMode: aws # 사용한 CSP
validateConfigOnDeploy: true
createProxyToken: true

aws:
  region: "ap-northeast-2" 
  backendTable: "teleport-helm-backend" # aws dynamodb를 사용하게되는데, 사용 될 테이블 명
  auditLogTable: "teleport-helm-events" # aws dynamodb를 사용하게되는데, 사용 될 테이블 명
  auditLogMirrorOnStdout: false
  sessionRecordingBucket: "s3.teleport" # 세션레코딩 된 파일은 크기가 크므로 S3에 저장한다.
  backups: false

annotations:
  service:
    service.beta.kubernetes.io/aws-load-balancer-name: AWS-NLB # NLB에서 사용할 이름
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:ap-northeast-2:000000000000:certificate/~ # ACM
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: ssl
    service.beta.kubernetes.io/load-balancer-source-ranges: 1.2.3.4/32 # 인스턴스 SG에 등록 될 IP, IP 접근 제한

service:
  type: LoadBalancer # 클러스터 타입은 NLB
차트를 이렇게 작성되기까지 굉장히 오랜시간이 걸렸다. 서비스 타입은 NodePort로하고 ALB ingress를 통해 트래픽 라우팅을 하려고했으나, 텔레포트의 안전한 클러스터링 배포(Deploying a High Availability Teleport Cluster)는 ALB가 아닌 NLB가 필수적이라고한다.
또 이 상태로 helm install을 진행하면 에러메시지를 뱉는다. 하지만 설치는 다 잘되어있다(?). 아마 annotations.service.service.beta.kubernetes.io/load-balancer-source-ranges 어노테이션이 NLB에서 지원하지 않는 어노테이션이거나, 해당 차트가 최신화 되지않아 허용되지않은 어노테이션인 경우일거라 추측된다.

3. Helm Install 배포

steve@MacBookPro ~/eks/prd/teleport-cluster# h install teleport .
steve@MacBookPro ~/eks/prd/teleport-cluster# k get all -l app.kubernetes.io/instance=teleport
NAME                                  READY   STATUS    RESTARTS   AGE
pod/teleport-auth-65d4586dc4-nhs2b    1/1     Running   0          31d
pod/teleport-proxy-57b4fd87b6-8wz72   1/1     Running   0          31d

NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP                                                                          PORT(S)                                                                     AGE
service/teleport            LoadBalancer   172.20.16.49     nlb-endpoint-address.elb.ap-northeast-2.amazonaws.com   443:30760/TCP,3023:30644/TCP,3024:30617/TCP,3036:31190/TCP,5432:32412/TCP   32d
service/teleport-auth       ClusterIP      172.20.159.171   <none>                                                                               3025/TCP,3026/TCP                                                           32d
service/teleport-auth-v11   ClusterIP      None             <none>                                                                               <none>                                                                      32d
service/teleport-auth-v12   ClusterIP      None             <none>                                                                               <none>                                                                      32d

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/teleport-auth    1/1     1            1           32d
deployment.apps/teleport-proxy   1/1     1            1           32d

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/teleport-auth-65d4586dc4    1         1         1       31d
replicaset.apps/teleport-auth-74d6ddc9bf    0         0         0       32d
replicaset.apps/teleport-auth-958c9d9c5     0         0         0       31d
replicaset.apps/teleport-proxy-57b4fd87b6   1         1         1       31d
replicaset.apps/teleport-proxy-6f6878c945   0         0         0       32d
replicaset.apps/teleport-proxy-74cfd4c858   0         0         0       31d
replicaset.apps/teleport-proxy-7d8f98d77d   0         0         0       32d

4. 관리자 계정 생성

steve@MacBookPro ~/eks/prd/teleport-cluster# k exec -it pod/teleport-auth-65d4586dc4-nhs2b -- tctl users add steve --roles=editor,access --logins=root,ubuntu,ec2-user
위 처럼 명령어를 입력하게되면 user가 생성되며 URL을 반환한다. 유효시간이 존재하는 토큰 URL로 1H이내 URL로 접속하여 초기 사용자 인증을 진행하고 로그인해야한다.
로그인하면 관리자가 설정해놓은 서버리스트가 보인다. 다만, 로그인 사용자가 인가된 서버리스트만 확인할 수 있고 인가 된 계정에만 접속할 수 있도록 가이드가 된다.


후기 : 오픈소스도입은 정말 많은 정보와 레퍼런스가 필요하다. 해당 툴에 대한 레퍼런스나 정보가 부족해서 의존할 곳이 Docs뿐이었는데, 많은 공부가 되었음을 느꼈다. 이 포스트에는 작성되지않았지만, DB Access와 Kubernetes Access도 가능하다. 오픈소스치고 정말 많은 기능을 지원해서 꽤나 좋은 것 같다.

profile
정리를 못하면 기록이라도 하자!!

0개의 댓글