InfoGrab Docs

Kubernetes ServiceAccount 토큰으로 서비스 조인

요약

이 가이드에서는 Kubernetes 조인 방법을 사용하여 Auth Service와 동일한 Kubernetes 클러스터에서 실행 중일 때 시크릿을 공유하지 않고 Teleport 서비스가 Teleport 클러스터에 조인하도록 구성하는 방법을 설명합니다.

이 가이드에서는 Kubernetes 조인 방법을 사용하여 Auth Service와 동일한 Kubernetes 클러스터에서 실행 중일 때 시크릿을 공유하지 않고 Teleport 서비스가 Teleport 클러스터에 조인하도록 구성하는 방법을 설명합니다.

작동 방식#

Teleport 서비스가 클러스터의 일부가 되려면 인증서를 받기 전에 Teleport Auth Service에 자신의 신원을 증명해야 합니다. Kubernetes는 각 파드가 어떤 Kubernetes ServiceAccount를 사용할 수 있는지 설명하는 서명된 증명을 발급합니다. Kubernetes 조인 방법을 사용할 때 Teleport는 이 Kubernetes 증명을 사용하여 클러스터의 일부가 됩니다.

Warning

Kubernetes 조인 방법은 조인하는 서비스가 Auth Service와 동일한 Kubernetes 클러스터에서 실행되어야 하므로 Teleport Enterprise Cloud에서는 사용할 수 없습니다.

Kubernetes 조인 방법은 Teleport의 셀프 호스팅 버전에서 사용 가능합니다. Auth Service와 동일한 Kubernetes 클러스터에서 실행 중인 모든 Teleport 서비스의 조인을 지원합니다.

사전 요구 사항#

  • Kubernetes에서 실행 중인 Teleport 클러스터. 설정 방법에 대한 자세한 내용은 Helm을 사용한 Teleport 실행 가이드를 참조하세요.
  • Teleport 클러스터를 실행하는 Kubernetes 클러스터에 대한 편집 권한. Namespace와 Deployment를 생성할 수 있어야 합니다.
  • access 역할 또는 app: demo-app 레이블이 있는 애플리케이션에 대한 접근을 허용하는 다른 역할을 가진 Teleport 사용자
  • Teleport editor 역할 또는 기존 Teleport Auth Service 파드에 kubectl exec를 실행할 수 있는 권한.
  • Auth Service ServiceAccount에는 system:auth-delegator ClusterRole이 부여되어야 합니다. teleport-cluster Helm 차트로 배포된 클러스터는 기본적으로 올바른 역할을 가지고 있습니다.

1단계/5단계. Kubernetes 조인 토큰 생성#

Kubernetes 클러스터에 호스팅된 Teleport 서비스가 Teleport 클러스터에 조인할 수 있도록 조인 토큰(프로비전 토큰이라고도 함)으로 Teleport Auth Service를 구성합니다.

내부적으로 Teleport 인스턴스는 Kubernetes 조인 토큰에 구성된 allow 규칙과 일치하는 서명된 ServiceAccount 토큰을 전송하여 동일한 Kubernetes 클러스터에서 실행 중임을 Auth Service에 증명합니다.

Teleport 서비스가 실행 중인 Kubernetes 네임스페이스와 Kubernetes ServiceAccount를 지정하는 allow 규칙을 포함하여 다음 내용으로 token.yaml 파일을 생성합니다.

# token.yaml
kind: token
version: v2
metadata:
  # The token name is not a secret as the Kubernetes join method relies on the
  # Kubernetes signature to establish trust and not on the join token name.
  name: kubernetes-token
  # set a long expiry time, the default for tokens is only 30 minutes
  expires: "2050-01-01T00:00:00Z"
spec:
  # Use the minimal set of system roles required.
  roles: [App]

  # set the join method allowed for this token
  join_method: kubernetes
  
  kubernetes:
    # If type is not specified, it defaults to in_cluster
    type: in_cluster
    allow:
      # Service account names follow the format "namespace:serviceaccountname".
      - service_account: "teleport-agent:teleport-app-service"

