InfoGrab DocsInfoGrab Docs

동적 Kubernetes 클러스터 등록

요약

동적 Kubernetes 클러스터 등록을 사용하면 개별 Kubernetes 서비스 인스턴스의 구성 파일을 수정하지 않고도 Teleport 클러스터에 연결된 Kubernetes 클러스터를 관리할 수 있습니다. 동적 Kubernetes 클러스터 등록은 여러 Kubernetes 서비스 인스턴스를 배포했거나 인프라의 Kubernetes 클러스터에 대한 접근을 정기적으로 재구성해야 할 때 유용합니다.

동적 Kubernetes 클러스터 등록을 사용하면 개별 Kubernetes 서비스 인스턴스의 구성 파일을 수정하지 않고도 Teleport 클러스터에 연결된 Kubernetes 클러스터를 관리할 수 있습니다.

동적 Kubernetes 클러스터 등록은 여러 Kubernetes 서비스 인스턴스를 배포했거나 인프라의 Kubernetes 클러스터에 대한 접근을 정기적으로 재구성해야 할 때 유용합니다.

이 가이드에서는 동적 Kubernetes 클러스터 등록을 설정하는 방법을 보여주고, tctl을 통해 Kubernetes 클러스터를 생성, 나열, 업데이트, 삭제하는 방법을 안내합니다.

작동 방식#

Teleport Kubernetes 서비스는 Teleport 사용자의 트래픽을 Kubernetes API 서버로 프록시하여 Kubernetes에 대한 접근을 관리하기 위해 패스워드 없는 인증, 역할 기반 접근 제어, 감사 로깅 및 기타 Teleport 기능을 활용할 수 있게 합니다.

이 단계에서는 Linux 호스트에 Teleport Kubernetes 서비스를 설치하고 Teleport 클러스터에 등록한 Kubernetes 클러스터에 접근하도록 구성합니다.

사전 요구사항#

  • 실행 중인 Teleport 클러스터. Teleport를 시작하려면 무료 체험판에 가입하거나 데모 환경을 구성하세요.

  • tctl and tsh clients.

    Installing `tctl` and `tsh` clients
    1. Teleport 클러스터의 버전을 확인합니다. tctl and tsh clients는 Teleport 클러스터 버전보다 최대 한 개의 메이저 버전까지만 뒤처질 수 있습니다. Proxy Service의 /v1/webapi/find로 GET 요청을 보내고 JSON 쿼리 도구를 사용하여 클러스터 버전을 확인합니다. teleport.example.com:443를 Teleport Proxy Service의 웹 주소로 바꿉니다:

      $ TELEPORT_DOMAIN=teleport.example.com:443
      $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')"
      
    2. 사용 중인 플랫폼에 대한 지침에 따라 tctl and tsh clients를 설치합니다:

Mac

     `tctl` and `tsh` clients가 포함된, 서명된 Teleport macOS .pkg 설치 프로그램을 다운로드합니다:
 
     ```code
     $ curl -O https://cdn.teleport.dev/teleport-${TELEPORT_VERSION?}.pkg
     ```

     Finder에서 `pkg` 파일을 더블 클릭하여 설치를 시작합니다.
 
     
Warning
       Homebrew를 사용하여 Teleport를 설치하는 것은 지원되지 않습니다. Homebrew의
       Teleport 패키지는 Teleport에서 유지 관리하지 않으므로 신뢰성이나 보안을
       보장할 수 없습니다.
     

Windows - Powershell

     ```code
     $ curl.exe -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-windows-amd64-bin.zip
     # Unzip the archive and move the `tctl` and `tsh` clients to your %PATH%
     # NOTE: Do not place the `tctl` and `tsh` clients in the System32 directory, as this can cause issues when using WinSCP.
     # Use %SystemRoot% (C:\Windows) or %USERPROFILE% (C:\Users\<username>) instead.
     ```
 
   

 
   

Linux

     Linux 설치판의 모든 Teleport 바이너리에는 `tctl` and `tsh` clients가 포함되어 있습니다.  RPM/DEB
     패키지 및 i386/ARM/ARM64용 다운로드를 포함한 더 많은 옵션은
     [설치 페이지](../installation/installation.mdx)를 참조하세요.
 
     ```code
     $ curl -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
     $ tar -xzf teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
     $ cd teleport
     $ sudo ./install
     # Teleport binaries have been copied to /usr/local/bin
     ```
   

 
  • Teleport Kubernetes 서비스를 설치할 Linux 호스트.

    Tip

teleport-kube-agent Helm 차트는 동적 Kubernetes 클러스터 등록을 지원하지 않습니다.

Teleport cluster에 연결할 수 있는지 확인하려면 tsh login으로 로그인한 다음, 현재 자격 증명으로 tctl 명령을 실행할 수 있는지 확인합니다.

예를 들어, teleport.example.com에 cluster 내 Teleport Proxy Service의 도메인 이름을, email@example.com에 Teleport 사용자 이름을 지정하여 다음 명령을 실행합니다:

$ tsh login --proxy=teleport.example.com --user=email@example.com
$ tctl status
# Cluster  (=teleport.url=)
# Version  (=teleport.version=)
# CA pin   (=presets.ca_pin=)

cluster에 연결하여 tctl status 명령을 실행할 수 있다면, 현재 자격 증명을 사용하여 워크스테이션에서 이후의 tctl 명령을 실행할 수 있습니다. 자체 Teleport cluster를 호스팅하는 경우, 전체 권한을 얻기 위해 Teleport Auth Service를 호스팅하는 컴퓨터에서 tctl 명령을 실행할 수도 있습니다.

1/3단계. Teleport Kubernetes 서비스 설정#

이 단계에서는 Linux 서버에 Teleport Kubernetes 서비스를 설치하는 방법을 보여줍니다.

조인 토큰 얻기#

조인 토큰을 생성하여 Teleport 클러스터와 새 Kubernetes 서비스 인스턴스 간의 신뢰를 설정합니다:

$ tctl tokens add --type=kube --ttl=1h --format=text
(=presets.tokens.first=)

토큰을 복사하여 Teleport Kubernetes 서비스를 실행할 때 사용할 수 있도록 안전한 곳에 보관합니다.

Teleport Kubernetes 서비스 설치#

Linux 호스트에 Teleport Kubernetes 서비스를 설치합니다:

Linux 서버에 Teleport Agent를 설치하려면:

