InfoGrab Docs

에이전트 없는 모드에서 Teleport와 OpenSSH 사용 (수동 설치)

요약

이 가이드에서는 OpenSSH 서버 sshd를 Teleport 클러스터에 참여하도록 구성하는 방법을 보여줍니다. Teleport와 OpenSSH를 사용하면 빠르게 시작할 수 있다는 장점이 있지만, 장기적으로는 sshd를 teleport로 교체하는 것을 권장합니다.

이 가이드에서는 OpenSSH 서버 sshd를 Teleport 클러스터에 참여하도록 구성하는 방법을 보여줍니다. 기존의 OpenSSH 서버 플릿은 Teleport CA에서 동적으로 발급된 SSH 인증서를 수락하도록 구성할 수 있습니다.

Teleport와 OpenSSH를 사용하면 빠르게 시작할 수 있다는 장점이 있지만, 장기적으로는 sshdteleport로 교체하는 것을 권장합니다. teleport SSH 서버는 OpenSSH와 호환되지 않는 여러 기능을 지원합니다:

작동 방식#

높은 수준에서 Teleport는 프록시 서비스를 통해 SSH 연결을 프록시하여 OpenSSH 서버를 지원합니다. OpenSSH 서버는 사용자의 직접 연결을 신뢰하는 대신 프록시 서비스의 연결을 신뢰하도록 설정됩니다. 이렇게 하면 OpenSSH 서버에 대한 모든 연결이 세션 IO와 감사 이벤트를 기록하고 RBAC를 적용할 수 있는 프록시 서비스를 통해 이루어집니다.

작동 방식에 대한 자세한 내용은 등록된 OpenSSH 노드 RFD를 참조할 수 있습니다. 다음은 RFD의 몇 가지 핵심 세부 사항입니다:

  • 프록시 서비스는 사용자를 대신하여 Auth 서비스에서 Teleport OpenSSH CA로 서명된 인증서를 요청할 수 있는 고유한 기능을 갖추고 있으며, OpenSSH 서버는 이 CA로 서명된 인증서만 신뢰하도록 설정됩니다. 따라서 OpenSSH 서버에 연결하려면 사용자가 프록시를 통해 연결하여 OpenSSH 인증서를 요청하고 사용해야 합니다.
  • 사용자를 OpenSSH 서버에 연결하기 전에 프록시 서비스는 사용자가 액세스할 수 있는지 RBAC 확인을 수행합니다.
  • 세션과 감사 이벤트를 기록하기 위해 프록시 서비스는 클라이언트 SSH 연결을 종료(복호화)하고 OpenSSH 서버와 자체 연결을 설정합니다. 그런 다음 두 연결 사이에서 파이프 역할을 하며 이벤트와 IO를 기록합니다.
Note

이 가이드는 노드 리소스를 생성하고 Teleport CA를 신뢰하도록 OpenSSH를 구성하여 OpenSSH 노드를 등록하는 방법을 보여줍니다. 그러나 OpenSSH 노드에 teleport 바이너리를 복사하고 실행할 수 있다면 대신 표준 등록 가이드를 따를 수 있습니다. 이 가이드에서 보여주는 많은 단계를 Teleport가 자동으로 수행할 수 있습니다.

사전 요구 사항#

  • 로컬 머신의 OpenSSH 버전 6.9 이상. 다음 명령으로 OpenSSH 버전을 확인하세요:

    $ ssh -V
    
  • 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:

  • Teleport가 아닌 OpenSSH 서버 sshd 버전 7.4 이상이 설치된 Linux 호스트. 이 호스트의 SSH 포트는 Teleport 프록시 서비스 호스트의 트래픽에 열려 있어야 합니다.

To check that you can connect to your Teleport cluster, sign in with tsh login, then verify that you can run tctl commands using your current credentials.

For example, run the following command, assigning to the domain name of the Teleport Proxy Service in your cluster and to your Teleport username:

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

If you can connect to the cluster and run the tctl status command, you can use your current credentials to run subsequent tctl commands from your workstation. If you host your own Teleport cluster, you can also run tctl commands on the computer that hosts the Teleport Auth Service for full permissions.

1단계/5단계. Teleport 클러스터에 노드 리소스 추가#

OpenSSH 노드에 SSH 연결을 요청하면 Teleport는 연결을 설정하기 위해 노드의 IP 주소를 찾을 수 있어야 합니다.

Teleport가 OpenSSH 서버에 어떻게 연결할지 알 수 있도록 node 리소스를 선언합니다. 로컬 머신에서 다음 내용으로 openssh-node-resource.yaml 파일을 생성합니다:

kind: node
version: v2
sub_kind: openssh
metadata:
  name: a100fdd0-52db-4eca-a7ab-c3afa7a1564a
  labels:
    env: prod
spec:
  addr: 1.2.3.4:22
  hostname: openssh-node

spec.addrspec.hostname은 필수입니다. spec.addr을 노드의 주소와 포트에 할당하고 spec.hostname을 사용자가 Teleport에서 볼 노드 이름으로 할당합니다.

metadata.labels 필드는 SSH 서비스 인스턴스에 레이블을 지정하여 RBAC 규칙을 적용할 수 있습니다.

metadata.name 필드는 필수가 아니지만 제공하는 경우 UUID(범용 고유 식별자)여야 합니다. node 이름에 적합한 새 UUID를 생성하려면 Linux 또는 macOS에서 uuidgen 명령을 사용하거나 Windows의 Powershell에서 New-Guid cmdlet을 사용하세요.

노드 리소스 생성:

$ tctl create openssh-node-resource.yaml
Note

