Infograb logo
Teleport AKS 자동 검색

AKS 자동 검색은 구성된 태그가 일치하는 경우 AKS 클러스터를 자동으로 검색하고 Teleport에 등록할 수 있습니다.

Teleport cluster 자동 검색에는 두 가지 구성 요소가 포함됩니다:

  1. 새로운 cluster 또는 이전에 발견된 cluster의 변경 사항을 감시하는 Teleport Discovery Service.
    발견된 각 cluster를 Teleport 클러스터의 kube_cluster 리소스로 동적으로 등록합니다.
    발견되는 cluster에 대한 연결이 필요하지 않습니다.
  2. Discovery Service에 의해 등록된 동적 kube_cluster 리소스를 모니터링하는 Teleport Kubernetes Service.
    사용자와 cluster 간의 통신을 프록시합니다.
Tip

이 가이드는 Discovery Service와 Kubernetes 서비스가 동일한 프로세스에서 실행되는 방법을 제시하지만, 두 서비스는 독립적으로 그리고 다른 머신에서 실행될 수 있습니다.

예를 들어, Kubernetes 서비스의 인스턴스를 Teleport 클러스터에 등록하려는 cluster와 동일한 개인 네트워크에서 실행할 수 있으며, Discovery Service의 인스턴스는 원하는 어떤 네트워크에서도 실행할 수 있습니다.

필수 조건

  • 실행 중인 Teleport 클러스터 버전 17.0.0-dev 이상. Teleport를 시작하려면 가입하여 무료 평가판을 이용하거나 데모 환경 설정 방법을 확인하십시오.

  • tctl 관리자 도구와 tsh 클라이언트 도구.

    tctltsh 다운로드 방법에 대한 지침은 설치를 방문하십시오.

  • AD 그룹을 생성 및 연결할 수 있는 권한을 가진 Azure ID.
  • 실행 중인 하나 이상의 AKS 클러스터.
  • AKS 클러스터에 대한 액세스.
  • Teleport Discovery 및 Kubernetes 서비스를 실행할 호스트.

1/2단계. 필요한 권한으로 Azure ID 설정

각 클러스터의 인증 및 인가 설정에 따라 Azure는 Teleport가 서버로 요청을 전달하기 위한 필요한 권한을 구성하는 다른 방식을 사용합니다.

클러스터에서 사용되는 인증 모드를 확인하고 하나 이상의 권한 시나리오를 선택하세요. 일부 구성에서는 Teleport가 필요한 권한을 포함하면 클러스터에 대한 액세스를 자동으로 구성할 수 있습니다.

이 시나리오에서는 Teleport의 인증이 Active Directory를 통해 이루어지며, Kubernetes 클러스터에 대한 액세스를 위해 필요한 권한은 해당 ID에 할당된 역할과 연결됩니다.

이 모드는 각 클러스터에 대해 특정 설정을 요구하지 않고 여러 Kubernetes 클러스터에 대한 권한을 부여할 수 있게 해줍니다.

이 설정을 사용하여 실행 중인 AKS 클러스터에 대한 액세스를 부여하려면 다음 내용을 포함하는 AD 역할을 생성하고 Teleport 프로세스에서 사용할 ID에 할당하세요.

{
  "Name": "AKS Teleport Discovery",
  "Description": "Teleport 자동 검색에 필요한 권한입니다.",
  "Actions": [
    "Microsoft.ContainerService/managedClusters/read",
    "Microsoft.ContainerService/managedClusters/listClusterUserCredential/action"
  ],
  "NotActions": [],
  "DataActions": [
    "Microsoft.ContainerService/managedClusters/groups/impersonate/action",
    "Microsoft.ContainerService/managedClusters/users/impersonate/action",
    "Microsoft.ContainerService/managedClusters/serviceaccounts/impersonate/action",
    "Microsoft.ContainerService/managedClusters/pods/read",
    "Microsoft.ContainerService/managedClusters/authorization.k8s.io/selfsubjectaccessreviews/write",
    "Microsoft.ContainerService/managedClusters/authorization.k8s.io/selfsubjectrulesreviews/write"
  ],
  "NotDataActions": [],
  "assignableScopes": ["/subscriptions/{subscription_id}"]
}

{subscription_id}을 원하는 구독 ID로 교체하거나, 모든 구독에 대한 권한을 보장하고 싶다면 와일드카드를 사용할 수 있습니다.

Azure AD 인증과 Kubernetes RBAC 모드를 사용할 경우, Azure는 AD 자격 증명을 사용하여 사용자 인증을 담당하지만, 권한 관리는 Kubernetes의 RBAC 책임입니다.