Kubernetes 조인 토큰은 Auth Service를 제외한 Proxy Service 및 SSH Service와 같은 모든 Teleport 서비스에서 사용할 수 있습니다. 이 가이드에서는 토큰을 Application Service 인스턴스 조인으로 제한합니다.

모든 것을 조인할 수 있는 단일 토큰을 사용하는 것은 권장되지 않습니다. 조인하는 인스턴스에서 사용하는 역할로 토큰을 제한해야 합니다. 예를 들어, Application Service와 Database Service를 모두 실행하는 Teleport 인스턴스는 roles: [App, Db]가 포함된 토큰을 사용해야 합니다. Auth Service 파드에 대한 관리자 접근 권한 여부에 따라 토큰을 생성하는 방법에 대한 지침을 따르세요:

토큰을 생성합니다:

$ tctl create token.yaml

마지막으로 토큰이 생성되었는지 확인합니다:

$ tctl get token/kubernetes-token

kind: token
metadata:
  expires: "3000-01-01T00:00:00Z"
  name: kubernetes-token
spec:
  join_method: kubernetes
  roles:
  - App
version: v2

Auth Service 배포의 이름과 네임스페이스를 가져옵니다:

$ kubectl get namespaces
NAME              STATUS   AGE
cert-manager      Active   40d
default           Active   40d
kube-system       Active   40d
teleport          Active   40d

# "teleport" 네임스페이스에서 배포를 확인합니다
$ kubectl get deployments -n teleport
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
teleport-auth    2/2     2            2           6d20h
teleport-proxy   2/2     2            2           6d20h

# 여기서 배포 이름은 "teleport-auth"입니다.

그런 다음 다음 명령을 실행하여 Auth Service 파드 중 하나에서 tctl create 명령을 실행합니다:

$ kubectl exec -i -n teleport deployment/teleport-auth -- tctl create < token.yaml

마지막으로 토큰이 성공적으로 생성되었는지 확인합니다:

$ kubectl exec -i -n teleport deployment/teleport-auth tctl get token/kubernetes-token

kind: token
metadata:
  expires: "3000-01-01T00:00:00Z"
  name: kubernetes-token
spec:
  join_method: kubernetes
  roles:
  - App
version: v2

2단계/5단계. 데모 HTTP 앱 배포#

이 단계에서는 데모 HTTP 애플리케이션을 배포하고 공개적으로 노출하지 않습니다. 대신 Kubernetes 조인 방법을 사용하여 Teleport에 등록할 Teleport Application Service로 이 애플리케이션에 대한 접근을 관리합니다.

$ kubectl create namespace demo-app
namespace/demo-app created

$ kubectl create deployment --image=nginx --namespace demo-app --port=80 demo-app
deployment.apps/demo-app created

$ kubectl expose deployment demo-app -n demo-app --port=80 --target-port=80 --selector='app=demo-app'
service/demo-app exposed

다음 명령으로 애플리케이션 파드가 실행 중이고 준비되었는지 확인합니다:

$ kubectl get pods -n demo-app
NAME                        READY   STATUS    RESTARTS   AGE
demo-app-7664d59cb8-bv888   1/1     Running   0          67s

3단계/5단계. Application Service 구성#

다음 내용으로 values.yaml 파일을 생성하여 Application Service를 실행하는 Teleport 인스턴스를 배포하도록 teleport-kube-agent 차트를 구성합니다:

# values.yaml

# 포트가 포함된 Teleport 클러스터의 공개 주소.
# 플레이스홀더를 프록시 주소로 교체해야 합니다.
proxyAddr: "teleport.example.com:443"

# `teleport-kube-agent` 차트가 실행해야 하는 서비스의 쉼표로 구분된 목록
# (지원되는 값: kube,db,app,discovery)
# 이 가이드에서는 앱 접근만 배포합니다.
# 여기에 더 많은 서비스를 추가하려면 1단계에서 생성한 프로비전 토큰에 역할도 추가해야 합니다.
roles: app