이 단계는 인프라스트럭처 코드(IaC) 도구(tctl, Terraform, Kubernetes Operator)로 수행할 수 있습니다. 이에 대한 설명은 OpenSSH 서버 IaC 가이드에서 확인할 수 있습니다.

2단계/5단계. Teleport CA를 신뢰하도록 sshd 구성#

이 가이드의 후반부에서 Teleport Auth 서비스에서 서명한 인증서를 사용하여 SSH 서버에 인증하는 SSH 클라이언트 구성을 생성합니다. 이것이 작동하려면 sshd가 Teleport Auth 서비스에서 생성된 인증서로 사용자가 로그인할 수 있도록 허용하도록 지정해야 합니다.

Teleport CA 공개 키를 내보내는 것으로 시작합니다.

sshd를 실행하는 호스트에서 다음 명령을 실행하고 를 Teleport 프록시 서비스의 주소에 할당합니다:

$ export KEY=$(curl 'https:///webapi/auth/export?type=openssh' | sed "s/cert-authority\ //")

sshd에서 공개 키에 액세스할 수 있도록 합니다:

$ sudo bash -c "echo \"$KEY\" > /etc/ssh/teleport_openssh_ca.pub"
$ sudo bash -c "echo 'TrustedUserCAKeys /etc/ssh/teleport_openssh_ca.pub' >> /etc/ssh/sshd_config"

sshd를 다시 시작합니다. systemd 활성화 호스트의 경우 다음 명령을 실행합니다:

$ sudo systemctl restart sshd

이제 sshd는 Teleport가 발급한 인증서를 제시하는 사용자를 신뢰합니다.

3단계/5단계. 호스트 인증 구성#

다음으로 sshd 호스트에 대한 유효한 호스트 인증서를 발급하도록 Teleport에 요청합니다. 이 가이드의 후반부에서 이 인증서를 신뢰하도록 SSH 클라이언트를 구성하여 SSH 클라이언트에 대해 sshd 호스트를 인증합니다. 앞서 생성한 사용자 인증서와 마찬가지로 호스트 인증서는 Teleport Auth 서비스에서 서명됩니다.

사용자에게 올바른 권한이 있는지 확인#

사용자는 호스트 인증서를 읽고 쓸 권한이 있어야 합니다.

로컬 머신에서 다음 내용으로 host-certifier.yaml 파일을 생성합니다:

kind: role
version: v5
metadata:
  name: host-certifier
spec:
  allow:
    rules:
      - resources:
          - host_cert
        verbs:
          - list
          - create
          - read
          - update
          - delete

역할 리소스 생성:

$ tctl create host-certifier.yaml
# role 'host-certifier' has been created

Assign the host-certifier role to your Teleport user by running the appropriate commands for your authentication provider:

이제 sshd 호스트의 호스트 키를 내보내는 데 필요한 권한이 있습니다.

호스트 인증서 발급#

노드의 UUID 찾기

노드 리소스를 생성할 때 metadata.name 필드를 설정하지 않은 경우 Teleport Auth 서비스가 해당 노드에 대한 UUID를 생성했습니다. Teleport 프록시 서비스는 UUID를 사용하여 동일한 호스트 이름을 가진 노드를 구분하므로 호스트 인증서에 추가해야 합니다. 노드의 UUID를 찾으려면 먼저 호스트 이름이 고유한지 확인합니다:

$ tctl get node/openssh-node --format text

하나의 노드만 표시되고 jq가 설치되어 있으면 다음 명령으로 노드의 UUID를 가져올 수 있습니다:

$ tctl get node/openssh-node --format=json | jq -r ".[0].metadata.name"

그렇지 않으면 이 명령의 YAML 출력에서 metadata.name 필드에서 노드의 UUID를 찾으세요:

$ tctl get node/openssh-node

호스트 인증서 생성#

호스트 인증서를 생성할 때 노드를 참조하는 모든 도메인 이름과 주소를 지정하는 것이 중요합니다. 호스트 인증서를 생성할 때 지정하지 않은 이름이나 주소로 노드에 연결하려고 하면 Teleport가 SSH 연결을 거부합니다.

로컬 머신에서 노드의 IP 주소, 완전 자격을 갖춘 도메인 이름 및 노드의 UUID를 환경 변수에 할당합니다. 호스트 이름으로 노드에 연결하지 않을 경우 안전하게 생략할 수 있습니다.

$ ADDR=1.2.3.4,openssh-node,a100fdd0-52db-4eca-a7ab-c3afa7a1564a

다음 tctl 명령을 실행하여 호스트 인증서를 생성합니다:

$ tctl auth sign \
      --host=${ADDR?} \
      --format=openssh \
      --out=myhost

# The credentials have been written to myhost, myhost-cert.pub

위 명령은 개인 키와 인증서를 생성합니다.

여러 호스트의 인증서 발급

여러 호스트에 대한 인증서를 생성하려면 host 플래그를 쉼표로 구분된 주소 목록에 할당합니다. 와일드카드 도메인의 인증서는 OpenSSH에서 지원되지 않으므로 각 도메인은 완전 자격을 갖춰야 합니다.

ssh-keygen을 사용하여 인증서 내용을 확인합니다:

$ ssh-keygen -L -f myhost-cert.pub

Principals 섹션에는 앞서 ADDR에 할당한 주소가 포함되어야 합니다:

