InfoGrab Docs

IaC로 에이전트 없는 OpenSSH 서버 등록하기

요약

이 가이드에서는 인프라스트럭처 애즈 코드(IaC)를 통해 Teleport에 OpenSSH 노드를 등록하는 방법을 알아봅니다. Teleport는 Teleport Proxy Service를 통해 SSH 노드로 SSH 연결을 라우팅할 수 있습니다.

이 가이드에서는 인프라스트럭처 애즈 코드(IaC)를 통해 Teleport에 OpenSSH 노드를 등록하는 방법을 알아봅니다. Teleport는 코드에서 리소스를 동적으로 생성하는 세 가지 방법을 지원합니다:

  • Kubernetes에서 Teleport 리소스를 관리할 수 있는 Teleport Kubernetes Operator
  • Terraform을 통해 Teleport 리소스를 관리할 수 있는 Teleport Terraform 프로바이더
  • 로컬 컴퓨터나 CI 환경에서 Teleport 리소스를 관리할 수 있는 tctl CLI

작동 방식#

Teleport는 Teleport Proxy Service를 통해 SSH 노드로 SSH 연결을 라우팅할 수 있습니다. OpenSSH를 위한 Teleport 인증 기관을 신뢰하도록 SSH 노드를 구성하면(에이전트 없는 OpenSSH 가이드 참조), Proxy Service는 Teleport가 서명한 인증서를 노드에 제시하고 연결을 설정할 수 있습니다. 이를 위해 Teleport Proxy Service가 노드에 접속할 수 있어야 합니다.

에이전트 없는 SSH 서버는 Auth Service 백엔드에 저장된 리소스로 Teleport Auth Service에 등록됩니다. Teleport Auth Service는 에이전트 없는 SSH 서버를 포함한 백엔드 리소스를 클라이언트가 생성, 삭제 또는 수정할 수 있게 해주는 gRPC API를 제공합니다. Teleport Kubernetes Operator와 Terraform 프로바이더, 그리고 tctl 커맨드라인 도구는 Teleport Auth Service에 인증하고 gRPC API와 상호작용하여 에이전트 없는 SSH 서비스를 관리할 수 있습니다.

사전 요구 사항#

이 가이드를 따르려면 다음이 필요합니다:

  • A running Teleport cluster. If you want to get started with Teleport, sign up for a free trial or set up a demo environment.

  • The tctl and tsh clients.

    Installing `tctl` and `tsh` clients
    1. Determine the version of your Teleport cluster. The tctl and tsh clients must be at most one major version behind your Teleport cluster version. Send a GET request to the Proxy Service at /v1/webapi/find and use a JSON query tool to obtain your cluster version. Replace with the web address of your Teleport Proxy Service:

      $ TELEPORT_DOMAIN=
      $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')"
      
    2. Follow the instructions for your platform to install tctl and tsh clients:

다음 중 하나를 따라 실행 중인 오퍼레이터:

오퍼레이터를 배포한 네임스페이스도 설정해야 합니다. 이 네임스페이스가 CustomResources를 배포하는 곳입니다:

# `teleport-cluster` Helm 차트로 배포된 오퍼레이터의 경우
$ export OPERATOR_NAMESPACE="teleport-cluster"

# 독립 실행형 오퍼레이터의 경우
$ export OPERATOR_NAMESPACE="teleport-iac"

Terraform 프로바이더 가이드를 따라 Teleport Terraform 프로바이더를 작동 중인 상태로 준비합니다.

  • Teleport 클러스터에 추가할 OpenSSH가 실행 중인 서버. 이 서버는 프록시에서 접근 가능해야 합니다(공인 IP 주소와 포트 22에서 트래픽을 허용하는 방화벽).
Tip

비공개 SSH 서버(예: NAT 뒤, 사설 네트워크, 인바운드 트래픽을 차단하는 방화벽으로 보호된 서버 등)를 추가하려면 Teleport 에이전트를 설치할 수 있습니다. Teleport 에이전트는 Teleport Proxy Service로 터널을 열어 모든 사용자가 Proxy Service를 통해 연결할 수 있게 합니다.

1/5단계 - 필요한 정보 수집#

Teleport에 OpenSSH 서버를 등록하려면 다음 정보가 필요합니다:

  • 서버 호스트명:
  • SSH 포트가 포함된 서버 공인 IP 주소:

서버에 대한 레이블 세트도 선택해야 합니다. 이 레이블은 서버를 설명하고 어떤 사용자가 서버에 접근할 수 있는지 제어하는 데 사용할 수 있습니다. OpenSSH를 재구성하지 않고도 나중에 동적으로 변경할 수 있습니다.

레이블 및 서버 접근 제어에 대한 자세한 내용은 서버용 접근 제어 페이지를 참조하세요.

이 가이드의 나머지 부분에서 레이블은 다음과 같습니다:

env: test
team: engineering

2/5단계 - 서버 매니페스트 작성#

이 단계에서는 Teleport에 등록하려는 OpenSSH 서버 리소스를 설명하는 텍스트 파일을 작성합니다. 이러한 파일을 매니페스트라고 하며, 사용하는 IaC 도구에 따라 문법이 달라집니다.

이러한 매니페스트는 일반적으로 git과 같은 공유 버전 관리 시스템에서 관리됩니다. 이를 통해 모든 변경 사항을 추적하고, Teleport에서 리소스를 변경하기 전에 표준 코드 검토 절차를 따르며, 필요한 경우 Teleport 인스턴스를 빠르게 재배포할 수 있습니다.

서버 ID를 선택해야 합니다. 선택하지 않으면 Teleport가 자동으로 생성합니다. 이 ID는 두 가지 용도로 사용됩니다:

  • 나중에 서버 정보(예: 레이블 변경)를 업데이트하려면 매니페스트에 ID를 지정해야 합니다. 그렇지 않으면 Teleport가 기존 리소스를 편집하는 대신 새 서버 리소스를 생성합니다.
  • 동일한 호스트명을 가진 여러 서버가 있는 경우, 고유 ID를 통해 특정 서버를 선택할 수 있습니다.

To generate a new UUID:

다음 openssh-node-resource.yaml 파일을 생성합니다:

kind: node
version: v2
sub_kind: openssh
metadata:
  name: a100fdd0-52db-4eca-a7ab-c3afa7a1564a  # this is the UUID previously generated
  labels:
    env: test
    team: engineering
spec:
  addr: 




다음 openssh-node-resource.yaml 파일을 생성합니다:

apiVersion: resources.teleport.dev/v1
kind: TeleportOpenSSHServerV2
metadata:
  name: a100fdd0-52db-4eca-a7ab-c3afa7a1564a  # this is the UUID previously generated
  # kubernetes CR labels are propagated to the Teleport resource
  labels:
    env: test
    team: engineering
spec:
  addr:  name="198.51.100.1:22" />
  hostname:  name="ssh-server-hostname" />

다음 openssh-node-resource.tf 파일을 생성합니다:

resource "teleport_server" "openssh_agentless" {
  version = "v2"
  sub_kind = "openssh"
  // Name is not required for servers, this is a special case.
  // When a name is not set, an UUID will be generated by Teleport and
  // imported back into Terraform.
  spec = {
    addr = ""
    hostname = ""
  }
}

output "openssh_node_id" {
  value = teleport_server.openssh_agentless.metadata.name
}

3/5단계. 모든 매니페스트 적용#

다음 명령으로 서버를 선언합니다:

$ tctl create -f openssh-node-resource.yaml
node "a100fdd0-52db-4eca-a7ab-c3afa7a1564a" has been created

다음 명령으로 Kubernetes 매니페스트를 적용합니다:

$ kubectl apply -n "$OPERATOR_NAMESPACE" -f openssh-node-resource.yaml
teleportopensshserverv2.resources.teleport.dev/a100fdd0-52db-4eca-a7ab-c3afa7a1564a created

그런 다음 TeleportOpenSSHServerV2 Kubernetes 커스텀 리소스를 나열합니다:

$ kubectl get teleportopensshserverv2 -n "$OPERATOR_NAMESPACE"
# NAME                                   AGE
# a100fdd0-52db-4eca-a7ab-c3afa7a1564a   10m

Terraform 연결을 테스트하고 변경 사항을 검토합니다:

$ terraform plan
Terraform will perform the following actions:

  # teleport_server.openssh_agentless will be created
  + resource "teleport_server" "openssh_agentless" {
      + id       = (known after apply)
      + kind     = (known after apply)
      + metadata = (known after apply)
      + spec     = {
          + addr     = ""
          + hostname = ""
        }
      + sub_kind = "openssh"
      + version  = "v2"
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + openssh_node_id = (known after apply)

플랜을 적용하고 노드 UUID를 복구합니다:

$ terraform apply
# [...]
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

teleport_server.openssh_agentless: Creating...
teleport_server.openssh_agentless: Creation complete after 3s [id=a100fdd0-52db-4eca-a7ab-c3afa7a1564a]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

openssh_node_id = "a100fdd0-52db-4eca-a7ab-c3afa7a1564a"

4/5단계. Teleport에서 생성된 서버 검증#

IaC 도구가 실행된 후, Teleport가 OpenSSH 서버를 인식하고 있는지 검증합니다:

# 주어진 호스트명 또는 IP 주소로 노드 나열
$ tsh ls --search=""
Node Name                                           Address        Labels
--------------------- ------------ --------------- --------------------------
  env=test,team=engineering

# 호스트명으로 노드 세부 정보 가져오기
$ tctl get "node/"

# ID로 노드 세부 정보 가져오기
$ tctl get node/a100fdd0-52db-4eca-a7ab-c3afa7a1564a

5/5단계. Teleport CA 신뢰 및 호스트 인증서 발급#

이 시점에서 Teleport는 OpenSSH 서버가 있다는 것을 알고 연락 방법과 어떤 사용자가 접근할 수 있는지 알고 있습니다. 그러나 Teleport와 서버는 서로를 신뢰하지 않습니다.

Teleport에서 오는 연결을 신뢰하도록 서버를 구성하고(Teleport SSH 인증 기관 신뢰), Teleport가 발급한 SSH 호스트 인증서를 서버에 부여해야 합니다.

이러한 단계는 자동화할 수 있지만, 자동화 방법은 사용자 지정 인프라와 도구에 따라 다릅니다(VM 이미지에서 SSH CA 구성, 사용자 지정 시작 스크립트 사용, Ansible로 서버 프로비저닝 등).

단계별 수동 설정은 OpenSSH 수동 설치 가이드의 2단계부터 설명되어 있습니다.

다음 단계#

  • RBAC 설정을 통해 어떤 사용자가 어떤 서버에 SSH로 접속할 수 있는지 제어합니다.

IaC로 에이전트 없는 OpenSSH 서버 등록하기

원문 보기
요약

이 가이드에서는 인프라스트럭처 애즈 코드(IaC)를 통해 Teleport에 OpenSSH 노드를 등록하는 방법을 알아봅니다. Teleport는 Teleport Proxy Service를 통해 SSH 노드로 SSH 연결을 라우팅할 수 있습니다.

이 가이드에서는 인프라스트럭처 애즈 코드(IaC)를 통해 Teleport에 OpenSSH 노드를 등록하는 방법을 알아봅니다. Teleport는 코드에서 리소스를 동적으로 생성하는 세 가지 방법을 지원합니다:

  • Kubernetes에서 Teleport 리소스를 관리할 수 있는 Teleport Kubernetes Operator
  • Terraform을 통해 Teleport 리소스를 관리할 수 있는 Teleport Terraform 프로바이더
  • 로컬 컴퓨터나 CI 환경에서 Teleport 리소스를 관리할 수 있는 tctl CLI

작동 방식#

Teleport는 Teleport Proxy Service를 통해 SSH 노드로 SSH 연결을 라우팅할 수 있습니다. OpenSSH를 위한 Teleport 인증 기관을 신뢰하도록 SSH 노드를 구성하면(에이전트 없는 OpenSSH 가이드 참조), Proxy Service는 Teleport가 서명한 인증서를 노드에 제시하고 연결을 설정할 수 있습니다. 이를 위해 Teleport Proxy Service가 노드에 접속할 수 있어야 합니다.

에이전트 없는 SSH 서버는 Auth Service 백엔드에 저장된 리소스로 Teleport Auth Service에 등록됩니다. Teleport Auth Service는 에이전트 없는 SSH 서버를 포함한 백엔드 리소스를 클라이언트가 생성, 삭제 또는 수정할 수 있게 해주는 gRPC API를 제공합니다. Teleport Kubernetes Operator와 Terraform 프로바이더, 그리고 tctl 커맨드라인 도구는 Teleport Auth Service에 인증하고 gRPC API와 상호작용하여 에이전트 없는 SSH 서비스를 관리할 수 있습니다.

사전 요구 사항#

이 가이드를 따르려면 다음이 필요합니다:

  • A running Teleport cluster. If you want to get started with Teleport, sign up for a free trial or set up a demo environment.

  • The tctl and tsh clients.

    Installing `tctl` and `tsh` clients
    1. Determine the version of your Teleport cluster. The tctl and tsh clients must be at most one major version behind your Teleport cluster version. Send a GET request to the Proxy Service at /v1/webapi/find and use a JSON query tool to obtain your cluster version. Replace with the web address of your Teleport Proxy Service:

      $ TELEPORT_DOMAIN=
      $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')"
      
    2. Follow the instructions for your platform to install tctl and tsh clients:

다음 중 하나를 따라 실행 중인 오퍼레이터:

오퍼레이터를 배포한 네임스페이스도 설정해야 합니다. 이 네임스페이스가 CustomResources를 배포하는 곳입니다:

# `teleport-cluster` Helm 차트로 배포된 오퍼레이터의 경우
$ export OPERATOR_NAMESPACE="teleport-cluster"

# 독립 실행형 오퍼레이터의 경우
$ export OPERATOR_NAMESPACE="teleport-iac"

Terraform 프로바이더 가이드를 따라 Teleport Terraform 프로바이더를 작동 중인 상태로 준비합니다.

  • Teleport 클러스터에 추가할 OpenSSH가 실행 중인 서버. 이 서버는 프록시에서 접근 가능해야 합니다(공인 IP 주소와 포트 22에서 트래픽을 허용하는 방화벽).
Tip

비공개 SSH 서버(예: NAT 뒤, 사설 네트워크, 인바운드 트래픽을 차단하는 방화벽으로 보호된 서버 등)를 추가하려면 Teleport 에이전트를 설치할 수 있습니다. Teleport 에이전트는 Teleport Proxy Service로 터널을 열어 모든 사용자가 Proxy Service를 통해 연결할 수 있게 합니다.

1/5단계 - 필요한 정보 수집#

Teleport에 OpenSSH 서버를 등록하려면 다음 정보가 필요합니다:

  • 서버 호스트명:
  • SSH 포트가 포함된 서버 공인 IP 주소:

서버에 대한 레이블 세트도 선택해야 합니다. 이 레이블은 서버를 설명하고 어떤 사용자가 서버에 접근할 수 있는지 제어하는 데 사용할 수 있습니다. OpenSSH를 재구성하지 않고도 나중에 동적으로 변경할 수 있습니다.

레이블 및 서버 접근 제어에 대한 자세한 내용은 서버용 접근 제어 페이지를 참조하세요.

이 가이드의 나머지 부분에서 레이블은 다음과 같습니다:

env: test
team: engineering

2/5단계 - 서버 매니페스트 작성#

이 단계에서는 Teleport에 등록하려는 OpenSSH 서버 리소스를 설명하는 텍스트 파일을 작성합니다. 이러한 파일을 매니페스트라고 하며, 사용하는 IaC 도구에 따라 문법이 달라집니다.

이러한 매니페스트는 일반적으로 git과 같은 공유 버전 관리 시스템에서 관리됩니다. 이를 통해 모든 변경 사항을 추적하고, Teleport에서 리소스를 변경하기 전에 표준 코드 검토 절차를 따르며, 필요한 경우 Teleport 인스턴스를 빠르게 재배포할 수 있습니다.

서버 ID를 선택해야 합니다. 선택하지 않으면 Teleport가 자동으로 생성합니다. 이 ID는 두 가지 용도로 사용됩니다:

  • 나중에 서버 정보(예: 레이블 변경)를 업데이트하려면 매니페스트에 ID를 지정해야 합니다. 그렇지 않으면 Teleport가 기존 리소스를 편집하는 대신 새 서버 리소스를 생성합니다.
  • 동일한 호스트명을 가진 여러 서버가 있는 경우, 고유 ID를 통해 특정 서버를 선택할 수 있습니다.

To generate a new UUID:

다음 openssh-node-resource.yaml 파일을 생성합니다:

kind: node
version: v2
sub_kind: openssh
metadata:
  name: a100fdd0-52db-4eca-a7ab-c3afa7a1564a  # this is the UUID previously generated
  labels:
    env: test
    team: engineering
spec:
  addr: 




다음 openssh-node-resource.yaml 파일을 생성합니다:

apiVersion: resources.teleport.dev/v1
kind: TeleportOpenSSHServerV2
metadata:
  name: a100fdd0-52db-4eca-a7ab-c3afa7a1564a  # this is the UUID previously generated
  # kubernetes CR labels are propagated to the Teleport resource
  labels:
    env: test
    team: engineering
spec:
  addr:  name="198.51.100.1:22" />
  hostname:  name="ssh-server-hostname" />

다음 openssh-node-resource.tf 파일을 생성합니다:

resource "teleport_server" "openssh_agentless" {
  version = "v2"
  sub_kind = "openssh"
  // Name is not required for servers, this is a special case.
  // When a name is not set, an UUID will be generated by Teleport and
  // imported back into Terraform.
  spec = {
    addr = ""
    hostname = ""
  }
}

output "openssh_node_id" {
  value = teleport_server.openssh_agentless.metadata.name
}

3/5단계. 모든 매니페스트 적용#

다음 명령으로 서버를 선언합니다:

$ tctl create -f openssh-node-resource.yaml
node "a100fdd0-52db-4eca-a7ab-c3afa7a1564a" has been created

다음 명령으로 Kubernetes 매니페스트를 적용합니다:

$ kubectl apply -n "$OPERATOR_NAMESPACE" -f openssh-node-resource.yaml
teleportopensshserverv2.resources.teleport.dev/a100fdd0-52db-4eca-a7ab-c3afa7a1564a created

그런 다음 TeleportOpenSSHServerV2 Kubernetes 커스텀 리소스를 나열합니다:

$ kubectl get teleportopensshserverv2 -n "$OPERATOR_NAMESPACE"
# NAME                                   AGE
# a100fdd0-52db-4eca-a7ab-c3afa7a1564a   10m

Terraform 연결을 테스트하고 변경 사항을 검토합니다:

$ terraform plan
Terraform will perform the following actions:

  # teleport_server.openssh_agentless will be created
  + resource "teleport_server" "openssh_agentless" {
      + id       = (known after apply)
      + kind     = (known after apply)
      + metadata = (known after apply)
      + spec     = {
          + addr     = ""
          + hostname = ""
        }
      + sub_kind = "openssh"
      + version  = "v2"
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + openssh_node_id = (known after apply)

플랜을 적용하고 노드 UUID를 복구합니다:

$ terraform apply
# [...]
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

teleport_server.openssh_agentless: Creating...
teleport_server.openssh_agentless: Creation complete after 3s [id=a100fdd0-52db-4eca-a7ab-c3afa7a1564a]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

openssh_node_id = "a100fdd0-52db-4eca-a7ab-c3afa7a1564a"

4/5단계. Teleport에서 생성된 서버 검증#

IaC 도구가 실행된 후, Teleport가 OpenSSH 서버를 인식하고 있는지 검증합니다:

# 주어진 호스트명 또는 IP 주소로 노드 나열
$ tsh ls --search=""
Node Name                                           Address        Labels
--------------------- ------------ --------------- --------------------------
  env=test,team=engineering

# 호스트명으로 노드 세부 정보 가져오기
$ tctl get "node/"

# ID로 노드 세부 정보 가져오기
$ tctl get node/a100fdd0-52db-4eca-a7ab-c3afa7a1564a

5/5단계. Teleport CA 신뢰 및 호스트 인증서 발급#

이 시점에서 Teleport는 OpenSSH 서버가 있다는 것을 알고 연락 방법과 어떤 사용자가 접근할 수 있는지 알고 있습니다. 그러나 Teleport와 서버는 서로를 신뢰하지 않습니다.

Teleport에서 오는 연결을 신뢰하도록 서버를 구성하고(Teleport SSH 인증 기관 신뢰), Teleport가 발급한 SSH 호스트 인증서를 서버에 부여해야 합니다.

이러한 단계는 자동화할 수 있지만, 자동화 방법은 사용자 지정 인프라와 도구에 따라 다릅니다(VM 이미지에서 SSH CA 구성, 사용자 지정 시작 스크립트 사용, Ansible로 서버 프로비저닝 등).

단계별 수동 설정은 OpenSSH 수동 설치 가이드의 2단계부터 설명되어 있습니다.

다음 단계#

  • RBAC 설정을 통해 어떤 사용자가 어떤 서버에 SSH로 접속할 수 있는지 제어합니다.