따라서 Teleport가 올바르게 작동하려면, 발견된 각 클러스터에서 Kubernetes ClusterRoleClusterRoleBinding 리소스를 만들어야 합니다. ClusterRoleBinding 은 Teleport ID에 구성된 AD 그룹 중 하나에 ClusterRole 을 바인딩해야 합니다.

Teleport는 다음 경우에 ClusterRoleClusterRoleBinding 리소스를 자동으로 생성할 수 있습니다:

  • Teleport의 AD ID가 정적 클러스터 관리자 자격 증명 (로컬 계정)에 대한 액세스 권한을 가지는 경우.
  • Teleport의 AD ID가 클러스터의 관리자 그룹에 속하는 경우.
  • Teleport의 AD ID가 클러스터에서 ClusterRoleClusterRoleBinding 을 생성할 수 있는 권한과 원격 명령 실행의 권한을 가지는 경우.

지정된 경우 중 하나라도 Teleport는 ClusterRole 을 생성하고 자신이 속하는 첫 번째 AD 그룹에 바인드할 수 있습니다. 이를 가능하게 하려면 Teleport의 ID와 함께 다음 권한을 연결하세요.

  {
      "Name": "AKS Teleport Discovery",
      "Description": "Teleport 자동 검색에 필요한 권한입니다.",
      "Actions": [
        "Microsoft.ContainerService/managedClusters/read",
        "Microsoft.ContainerService/managedClusters/listClusterAdminCredential/action",
        "Microsoft.ContainerService/managedClusters/listClusterUserCredential/action",
        "Microsoft.ContainerService/managedClusters/runcommand/action",
        "Microsoft.ContainerService/managedclusters/commandResults/read"
      ],
      "NotActions": [],
      "DataActions": [],
      "NotDataActions": [],
      "assignableScopes": [
          "/subscriptions/{subscription_id}"
      ]
  }

이외의 모든 경우에는 아래 가이드에 설명된 대로 필요한 액세스를 수동으로 설정해야 합니다.

모든 클러스터에 관리 권한으로 연결하고 kubectl 을 사용하여 다음 리소스를 생성하세요.

ClusterRole

ClusterRole RBAC 정의를 생성하여 Teleport Kubernetes 서비스가 클러스터에 요청을 전달하는 데 필요한 권한을 부여합니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: teleport
rules:
  - apiGroups:
      - ""
    resources:
      - users
      - groups
      - serviceaccounts
    verbs:
      - impersonate
  - apiGroups:
      - ""
    resources:
      - pods
    verbs:
      - get
  - apiGroups:
      - "authorization.k8s.io"
    resources:
      - selfsubjectaccessreviews
      - selfsubjectrulesreviews
    verbs:
      - create

ClusterRoleBinding

이전에 생성된 ClusterRole 을 Teleport AD 그룹 ID에 연결합니다.

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: teleport
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: teleport
subjects:
  - kind: Group
    name: { azure_ad_group_id }
    apiGroup: rbac.authorization.k8s.io

{azure_ad_group_id}를 Teleport 아이덴티티와 연결된 적절한 Azure AD 그룹 ID로 교체하십시오.

이 경우, Teleport는 클러스터의 프로비저닝 단계에서 생성된 사용자 자격 증명을 사용할 것입니다.

  {
      "Name": "AKS Teleport Discovery",
      "Description": "Teleport 자동 검색을 위한 필수 권한.",
      "Actions": [
        "Microsoft.ContainerService/managedClusters/read",
        "Microsoft.ContainerService/managedClusters/listClusterUserCredential/action",
      ],
      "NotActions": [],
      "DataActions": [],
      "NotDataActions": [],
      "assignableScopes": [
          "/subscriptions/{subscription_id}"
      ]
  }

2/2단계. Teleport를 구성하여 AKS 클러스터 발견

Teleport AKS 자동 검색에는 클러스터에 조인하기 위한 Discovery 및 Kubernetes 서비스에 유효한 인증 토큰이 필요합니다. 다음 명령을 Teleport Auth Service에 대해 실행하고 /tmp/token 에 저장하십시오:

tctl tokens add --type=discovery,kube

AKS 자동 검색을 활성화하려면 discovery_service.azure 섹션에 최소한 하나의 항목이 포함되어야 하고, discovery_service.azure.typesaks 가 포함되어야 합니다. 또한 kubernetes_service.resources.tagsdiscovery_service.azure.tags 에서 구성된 동일한 레이블이나 그 하위 집합을 사용하도록 구성해야 하며, 이를 통해 Kubernetes 서비스가 Discovery Service에 의해 생성된 동적 리소스를 수신 대기할 수 있습니다.

Discovery Service는 발견된 리소스를 서로 다른 집합으로 그룹화할 수 있는 구성 매개변수 - discovery_service.discovery_group - 를 노출합니다. 이 매개변수는 서로 다른 클라우드 리소스 집합을 감시하는 Discovery Agents들이 충돌하여 다른 서비스에 의해 생성된 리소스를 삭제하는 것을 방지하는 데 사용됩니다.

여러 Discovery Services를 실행할 때, 동일한 클라우드 리소스를 감시하는 경우 각 서비스가 동일한 discovery_group 값으로 구성되어야 하며, 서로 다른 클라우드 리소스를 감시하는 경우에는 다른 값으로 구성해야 합니다.

동일한 Teleport 클러스터 내에서 혼합된 구성을 실행하는 것이 가능하므로 일부 Discovery Services는 동일한 클라우드 리소스를 감시하도록 구성할 수 있고, 다른 서비스는 서로 다른 리소스를 감시하도록 할 수도 있습니다. 예를 들어, 두 개의 서로 다른 클라우드 계정에서 데이터를 분석하는 4-agent 고가용성 구성은 다음과 같이 구성됩니다.

  • Production 계정에서 데이터를 폴링하기 위해 discovery_group: "prod" 로 구성된 2개의 Discovery Services.
  • Staging 계정에서 데이터를 폴링하기 위해 discovery_group: "staging" 로 구성된 2개의 Discovery Services.
version: v3
teleport:
  join_params:
    token_name: "/tmp/token"
    method: token
  proxy_server: teleport.example.com:443
auth_service:
  enabled: off
proxy_service:
  enabled: off
ssh_service:
  enabled: off
discovery_service:
  enabled: "yes"
  discovery_group: "aks-prod"
  azure:
    - types: ["aks"]
      regions: ["*"]
      subscriptions: ["*"]
      resource_groups: ["*"]
      tags:
        "env": "prod"
kubernetes_service:
  enabled: "yes"
  resources:
    - labels:
        "env": "prod" # 이전에 지정된 Kubernetes 클러스터 레이블과 일치

이 구성을 추가한 후 Teleport를 시작하십시오. Azure 섹션에 지정된 태그 및 지역과 일치하는 AKS 클러스터가 Teleport 클러스터에 자동으로 추가됩니다.

문제 해결

Discovery Service 문제 해결

먼저, 발견된 Kubernetes cluster이 있는지 확인하세요.
이를 위해 tctl get kube_cluster 명령을 사용하고, 예상되는 Kubernetes cluster이 이미 Teleport 클러스터에 등록되어 있는지 확인하세요.

목록에 일부 Kubernetes cluster이 나타나지 않으면, Discovery Service 선택기 레이블이 누락된 Kubernetes cluster 태그와 일치하는지 확인하거나 Discovery Service 로그에서 권한 오류를 살펴보세요.

Discovery Service가 올바른 AWS 계정의 자격 증명으로 실행되고 있는지 확인하세요. 다른 AWS 계정에서 리소스를 발견할 수 있지만, 이 경우 다른 AWS 계정의 역할을 가정하도록 구성해야 합니다.

실행 중인 Discovery Service가 여러 개인지 확인하세요:

tctl inventory status --connected

여러 개의 Discovery Service를 실행 중인 경우, 동일한 클라우드 Kubernetes cluster를 감시하는 경우에는 각 서비스가 동일한 discovery_group 값으로 구성되어야 하며, 다른 클라우드 Kubernetes cluster를 감시하는 경우에는 다른 값으로 구성되어야 합니다.
이 구성이 올바르지 않으면, 일반적인 증상으로는 kube_cluster 리소스가 Teleport 클러스터의 레지스트리에서 간헐적으로 삭제되는 것이 있습니다.

Kubernetes 서비스 문제 해결

tctl get kube_cluster 명령어가 발견된 클러스터를 반환하지만, tctl kube ls 명령어에 포함되지 않는 경우, kubernetes_service.resources 섹션이 올바르게 설정되었는지 확인하십시오.

kubernetes_service:
  enabled: "yes"
  resources:
  - labels:
      "env": "prod"

섹션이 올바르게 구성되었으나 클러스터가 여전히 나타나지 않거나 인증 오류가 발생하는 경우, 대상 클러스터에서 권한이 올바르게 구성되었는지 확인하거나 Teleport에서 Kubernetes 클러스터를 나열할 수 있는 올바른 권한이 있는지 확인하십시오.

Teleport 원문 보기