권장 설치 방법은 클러스터 설치 스크립트입니다. 이 스크립트는 클러스터에 맞는 올바른 버전, 에디션, 설치 모드를 선택합니다.

  1. teleport.example.com:443에 Teleport 클러스터의 호스트명과 포트를 할당하되, 스킴(https://)은 포함하지 마십시오.

  2. 클러스터의 설치 스크립트를 실행하십시오:

    $ curl "https://teleport.example.com:443/scripts/install.sh" | sudo bash
    

Teleport Kubernetes 서비스 구성#

Teleport Kubernetes 서비스를 실행할 호스트에서 다음 명령을 실행하여 Teleport 인스턴스의 기본 구성을 생성합니다. example.teleport.sh:443에 Teleport Proxy 서비스 또는 Teleport Cloud 테넌트의 호스트와 포트를 할당하고 join-token에 앞에서 생성한 조인 토큰을 할당합니다:

$ sudo teleport configure \
--proxy=example.teleport.sh:443 \
--roles=kube \
--token=join-token \
-o file

/etc/teleport.yaml의 구성 파일을 편집하여 다음을 포함합니다:

kubernetes_service:
  enabled: true
  resources:
  - labels:
      "*": "*"

이 구성은 Teleport 클러스터에 등록한 모든 Kubernetes 클러스터에 연결하도록 Kubernetes 서비스 인스턴스를 활성화합니다. resources[0].labels 필드에 와일드카드 패턴("*": "*")이 포함되어 있어 이 Kubernetes 서비스 인스턴스가 레이블 키나 값에 관계없이 모든 Kubernetes 클러스터 리소스에 연결할 수 있기 때문입니다.

Kubernetes 클러스터를 선택적으로 감시하기

와일드카드 문자 대신 특정 레이블 키와 값을 포함하여 특정 Kubernetes 클러스터 하위 집합을 감시하도록 Kubernetes 서비스 인스턴스를 구성할 수 있습니다:

resources:
- labels:
    "env": "prod"
    "region": "us-east-2"
- labels:
    "env": "test"
    "region": "us-west-1"

Kubernetes 서비스가 클러스터를 등록하려면 resources의 항목 중 어느 하나라도 클러스터의 레이블과 일치해야 합니다. resources의 항목이 일치하려면 해당 항목 내의 모든 labels 항목이 클러스터의 레이블과 일치해야 합니다.

예를 들어, env:prodregion:us-west-1 레이블을 가진 클러스터는 첫 번째 resources 항목의 env:prod 레이블만 일치하고 두 번째 resources 항목의 region:us-west-1 레이블만 일치하기 때문에 위 구성과 일치하지 않습니다.

그러나 env:testregion:us-west-1을 가진 클러스터는 두 번째 resources 항목에 주어진 두 레이블 모두 일치하기 때문에 일치합니다.

이 가이드의 뒷부분에서 동적 Kubernetes 클러스터 리소스를 생성할 때, 특정 Kubernetes 서비스 인스턴스만이 이를 감시하도록 레이블을 할당할 수 있습니다.

Teleport Kubernetes 서비스 실행#

systemd 서비스를 생성하여 호스트가 부팅될 때 the Teleport Kubernetes Service이 자동으로 시작되도록 구성합니다. 지침은 the Teleport Kubernetes Service을 어떻게 설치했는지에 따라 다릅니다.

Package Manager

the Teleport Kubernetes Service을 실행할 호스트에서 Teleport를 활성화하고 시작합니다:

$ sudo systemctl enable teleport
$ sudo systemctl start teleport

TAR Archive

the Teleport Kubernetes Service을 실행할 호스트에서 Teleport용 systemd 서비스 구성을 생성하고, Teleport 서비스를 활성화한 후 Teleport를 시작합니다:

$ sudo teleport install systemd -o /etc/systemd/system/teleport.service
$ sudo systemctl enable teleport
$ sudo systemctl start teleport

systemctl status teleport로 the Teleport Kubernetes Service의 상태를 확인하고 journalctl -fu teleport로 로그를 볼 수 있습니다.

2/3단계. 사용자 권한 부여#

Teleport에서 동적 Kubernetes 클러스터 등록을 활성화하려면 Teleport에 등록하려는 Kubernetes 클러스터에 접근할 수 있도록 사용자를 권한 부여해야 합니다. 이 단계에서 Teleport와 Kubernetes 클러스터 모두에서 이 접근을 구성합니다.

Kubernetes 클러스터에 대한 접근 허용#

접근을 활성화하려는 클러스터에 대한 올바른 Kubernetes 컨텍스트에 있는지 확인합니다.

사용 가능한 모든 컨텍스트를 검색합니다:

$ kubectl config get-contexts

CONTEXT_NAME을 선택한 컨텍스트 이름으로 바꿔 컨텍스트를 전환합니다:

$ kubectl config use-context CONTEXT_NAME
Switched to context CONTEXT_NAME

Teleport를 통해 Kubernetes 클러스터에 인증하려면, Teleport 사용자의 역할이 최소한 하나의 Kubernetes 사용자 또는 그룹으로 접근할 수 있도록 허용해야 합니다.

  1. 현재 사용자의 Teleport 역할 목록을 조회합니다. 아래 예제는 JSON 파싱을 위해 jq 유틸리티가 필요합니다.

    $ CURRENT_ROLES=$(tsh status -f json | jq -r '.active.roles | join ("\n")')
    
  2. 역할이 접근을 허용하는 Kubernetes 그룹을 조회합니다.

    $ echo "$CURRENT_ROLES" | xargs -I{} tctl get roles/{} --format json | \
      jq '.[0].spec.allow.kubernetes_groups[]?'
    
  3. 역할이 접근을 허용하는 Kubernetes 사용자를 조회합니다.

    $ echo "$CURRENT_ROLES" | xargs -I{} tctl get roles/{} --format json | \
      jq '.[0].spec.allow.kubernetes_users[]?'
    
  4. 앞의 두 명령 중 하나의 출력이 비어 있지 않다면, 사용자가 최소한 하나의 Kubernetes 사용자 또는 그룹에 접근할 수 있으므로 다음 단계로 진행할 수 있습니다.

  5. 두 목록이 모두 비어 있다면, 이 가이드를 위한 목적으로 클러스터의 Kubernetes 리소스를 볼 수 있는 Teleport 역할을 생성합니다.

    다음 내용으로 kube-access.yaml 파일을 생성합니다.

    kind: role
    metadata:
      name: kube-access
    version: v7
    spec:
      allow:
        kubernetes_labels:
          '*': '*'
        kubernetes_resources:
          - kind: '*'
            namespace: '*'
            name: '*'
            verbs: ['*']
        kubernetes_groups:
        - viewers
      deny: {}
    
  6. 변경 사항을 적용합니다.

    $ tctl create -f kube-access.yaml
    
Tip

Web UI를 사용하여 역할을 생성하고 편집할 수도 있습니다. Access -> Roles로 이동하여 Create New Role을 클릭하거나 편집할 기존 역할을 선택하십시오.

인증 공급자에 맞는 적절한 명령을 실행하여 kube-access 역할을 your Teleport user에게 할당하십시오:

Local User

  1. 로컬 사용자의 역할을 쉼표로 구분된 목록으로 가져옵니다:

    $ ROLES=$(tsh status -f json | jq -r '.active.roles | join(",")')
    
  2. 로컬 사용자를 편집하여 새 역할을 추가합니다:

    $ tctl users update $(tsh status -f json | jq -r '.active.username') \
      --set-roles "${ROLES?},kube-access"
    
  3. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

GitHub

  1. 텍스트 편집기에서 github 인증 커넥터를 엽니다:

    $ tctl edit github/github
    
  2. github 커넥터를 편집하여 teams_to_roles 섹션에 kube-access을 추가합니다.

    이 역할에 매핑해야 할 팀은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 팀은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 팀이어야 합니다.

    다음은 예시입니다:

      teams_to_roles:
        - organization: octocats
          team: admins
          roles:
            - access
    +       - kube-access
    
  3. 편집기에서 파일을 저장하고 닫아 변경 사항을 적용합니다.

  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

SAML

  1. saml 구성 리소스를 가져옵니다:

    $ tctl get --with-secrets saml/mysaml > saml.yaml
    

    --with-secrets 플래그는 spec.signing_key_pair.private_key 값을 saml.yaml 파일에 추가한다는 점에 유의하십시오. 이 키에는 민감한 값이 포함되어 있으므로, 리소스를 업데이트한 직후 saml.yaml 파일을 삭제해야 합니다.

  2. saml.yaml을 편집하여 attributes_to_roles 섹션에 kube-access을 추가합니다.

    이 역할에 매핑해야 할 속성은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 그룹은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 그룹이어야 합니다.

    다음은 예시입니다:

      attributes_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - kube-access
    
  3. 변경 사항을 적용합니다:

    $ tctl create -f saml.yaml
    
  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

OIDC

  1. oidc 구성 리소스를 가져옵니다:

    $ tctl get oidc/myoidc --with-secrets > oidc.yaml
    

    --with-secrets 플래그는 spec.signing_key_pair.private_key 값을 oidc.yaml 파일에 추가한다는 점에 유의하십시오. 이 키에는 민감한 값이 포함되어 있으므로, 리소스를 업데이트한 직후 oidc.yaml 파일을 삭제해야 합니다.

  2. oidc.yaml을 편집하여 claims_to_roles 섹션에 kube-access을 추가합니다.

    이 역할에 매핑해야 할 클레임은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 그룹은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 그룹이어야 합니다.

    다음은 예시입니다:

      claims_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - kube-access
    
  3. 변경 사항을 적용합니다:

    $ tctl create -f oidc.yaml
    
  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

  5. Kubernetes 클러스터에서 viewers 그룹이 내장 view ClusterRole을 갖도록 구성합니다. Teleport 사용자가 kube-access 역할을 맡아 Kubernetes API 서버로 요청을 보내면, Teleport Kubernetes Service가 viewers 그룹을 가장(impersonate)하여 요청을 프록시합니다.

    다음 내용으로 viewers-bind.yaml 파일을 생성하여, 내장 view ClusterRole을 Teleport 사용자가 접근할 수 있도록 활성화한 viewers 그룹에 바인딩합니다.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: viewers-crb
    subjects:
    - kind: Group
      # Bind the group "viewers", corresponding to the kubernetes_groups we assigned our "kube-access" role above
      name: viewers
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      # "view" is a default ClusterRole that grants read-only access to resources
      # See: https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles
      name: view
      apiGroup: rbac.authorization.k8s.io
    
  6. kubectlClusterRoleBinding을 적용합니다.

    $ kubectl apply -f viewers-bind.yaml
    

Kubernetes 클러스터 관리 권한 부여#

Teleport는 동적 kube_cluster 리소스를 통해 인프라의 Kubernetes 클러스터를 추적합니다. Teleport로 Kubernetes 클러스터에 대한 접근을 관리하려면 사용자에게 이러한 리소스를 관리할 수 있는 권한이 필요합니다.

이전 섹션에서 Teleport 클러스터에 등록된 모든 Kubernetes 클러스터에 접근할 수 있도록 사용자를 권한 부여했습니다. 이제 이 클러스터에 접근할 수 있으므로 관리할 수 있는 역할을 생성합니다.

다음 내용으로 kube-manager.yaml이라는 역할 정의를 생성합니다:

kind: role
metadata:
  name: kube-manager
spec:
  allow:
    rules:
    - resources:
      - kube_cluster
      verbs:
      - list
      - create
      - read
      - update
      - delete
version: v5

역할을 생성합니다:

$ tctl create -f kube-manager.yaml
Tip

Web UI를 사용하여 역할을 생성하고 편집할 수도 있습니다. Access -> Roles로 이동하여 Create New Role을 클릭하거나 편집할 기존 역할을 선택하십시오.

인증 공급자에 맞는 적절한 명령을 실행하여 kube-manager 역할을 your Teleport user에게 할당하십시오:

Local User

  1. 로컬 사용자의 역할을 쉼표로 구분된 목록으로 가져옵니다:

    $ ROLES=$(tsh status -f json | jq -r '.active.roles | join(",")')
    
  2. 로컬 사용자를 편집하여 새 역할을 추가합니다:

    $ tctl users update $(tsh status -f json | jq -r '.active.username') \
      --set-roles "${ROLES?},kube-manager"
    
  3. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

GitHub

  1. 텍스트 편집기에서 github 인증 커넥터를 엽니다:

    $ tctl edit github/github
    
  2. github 커넥터를 편집하여 teams_to_roles 섹션에 kube-manager을 추가합니다.

    이 역할에 매핑해야 할 팀은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 팀은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 팀이어야 합니다.

    다음은 예시입니다:

      teams_to_roles:
        - organization: octocats
          team: admins
          roles:
            - access
    +       - kube-manager
    
  3. 편집기에서 파일을 저장하고 닫아 변경 사항을 적용합니다.

  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

SAML

  1. saml 구성 리소스를 가져옵니다:

    $ tctl get --with-secrets saml/mysaml > saml.yaml
    

    --with-secrets 플래그는 spec.signing_key_pair.private_key 값을 saml.yaml 파일에 추가한다는 점에 유의하십시오. 이 키에는 민감한 값이 포함되어 있으므로, 리소스를 업데이트한 직후 saml.yaml 파일을 삭제해야 합니다.

  2. saml.yaml을 편집하여 attributes_to_roles 섹션에 kube-manager을 추가합니다.

    이 역할에 매핑해야 할 속성은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 그룹은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 그룹이어야 합니다.

    다음은 예시입니다:

      attributes_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - kube-manager
    
  3. 변경 사항을 적용합니다:

    $ tctl create -f saml.yaml
    
  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

OIDC

  1. oidc 구성 리소스를 가져옵니다:

    $ tctl get oidc/myoidc --with-secrets > oidc.yaml
    

    --with-secrets 플래그는 spec.signing_key_pair.private_key 값을 oidc.yaml 파일에 추가한다는 점에 유의하십시오. 이 키에는 민감한 값이 포함되어 있으므로, 리소스를 업데이트한 직후 oidc.yaml 파일을 삭제해야 합니다.

  2. oidc.yaml을 편집하여 claims_to_roles 섹션에 kube-manager을 추가합니다.

    이 역할에 매핑해야 할 클레임은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 그룹은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 그룹이어야 합니다.

    다음은 예시입니다:

      claims_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - kube-manager
    
  3. 변경 사항을 적용합니다:

    $ tctl create -f oidc.yaml
    
  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

3/3단계. 동적 Kubernetes 클러스터 리소스 관리#

이제 Teleport 사용자에게 Kubernetes 클러스터 리소스를 관리할 권한이 있으므로, 리소스를 생성, 나열, 업데이트, 삭제하는 방법을 보여드립니다.

kubeconfig 생성#

이 섹션에서는 Teleport 클러스터가 Kubernetes 클러스터에 인증하는 데 사용할 Kubernetes Config 리소스(kubeconfig)를 생성합니다.

이 가이드의 앞부분에서 Teleport에 로그인했을 때, tsh가 Teleport 클러스터를 기반으로 한 Kubernetes 컨텍스트로 변경했을 수 있으므로, Teleport에 연결하려는 클러스터와 일치하도록 Kubernetes 컨텍스트를 업데이트해야 합니다:

$ kubectl config get-contexts
# CONTEXT_NAME을 선택한 컨텍스트에 할당합니다
$ kubectl config use-context CONTEXT_NAME

워크스테이션에서 kubeconfig를 생성하는 데 사용할 Teleport의 get-kubeconfig.sh 스크립트를 다운로드합니다:

$ curl -OL \
https://raw.githubusercontent.com/gravitational/teleport/v(=teleport.version=)/examples/k8s-auth/get-kubeconfig.sh

이 스크립트는 Kubernetes 파드를 가져오고 사용자, 그룹 및 기타 서비스 계정을 가장(impersonate)할 수 있는 Teleport Kubernetes 서비스용 서비스 계정을 생성합니다. Teleport Kubernetes 서비스는 이 서비스 계정을 사용하여 Kubernetes 클러스터의 리소스에 대한 접근을 관리합니다. 또한 스크립트는 서비스 계정 자격 증명을 저장하기 위해 클러스터에 Kubernetes Secret이 있는지 확인합니다.

get-kubeconfig.sh는 배포하는 리소스를 위해 teleport라는 네임스페이스를 생성하지만, 스크립트를 실행하는 셸에서 TELEPORT_NAMESPACE 환경 변수를 할당하여 다른 이름을 선택할 수 있습니다.

리소스를 생성한 후 get-kubeconfig.sh는 스크립트를 실행한 디렉터리의 kubeconfig라는 파일에 새 kubeconfig를 작성합니다.

get-kubeconfig.sh 스크립트를 실행합니다:

$ bash get-kubeconfig.sh

스크립트가 성공적이면 이 메시지가 표시됩니다:

Done!

생성된 kubeconfig 파일을 Teleport Proxy 서비스에 복사하라는 스크립트의 지시를 무시하세요. 다음 섹션에서 동적 kube_cluster 리소스를 생성할 때 kubeconfig 파일을 사용하는 방법을 보여드립니다.

Kubernetes 클러스터 리소스 생성#

kube_cluster.yaml이라는 파일에 다음 내용으로 kube_cluster 리소스를 정의합니다:

kind: kube_cluster
version: v3
metadata:
  name: mycluster
spec:
  kubeconfig: |

위 스니펫의 spec.kubeconfig 필드는 여러 줄 문자열을 시작합니다. 아래에 kubeconfig 파일의 내용을 그 값으로 포함합니다.

spec.kubeconfig는 base64로 인코딩된 문자열이어야 하므로, kubeconfig 파일을 base64로 변환한 다음 들여쓰기하고 다음 명령을 사용하여 kube_cluster.yaml 리소스 정의에 추가합니다:

$ printf "    %s" $(cat kubeconfig | base64) >> kube_cluster.yaml
kube_cluster에 레이블 추가하기

kube_cluster 리소스에 레이블을 추가하여 Teleport 역할이나 Kubernetes 서비스 인스턴스에서 특정 클러스터에 대한 접근을 관리할 수 있습니다.

레이블은 정적이거나 동적일 수 있습니다. 정적 레이블은 키/값 쌍입니다. 이 예제는 env=prodteam=dev 레이블을 정의합니다:

kind: kube_cluster
version: v3
metadata:
  name: mycluster
  labels:
    env: prod
    team: dev
spec:
  kubeconfig: KUBECONFIG

동적 레이블을 추가할 수도 있는데, 이는 Kubernetes 서비스 인스턴스가 레이블을 생성하기 위해 실행할 셸 명령을 정의합니다. 이렇게 하려면 kube_cluster 리소스의 spec.dynamic_labels 필드를 편집합니다.

이 예제는 python3 get_region.py 명령을 실행하여 Kubernetes 서비스가 배포된 지역을 가져오고 결과를 region 키에 할당합니다:

kind: kube_cluster
version: v3
metadata:
  name: mycluster
spec:
  kubeconfig: KUBECONFIG
  dynamic_labels:
    region:
      period: "24h"
      command: ["python3", "get_region.py"]

동적 레이블을 정의할 때 spec.dynamic_labels 필드 내의 키는 metadata.labels 필드 내의 키와 동일하게 동작하여 레이블의 키를 나타냅니다.

Kubernetes 서비스는 command에 주어진 명령을 period마다 실행하여 해당 키의 값을 얻습니다. command는 문자열 배열로 첫 번째 요소는 실행할 명령을, 이후 각 요소는 인수를 나타냅니다.

period는 숫자와 시간 단위를 포함하는 Go 지속 시간 문자열입니다. 지원되는 단위는 ns, us(또는 µs), ms, s, m, h입니다. 위 예제는 매일 명령을 실행하도록 Kubernetes 서비스를 구성합니다.

kube_cluster 리소스를 생성하려면 다음 명령을 실행합니다:

$ tctl create kube_cluster.yaml
kubernetes cluster "mycluster" has been created

새 Kubernetes 클러스터 접근#

Teleport Kubernetes 서비스 인스턴스는 새로 생성되거나 업데이트된 kube_cluster 리소스를 감시합니다. kube_cluster 리소스를 생성하면 해당 클러스터의 레이블을 추적하도록 구성된 Kubernetes 서비스 인스턴스가 해당 클러스터를 등록하고 Teleport를 통해 접근할 수 있게 합니다.

결과적으로 tsh kube ls를 실행하면 위에서 등록한 클러스터가 표시되어야 합니다:

$ tsh kube ls
 Kube Cluster Name Labels                      Selected
 ----------------- --------------------------- --------
 mycluster         teleport.dev/origin=dynamic

teleport.dev/origin=dynamic 레이블은 클러스터가 동적으로 등록되었음을 나타냅니다.

방금 등록한 클러스터에 로그인할 수도 있습니다:

$ tsh kube login mycluster
Logged into kubernetes cluster "mycluster". Try 'kubectl version' to test the
connection.

Kubernetes 클러스터 리소스 나열#

다음 명령으로 kube_cluster 리소스를 나열할 수 있습니다:

$ tctl get kube_clusters

Kubernetes 클러스터 리소스 업데이트#

앞에서 생성한 kube_cluster 리소스를 업데이트하려면 다음 명령을 실행하여 Auth 서비스의 백엔드에 존재하는 리소스를 텍스트 편집기에서 엽니다:

$ tctl edit kube_clusters/mycluster

kube_cluster에 레이블을 추가하도록 리소스를 편집합니다:

  kind: kube_cluster
  metadata:
    id: 9999999999999999999
    labels:
      teleport.dev/origin: dynamic
+     env: test
    name: mycluster
  spec:
    aws: {}
    azure: {}
    kubeconfig: KUBECONFIG
  version: v3

편집기에서 파일을 저장하고 닫아 변경사항을 적용합니다.

업데이트된 레이블이 표시되어야 합니다:

$ tsh kube ls
 Kube Cluster Name Labels                               Selected
 ----------------- ------------------------------------ --------
 mycluster         env=test teleport.dev/origin=dynamic *
Warning

업데이트된 kube_cluster 리소스의 레이블이 더 이상 Teleport Kubernetes 서비스 인스턴스가 감시하도록 구성된 레이블과 일치하지 않으면, 해당 인스턴스가 등록을 해제하고 Kubernetes 클러스터 프록시를 중지합니다.

Kubernetes 클러스터 리소스 삭제#

앞에서 생성한 kube_cluster 리소스를 삭제하려면 다음 명령을 실행합니다:

$ tctl rm kube_clusters/mycluster
kubernetes cluster "mycluster" has been deleted

이렇게 하면 Teleport에서 Kubernetes 클러스터 등록이 해제됩니다:

$ tsh kube ls
Kube Cluster Name Labels Selected
----------------- ------ --------

다음 단계#

이 가이드에서는 tctl을 사용하여 kube_cluster 리소스를 관리하는 방법을 보여드렸습니다. Teleport를 통해 Kubernetes 클러스터에 대한 접근을 관리하는 다른 방법에 관심이 있다면 다음 가이드를 확인하세요:

동적 Kubernetes 클러스터 등록

Teleport v18.9
원문 보기
요약

동적 Kubernetes 클러스터 등록을 사용하면 개별 Kubernetes 서비스 인스턴스의 구성 파일을 수정하지 않고도 Teleport 클러스터에 연결된 Kubernetes 클러스터를 관리할 수 있습니다. 동적 Kubernetes 클러스터 등록은 여러 Kubernetes 서비스 인스턴스를 배포했거나 인프라의 Kubernetes 클러스터에 대한 접근을 정기적으로 재구성해야 할 때 유용합니다.

동적 Kubernetes 클러스터 등록을 사용하면 개별 Kubernetes 서비스 인스턴스의 구성 파일을 수정하지 않고도 Teleport 클러스터에 연결된 Kubernetes 클러스터를 관리할 수 있습니다.

동적 Kubernetes 클러스터 등록은 여러 Kubernetes 서비스 인스턴스를 배포했거나 인프라의 Kubernetes 클러스터에 대한 접근을 정기적으로 재구성해야 할 때 유용합니다.

이 가이드에서는 동적 Kubernetes 클러스터 등록을 설정하는 방법을 보여주고, tctl을 통해 Kubernetes 클러스터를 생성, 나열, 업데이트, 삭제하는 방법을 안내합니다.

작동 방식#

Teleport Kubernetes 서비스는 Teleport 사용자의 트래픽을 Kubernetes API 서버로 프록시하여 Kubernetes에 대한 접근을 관리하기 위해 패스워드 없는 인증, 역할 기반 접근 제어, 감사 로깅 및 기타 Teleport 기능을 활용할 수 있게 합니다.

이 단계에서는 Linux 호스트에 Teleport Kubernetes 서비스를 설치하고 Teleport 클러스터에 등록한 Kubernetes 클러스터에 접근하도록 구성합니다.

사전 요구사항#

  • 실행 중인 Teleport 클러스터. Teleport를 시작하려면 무료 체험판에 가입하거나 데모 환경을 구성하세요.

  • tctl and tsh clients.

    Installing `tctl` and `tsh` clients
    1. Teleport 클러스터의 버전을 확인합니다. tctl and tsh clients는 Teleport 클러스터 버전보다 최대 한 개의 메이저 버전까지만 뒤처질 수 있습니다. Proxy Service의 /v1/webapi/find로 GET 요청을 보내고 JSON 쿼리 도구를 사용하여 클러스터 버전을 확인합니다. teleport.example.com:443를 Teleport Proxy Service의 웹 주소로 바꿉니다:

      $ TELEPORT_DOMAIN=teleport.example.com:443
      $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')"
      
    2. 사용 중인 플랫폼에 대한 지침에 따라 tctl and tsh clients를 설치합니다:

Mac

     `tctl` and `tsh` clients가 포함된, 서명된 Teleport macOS .pkg 설치 프로그램을 다운로드합니다:
 
     ```code
     $ curl -O https://cdn.teleport.dev/teleport-${TELEPORT_VERSION?}.pkg
     ```

     Finder에서 `pkg` 파일을 더블 클릭하여 설치를 시작합니다.
 
     
Warning
       Homebrew를 사용하여 Teleport를 설치하는 것은 지원되지 않습니다. Homebrew의
       Teleport 패키지는 Teleport에서 유지 관리하지 않으므로 신뢰성이나 보안을
       보장할 수 없습니다.
     

Windows - Powershell

     ```code
     $ curl.exe -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-windows-amd64-bin.zip
     # Unzip the archive and move the `tctl` and `tsh` clients to your %PATH%
     # NOTE: Do not place the `tctl` and `tsh` clients in the System32 directory, as this can cause issues when using WinSCP.
     # Use %SystemRoot% (C:\Windows) or %USERPROFILE% (C:\Users\<username>) instead.
     ```
 
   

 
   

Linux

     Linux 설치판의 모든 Teleport 바이너리에는 `tctl` and `tsh` clients가 포함되어 있습니다.  RPM/DEB
     패키지 및 i386/ARM/ARM64용 다운로드를 포함한 더 많은 옵션은
     [설치 페이지](../installation/installation.mdx)를 참조하세요.
 
     ```code
     $ curl -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
     $ tar -xzf teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
     $ cd teleport
     $ sudo ./install
     # Teleport binaries have been copied to /usr/local/bin
     ```
   

 
  • Teleport Kubernetes 서비스를 설치할 Linux 호스트.

    Tip

teleport-kube-agent Helm 차트는 동적 Kubernetes 클러스터 등록을 지원하지 않습니다.

Teleport cluster에 연결할 수 있는지 확인하려면 tsh login으로 로그인한 다음, 현재 자격 증명으로 tctl 명령을 실행할 수 있는지 확인합니다.

예를 들어, teleport.example.com에 cluster 내 Teleport Proxy Service의 도메인 이름을, email@example.com에 Teleport 사용자 이름을 지정하여 다음 명령을 실행합니다:

$ tsh login --proxy=teleport.example.com --user=email@example.com
$ tctl status
# Cluster  (=teleport.url=)
# Version  (=teleport.version=)
# CA pin   (=presets.ca_pin=)

cluster에 연결하여 tctl status 명령을 실행할 수 있다면, 현재 자격 증명을 사용하여 워크스테이션에서 이후의 tctl 명령을 실행할 수 있습니다. 자체 Teleport cluster를 호스팅하는 경우, 전체 권한을 얻기 위해 Teleport Auth Service를 호스팅하는 컴퓨터에서 tctl 명령을 실행할 수도 있습니다.

1/3단계. Teleport Kubernetes 서비스 설정#

이 단계에서는 Linux 서버에 Teleport Kubernetes 서비스를 설치하는 방법을 보여줍니다.

조인 토큰 얻기#

조인 토큰을 생성하여 Teleport 클러스터와 새 Kubernetes 서비스 인스턴스 간의 신뢰를 설정합니다:

$ tctl tokens add --type=kube --ttl=1h --format=text
(=presets.tokens.first=)

토큰을 복사하여 Teleport Kubernetes 서비스를 실행할 때 사용할 수 있도록 안전한 곳에 보관합니다.

Teleport Kubernetes 서비스 설치#

Linux 호스트에 Teleport Kubernetes 서비스를 설치합니다:

Linux 서버에 Teleport Agent를 설치하려면:

권장 설치 방법은 클러스터 설치 스크립트입니다. 이 스크립트는 클러스터에 맞는 올바른 버전, 에디션, 설치 모드를 선택합니다.

  1. teleport.example.com:443에 Teleport 클러스터의 호스트명과 포트를 할당하되, 스킴(https://)은 포함하지 마십시오.

  2. 클러스터의 설치 스크립트를 실행하십시오:

    $ curl "https://teleport.example.com:443/scripts/install.sh" | sudo bash
    

Teleport Kubernetes 서비스 구성#

Teleport Kubernetes 서비스를 실행할 호스트에서 다음 명령을 실행하여 Teleport 인스턴스의 기본 구성을 생성합니다. example.teleport.sh:443에 Teleport Proxy 서비스 또는 Teleport Cloud 테넌트의 호스트와 포트를 할당하고 join-token에 앞에서 생성한 조인 토큰을 할당합니다:

$ sudo teleport configure \
--proxy=example.teleport.sh:443 \
--roles=kube \
--token=join-token \
-o file

/etc/teleport.yaml의 구성 파일을 편집하여 다음을 포함합니다:

kubernetes_service:
  enabled: true
  resources:
  - labels:
      "*": "*"

이 구성은 Teleport 클러스터에 등록한 모든 Kubernetes 클러스터에 연결하도록 Kubernetes 서비스 인스턴스를 활성화합니다. resources[0].labels 필드에 와일드카드 패턴("*": "*")이 포함되어 있어 이 Kubernetes 서비스 인스턴스가 레이블 키나 값에 관계없이 모든 Kubernetes 클러스터 리소스에 연결할 수 있기 때문입니다.

Kubernetes 클러스터를 선택적으로 감시하기

와일드카드 문자 대신 특정 레이블 키와 값을 포함하여 특정 Kubernetes 클러스터 하위 집합을 감시하도록 Kubernetes 서비스 인스턴스를 구성할 수 있습니다:

resources:
- labels:
    "env": "prod"
    "region": "us-east-2"
- labels:
    "env": "test"
    "region": "us-west-1"

Kubernetes 서비스가 클러스터를 등록하려면 resources의 항목 중 어느 하나라도 클러스터의 레이블과 일치해야 합니다. resources의 항목이 일치하려면 해당 항목 내의 모든 labels 항목이 클러스터의 레이블과 일치해야 합니다.

예를 들어, env:prodregion:us-west-1 레이블을 가진 클러스터는 첫 번째 resources 항목의 env:prod 레이블만 일치하고 두 번째 resources 항목의 region:us-west-1 레이블만 일치하기 때문에 위 구성과 일치하지 않습니다.

그러나 env:testregion:us-west-1을 가진 클러스터는 두 번째 resources 항목에 주어진 두 레이블 모두 일치하기 때문에 일치합니다.

이 가이드의 뒷부분에서 동적 Kubernetes 클러스터 리소스를 생성할 때, 특정 Kubernetes 서비스 인스턴스만이 이를 감시하도록 레이블을 할당할 수 있습니다.

Teleport Kubernetes 서비스 실행#

systemd 서비스를 생성하여 호스트가 부팅될 때 the Teleport Kubernetes Service이 자동으로 시작되도록 구성합니다. 지침은 the Teleport Kubernetes Service을 어떻게 설치했는지에 따라 다릅니다.

Package Manager

the Teleport Kubernetes Service을 실행할 호스트에서 Teleport를 활성화하고 시작합니다:

$ sudo systemctl enable teleport
$ sudo systemctl start teleport

TAR Archive

the Teleport Kubernetes Service을 실행할 호스트에서 Teleport용 systemd 서비스 구성을 생성하고, Teleport 서비스를 활성화한 후 Teleport를 시작합니다:

$ sudo teleport install systemd -o /etc/systemd/system/teleport.service
$ sudo systemctl enable teleport
$ sudo systemctl start teleport

systemctl status teleport로 the Teleport Kubernetes Service의 상태를 확인하고 journalctl -fu teleport로 로그를 볼 수 있습니다.

2/3단계. 사용자 권한 부여#

Teleport에서 동적 Kubernetes 클러스터 등록을 활성화하려면 Teleport에 등록하려는 Kubernetes 클러스터에 접근할 수 있도록 사용자를 권한 부여해야 합니다. 이 단계에서 Teleport와 Kubernetes 클러스터 모두에서 이 접근을 구성합니다.

Kubernetes 클러스터에 대한 접근 허용#

접근을 활성화하려는 클러스터에 대한 올바른 Kubernetes 컨텍스트에 있는지 확인합니다.

사용 가능한 모든 컨텍스트를 검색합니다:

$ kubectl config get-contexts

CONTEXT_NAME을 선택한 컨텍스트 이름으로 바꿔 컨텍스트를 전환합니다:

$ kubectl config use-context CONTEXT_NAME
Switched to context CONTEXT_NAME

Teleport를 통해 Kubernetes 클러스터에 인증하려면, Teleport 사용자의 역할이 최소한 하나의 Kubernetes 사용자 또는 그룹으로 접근할 수 있도록 허용해야 합니다.

  1. 현재 사용자의 Teleport 역할 목록을 조회합니다. 아래 예제는 JSON 파싱을 위해 jq 유틸리티가 필요합니다.

    $ CURRENT_ROLES=$(tsh status -f json | jq -r '.active.roles | join ("\n")')
    
  2. 역할이 접근을 허용하는 Kubernetes 그룹을 조회합니다.

    $ echo "$CURRENT_ROLES" | xargs -I{} tctl get roles/{} --format json | \
      jq '.[0].spec.allow.kubernetes_groups[]?'
    
  3. 역할이 접근을 허용하는 Kubernetes 사용자를 조회합니다.

    $ echo "$CURRENT_ROLES" | xargs -I{} tctl get roles/{} --format json | \
      jq '.[0].spec.allow.kubernetes_users[]?'
    
  4. 앞의 두 명령 중 하나의 출력이 비어 있지 않다면, 사용자가 최소한 하나의 Kubernetes 사용자 또는 그룹에 접근할 수 있으므로 다음 단계로 진행할 수 있습니다.

  5. 두 목록이 모두 비어 있다면, 이 가이드를 위한 목적으로 클러스터의 Kubernetes 리소스를 볼 수 있는 Teleport 역할을 생성합니다.

    다음 내용으로 kube-access.yaml 파일을 생성합니다.

    kind: role
    metadata:
      name: kube-access
    version: v7
    spec:
      allow:
        kubernetes_labels:
          '*': '*'
        kubernetes_resources:
          - kind: '*'
            namespace: '*'
            name: '*'
            verbs: ['*']
        kubernetes_groups:
        - viewers
      deny: {}
    
  6. 변경 사항을 적용합니다.

    $ tctl create -f kube-access.yaml
    
Tip

Web UI를 사용하여 역할을 생성하고 편집할 수도 있습니다. Access -> Roles로 이동하여 Create New Role을 클릭하거나 편집할 기존 역할을 선택하십시오.

인증 공급자에 맞는 적절한 명령을 실행하여 kube-access 역할을 your Teleport user에게 할당하십시오:

Local User

  1. 로컬 사용자의 역할을 쉼표로 구분된 목록으로 가져옵니다:

    $ ROLES=$(tsh status -f json | jq -r '.active.roles | join(",")')
    
  2. 로컬 사용자를 편집하여 새 역할을 추가합니다:

    $ tctl users update $(tsh status -f json | jq -r '.active.username') \
      --set-roles "${ROLES?},kube-access"
    
  3. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

GitHub

  1. 텍스트 편집기에서 github 인증 커넥터를 엽니다:

    $ tctl edit github/github
    
  2. github 커넥터를 편집하여 teams_to_roles 섹션에 kube-access을 추가합니다.

    이 역할에 매핑해야 할 팀은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 팀은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 팀이어야 합니다.

    다음은 예시입니다:

      teams_to_roles:
        - organization: octocats
          team: admins
          roles:
            - access
    +       - kube-access
    
  3. 편집기에서 파일을 저장하고 닫아 변경 사항을 적용합니다.

  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

SAML

  1. saml 구성 리소스를 가져옵니다:

    $ tctl get --with-secrets saml/mysaml > saml.yaml
    

    --with-secrets 플래그는 spec.signing_key_pair.private_key 값을 saml.yaml 파일에 추가한다는 점에 유의하십시오. 이 키에는 민감한 값이 포함되어 있으므로, 리소스를 업데이트한 직후 saml.yaml 파일을 삭제해야 합니다.

  2. saml.yaml을 편집하여 attributes_to_roles 섹션에 kube-access을 추가합니다.

    이 역할에 매핑해야 할 속성은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 그룹은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 그룹이어야 합니다.

    다음은 예시입니다:

      attributes_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - kube-access
    
  3. 변경 사항을 적용합니다:

    $ tctl create -f saml.yaml
    
  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

OIDC

  1. oidc 구성 리소스를 가져옵니다:

    $ tctl get oidc/myoidc --with-secrets > oidc.yaml
    

    --with-secrets 플래그는 spec.signing_key_pair.private_key 값을 oidc.yaml 파일에 추가한다는 점에 유의하십시오. 이 키에는 민감한 값이 포함되어 있으므로, 리소스를 업데이트한 직후 oidc.yaml 파일을 삭제해야 합니다.

  2. oidc.yaml을 편집하여 claims_to_roles 섹션에 kube-access을 추가합니다.

    이 역할에 매핑해야 할 클레임은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 그룹은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 그룹이어야 합니다.

    다음은 예시입니다:

      claims_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - kube-access
    
  3. 변경 사항을 적용합니다:

    $ tctl create -f oidc.yaml
    
  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

  5. Kubernetes 클러스터에서 viewers 그룹이 내장 view ClusterRole을 갖도록 구성합니다. Teleport 사용자가 kube-access 역할을 맡아 Kubernetes API 서버로 요청을 보내면, Teleport Kubernetes Service가 viewers 그룹을 가장(impersonate)하여 요청을 프록시합니다.

    다음 내용으로 viewers-bind.yaml 파일을 생성하여, 내장 view ClusterRole을 Teleport 사용자가 접근할 수 있도록 활성화한 viewers 그룹에 바인딩합니다.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: viewers-crb
    subjects:
    - kind: Group
      # Bind the group "viewers", corresponding to the kubernetes_groups we assigned our "kube-access" role above
      name: viewers
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      # "view" is a default ClusterRole that grants read-only access to resources
      # See: https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles
      name: view
      apiGroup: rbac.authorization.k8s.io
    
  6. kubectlClusterRoleBinding을 적용합니다.

    $ kubectl apply -f viewers-bind.yaml
    

Kubernetes 클러스터 관리 권한 부여#

Teleport는 동적 kube_cluster 리소스를 통해 인프라의 Kubernetes 클러스터를 추적합니다. Teleport로 Kubernetes 클러스터에 대한 접근을 관리하려면 사용자에게 이러한 리소스를 관리할 수 있는 권한이 필요합니다.

이전 섹션에서 Teleport 클러스터에 등록된 모든 Kubernetes 클러스터에 접근할 수 있도록 사용자를 권한 부여했습니다. 이제 이 클러스터에 접근할 수 있으므로 관리할 수 있는 역할을 생성합니다.

다음 내용으로 kube-manager.yaml이라는 역할 정의를 생성합니다:

kind: role
metadata:
  name: kube-manager
spec:
  allow:
    rules:
    - resources:
      - kube_cluster
      verbs:
      - list
      - create
      - read
      - update
      - delete
version: v5

역할을 생성합니다:

$ tctl create -f kube-manager.yaml
Tip

Web UI를 사용하여 역할을 생성하고 편집할 수도 있습니다. Access -> Roles로 이동하여 Create New Role을 클릭하거나 편집할 기존 역할을 선택하십시오.

인증 공급자에 맞는 적절한 명령을 실행하여 kube-manager 역할을 your Teleport user에게 할당하십시오:

Local User

  1. 로컬 사용자의 역할을 쉼표로 구분된 목록으로 가져옵니다:

    $ ROLES=$(tsh status -f json | jq -r '.active.roles | join(",")')
    
  2. 로컬 사용자를 편집하여 새 역할을 추가합니다:

    $ tctl users update $(tsh status -f json | jq -r '.active.username') \
      --set-roles "${ROLES?},kube-manager"
    
  3. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

GitHub

  1. 텍스트 편집기에서 github 인증 커넥터를 엽니다:

    $ tctl edit github/github
    
  2. github 커넥터를 편집하여 teams_to_roles 섹션에 kube-manager을 추가합니다.

    이 역할에 매핑해야 할 팀은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 팀은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 팀이어야 합니다.

    다음은 예시입니다:

      teams_to_roles:
        - organization: octocats
          team: admins
          roles:
            - access
    +       - kube-manager
    
  3. 편집기에서 파일을 저장하고 닫아 변경 사항을 적용합니다.

  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

SAML

  1. saml 구성 리소스를 가져옵니다:

    $ tctl get --with-secrets saml/mysaml > saml.yaml
    

    --with-secrets 플래그는 spec.signing_key_pair.private_key 값을 saml.yaml 파일에 추가한다는 점에 유의하십시오. 이 키에는 민감한 값이 포함되어 있으므로, 리소스를 업데이트한 직후 saml.yaml 파일을 삭제해야 합니다.

  2. saml.yaml을 편집하여 attributes_to_roles 섹션에 kube-manager을 추가합니다.

    이 역할에 매핑해야 할 속성은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 그룹은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 그룹이어야 합니다.

    다음은 예시입니다:

      attributes_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - kube-manager
    
  3. 변경 사항을 적용합니다:

    $ tctl create -f saml.yaml
    
  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

OIDC

  1. oidc 구성 리소스를 가져옵니다:

    $ tctl get oidc/myoidc --with-secrets > oidc.yaml
    

    --with-secrets 플래그는 spec.signing_key_pair.private_key 값을 oidc.yaml 파일에 추가한다는 점에 유의하십시오. 이 키에는 민감한 값이 포함되어 있으므로, 리소스를 업데이트한 직후 oidc.yaml 파일을 삭제해야 합니다.

  2. oidc.yaml을 편집하여 claims_to_roles 섹션에 kube-manager을 추가합니다.

    이 역할에 매핑해야 할 클레임은 조직의 역할 기반 액세스 제어(RBAC)를 어떻게 설계했는지에 따라 달라집니다. 다만, 해당 그룹은 여러분의 사용자 계정을 포함해야 하며 조직 내에서 가능한 한 가장 작은 그룹이어야 합니다.

    다음은 예시입니다:

      claims_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - kube-manager
    
  3. 변경 사항을 적용합니다:

    $ tctl create -f oidc.yaml
    
  4. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

3/3단계. 동적 Kubernetes 클러스터 리소스 관리#

이제 Teleport 사용자에게 Kubernetes 클러스터 리소스를 관리할 권한이 있으므로, 리소스를 생성, 나열, 업데이트, 삭제하는 방법을 보여드립니다.

kubeconfig 생성#

이 섹션에서는 Teleport 클러스터가 Kubernetes 클러스터에 인증하는 데 사용할 Kubernetes Config 리소스(kubeconfig)를 생성합니다.

이 가이드의 앞부분에서 Teleport에 로그인했을 때, tsh가 Teleport 클러스터를 기반으로 한 Kubernetes 컨텍스트로 변경했을 수 있으므로, Teleport에 연결하려는 클러스터와 일치하도록 Kubernetes 컨텍스트를 업데이트해야 합니다:

$ kubectl config get-contexts
# CONTEXT_NAME을 선택한 컨텍스트에 할당합니다
$ kubectl config use-context CONTEXT_NAME

워크스테이션에서 kubeconfig를 생성하는 데 사용할 Teleport의 get-kubeconfig.sh 스크립트를 다운로드합니다:

$ curl -OL \
https://raw.githubusercontent.com/gravitational/teleport/v(=teleport.version=)/examples/k8s-auth/get-kubeconfig.sh

이 스크립트는 Kubernetes 파드를 가져오고 사용자, 그룹 및 기타 서비스 계정을 가장(impersonate)할 수 있는 Teleport Kubernetes 서비스용 서비스 계정을 생성합니다. Teleport Kubernetes 서비스는 이 서비스 계정을 사용하여 Kubernetes 클러스터의 리소스에 대한 접근을 관리합니다. 또한 스크립트는 서비스 계정 자격 증명을 저장하기 위해 클러스터에 Kubernetes Secret이 있는지 확인합니다.

get-kubeconfig.sh는 배포하는 리소스를 위해 teleport라는 네임스페이스를 생성하지만, 스크립트를 실행하는 셸에서 TELEPORT_NAMESPACE 환경 변수를 할당하여 다른 이름을 선택할 수 있습니다.

리소스를 생성한 후 get-kubeconfig.sh는 스크립트를 실행한 디렉터리의 kubeconfig라는 파일에 새 kubeconfig를 작성합니다.

get-kubeconfig.sh 스크립트를 실행합니다:

$ bash get-kubeconfig.sh

스크립트가 성공적이면 이 메시지가 표시됩니다:

Done!

생성된 kubeconfig 파일을 Teleport Proxy 서비스에 복사하라는 스크립트의 지시를 무시하세요. 다음 섹션에서 동적 kube_cluster 리소스를 생성할 때 kubeconfig 파일을 사용하는 방법을 보여드립니다.

Kubernetes 클러스터 리소스 생성#

kube_cluster.yaml이라는 파일에 다음 내용으로 kube_cluster 리소스를 정의합니다:

kind: kube_cluster
version: v3
metadata:
  name: mycluster
spec:
  kubeconfig: |

위 스니펫의 spec.kubeconfig 필드는 여러 줄 문자열을 시작합니다. 아래에 kubeconfig 파일의 내용을 그 값으로 포함합니다.

spec.kubeconfig는 base64로 인코딩된 문자열이어야 하므로, kubeconfig 파일을 base64로 변환한 다음 들여쓰기하고 다음 명령을 사용하여 kube_cluster.yaml 리소스 정의에 추가합니다:

$ printf "    %s" $(cat kubeconfig | base64) >> kube_cluster.yaml
kube_cluster에 레이블 추가하기

kube_cluster 리소스에 레이블을 추가하여 Teleport 역할이나 Kubernetes 서비스 인스턴스에서 특정 클러스터에 대한 접근을 관리할 수 있습니다.

레이블은 정적이거나 동적일 수 있습니다. 정적 레이블은 키/값 쌍입니다. 이 예제는 env=prodteam=dev 레이블을 정의합니다:

kind: kube_cluster
version: v3
metadata:
  name: mycluster
  labels:
    env: prod
    team: dev
spec:
  kubeconfig: KUBECONFIG

동적 레이블을 추가할 수도 있는데, 이는 Kubernetes 서비스 인스턴스가 레이블을 생성하기 위해 실행할 셸 명령을 정의합니다. 이렇게 하려면 kube_cluster 리소스의 spec.dynamic_labels 필드를 편집합니다.

이 예제는 python3 get_region.py 명령을 실행하여 Kubernetes 서비스가 배포된 지역을 가져오고 결과를 region 키에 할당합니다:

kind: kube_cluster
version: v3
metadata:
  name: mycluster
spec:
  kubeconfig: KUBECONFIG
  dynamic_labels:
    region:
      period: "24h"
      command: ["python3", "get_region.py"]

동적 레이블을 정의할 때 spec.dynamic_labels 필드 내의 키는 metadata.labels 필드 내의 키와 동일하게 동작하여 레이블의 키를 나타냅니다.

Kubernetes 서비스는 command에 주어진 명령을 period마다 실행하여 해당 키의 값을 얻습니다. command는 문자열 배열로 첫 번째 요소는 실행할 명령을, 이후 각 요소는 인수를 나타냅니다.

period는 숫자와 시간 단위를 포함하는 Go 지속 시간 문자열입니다. 지원되는 단위는 ns, us(또는 µs), ms, s, m, h입니다. 위 예제는 매일 명령을 실행하도록 Kubernetes 서비스를 구성합니다.

kube_cluster 리소스를 생성하려면 다음 명령을 실행합니다:

$ tctl create kube_cluster.yaml
kubernetes cluster "mycluster" has been created

새 Kubernetes 클러스터 접근#

Teleport Kubernetes 서비스 인스턴스는 새로 생성되거나 업데이트된 kube_cluster 리소스를 감시합니다. kube_cluster 리소스를 생성하면 해당 클러스터의 레이블을 추적하도록 구성된 Kubernetes 서비스 인스턴스가 해당 클러스터를 등록하고 Teleport를 통해 접근할 수 있게 합니다.

결과적으로 tsh kube ls를 실행하면 위에서 등록한 클러스터가 표시되어야 합니다:

$ tsh kube ls
 Kube Cluster Name Labels                      Selected
 ----------------- --------------------------- --------
 mycluster         teleport.dev/origin=dynamic

teleport.dev/origin=dynamic 레이블은 클러스터가 동적으로 등록되었음을 나타냅니다.

방금 등록한 클러스터에 로그인할 수도 있습니다:

$ tsh kube login mycluster
Logged into kubernetes cluster "mycluster". Try 'kubectl version' to test the
connection.

Kubernetes 클러스터 리소스 나열#

다음 명령으로 kube_cluster 리소스를 나열할 수 있습니다:

$ tctl get kube_clusters

Kubernetes 클러스터 리소스 업데이트#

앞에서 생성한 kube_cluster 리소스를 업데이트하려면 다음 명령을 실행하여 Auth 서비스의 백엔드에 존재하는 리소스를 텍스트 편집기에서 엽니다:

$ tctl edit kube_clusters/mycluster

kube_cluster에 레이블을 추가하도록 리소스를 편집합니다:

  kind: kube_cluster
  metadata:
    id: 9999999999999999999
    labels:
      teleport.dev/origin: dynamic
+     env: test
    name: mycluster
  spec:
    aws: {}
    azure: {}
    kubeconfig: KUBECONFIG
  version: v3

편집기에서 파일을 저장하고 닫아 변경사항을 적용합니다.

업데이트된 레이블이 표시되어야 합니다:

$ tsh kube ls
 Kube Cluster Name Labels                               Selected
 ----------------- ------------------------------------ --------
 mycluster         env=test teleport.dev/origin=dynamic *
Warning

업데이트된 kube_cluster 리소스의 레이블이 더 이상 Teleport Kubernetes 서비스 인스턴스가 감시하도록 구성된 레이블과 일치하지 않으면, 해당 인스턴스가 등록을 해제하고 Kubernetes 클러스터 프록시를 중지합니다.

Kubernetes 클러스터 리소스 삭제#

앞에서 생성한 kube_cluster 리소스를 삭제하려면 다음 명령을 실행합니다:

$ tctl rm kube_clusters/mycluster
kubernetes cluster "mycluster" has been deleted

이렇게 하면 Teleport에서 Kubernetes 클러스터 등록이 해제됩니다:

$ tsh kube ls
Kube Cluster Name Labels Selected
----------------- ------ --------

다음 단계#

이 가이드에서는 tctl을 사용하여 kube_cluster 리소스를 관리하는 방법을 보여드렸습니다. Teleport를 통해 Kubernetes 클러스터에 대한 접근을 관리하는 다른 방법에 관심이 있다면 다음 가이드를 확인하세요: