InfoGrab DocsInfoGrab 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 서버로의 모든 연결이 프록시 서비스를 거치도록 보장하며, 프록시 서비스에서 세션 입출력과 감사 이벤트를 기록하고 RBAC를 적용할 수 있습니다.

이 방식이 어떻게 작동하는지 더 자세히 알고 싶다면 등록된 OpenSSH 노드 RFD를 참고하세요. 아래는 RFD에서 발췌한 몇 가지 주요 내용입니다:

  • 프록시 서비스는 사용자를 대신하여 Teleport OpenSSH CA로 Auth 서비스가 서명한 인증서를 요청할 수 있는 고유한 권한을 가지며, OpenSSH 서버는 이 CA로 서명된 인증서만 신뢰하도록 설정됩니다. 따라서 OpenSSH 서버에 연결하려면 사용자는 반드시 프록시를 통해 OpenSSH 인증서를 요청하고 사용해야 합니다.
  • 사용자를 OpenSSH 서버에 연결하기 전에, 프록시 서비스는 해당 사용자가 접근을 허용받아야 하는지 확인하기 위해 RBAC 검사를 수행합니다.
  • 세션과 그 감사 이벤트를 기록하기 위해, 프록시 서비스는 클라이언트의 SSH 연결을 종료(복호화)하고 OpenSSH 서버로 자체 연결을 수립합니다. 그런 다음 두 연결 사이의 파이프 역할을 하면서 진행 중에 이벤트와 입출력을 기록합니다.
Note

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

