이 가이드는 Kubernetes 클러스터에서 Machine ID 데몬 tbot
을 배포하는 방법을 보여줍니다.
이 가이드에서 설명하는 설정에서 tbot
은 Kubernetes 배포로 실행됩니다. 출력 자격 증명은 Kubernetes 비밀에 기록되며, 이는 자격 증명을 사용하는 데 필요한 포드에 마운트할 수 있습니다. tbot
은 자격 증명을 생성하는 서비스와 동일한 포드 내에서 사이드카로 실행할 수도 있지만, Kubernetes의 사이드카 지원이 제한적이므로 tbot
을 독립 실행형 배포로 실행하는 것을 권장합니다.
이 가이드에서는 tbot
이 Kubernetes API 서버에 의해 서명된 JSON 웹 토큰(JWT)을 제시하여 Teleport Auth 서비스에 자신의 신원을 증명하는 kubernetes
가입 방법을 보여줍니다. 이 JWT는 tbot
이 실행되는 서비스 계정, 포드 및 네임스페이스를 식별합니다. Teleport Auth 서비스는 JWT 서명을 Kubernetes 클러스터의 공개 서명 키와 대조하여 확인합니다.
tbot
을 Teleport 클러스터에 배포할 때는 일반적으로 kubernetes
가입 방법을 사용하는 것이 권장됩니다. 이는 대부분의 Kubernetes 클러스터에서 작동합니다. 다음 가이드에서는 이 가입 방법을 구성하는 방법을 보여줍니다.
그러나 특정 클라우드 Kubernetes 서비스에서는 kubernetes
가입 방법 대신 해당 플랫폼과 관련된 가입 방법을 사용할 수 있습니다. 이는 tbot
을 Kubernetes 클러스터 내에서 관리하고 일반 VM과 동일한 플랫폼에서 단일 가입 토큰으로 tbot
을 관리하려고 할 경우 유익할 수 있습니다. 이러한 서비스는 다음과 같습니다:
- Google Kubernetes Engine: 클러스터에 GCP Workload Identity가 구성된 경우,
gcp
가입 방법을 사용할 수 있습니다. 자세한 내용은 GCP 플랫폼 가이드를 참조하십시오. - AWS Elastic Kubernetes Service: 클러스터에 IAM Roles for Service Accounts (IRSA)가 구성된 경우,
iam
가입 방법을 사용할 수 있습니다. 자세한 내용은 AWS 플랫폼 가이드를 참조하십시오.
필수 조건
-
실행 중인 Teleport 클러스터 버전 이상. Teleport를 시작하려면, 가입하기 위해 무료 평가판에 등록하거나 데모 환경 설정하기를 참조하세요.
-
tctl
관리 도구와tsh
클라이언트 도구.tctl
과tsh
다운로드에 대한 지침은 설치를 방문하세요.
- 당신의 Teleport 클러스터에 연결할 수 있는지 확인하려면,
tsh login
으로 로그인한 다음 현재 자격 증명을 사용하여tctl
명령어를 실행할 수 있는지 확인하십시오. 예를 들어:클러스터에 연결하고tsh login --proxy=teleport.example.com --user=email@example.comtctl status클러스터 teleport.example.com
버전 16.2.0
CA 핀 sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678
tctl status
명령어를 실행할 수 있다면, 현재 자격 증명을 사용하여 작업대에서 후속tctl
명령어를 실행할 수 있습니다. 자신의 Teleport 클러스터를 호스팅하는 경우, Teleport 인증 서비스를 호스팅하는 컴퓨터에서 전체 권한으로tctl
명령어를 실행할 수도 있습니다. - Token Request Projection을 지원하는 Kubernetes 클러스터(Kubernetes 1.20에서 일반 사용 가능 기능으로 졸업).
kubectl
이tbot
을 배포할 클러스터 내에서 자원을 생성할 수 있도록 인증되었습니다.
이 가이드의 예제에서는 Kubernetes 클러스터의 default
네임스페이스에 tbot
배포를 설치합니다. default
에 대한 참조는 사용하려는 네임스페이스로 조정하십시오.
1단계/5. Kubernetes RBAC 준비
Machine ID를 위해 Kubernetes 클러스터를 준비하려면 여러 Kubernetes RBAC 리소스를 생성해야 합니다.
ServiceAccount가 생성되어 나중에 tbot
을 실행할 포드에 할당됩니다. 이는 Teleport 클러스터에 가입할 수 있도록 허용할 수 있는 정적 신원을 생성하며, Kubernetes 권한을 할당할 수 있는 신원을 제공합니다.
Namespace 내 비밀을 읽고 쓸 수 있는 권한을 부여하는 Role이 생성된 후 ServiceAccount에 RoleBinding을 사용하여 할당됩니다. 이를 통해 tbot
포드가 비밀에 자격 증명을 읽고 쓸 수 있습니다.
k8s-rbac.yaml
이라는 파일을 생성하십시오:
# 이 ServiceAccount는 `tbot` 포드에 명확한 신원을 제공합니다.
# 이는 Teleport Auth Server에 의해 검증될 수 있습니다.
apiVersion: v1
kind: ServiceAccount
metadata:
name: tbot
namespace: default
---
# 이 역할은 네임스페이스 내 비밀을 관리할 수 있는 권한을 부여합니다.
# 이는 `kubernetes_secret` 대상을 올바르게 작동시키기 위해 필수적입니다.
#
# 민감한 환경에서는 액세스를 더욱 제한하기 위해 역할에 `resourceNames` 필드를 추가할 수 있습니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: secrets-admin
namespace: default
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["*"]
---
# 역할을 tbot에 대해 생성된 서비스 계정에 바인딩합니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: tbot-secrets-admin
namespace: default
subjects:
- kind: ServiceAccount
name: tbot
roleRef:
kind: Role
name: secrets-admin
apiGroup: rbac.authorization.k8s.io
이 파일을 Kubernetes 클러스터에 적용하십시오:
kubectl apply -f ./k8s-rbac.yaml
2단계/5. Bot 생성
다음으로, 봇을 생성해야 합니다. 봇은 기계 또는 기계 그룹에 대한 Teleport 아이덴티티입니다. 사용자와 마찬가지로, 봇은 액세스할 수 있는 내용을 정의하는 일련의 역할과 특성을 가지고 있습니다.
bot.yaml
을 생성하세요:
kind: bot
version: v1
metadata:
# name은 클러스터 내에서 봇의 고유 식별자입니다.
name: example
spec:
# roles는 봇에 부여할 역할의 목록입니다. 여기에 어떤 역할을 지정해야 할지 모르는 경우 걱정하지 마세요.
# Access Guides가 이미 생성된 봇에 역할을 생성하고 할당하는 방법을 안내해 드립니다.
roles: []
example
을 봇에 대한 고유하고 설명적인 이름으로 교체하는 것을 잊지 마세요.
이 파일을 적용하려면 tctl
을 사용하세요:
tctl create bot.yaml
3단계/5. 가입 토큰 생성
다음으로, 가입 토큰을 구성해야 합니다. 이는 tbot
이 클러스터에 가입하는 데 사용됩니다. kubernetes
가입 방법이 사용되므로, 먼저 Kubernetes 클러스터의 공개 키를 확인해야 합니다. JWT 서명에 사용되는 공개 키는 Kubernetes API 서버의 "JWKS" 엔드포인트에 노출됩니다. 이 공개 키는 Teleport Auth가 tbot
이 제시하는 서비스 계정 JWT가 Kubernetes 클러스터에 의해 합법적으로 서명되었는지 확인하는 데 사용될 수 있습니다.
다음 명령을 실행하여 JWKS 형식의 공개 키를 확인하십시오:
kubectl proxy -p 8080curl http://localhost:8080/openid/v1/jwks{"keys":[--snip--]}%
bot-token.yaml
을 생성하고, JWKS 엔드포인트에서 가져온 값을 spec.kubernetes.static_jwks.jwks
에 삽입하십시오:
kind: token
version: v2
metadata:
# 이름은 `tbot`이 이 토큰을 사용하도록 지정됩니다.
name: example-bot
spec:
roles: [Bot]
# bot_name은 이 가이드에서 이전에 생성한 봇의 이름과 일치해야 합니다.
bot_name: example
join_method: kubernetes
kubernetes:
# static_jwks는 Auth Server가 `tbot`이 제시하는 JWT를 검증하기 위해
# 고정 구성된 JWKS의 공개 키를 사용하도록 설정합니다.
type: static_jwks
static_jwks:
jwks: |
# curl 명령으로 반환된 데이터를 여기에 배치하십시오
{"keys":[--snip--]}
# allow는 Auth Server가 `tbot`의 가입 여부를 결정하는 규칙을 지정합니다.
allow:
- service_account: "default:tbot" # service_account
tctl
을 사용하여 이 파일을 적용하십시오:
tctl create -f bot-token.yaml
4단계/5. tbot
배포 생성
먼저, tbot
의 구성 파일을 포함하는 ConfigMap이 생성됩니다. 이는 포드에 마운트됩니다.
k8s-deployment-config.yaml
을 생성하고, 이전에 생성한 토큰의 이름으로 token
의 값을 교체하고 proxy_server
의 값을 Teleport Proxy 서비스의 주소로 교체하십시오:
apiVersion: v1
kind: ConfigMap
metadata:
name: tbot-config
namespace: default
data:
tbot.yaml: |
version: v2
onboarding:
join_method: kubernetes
# 토큰은 이전에 생성한 가입 토큰의 이름으로 설정해야 합니다.
token: bot-kubernetes
storage:
# Kubernetes 가입 방법은 지속성이 필요하지 않기 때문에
# 봇의 자체 상태를 위한 메모리 대상을 사용합니다.
type: memory
# 이 설정은 Teleport Proxy 서비스의 주소로 구성되어야 합니다.
proxy_server: example.teleport.sh:443
# outputs는 액세스 가이드 완료 중에 채워집니다.
outputs: []
이 파일을 Kubernetes 클러스터에 적용하십시오:
kubectl apply -f k8s-deployment-config.yaml
ConfigMap이 생성되었으므로 이제 tbot
배포 자체를 생성할 수 있습니다.
k8s-deployment.yaml
을 생성하십시오:
apiVersion: apps/v1
kind: Deployment
metadata:
name: tbot
namespace: default
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app.kubernetes.io/name: tbot
template:
metadata:
labels:
app.kubernetes.io/name: tbot
spec:
containers:
- name: tbot
image: public.ecr.aws/gravitational/tbot-distroless:16.2.0
args:
- start
- -c
- /config/tbot.yaml
env:
# POD_NAMESPACE는 `kubernetes_secret` 목적지 유형이 올바르게 작동하기 위해 필요합니다.
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
# KUBERNETES_TOKEN_PATH는 가입에 사용할 서비스 계정 JWT의 경로를 지정합니다.
# 이 경로는 볼륨 및 volumeMount의 구성에 따라 달라집니다.
- name: KUBERNETES_TOKEN_PATH
value: /var/run/secrets/tokens/join-sa-token
# TELEPORT_ANONYMOUS_TELEMETRY는 익명 사용량 원격 제출을 활성화합니다.
# 이는 `tbot`의 향후 개발 방향을 결정하는 데 도움이 됩니다.
# 이를 생략하여 비활성화할 수 있습니다.
- name: TELEPORT_ANONYMOUS_TELEMETRY
value: "1"
volumeMounts:
- mountPath: /config
name: config
- mountPath: /var/run/secrets/tokens
name: join-sa-token
serviceAccountName: tbot
volumes:
- name: config
configMap:
name: tbot-config
- name: join-sa-token
projected:
sources:
- serviceAccountToken:
path: join-sa-token
# 600초는 Kubernetes가 지원하는 최소 시간입니다.
# 이 값을 사용하는 것이 권장됩니다.
expirationSeconds: 600
# `example.teleport.sh`는 귀하의 Teleport 클러스터 이름으로 대체해야 합니다.
audience: example.teleport.sh
example.teleport.sh
를 Teleport 클러스터의 이름으로 교체하십시오 - 이는 반드시 공개 주소일 필요는 없습니다(포트는 포함되지 않아야 합니다).
이것은 예시 매니페스트입니다. 클러스터에 배포할 때 관례에 맞게 변경하는 것을 고려하십시오(예: 레이블 사용자 정의).
기본 tbot-distroless
이미지는 FIPS 준수 바이너리를 포함하지 않습니다. FIPS 준수가 요구되는 환경에서 운영하는 경우, 대신 tbot-fips-distroless
이미지를 사용하십시오.
이 파일을 Kubernetes 클러스터에 적용하십시오:
kubectl apply -f ./k8s-deployment.yaml
kubectl
을 사용하여 배포가 정상인지 확인하십시오:
kubectl describe deployment/tbotkubectl logs deployment/tbot
이 작업이 완료되면 tbot
이 클러스터에 성공적으로 배포되었습니다. 그러나 아직 유용한 출력을 생성하지 않고 있습니다.
5단계/5. 출력 구성
액세스 가이드 중 하나를 따라 액세스 요구에 맞는 출력을 구성하십시오.
Kubernetes와 잘 작동하도록 액세스 가이드 조정을 위해 Kubernetes 비밀 목적지 유형을 사용하십시오. 이는 생성된 아티팩트를 지정된 Kubernetes 비밀에 작성합니다. 예를 들어:
outputs:
- type: identity
destination:
type: kubernetes_secret
name: identity-output
출력은 다음 포드 내에서 이 비밀을 마운트하여 사용할 수 있습니다:
apiVersion: v1
kind: Pod
metadata:
name: tsh
namespace: default
spec:
containers:
- name: tsh
image: public.ecr.aws/gravitational/teleport-distroless:16.2.0
command:
- tsh
args:
- -i
- /identity-output/identity
- --proxy
- example.teleport.sh:443
- ls
volumeMounts:
- name: identity-output
mountPath: /identity-output
volumes:
- name: identity-output
secret:
secretName: identity-output
다음 단계
- 액세스 가이드를 따라 귀하의 환경에 맞게
tbot
구성을 마무리하십시오. - 구성 참조를 읽고 모든 사용 가능한 구성 옵션을 탐색하십시오.
TELEPORT_ANONYMOUS_TELEMETRY
에 대한 자세한 정보.