Infograb logo
에이전트 없는 OpenSSH 서버 등록하기

이 가이드에서는 코드로 인프라(IaC)를 통해 Teleport에 OpenSSH 노드를 등록하는 방법을 보여줍니다. Teleport는 코드를 통해 리소스를 동적으로 생성하는 세 가지 방법을 지원합니다:

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

필수 조건

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

  • 실행 중인 Teleport 클러스터 버전 이상. Teleport를 시작하려면, 가입하기 위해 무료 평가판에 등록하거나 데모 환경 설정하기를 참조하세요.

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

    tctltsh 다운로드에 대한 지침은 설치를 방문하세요.

작동 중인 오퍼레이터가 필요하며, 아래의 가이드를 따르세요:

커스텀 리소스를 배포할 네임스페이스를 설정해야 합니다:

`teleport-cluster` Helm 차트로 배포된 오퍼레이터의 경우

export OPERATOR_NAMESPACE="teleport-cluster"

독립형 오퍼레이터의 경우

export OPERATOR_NAMESPACE="teleport-iac"

작동하는 Teleport Terraform 제공자가 필요하며, Terraform 제공자 안내서를 따르세요.

  • Teleport 클러스터에 추가할 OpenSSH 서버가 필요합니다. 이 서버는 프록시에서 접근 가능해야 하며(공식 IP 주소 및 포트 22에 대한 트래픽 허용).
Tip

개인 SSH 서버(예: NAT 뒤에서, 사설 네트워크, 인바운드 트래픽을 차단하는 방화벽 보호 등)를 추가하려는 경우, Teleport 에이전트 설치를 할 수 있습니다. Teleport 에이전트는 Teleport 프록시 서비스에 터널을 열어 다양한 사용자가 프록시 서비스를 통해 연결할 수 있도록 허용합니다.

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

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

  • 서버 호스트 이름: ssh-server-hostname
  • SSH 포트를 포함한 공용 서버 IP 주소: 198.51.100.1:22

서버에 대한 레이블 집합도 선택해야 합니다. 이 레이블은 서버를 설명하고 누구가 서버에 접근할 수 있을지를 제어하는 데 사용할 수 있습니다. 나중에 동적으로 변경할 수 있음으로, openSSH를 재구성할 필요가 없습니다.

레이블과 서버 접근 제어에 대한 자세한 내용은 서버용 접근 제어 페이지를 확인하세요.

이번 가이드의 레이블은 다음과 같습니다:

env: test
team: engineering

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

이번 단계에서는 Teleport에 등록할 OpenSSH 서버 리소스를 설명하는 텍스트 파일을 작성할 것입니다. 이러한 파일을 매니페스트라고 하며 IaC 도구에 따라 문법이 다를 수 있습니다.

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

서버 ID를 선택해야 하며, 그렇지 않으면 Teleport가 하나를 선택합니다. 이 ID는 두 가지 용도로 사용됩니다:

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

새로운 UUID 생성하기:

uuidgen을 사용하세요. 이 실행 파일은 대부분의 기계에 기본적으로 설치되어 있습니다. 설치되어 있지 않은 경우, DEB 기반 배포판의 경우 uuid-runtime 패키지와 RPM 기반 배포판의 경우 util-linux를 통해 사용할 수 있습니다.

uuidgen

a100fdd0-52db-4eca-a7ab-c3afa7a1564a

기본적으로 설치된 uuidgentr 패키지를 사용하세요:

uuidgen | tr '[:upper:]' '[:lower:]'

a100fdd0-52db-4eca-a7ab-c3afa7a1564a

NewGuid powershell cmdlet을 사용하세요:

New-guid
Guid----a100fdd0-52db-4eca-a7ab-c3afa7a1564a

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

kind: node
version: v2
sub_kind: openssh
metadata:
  name: a100fdd0-52db-4eca-a7ab-c3afa7a1564a  # 이전에 생성한 UUID
  labels:
    env: test
    team: engineering
spec:
  addr: 198.51.100.1:22
  hostname: ssh-server-hostname

새로운 UUID 생성하기:

uuidgen을 사용하세요. 이 실행 파일은 대부분의 기계에 기본적으로 설치되어 있습니다. 설치되어 있지 않은 경우, DEB 기반 배포판의 경우 uuid-runtime 패키지와 RPM 기반 배포판의 경우 util-linux를 통해 사용할 수 있습니다.

uuidgen

a100fdd0-52db-4eca-a7ab-c3afa7a1564a

기본적으로 설치된 uuidgentr 패키지를 사용하세요:

uuidgen | tr '[:upper:]' '[:lower:]'

a100fdd0-52db-4eca-a7ab-c3afa7a1564a

NewGuid powershell cmdlet을 사용하세요:

New-guid
Guid----a100fdd0-52db-4eca-a7ab-c3afa7a1564a

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

apiVersion: resources.teleport.dev/v1
kind: TeleportOpenSSHServerV2
metadata:
  name: a100fdd0-52db-4eca-a7ab-c3afa7a1564a  # 이전에 생성한 UUID
  # Kubernetes CR 레이블은 Teleport 리소스로 전파됩니다
  labels:
    env: test
    team: engineering
spec:
  addr: 198.51.100.1:22
  hostname: ssh-server-hostname

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

resource "teleport_server" "openssh_agentless" {
  version = "v2"
  sub_kind = "openssh"
  // 서버는 이름이 필수는 아닙니다. 특별한 경우입니다.
  // 이름이 설정되지 않으면، Teleport에 의해 UUID가 생성되고
  // 다시 Terraform에 가져오게 됩니다.
  spec = {
    addr = "198.51.100.1:22"
    hostname = "ssh-server-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"가 생성되었습니다.

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

kubectl apply -n "$OPERATOR_NAMESPACE" -f openssh-node-resource.yaml
teleportopensshserverv2.resources.teleport.dev/a100fdd0-52db-4eca-a7ab-c3afa7a1564a가 생성되었습니다.

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

kubectl get teleportopensshserverv2 -n "$OPERATOR_NAMESPACE"

NAME AGE

a100fdd0-52db-4eca-a7ab-c3afa7a1564a 10m

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

terraform plan
Terraform는 다음 작업을 수행할 것입니다:
# teleport_server.openssh_agentless가 생성됩니다 + resource "teleport_server" "openssh_agentless" { + id = (apply 후에 알려짐) + kind = (apply 후에 알려짐) + metadata = (apply 후에 알려짐) + spec = { + addr = "198.51.100.1:22" + hostname = "ssh-server-hostname" } + sub_kind = "openssh" + version = "v2" }
계획: 1 추가, 0 변경, 0 삭제.
출력 변경: + openssh_node_id = (apply 후에 알려짐)

계획을 적용하고 노드 UUID를 복구합니다:

terraform apply

[...]

이 작업을 수행하시겠습니까? Terraform는 위에서 설명한 작업을 수행합니다. 'yes'만 승인으로 받아들여집니다.
값을 입력하세요: yes
teleport_server.openssh_agentless: 생성 중...teleport_server.openssh_agentless: 3초 후에 생성 완료 [id=a100fdd0-52db-4eca-a7ab-c3afa7a1564a]
적용 완료! 리소스: 1 추가, 0 변경, 0 삭제.
출력:
openssh_node_id = "a100fdd0-52db-4eca-a7ab-c3afa7a1564a"

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

IaC 도구가 실행된 지금, Teleport가 OpenSSH 서버를 인식하는지 확인합니다:

주어진 호스트 이름이나 IP 주소로 노드 나열하기

tsh ls --search="ssh-server-hostname"
노드 이름 주소 레이블--------------------- ------------ --------------- --------------------------ssh-server-hostname 198.51.100.1:22 env=test,team=engineering

호스트 이름으로 노드 세부 정보 가져오기

tctl get "node/ssh-server-hostname"

ID로 노드 세부 정보 가져오기

tctl get node/a100fdd0-52db-4eca-a7ab-c3afa7a1564a

5/5 단계. Teleport CA에 신뢰를 부여하고 호스트 인증서 발급하기

이제 Teleport가 OpenSSH 서버의 존재를 인식하고 이를 연락할 수 아라는 것을 알지만, 서로를 신뢰하지는 않습니다.

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

이 단계는 자동화될 수 있지만, 자동화는 사용자의 맞춤형 인프라와 도구에 따라 달라집니다 (VM 이미지에서 SSH CA를 구성하거나, 사용자 지정 시작 스크립트를 사용하거나, Ansible로 서버를 프로비저닝하는 등).

수동 설정의 단계별 설명은 OpenSSH 수동 설치 가이드에서 2단계부터 확인할 수 있습니다.

다음 단계

  • RBAC 설정하기 사용자가 어떤 서버에서 SSH를 실행할 수 있는지를 제어하세요.
Teleport 원문 보기