myhost-cert.pub:
        Type: ssh-rsa-cert-v01@openssh.com host certificate
        Public key: RSA-CERT SHA256:nHkp6SnrAW4AV00VUaqPgR6SgdyvV9MmjUrYnwZ779A
        Signing CA: RSA SHA256:euqx2Y8Pq+r0c94GKVNXAklBVTmAJtaQUn3/ehrfEJE (using rsa-sha2-512)
        Key ID: ""
        Serial: 0
        Valid: after 2022-04-22T11:14:16
        Principals:
                1.2.3.4
                openssh-node
                a100fdd0-52db-4eca-a7ab-c3afa7a1564a
        Critical Options: (none)
        Extensions:
                x-teleport-authority UNKNOWN OPTION (len 33)
                x-teleport-role UNKNOWN OPTION (len 8)

호스트 키와 인증서를 /etc/ssh 디렉터리에 배치하여 sshd 호스트에 복사합니다.

이 파일에 올바른 권한이 있는지 확인합니다:

$ sudo chmod 0600 /etc/ssh/myhost
$ sudo chmod 0600 /etc/ssh/myhost-cert.pub

그런 다음 sshd 호스트의 /etc/ssh/sshd_config에 다음 줄을 추가합니다:

HostKey /etc/ssh/myhost
HostCertificate /etc/ssh/myhost-cert.pub

sshd를 다시 시작합니다.

4단계/5단계. SSH 클라이언트 구성 생성#

다음 단계는 Teleport에서 관리하는 자격 증명을 사용하여 sshd 호스트에 연결하도록 OpenSSH 클라이언트를 구성하는 것입니다. 이 구성은 사용자의 Teleport 발급 인증서를 사용하여 sshd 호스트에 인증합니다. 또한 앞서 생성한 호스트 인증서를 사용하여 sshd 호스트를 인증합니다.

먼저 Teleport 클러스터에 로그인했는지 확인합니다:

$ tsh status
> Profile URL:        https://teleport.example.com:443
  Logged in as:       myuser
  Cluster:            teleport.example.com
  Roles:              access, auditor, editor, host-certifier
  Logins:             ubuntu, root
  Kubernetes:         enabled
  Valid until:        2022-05-06 22:54:01 -0400 EDT [valid for 11h53m0s]
  Extensions:         permit-agent-forwarding, permit-port-forwarding, permit-pty
$ tsh status
> Profile URL:        https://teleport.example.com:443
  Logged in as:       myuser
  Cluster:            teleport.example.com
  Roles:              access, auditor, editor, reviewer, host-certifier
  Logins:             ubuntu, root
  Kubernetes:         enabled
  Valid until:        2022-05-06 22:54:01 -0400 EDT [valid for 11h53m0s]
  Extensions:         permit-agent-forwarding, permit-port-forwarding, permit-pty
$ tsh status
> Profile URL:        https://mytenant.teleport.sh:443
  Logged in as:       myuser
  Cluster:            mytenant.teleport.sh
  Roles:              access, auditor, editor, reviewer, host-certifier
  Logins:             ubuntu, root
  Kubernetes:         enabled
  Valid until:        2022-05-06 22:54:01 -0400 EDT [valid for 11h53m0s]
  Extensions:         permit-agent-forwarding, permit-port-forwarding, permit-pty

로컬 머신에서 다음 tsh 명령을 실행합니다. 이렇게 하면 클러스터의 호스트에 연결하기 위해 Teleport에서 관리하는 자격 증명을 사용하도록 SSH 클라이언트에 알려주는 구성 블록이 출력됩니다.

$ tsh config > ssh_config_teleport

이 명령은 정리를 쉽게 하기 위해 비표준 위치에 SSH 구성 파일을 생성합니다. 원하는 경우 tsh config의 출력을 기본 SSH 구성 파일(~/.ssh/config)에 추가할 수 있습니다.

구성은 어떻게 작동하나요?

Teleport는 서버가 연결을 처리할 때 실행되는 사전 정의된 명령인 여러 하위 시스템을 포함하는 SSH 서버를 구현합니다. 프록시 서비스는 원격 호스트와 신뢰할 수 있는 클러스터로 SSH 트래픽을 전달하는 proxy 하위 시스템을 구현합니다.

다음은 tsh config가 생성하는 구성에 대한 간략한 설명입니다:

# Common flags for all {} hosts
Host *.{} {}
    UserKnownHostsFile "{}"
    IdentityFile "{}"
    CertificateFile "{}"

ssh하는 호스트가 Teleport 클러스터에 속하는 경우(즉, 주소가 클러스터 도메인의 하위 도메인인 경우) .tsh 디렉터리에 저장된 Teleport 관리 알려진 호스트 파일, 개인 키 및 인증서를 사용합니다.

# Flags for all {} hosts except the proxy
Host *.{} !{}
    Port 3022
    ProxyCommand "{}" proxy ssh --cluster={} --proxy={} %r@%h:%p

ssh하는 호스트가 Teleport 클러스터에 속하는 경우 OpenSSH 클라이언트는 먼저 프록시 서비스에 SSH 연결을 설정하는 ProxyCommand 명령을 실행합니다. 이 명령 tsh proxy ssh는 선택한 호스트(신뢰할 수 있는 클러스터의 호스트 포함)로 SSH 트래픽을 프록시 서비스를 통해 전달하기 위해 proxy 하위 시스템을 요청합니다.

tsh proxy ssh 명령은 다음과 유사한 명령을 통해 proxy 하위 시스템을 요청합니다. teleport.example.com이라는 클러스터에서 rootmynode라는 노드에 로그인한다고 가정합니다:

$ /usr/bin/ssh -l root -A -o UserKnownHostsFile=/root/.tsh/known_hosts -p 11105 teleport.example.com -s proxy:mynode:3022@teleport.example.com

명령이 사용하는 known_hosts 파일은 tsh에서 관리합니다. sshd 호스트의 정보가 이 파일에 나열되어 있으므로 SSH 클라이언트는 앞서 생성한 인증서를 통해 호스트를 인증할 수 있습니다.

Windows에서 PowerShell을 사용하나요?

Windows에서 PowerShell을 사용하는 경우 일반적인 셸 리디렉션으로 파일이 잘못된 인코딩으로 쓰일 수 있습니다. 올바르게 쓰여지도록 하려면 다음을 시도하세요:

$ tsh.exe config | out-file .ssh\config -encoding utf8 -append
OpenSSH에서 대문자 호스트 이름 다이얼링 Teleport 클러스터의 라우팅은 기본적으로 대소문자를 구분하지만 OpenSSH는 항상 호스트 이름을 소문자로 변환합니다. OpenSSH 클라이언트를 사용하고 호스트 이름에 대문자가 있는 호스트가 있는 경우 Teleport 구성의 `auth_service` 블록 또는 `cluster_networking_config` 리소스에 `case_insensitive_routing: true`를 설정해야 할 수 있습니다.
Multiple Clusters

여러 Teleport 프록시 서버 간에 전환하는 경우 각각에 대해 tsh config를 다시 실행하여 클러스터별 구성을 생성해야 합니다.

마찬가지로 신뢰할 수 있는 클러스터가 추가되거나 제거되면 tsh config를 다시 실행하고 이전 구성을 교체하세요.

5단계/5단계. sshd 호스트에 연결#

새 텍스트를 OpenSSH 클라이언트 구성 파일에 추가하면 앞서 생성한 구성을 사용하여 sshd 호스트에 로그인할 수 있습니다.

먼저 Teleport 클러스터 주소, sshd 호스트에 로그인하는 데 사용할 사용자 이름, SSH 트래픽에 사용하는 sshd 호스트의 포트에 대한 환경 변수를 정의합니다:

# sshd 호스트에 액세스하는 데 사용할 수 있는 로그인 보기
$ tsh status | grep Logins
Logins:             ubuntu, root
$ USER=ubuntu
$ CLUSTER=teleport.example.com
$ PORT=22
# sshd 호스트에 액세스하는 데 사용할 수 있는 로그인 보기
$ tsh status | grep Logins
Logins:             ubuntu, root
$ USER=ubuntu
$ CLUSTER=mytenant.teleport.sh
$ PORT=22

다음으로, 원격 호스트에 SSH로 연결합니다:

$ ADDR_NODE=openssh-node
$ ssh -p ${PORT?} -F ssh_config_teleport "${USER?}@${ADDR_NODE?}.${CLUSTER?}"

이 이름은 DNS로 확인할 필요가 없습니다. 연결이 Teleport 프록시 서비스를 통해 라우팅됩니다.

여기서 포트를 재정의하는 이유는 무엇인가요?

기본적으로 tsh config가 생성하는 OpenSSH 클라이언트 구성은 Teleport 클러스터에서 노드의 3022 포트로 다이얼하도록 Teleport 프록시 서비스에 지시합니다. 이는 노드의 SSH 서비스가 포트 3022에서 수신 대기 중인 경우 작동하며, OpenSSH 클라이언트를 통해 Teleport SSH 서비스에 연결할 수 있음을 의미합니다.

Teleport 노드를 클러스터에 참여시키면 노드가 클러스터의 프록시 서비스에 대한 역방향 터널을 생성합니다. 생성된 구성을 사용하여 Teleport 클러스터의 호스트에 액세스하기 위해 ssh 명령을 실행하면 Teleport 프록시 서비스는 이 역방향 터널을 통해 호스트에 연결을 시도하고, 실패하면 직접 주소 다이얼을 시도합니다.

우리의 경우 sshd 호스트가 Teleport를 실행하지 않으므로 역방향 터널이 존재하지 않습니다. 대신 프록시 서비스가 호스트의 SSH 포트에서 직접 연결을 설정합니다.

신뢰할 수 있는 클러스터를 사용하나요?

신뢰할 수 있는 리프 클러스터의 호스트에 로그인하려면 노드 이름과 루트 클러스터 이름 사이에 클러스터 이름을 넣으세요:

$ ssh -F ssh_config_teleport ${USER?}@node2.leafcluster.${CLUSTER}
Note

Teleport는 키 대신 OpenSSH 인증서를 사용합니다. 원격 호스트에 연결할 때 OpenSSH는 호스트 주소가 OpenSSH 인증서의 Principals 섹션 아래에 나열되어 있는지 확인합니다. 일반적으로 이는 IP 주소가 아닌 완전 자격을 갖춘 도메인 이름입니다.

OpenSSH 속도 제한#

OpenSSH의 내장 속도 제한에 주의하세요. 많은 수의 프록시 서비스 연결에서 다음과 같은 오류가 발생할 수 있습니다:

channel 0: open failed: connect failed: ssh: handshake failed: EOF

man sshd_configMaxStartups 설정을 참조하세요. 이 설정은 기본적으로 OpenSSH가 한 번에 10개의 인증되지 않은 연결만 허용하고 연결 수가 10을 초과하면 30% 확률로 연결을 삭제하기 시작한다는 것을 의미합니다. 100개의 인증 연결에 도달하면 모든 새 연결이 삭제됩니다.

동시성 수준을 높이려면 MaxStartups 50:30:100과 같은 값으로 증가시키세요. 이렇게 하면 50개의 동시 연결과 최대 100개가 허용됩니다.

에이전트 없는 모드에서 Teleport와 OpenSSH 사용 (수동 설치)

원문 보기
요약

이 가이드에서는 OpenSSH 서버 sshd를 Teleport 클러스터에 참여하도록 구성하는 방법을 보여줍니다. Teleport와 OpenSSH를 사용하면 빠르게 시작할 수 있다는 장점이 있지만, 장기적으로는 sshd를 teleport로 교체하는 것을 권장합니다.

이 가이드에서는 OpenSSH 서버 sshd를 Teleport 클러스터에 참여하도록 구성하는 방법을 보여줍니다. 기존의 OpenSSH 서버 플릿은 Teleport CA에서 동적으로 발급된 SSH 인증서를 수락하도록 구성할 수 있습니다.

Teleport와 OpenSSH를 사용하면 빠르게 시작할 수 있다는 장점이 있지만, 장기적으로는 sshdteleport로 교체하는 것을 권장합니다. teleport SSH 서버는 OpenSSH와 호환되지 않는 여러 기능을 지원합니다:

작동 방식#

높은 수준에서 Teleport는 프록시 서비스를 통해 SSH 연결을 프록시하여 OpenSSH 서버를 지원합니다. OpenSSH 서버는 사용자의 직접 연결을 신뢰하는 대신 프록시 서비스의 연결을 신뢰하도록 설정됩니다. 이렇게 하면 OpenSSH 서버에 대한 모든 연결이 세션 IO와 감사 이벤트를 기록하고 RBAC를 적용할 수 있는 프록시 서비스를 통해 이루어집니다.

작동 방식에 대한 자세한 내용은 등록된 OpenSSH 노드 RFD를 참조할 수 있습니다. 다음은 RFD의 몇 가지 핵심 세부 사항입니다:

  • 프록시 서비스는 사용자를 대신하여 Auth 서비스에서 Teleport OpenSSH CA로 서명된 인증서를 요청할 수 있는 고유한 기능을 갖추고 있으며, OpenSSH 서버는 이 CA로 서명된 인증서만 신뢰하도록 설정됩니다. 따라서 OpenSSH 서버에 연결하려면 사용자가 프록시를 통해 연결하여 OpenSSH 인증서를 요청하고 사용해야 합니다.
  • 사용자를 OpenSSH 서버에 연결하기 전에 프록시 서비스는 사용자가 액세스할 수 있는지 RBAC 확인을 수행합니다.
  • 세션과 감사 이벤트를 기록하기 위해 프록시 서비스는 클라이언트 SSH 연결을 종료(복호화)하고 OpenSSH 서버와 자체 연결을 설정합니다. 그런 다음 두 연결 사이에서 파이프 역할을 하며 이벤트와 IO를 기록합니다.
Note

이 가이드는 노드 리소스를 생성하고 Teleport CA를 신뢰하도록 OpenSSH를 구성하여 OpenSSH 노드를 등록하는 방법을 보여줍니다. 그러나 OpenSSH 노드에 teleport 바이너리를 복사하고 실행할 수 있다면 대신 표준 등록 가이드를 따를 수 있습니다. 이 가이드에서 보여주는 많은 단계를 Teleport가 자동으로 수행할 수 있습니다.

사전 요구 사항#

  • 로컬 머신의 OpenSSH 버전 6.9 이상. 다음 명령으로 OpenSSH 버전을 확인하세요:

    $ ssh -V
    
  • 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:

  • Teleport가 아닌 OpenSSH 서버 sshd 버전 7.4 이상이 설치된 Linux 호스트. 이 호스트의 SSH 포트는 Teleport 프록시 서비스 호스트의 트래픽에 열려 있어야 합니다.

To check that you can connect to your Teleport cluster, sign in with tsh login, then verify that you can run tctl commands using your current credentials.

For example, run the following command, assigning to the domain name of the Teleport Proxy Service in your cluster and to your Teleport username:

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

If you can connect to the cluster and run the tctl status command, you can use your current credentials to run subsequent tctl commands from your workstation. If you host your own Teleport cluster, you can also run tctl commands on the computer that hosts the Teleport Auth Service for full permissions.

1단계/5단계. Teleport 클러스터에 노드 리소스 추가#

OpenSSH 노드에 SSH 연결을 요청하면 Teleport는 연결을 설정하기 위해 노드의 IP 주소를 찾을 수 있어야 합니다.

Teleport가 OpenSSH 서버에 어떻게 연결할지 알 수 있도록 node 리소스를 선언합니다. 로컬 머신에서 다음 내용으로 openssh-node-resource.yaml 파일을 생성합니다:

kind: node
version: v2
sub_kind: openssh
metadata:
  name: a100fdd0-52db-4eca-a7ab-c3afa7a1564a
  labels:
    env: prod
spec:
  addr: 1.2.3.4:22
  hostname: openssh-node

spec.addrspec.hostname은 필수입니다. spec.addr을 노드의 주소와 포트에 할당하고 spec.hostname을 사용자가 Teleport에서 볼 노드 이름으로 할당합니다.

metadata.labels 필드는 SSH 서비스 인스턴스에 레이블을 지정하여 RBAC 규칙을 적용할 수 있습니다.

metadata.name 필드는 필수가 아니지만 제공하는 경우 UUID(범용 고유 식별자)여야 합니다. node 이름에 적합한 새 UUID를 생성하려면 Linux 또는 macOS에서 uuidgen 명령을 사용하거나 Windows의 Powershell에서 New-Guid cmdlet을 사용하세요.

노드 리소스 생성:

$ tctl create openssh-node-resource.yaml
Note

이 단계는 인프라스트럭처 코드(IaC) 도구(tctl, Terraform, Kubernetes Operator)로 수행할 수 있습니다. 이에 대한 설명은 OpenSSH 서버 IaC 가이드에서 확인할 수 있습니다.

2단계/5단계. Teleport CA를 신뢰하도록 sshd 구성#

이 가이드의 후반부에서 Teleport Auth 서비스에서 서명한 인증서를 사용하여 SSH 서버에 인증하는 SSH 클라이언트 구성을 생성합니다. 이것이 작동하려면 sshd가 Teleport Auth 서비스에서 생성된 인증서로 사용자가 로그인할 수 있도록 허용하도록 지정해야 합니다.

Teleport CA 공개 키를 내보내는 것으로 시작합니다.

sshd를 실행하는 호스트에서 다음 명령을 실행하고 를 Teleport 프록시 서비스의 주소에 할당합니다:

$ export KEY=$(curl 'https:///webapi/auth/export?type=openssh' | sed "s/cert-authority\ //")

sshd에서 공개 키에 액세스할 수 있도록 합니다:

$ sudo bash -c "echo \"$KEY\" > /etc/ssh/teleport_openssh_ca.pub"
$ sudo bash -c "echo 'TrustedUserCAKeys /etc/ssh/teleport_openssh_ca.pub' >> /etc/ssh/sshd_config"

sshd를 다시 시작합니다. systemd 활성화 호스트의 경우 다음 명령을 실행합니다:

$ sudo systemctl restart sshd

이제 sshd는 Teleport가 발급한 인증서를 제시하는 사용자를 신뢰합니다.

3단계/5단계. 호스트 인증 구성#

다음으로 sshd 호스트에 대한 유효한 호스트 인증서를 발급하도록 Teleport에 요청합니다. 이 가이드의 후반부에서 이 인증서를 신뢰하도록 SSH 클라이언트를 구성하여 SSH 클라이언트에 대해 sshd 호스트를 인증합니다. 앞서 생성한 사용자 인증서와 마찬가지로 호스트 인증서는 Teleport Auth 서비스에서 서명됩니다.

사용자에게 올바른 권한이 있는지 확인#

사용자는 호스트 인증서를 읽고 쓸 권한이 있어야 합니다.

로컬 머신에서 다음 내용으로 host-certifier.yaml 파일을 생성합니다:

kind: role
version: v5
metadata:
  name: host-certifier
spec:
  allow:
    rules:
      - resources:
          - host_cert
        verbs:
          - list
          - create
          - read
          - update
          - delete

역할 리소스 생성:

$ tctl create host-certifier.yaml
# role 'host-certifier' has been created

Assign the host-certifier role to your Teleport user by running the appropriate commands for your authentication provider:

이제 sshd 호스트의 호스트 키를 내보내는 데 필요한 권한이 있습니다.

호스트 인증서 발급#

노드의 UUID 찾기

노드 리소스를 생성할 때 metadata.name 필드를 설정하지 않은 경우 Teleport Auth 서비스가 해당 노드에 대한 UUID를 생성했습니다. Teleport 프록시 서비스는 UUID를 사용하여 동일한 호스트 이름을 가진 노드를 구분하므로 호스트 인증서에 추가해야 합니다. 노드의 UUID를 찾으려면 먼저 호스트 이름이 고유한지 확인합니다:

$ tctl get node/openssh-node --format text

하나의 노드만 표시되고 jq가 설치되어 있으면 다음 명령으로 노드의 UUID를 가져올 수 있습니다:

$ tctl get node/openssh-node --format=json | jq -r ".[0].metadata.name"

그렇지 않으면 이 명령의 YAML 출력에서 metadata.name 필드에서 노드의 UUID를 찾으세요:

$ tctl get node/openssh-node

호스트 인증서 생성#

호스트 인증서를 생성할 때 노드를 참조하는 모든 도메인 이름과 주소를 지정하는 것이 중요합니다. 호스트 인증서를 생성할 때 지정하지 않은 이름이나 주소로 노드에 연결하려고 하면 Teleport가 SSH 연결을 거부합니다.

로컬 머신에서 노드의 IP 주소, 완전 자격을 갖춘 도메인 이름 및 노드의 UUID를 환경 변수에 할당합니다. 호스트 이름으로 노드에 연결하지 않을 경우 안전하게 생략할 수 있습니다.

$ ADDR=1.2.3.4,openssh-node,a100fdd0-52db-4eca-a7ab-c3afa7a1564a

다음 tctl 명령을 실행하여 호스트 인증서를 생성합니다:

$ tctl auth sign \
      --host=${ADDR?} \
      --format=openssh \
      --out=myhost

# The credentials have been written to myhost, myhost-cert.pub

위 명령은 개인 키와 인증서를 생성합니다.

여러 호스트의 인증서 발급

여러 호스트에 대한 인증서를 생성하려면 host 플래그를 쉼표로 구분된 주소 목록에 할당합니다. 와일드카드 도메인의 인증서는 OpenSSH에서 지원되지 않으므로 각 도메인은 완전 자격을 갖춰야 합니다.

ssh-keygen을 사용하여 인증서 내용을 확인합니다:

$ ssh-keygen -L -f myhost-cert.pub

Principals 섹션에는 앞서 ADDR에 할당한 주소가 포함되어야 합니다:

myhost-cert.pub:
        Type: ssh-rsa-cert-v01@openssh.com host certificate
        Public key: RSA-CERT SHA256:nHkp6SnrAW4AV00VUaqPgR6SgdyvV9MmjUrYnwZ779A
        Signing CA: RSA SHA256:euqx2Y8Pq+r0c94GKVNXAklBVTmAJtaQUn3/ehrfEJE (using rsa-sha2-512)
        Key ID: ""
        Serial: 0
        Valid: after 2022-04-22T11:14:16
        Principals:
                1.2.3.4
                openssh-node
                a100fdd0-52db-4eca-a7ab-c3afa7a1564a
        Critical Options: (none)
        Extensions:
                x-teleport-authority UNKNOWN OPTION (len 33)
                x-teleport-role UNKNOWN OPTION (len 8)

호스트 키와 인증서를 /etc/ssh 디렉터리에 배치하여 sshd 호스트에 복사합니다.

이 파일에 올바른 권한이 있는지 확인합니다:

$ sudo chmod 0600 /etc/ssh/myhost
$ sudo chmod 0600 /etc/ssh/myhost-cert.pub

그런 다음 sshd 호스트의 /etc/ssh/sshd_config에 다음 줄을 추가합니다:

HostKey /etc/ssh/myhost
HostCertificate /etc/ssh/myhost-cert.pub

sshd를 다시 시작합니다.

4단계/5단계. SSH 클라이언트 구성 생성#

다음 단계는 Teleport에서 관리하는 자격 증명을 사용하여 sshd 호스트에 연결하도록 OpenSSH 클라이언트를 구성하는 것입니다. 이 구성은 사용자의 Teleport 발급 인증서를 사용하여 sshd 호스트에 인증합니다. 또한 앞서 생성한 호스트 인증서를 사용하여 sshd 호스트를 인증합니다.

먼저 Teleport 클러스터에 로그인했는지 확인합니다:

$ tsh status
> Profile URL:        https://teleport.example.com:443
  Logged in as:       myuser
  Cluster:            teleport.example.com
  Roles:              access, auditor, editor, host-certifier
  Logins:             ubuntu, root
  Kubernetes:         enabled
  Valid until:        2022-05-06 22:54:01 -0400 EDT [valid for 11h53m0s]
  Extensions:         permit-agent-forwarding, permit-port-forwarding, permit-pty
$ tsh status
> Profile URL:        https://teleport.example.com:443
  Logged in as:       myuser
  Cluster:            teleport.example.com
  Roles:              access, auditor, editor, reviewer, host-certifier
  Logins:             ubuntu, root
  Kubernetes:         enabled
  Valid until:        2022-05-06 22:54:01 -0400 EDT [valid for 11h53m0s]
  Extensions:         permit-agent-forwarding, permit-port-forwarding, permit-pty
$ tsh status
> Profile URL:        https://mytenant.teleport.sh:443
  Logged in as:       myuser
  Cluster:            mytenant.teleport.sh
  Roles:              access, auditor, editor, reviewer, host-certifier
  Logins:             ubuntu, root
  Kubernetes:         enabled
  Valid until:        2022-05-06 22:54:01 -0400 EDT [valid for 11h53m0s]
  Extensions:         permit-agent-forwarding, permit-port-forwarding, permit-pty

로컬 머신에서 다음 tsh 명령을 실행합니다. 이렇게 하면 클러스터의 호스트에 연결하기 위해 Teleport에서 관리하는 자격 증명을 사용하도록 SSH 클라이언트에 알려주는 구성 블록이 출력됩니다.

$ tsh config > ssh_config_teleport

이 명령은 정리를 쉽게 하기 위해 비표준 위치에 SSH 구성 파일을 생성합니다. 원하는 경우 tsh config의 출력을 기본 SSH 구성 파일(~/.ssh/config)에 추가할 수 있습니다.

구성은 어떻게 작동하나요?

Teleport는 서버가 연결을 처리할 때 실행되는 사전 정의된 명령인 여러 하위 시스템을 포함하는 SSH 서버를 구현합니다. 프록시 서비스는 원격 호스트와 신뢰할 수 있는 클러스터로 SSH 트래픽을 전달하는 proxy 하위 시스템을 구현합니다.

다음은 tsh config가 생성하는 구성에 대한 간략한 설명입니다:

# Common flags for all {} hosts
Host *.{} {}
    UserKnownHostsFile "{}"
    IdentityFile "{}"
    CertificateFile "{}"

ssh하는 호스트가 Teleport 클러스터에 속하는 경우(즉, 주소가 클러스터 도메인의 하위 도메인인 경우) .tsh 디렉터리에 저장된 Teleport 관리 알려진 호스트 파일, 개인 키 및 인증서를 사용합니다.

# Flags for all {} hosts except the proxy
Host *.{} !{}
    Port 3022
    ProxyCommand "{}" proxy ssh --cluster={} --proxy={} %r@%h:%p

ssh하는 호스트가 Teleport 클러스터에 속하는 경우 OpenSSH 클라이언트는 먼저 프록시 서비스에 SSH 연결을 설정하는 ProxyCommand 명령을 실행합니다. 이 명령 tsh proxy ssh는 선택한 호스트(신뢰할 수 있는 클러스터의 호스트 포함)로 SSH 트래픽을 프록시 서비스를 통해 전달하기 위해 proxy 하위 시스템을 요청합니다.

tsh proxy ssh 명령은 다음과 유사한 명령을 통해 proxy 하위 시스템을 요청합니다. teleport.example.com이라는 클러스터에서 rootmynode라는 노드에 로그인한다고 가정합니다:

$ /usr/bin/ssh -l root -A -o UserKnownHostsFile=/root/.tsh/known_hosts -p 11105 teleport.example.com -s proxy:mynode:3022@teleport.example.com

명령이 사용하는 known_hosts 파일은 tsh에서 관리합니다. sshd 호스트의 정보가 이 파일에 나열되어 있으므로 SSH 클라이언트는 앞서 생성한 인증서를 통해 호스트를 인증할 수 있습니다.

Windows에서 PowerShell을 사용하나요?

Windows에서 PowerShell을 사용하는 경우 일반적인 셸 리디렉션으로 파일이 잘못된 인코딩으로 쓰일 수 있습니다. 올바르게 쓰여지도록 하려면 다음을 시도하세요:

$ tsh.exe config | out-file .ssh\config -encoding utf8 -append
OpenSSH에서 대문자 호스트 이름 다이얼링 Teleport 클러스터의 라우팅은 기본적으로 대소문자를 구분하지만 OpenSSH는 항상 호스트 이름을 소문자로 변환합니다. OpenSSH 클라이언트를 사용하고 호스트 이름에 대문자가 있는 호스트가 있는 경우 Teleport 구성의 `auth_service` 블록 또는 `cluster_networking_config` 리소스에 `case_insensitive_routing: true`를 설정해야 할 수 있습니다.
Multiple Clusters

여러 Teleport 프록시 서버 간에 전환하는 경우 각각에 대해 tsh config를 다시 실행하여 클러스터별 구성을 생성해야 합니다.

마찬가지로 신뢰할 수 있는 클러스터가 추가되거나 제거되면 tsh config를 다시 실행하고 이전 구성을 교체하세요.

5단계/5단계. sshd 호스트에 연결#

새 텍스트를 OpenSSH 클라이언트 구성 파일에 추가하면 앞서 생성한 구성을 사용하여 sshd 호스트에 로그인할 수 있습니다.

먼저 Teleport 클러스터 주소, sshd 호스트에 로그인하는 데 사용할 사용자 이름, SSH 트래픽에 사용하는 sshd 호스트의 포트에 대한 환경 변수를 정의합니다:

# sshd 호스트에 액세스하는 데 사용할 수 있는 로그인 보기
$ tsh status | grep Logins
Logins:             ubuntu, root
$ USER=ubuntu
$ CLUSTER=teleport.example.com
$ PORT=22
# sshd 호스트에 액세스하는 데 사용할 수 있는 로그인 보기
$ tsh status | grep Logins
Logins:             ubuntu, root
$ USER=ubuntu
$ CLUSTER=mytenant.teleport.sh
$ PORT=22

다음으로, 원격 호스트에 SSH로 연결합니다:

$ ADDR_NODE=openssh-node
$ ssh -p ${PORT?} -F ssh_config_teleport "${USER?}@${ADDR_NODE?}.${CLUSTER?}"

이 이름은 DNS로 확인할 필요가 없습니다. 연결이 Teleport 프록시 서비스를 통해 라우팅됩니다.

여기서 포트를 재정의하는 이유는 무엇인가요?

기본적으로 tsh config가 생성하는 OpenSSH 클라이언트 구성은 Teleport 클러스터에서 노드의 3022 포트로 다이얼하도록 Teleport 프록시 서비스에 지시합니다. 이는 노드의 SSH 서비스가 포트 3022에서 수신 대기 중인 경우 작동하며, OpenSSH 클라이언트를 통해 Teleport SSH 서비스에 연결할 수 있음을 의미합니다.

Teleport 노드를 클러스터에 참여시키면 노드가 클러스터의 프록시 서비스에 대한 역방향 터널을 생성합니다. 생성된 구성을 사용하여 Teleport 클러스터의 호스트에 액세스하기 위해 ssh 명령을 실행하면 Teleport 프록시 서비스는 이 역방향 터널을 통해 호스트에 연결을 시도하고, 실패하면 직접 주소 다이얼을 시도합니다.

우리의 경우 sshd 호스트가 Teleport를 실행하지 않으므로 역방향 터널이 존재하지 않습니다. 대신 프록시 서비스가 호스트의 SSH 포트에서 직접 연결을 설정합니다.

신뢰할 수 있는 클러스터를 사용하나요?

신뢰할 수 있는 리프 클러스터의 호스트에 로그인하려면 노드 이름과 루트 클러스터 이름 사이에 클러스터 이름을 넣으세요:

$ ssh -F ssh_config_teleport ${USER?}@node2.leafcluster.${CLUSTER}
Note

Teleport는 키 대신 OpenSSH 인증서를 사용합니다. 원격 호스트에 연결할 때 OpenSSH는 호스트 주소가 OpenSSH 인증서의 Principals 섹션 아래에 나열되어 있는지 확인합니다. 일반적으로 이는 IP 주소가 아닌 완전 자격을 갖춘 도메인 이름입니다.

OpenSSH 속도 제한#

OpenSSH의 내장 속도 제한에 주의하세요. 많은 수의 프록시 서비스 연결에서 다음과 같은 오류가 발생할 수 있습니다:

channel 0: open failed: connect failed: ssh: handshake failed: EOF

man sshd_configMaxStartups 설정을 참조하세요. 이 설정은 기본적으로 OpenSSH가 한 번에 10개의 인증되지 않은 연결만 허용하고 연결 수가 10을 초과하면 30% 확률로 연결을 삭제하기 시작한다는 것을 의미합니다. 100개의 인증 연결에 도달하면 모든 새 연결이 삭제됩니다.

동시성 수준을 높이려면 MaxStartups 50:30:100과 같은 값으로 증가시키세요. 이렇게 하면 50개의 동시 연결과 최대 100개가 허용됩니다.