joinParams:
  method: "kubernetes"
  # 1단계에서 생성한 프로비전 토큰과 일치해야 합니다.
  tokenName: "kubernetes-token"

apps:
  - name: demo-app
    uri: "http://demo-app.demo-app.svc.cluster.local:80"

4단계/5단계. Application Service 배포#

1단계에서 생성한 토큰을 사용하려면, 조인하는 인스턴스가 Auth Service와 동일한 Kubernetes 클러스터에서 실행되고 Kubernetes ServiceAccount 토큰이 마운트되어 있어야 합니다. 이 섹션에서 설치할 teleport-kube-agent 차트가 기본적으로 이를 처리합니다.

다음 명령을 실행하여 Teleport Application Service를 배포합니다:

$ helm install teleport-app-service teleport/teleport-kube-agent -n teleport-agent --create-namespace -f values.yaml

그런 다음 몇 초 후에 파드가 실행 중인지 확인합니다:

$ kubectl get pods -n teleport-agent
NAME                  READY   STATUS    RESTARTS   AGE
teleport-app-service-0   1/1     Running   0          23s

마지막으로 Teleport Web UI에서 애플리케이션을 볼 수 있는지 또는 명령줄을 사용하여 확인합니다:

$ tsh apps ls
Application Description Type Public Address       Labels
----------- ----------- ---- -------------------- -------------------
demo-app                HTTP teleport.example.com teleport.dev/origin

5단계/5단계. 정리#

teleport-app-service Helm 릴리즈를 제거하고 demo-appteleport-agent 네임스페이스를 모두 삭제합니다.

$ helm delete -n teleport-agent teleport-app-service
release "teleport-app-service" uninstalled

$ kubectl delete namespaces demo-app teleport-agent
namespace "demo-app" deleted
namespace "teleport-agent" deleted

더 나아가기#

Kubernetes ServiceAccount 토큰으로 서비스 조인

원문 보기
요약

이 가이드에서는 Kubernetes 조인 방법을 사용하여 Auth Service와 동일한 Kubernetes 클러스터에서 실행 중일 때 시크릿을 공유하지 않고 Teleport 서비스가 Teleport 클러스터에 조인하도록 구성하는 방법을 설명합니다.

이 가이드에서는 Kubernetes 조인 방법을 사용하여 Auth Service와 동일한 Kubernetes 클러스터에서 실행 중일 때 시크릿을 공유하지 않고 Teleport 서비스가 Teleport 클러스터에 조인하도록 구성하는 방법을 설명합니다.

작동 방식#

Teleport 서비스가 클러스터의 일부가 되려면 인증서를 받기 전에 Teleport Auth Service에 자신의 신원을 증명해야 합니다. Kubernetes는 각 파드가 어떤 Kubernetes ServiceAccount를 사용할 수 있는지 설명하는 서명된 증명을 발급합니다. Kubernetes 조인 방법을 사용할 때 Teleport는 이 Kubernetes 증명을 사용하여 클러스터의 일부가 됩니다.

Warning

Kubernetes 조인 방법은 조인하는 서비스가 Auth Service와 동일한 Kubernetes 클러스터에서 실행되어야 하므로 Teleport Enterprise Cloud에서는 사용할 수 없습니다.

Kubernetes 조인 방법은 Teleport의 셀프 호스팅 버전에서 사용 가능합니다. Auth Service와 동일한 Kubernetes 클러스터에서 실행 중인 모든 Teleport 서비스의 조인을 지원합니다.

사전 요구 사항#

  • Kubernetes에서 실행 중인 Teleport 클러스터. 설정 방법에 대한 자세한 내용은 Helm을 사용한 Teleport 실행 가이드를 참조하세요.
  • Teleport 클러스터를 실행하는 Kubernetes 클러스터에 대한 편집 권한. Namespace와 Deployment를 생성할 수 있어야 합니다.
  • access 역할 또는 app: demo-app 레이블이 있는 애플리케이션에 대한 접근을 허용하는 다른 역할을 가진 Teleport 사용자
  • Teleport editor 역할 또는 기존 Teleport Auth Service 파드에 kubectl exec를 실행할 수 있는 권한.
  • Auth Service ServiceAccount에는 system:auth-delegator ClusterRole이 부여되어야 합니다. teleport-cluster Helm 차트로 배포된 클러스터는 기본적으로 올바른 역할을 가지고 있습니다.

1단계/5단계. Kubernetes 조인 토큰 생성#

Kubernetes 클러스터에 호스팅된 Teleport 서비스가 Teleport 클러스터에 조인할 수 있도록 조인 토큰(프로비전 토큰이라고도 함)으로 Teleport Auth Service를 구성합니다.

내부적으로 Teleport 인스턴스는 Kubernetes 조인 토큰에 구성된 allow 규칙과 일치하는 서명된 ServiceAccount 토큰을 전송하여 동일한 Kubernetes 클러스터에서 실행 중임을 Auth Service에 증명합니다.

Teleport 서비스가 실행 중인 Kubernetes 네임스페이스와 Kubernetes ServiceAccount를 지정하는 allow 규칙을 포함하여 다음 내용으로 token.yaml 파일을 생성합니다.

# token.yaml
kind: token
version: v2
metadata:
  # The token name is not a secret as the Kubernetes join method relies on the
  # Kubernetes signature to establish trust and not on the join token name.
  name: kubernetes-token
  # set a long expiry time, the default for tokens is only 30 minutes
  expires: "2050-01-01T00:00:00Z"
spec:
  # Use the minimal set of system roles required.
  roles: [App]

  # set the join method allowed for this token
  join_method: kubernetes
  
  kubernetes:
    # If type is not specified, it defaults to in_cluster
    type: in_cluster
    allow:
      # Service account names follow the format "namespace:serviceaccountname".
      - service_account: "teleport-agent:teleport-app-service"

Kubernetes 조인 토큰은 Auth Service를 제외한 Proxy Service 및 SSH Service와 같은 모든 Teleport 서비스에서 사용할 수 있습니다. 이 가이드에서는 토큰을 Application Service 인스턴스 조인으로 제한합니다.

모든 것을 조인할 수 있는 단일 토큰을 사용하는 것은 권장되지 않습니다. 조인하는 인스턴스에서 사용하는 역할로 토큰을 제한해야 합니다. 예를 들어, Application Service와 Database Service를 모두 실행하는 Teleport 인스턴스는 roles: [App, Db]가 포함된 토큰을 사용해야 합니다. Auth Service 파드에 대한 관리자 접근 권한 여부에 따라 토큰을 생성하는 방법에 대한 지침을 따르세요:

토큰을 생성합니다:

$ tctl create token.yaml

마지막으로 토큰이 생성되었는지 확인합니다:

$ tctl get token/kubernetes-token

kind: token
metadata:
  expires: "3000-01-01T00:00:00Z"
  name: kubernetes-token
spec:
  join_method: kubernetes
  roles:
  - App
version: v2

Auth Service 배포의 이름과 네임스페이스를 가져옵니다:

$ kubectl get namespaces
NAME              STATUS   AGE
cert-manager      Active   40d
default           Active   40d
kube-system       Active   40d
teleport          Active   40d

# "teleport" 네임스페이스에서 배포를 확인합니다
$ kubectl get deployments -n teleport
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
teleport-auth    2/2     2            2           6d20h
teleport-proxy   2/2     2            2           6d20h

# 여기서 배포 이름은 "teleport-auth"입니다.

그런 다음 다음 명령을 실행하여 Auth Service 파드 중 하나에서 tctl create 명령을 실행합니다:

$ kubectl exec -i -n teleport deployment/teleport-auth -- tctl create < token.yaml

마지막으로 토큰이 성공적으로 생성되었는지 확인합니다:

$ kubectl exec -i -n teleport deployment/teleport-auth tctl get token/kubernetes-token

kind: token
metadata:
  expires: "3000-01-01T00:00:00Z"
  name: kubernetes-token
spec:
  join_method: kubernetes
  roles:
  - App
version: v2

2단계/5단계. 데모 HTTP 앱 배포#

이 단계에서는 데모 HTTP 애플리케이션을 배포하고 공개적으로 노출하지 않습니다. 대신 Kubernetes 조인 방법을 사용하여 Teleport에 등록할 Teleport Application Service로 이 애플리케이션에 대한 접근을 관리합니다.

$ kubectl create namespace demo-app
namespace/demo-app created

$ kubectl create deployment --image=nginx --namespace demo-app --port=80 demo-app
deployment.apps/demo-app created

$ kubectl expose deployment demo-app -n demo-app --port=80 --target-port=80 --selector='app=demo-app'
service/demo-app exposed

다음 명령으로 애플리케이션 파드가 실행 중이고 준비되었는지 확인합니다:

$ kubectl get pods -n demo-app
NAME                        READY   STATUS    RESTARTS   AGE
demo-app-7664d59cb8-bv888   1/1     Running   0          67s

3단계/5단계. Application Service 구성#

다음 내용으로 values.yaml 파일을 생성하여 Application Service를 실행하는 Teleport 인스턴스를 배포하도록 teleport-kube-agent 차트를 구성합니다:

# values.yaml

# 포트가 포함된 Teleport 클러스터의 공개 주소.
# 플레이스홀더를 프록시 주소로 교체해야 합니다.
proxyAddr: "teleport.example.com:443"

# `teleport-kube-agent` 차트가 실행해야 하는 서비스의 쉼표로 구분된 목록
# (지원되는 값: kube,db,app,discovery)
# 이 가이드에서는 앱 접근만 배포합니다.
# 여기에 더 많은 서비스를 추가하려면 1단계에서 생성한 프로비전 토큰에 역할도 추가해야 합니다.
roles: app

joinParams:
  method: "kubernetes"
  # 1단계에서 생성한 프로비전 토큰과 일치해야 합니다.
  tokenName: "kubernetes-token"

apps:
  - name: demo-app
    uri: "http://demo-app.demo-app.svc.cluster.local:80"

4단계/5단계. Application Service 배포#

1단계에서 생성한 토큰을 사용하려면, 조인하는 인스턴스가 Auth Service와 동일한 Kubernetes 클러스터에서 실행되고 Kubernetes ServiceAccount 토큰이 마운트되어 있어야 합니다. 이 섹션에서 설치할 teleport-kube-agent 차트가 기본적으로 이를 처리합니다.

다음 명령을 실행하여 Teleport Application Service를 배포합니다:

$ helm install teleport-app-service teleport/teleport-kube-agent -n teleport-agent --create-namespace -f values.yaml

그런 다음 몇 초 후에 파드가 실행 중인지 확인합니다:

$ kubectl get pods -n teleport-agent
NAME                  READY   STATUS    RESTARTS   AGE
teleport-app-service-0   1/1     Running   0          23s

마지막으로 Teleport Web UI에서 애플리케이션을 볼 수 있는지 또는 명령줄을 사용하여 확인합니다:

$ tsh apps ls
Application Description Type Public Address       Labels
----------- ----------- ---- -------------------- -------------------
demo-app                HTTP teleport.example.com teleport.dev/origin

5단계/5단계. 정리#

teleport-app-service Helm 릴리즈를 제거하고 demo-appteleport-agent 네임스페이스를 모두 삭제합니다.

$ helm delete -n teleport-agent teleport-app-service
release "teleport-app-service" uninstalled

$ kubectl delete namespaces demo-app teleport-agent
namespace "demo-app" deleted
namespace "teleport-agent" deleted

더 나아가기#