사전 요구사항#

  • 로컬 머신에 OpenSSH 버전 6.9 이상이 설치되어 있어야 합니다. 다음 명령어로 OpenSSH 버전을 확인할 수 있습니다:

    $ ssh -V
    
  • 실행 중인 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
     ```
   

 
  • OpenSSH 서버 sshd 버전 7.4 이상이 설치되어 있지만 Teleport는 설치되지 않은 Linux 호스트. 이 호스트의 SSH 포트는 Teleport 프록시 서비스 호스트로부터의 트래픽에 대해 열려 있어야 합니다.

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/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

이 단계는 Infrastructure-as-Code(IaC) 도구(tctl, Terraform 또는 Kubernetes Operator)로 수행할 수 있습니다. 자세한 내용은 OpenSSH 서버 IaC 가이드에서 설명합니다.

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

이 가이드의 뒷부분에서는 Teleport Auth 서비스가 서명한 인증서를 사용하여 SSH 서버에 인증하는 SSH 클라이언트 구성을 생성할 것입니다. 이를 위해서는 sshd가 Teleport Auth 서비스가 생성한 인증서로 사용자가 로그인할 수 있도록 허용해야 합니다.

먼저 Teleport CA 공개 키를 내보내는 것부터 시작합니다.

sshd를 실행 중인 호스트에서 다음 명령어를 실행하되, proxy에 Teleport 프록시 서비스의 주소를 지정하세요:

$ export KEY=$(curl 'https://proxy/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
Tip

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

인증 공급자에 맞는 적절한 명령을 실행하여 host-certifier 역할을 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?},host-certifier"
    
  3. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

GitHub

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

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

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

    다음은 예시입니다:

      teams_to_roles:
        - organization: octocats
          team: admins
          roles:
            - access
    +       - host-certifier
    
  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 섹션에 host-certifier을 추가합니다.

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

    다음은 예시입니다:

      attributes_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - host-certifier
    
  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 섹션에 host-certifier을 추가합니다.

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

    다음은 예시입니다:

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

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

이제 sshd 호스트의 호스트 키를 내보내는 데 필요한 권한을 갖게 됩니다.

호스트 인증서 발급하기#

노드의 UUID 찾기

node 리소스를 생성할 때 metadata.name 필드를 이전에 설정하지 않았다면, Teleport Auth 서비스가 해당 노드에 대한 범용 고유 식별자(UUID)를 생성했습니다. Teleport 프록시 서비스는 동일한 호스트 이름을 가진 노드를 구분하기 위해 이 UUID를 사용하므로, 호스트 인증서에 이 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)

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

이 파일들이 올바른 권한을 갖도록 하세요:

$ 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 서버를 구현합니다. 프록시 서비스는 proxy 서브시스템을 구현하여 SSH 트래픽을 원격 호스트와 트러스티드 클러스터로 전달합니다.

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

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

ssh로 접속하려는 호스트가 사용자의 Teleport 클러스터에 속한 경우(즉, 그 주소가 클러스터 도메인의 서브도메인인 경우), .tsh 디렉터리에 저장된 Teleport가 관리하는 known hosts 파일, 개인 키, 인증서를 사용합니다.

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

ssh로 접속하려는 호스트가 사용자의 Teleport 클러스터에 속한 경우, OpenSSH 클라이언트는 먼저 ProxyCommand라는 명령을 실행하여 프록시 서비스로의 SSH 연결을 수립합니다. tsh proxy ssh라는 이 명령은 proxy 서브시스템을 요청하여 프록시 서비스를 통해 SSH 트래픽을 선택한 호스트(트러스티드 클러스터의 호스트 포함)로 전달합니다.

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 호스트의 포트에 대한 환경 변수를 정의하세요:

# See the available logins you can use to access your sshd host
$ tsh status | grep Logins
Logins:             ubuntu, root
$ USER=ubuntu
$ CLUSTER=teleport.example.com
$ PORT=22
# See the available logins you can use to access your sshd host
$ 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?}"

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

여기서 포트를 왜 재정의하나요?

기본적으로 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_config에서 MaxStartups 설정을 참고하세요. 이 설정은 기본적으로 OpenSSH가 한 번에 10개의 인증되지 않은 연결만 허용하며, 연결 수가 10개를 초과하면 30%의 확률로 연결을 끊기 시작한다는 것을 의미합니다. 인증된 연결이 100개에 도달하면 모든 새로운 연결이 거부됩니다.

동시성 수준을 높이려면 값을 MaxStartups 50:30:100과 같이 늘리세요. 이렇게 하면 50개의 동시 연결과 최대 100개까지 허용됩니다.

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

Teleport v18.9
원문 보기
요약

이 가이드에서는 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 서버로의 모든 연결이 프록시 서비스를 거치도록 보장하며, 프록시 서비스에서 세션 입출력과 감사 이벤트를 기록하고 RBAC를 적용할 수 있습니다.

이 방식이 어떻게 작동하는지 더 자세히 알고 싶다면 등록된 OpenSSH 노드 RFD를 참고하세요. 아래는 RFD에서 발췌한 몇 가지 주요 내용입니다:

  • 프록시 서비스는 사용자를 대신하여 Teleport OpenSSH CA로 Auth 서비스가 서명한 인증서를 요청할 수 있는 고유한 권한을 가지며, OpenSSH 서버는 이 CA로 서명된 인증서만 신뢰하도록 설정됩니다. 따라서 OpenSSH 서버에 연결하려면 사용자는 반드시 프록시를 통해 OpenSSH 인증서를 요청하고 사용해야 합니다.
  • 사용자를 OpenSSH 서버에 연결하기 전에, 프록시 서비스는 해당 사용자가 접근을 허용받아야 하는지 확인하기 위해 RBAC 검사를 수행합니다.
  • 세션과 그 감사 이벤트를 기록하기 위해, 프록시 서비스는 클라이언트의 SSH 연결을 종료(복호화)하고 OpenSSH 서버로 자체 연결을 수립합니다. 그런 다음 두 연결 사이의 파이프 역할을 하면서 진행 중에 이벤트와 입출력을 기록합니다.
Note

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

사전 요구사항#

  • 로컬 머신에 OpenSSH 버전 6.9 이상이 설치되어 있어야 합니다. 다음 명령어로 OpenSSH 버전을 확인할 수 있습니다:

    $ ssh -V
    
  • 실행 중인 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
     ```
   

 
  • OpenSSH 서버 sshd 버전 7.4 이상이 설치되어 있지만 Teleport는 설치되지 않은 Linux 호스트. 이 호스트의 SSH 포트는 Teleport 프록시 서비스 호스트로부터의 트래픽에 대해 열려 있어야 합니다.

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/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

이 단계는 Infrastructure-as-Code(IaC) 도구(tctl, Terraform 또는 Kubernetes Operator)로 수행할 수 있습니다. 자세한 내용은 OpenSSH 서버 IaC 가이드에서 설명합니다.

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

이 가이드의 뒷부분에서는 Teleport Auth 서비스가 서명한 인증서를 사용하여 SSH 서버에 인증하는 SSH 클라이언트 구성을 생성할 것입니다. 이를 위해서는 sshd가 Teleport Auth 서비스가 생성한 인증서로 사용자가 로그인할 수 있도록 허용해야 합니다.

먼저 Teleport CA 공개 키를 내보내는 것부터 시작합니다.

sshd를 실행 중인 호스트에서 다음 명령어를 실행하되, proxy에 Teleport 프록시 서비스의 주소를 지정하세요:

$ export KEY=$(curl 'https://proxy/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
Tip

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

인증 공급자에 맞는 적절한 명령을 실행하여 host-certifier 역할을 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?},host-certifier"
    
  3. Teleport 클러스터에서 로그아웃한 다음 다시 로그인하여 새 역할을 적용합니다.

GitHub

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

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

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

    다음은 예시입니다:

      teams_to_roles:
        - organization: octocats
          team: admins
          roles:
            - access
    +       - host-certifier
    
  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 섹션에 host-certifier을 추가합니다.

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

    다음은 예시입니다:

      attributes_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - host-certifier
    
  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 섹션에 host-certifier을 추가합니다.

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

    다음은 예시입니다:

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

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

이제 sshd 호스트의 호스트 키를 내보내는 데 필요한 권한을 갖게 됩니다.

호스트 인증서 발급하기#

노드의 UUID 찾기

node 리소스를 생성할 때 metadata.name 필드를 이전에 설정하지 않았다면, Teleport Auth 서비스가 해당 노드에 대한 범용 고유 식별자(UUID)를 생성했습니다. Teleport 프록시 서비스는 동일한 호스트 이름을 가진 노드를 구분하기 위해 이 UUID를 사용하므로, 호스트 인증서에 이 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)

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

이 파일들이 올바른 권한을 갖도록 하세요:

$ 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 서버를 구현합니다. 프록시 서비스는 proxy 서브시스템을 구현하여 SSH 트래픽을 원격 호스트와 트러스티드 클러스터로 전달합니다.

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

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

ssh로 접속하려는 호스트가 사용자의 Teleport 클러스터에 속한 경우(즉, 그 주소가 클러스터 도메인의 서브도메인인 경우), .tsh 디렉터리에 저장된 Teleport가 관리하는 known hosts 파일, 개인 키, 인증서를 사용합니다.

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

ssh로 접속하려는 호스트가 사용자의 Teleport 클러스터에 속한 경우, OpenSSH 클라이언트는 먼저 ProxyCommand라는 명령을 실행하여 프록시 서비스로의 SSH 연결을 수립합니다. tsh proxy ssh라는 이 명령은 proxy 서브시스템을 요청하여 프록시 서비스를 통해 SSH 트래픽을 선택한 호스트(트러스티드 클러스터의 호스트 포함)로 전달합니다.

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 호스트의 포트에 대한 환경 변수를 정의하세요:

# See the available logins you can use to access your sshd host
$ tsh status | grep Logins
Logins:             ubuntu, root
$ USER=ubuntu
$ CLUSTER=teleport.example.com
$ PORT=22
# See the available logins you can use to access your sshd host
$ 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?}"

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

여기서 포트를 왜 재정의하나요?

기본적으로 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_config에서 MaxStartups 설정을 참고하세요. 이 설정은 기본적으로 OpenSSH가 한 번에 10개의 인증되지 않은 연결만 허용하며, 연결 수가 10개를 초과하면 30%의 확률로 연결을 끊기 시작한다는 것을 의미합니다. 인증된 연결이 100개에 도달하면 모든 새로운 연결이 거부됩니다.

동시성 수준을 높이려면 값을 MaxStartups 50:30:100과 같이 늘리세요. 이렇게 하면 50개의 동시 연결과 최대 100개까지 허용됩니다.