Infograb logo
Teleport를 OpenSSH와 함께 에이전트 없는 모드로 사용하기

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

Teleport와 OpenSSH를 사용하는 것은 진행하기 쉽지만, 장기적으로는 sshdteleport로 대체하는 것을 권장합니다. teleport SSH 서버는 OpenSSH와 호환되지 않는 여러 기능을 지원합니다:

Teleport는 Proxy Service를 통해 SSH 연결을 프록시하여 OpenSSH를 지원합니다. Teleport 사용자가 OpenSSH 노드에 연결을 요청하면, Proxy Service는 사용자의 Teleport 역할을 확인합니다.

RBAC 검사가 성공하면 Proxy Service는 Teleport CA에 의해 서명된 동적으로 생성된 인증서로 OpenSSH 노드에 인증합니다. 이렇게 하면 Proxy Service가 OpenSSH 노드에 대한 연결을 기록하고 감사할 수 있습니다.

Proxy Service는 Teleport 사용자가 감사 요구를 우회하는 것을 방지하기 위해 인증서가 Teleport CA에 의해 서명되도록 요구합니다. 이 인증서는 Auth Service만 소유합니다.

이 설정에서 Teleport SSH Service는 RBAC 검사를 수행하고 호스트에서 세션을 감사 및 기록하여, SSH 세션을 녹화할 때 연결 종료의 필요성을 없앱니다.

참고

OpenSSH 노드를 Teleport에 등록하려면 teleport 바이너리를 sshd 호스트에 복사해야 합니다. teleport 바이너리는 클러스터에 노드를 등록하고 인증서를 생성하며 OpenSSH sshd 구성 수정 등을 처리합니다. teleport 바이너리를 sshd에 복사하고 실행하는 것이 불가능한 경우, 대신 수동으로 노드를 등록할 수 있습니다.

전제 조건

  • 로컬 머신에 OpenSSH 버전 6.9 이상이 설치되어 있어야 합니다. OpenSSH 버전을 확인하려면 다음 명령어를 실행하세요:

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

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

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

  • Teleport가 아닌 OpenSSH 서버 sshd 버전 7.4 이상이 설치된 Linux 호스트가 필요하며, 이 호스트의 SSH 포트는 Teleport Proxy Service 호스트의 트래픽에 개방되어 있어야 합니다.
  • 당신의 Teleport 클러스터에 연결할 수 있는지 확인하려면, tsh login으로 로그인한 다음 현재 자격 증명을 사용하여 tctl 명령어를 실행할 수 있는지 확인하십시오. 예를 들어:
    tsh login --proxy=teleport.example.com --user=email@example.com
    tctl status

    클러스터 teleport.example.com

    버전 16.2.0

    CA 핀 sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678

    클러스터에 연결하고 tctl status 명령어를 실행할 수 있다면, 현재 자격 증명을 사용하여 작업대에서 후속 tctl 명령어를 실행할 수 있습니다. 자신의 Teleport 클러스터를 호스팅하는 경우, Teleport 인증 서비스를 호스팅하는 컴퓨터에서 전체 권한으로 tctl 명령어를 실행할 수도 있습니다.

레거시 OpenSSH 노드에서 v14로 업그레이드하기

이전에 Teleport CA를 신뢰하도록 OpenSSH 노드를 구성했지만 등록하지 않았고, Teleport 클러스터를 Teleport 14로 업그레이드하면 기본적으로 더 이상 연결할 수 없습니다. 이는 클러스터에 등록되지 않은 OpenSSH 서버에 대한 무작위 전화가 Teleport 14에서 더 이상 허용되지 않기 때문입니다. OpenSSH 노드에 대한 액세스를 유지하려면 이전에 구성한 모든 OpenSSH 노드를 Teleport에 등록하는 이 가이드를 따라야 합니다. 이 작업은 Teleport 클러스터가 Teleport 14로 업그레이드되기 에 완료해야 합니다.

OpenSSH 노드를 등록하는 데 문제가 있거나 모든 OpenSSH 노드를 등록하기 전에 Teleport 클러스터를 Teleport 14로 업그레이드해야 하는 경우, TELEPORT_UNSTABLE_UNLISTED_AGENT_DIALING 환경 변수를 Proxy Service에 전달하고 yes로 설정할 수 있습니다. 이를 통해 등록되지 않은 OpenSSH 노드에 대한 연결이 허용되지만, Teleport v15에서 제거될 것입니다.

1단계/3단계. sshd 구성하기

Teleport는 클러스터에 가입한 Teleport 프로세스를 통해 인프라 내 리소스에 대한 액세스만 허용합니다.

OpenSSH 노드를 등록하려면 클러스터에 연결하기 위한 유효한 인증 토큰이 필요합니다. 아래 명령어를 실행하여 Teleport Auth Service에 대한 토큰을 생성할 수 있습니다:

tctl tokens add --type=node --format=text
abcd123-insecure-do-not-use-this

teleport 바이너리를 sshd 호스트에 복사합니다. sshd를 구성하고 다음 명령어로 클러스터에 노드 리소스를 생성합니다:

sudo teleport join openssh \ --address server1.example.com:22 \ --proxy-server teleport.example.com:443 \ --join-method token \ --token abcd123-insecure-do-not-use-this \ --labels env=dev

명령어 옵션을 아래의 값으로 변경합니다:

  • server1.example.com:22 Teleport 클러스터에 조인할 노드의 주소와 포트로 설정합니다.
  • teleport.example.com:443 Teleport Proxy Service의 주소와 포트로 설정합니다.
  • abcd123-insecure-do-not-use-this 조인 토큰 값을 설정합니다.

tsh ls 또는 웹 UI에서 새 노드가 나열되었는지 확인합니다. tctl edit nodes/<hostname>로 호스트 이름과 레이블을 수정할 수 있습니다. 호스트 이름이 고유하지 않으면 tctl nodes ls -v에서 UUID를 가져와 tctl edit nodes/<uuid>로 수정합니다. 노드가 성공적으로 등록된 것을 확인한 후 복사한 teleport 바이너리를 삭제할 수 있습니다.

2단계/3단계. SSH 클라이언트 구성 생성하기

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

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

tsh status
> 프로필 URL: https://teleport.example.com:443 로그인 사용자: myuser 클러스터: teleport.example.com 역할: access, auditor, editor, host-certifier 로그인: ubuntu, root Kubernetes: 활성화됨 유효 기간: 2022-05-06 22:54:01 -0400 EDT [유효 기간 11h53m0s] 확장: permit-agent-forwarding, permit-port-forwarding, permit-pty
tsh status
> 프로필 URL: https://teleport.example.com:443 로그인 사용자: myuser 클러스터: teleport.example.com 역할: access, auditor, editor, reviewer, host-certifier 로그인: ubuntu, root Kubernetes: 활성화됨 유효 기간: 2022-05-06 22:54:01 -0400 EDT [유효 기간 11h53m0s] 확장: permit-agent-forwarding, permit-port-forwarding, permit-pty
tsh status
> 프로필 URL: https://mytenant.teleport.sh:443 로그인 사용자: myuser 클러스터: mytenant.teleport.sh 역할: access, auditor, editor, reviewer, host-certifier 로그인: ubuntu, root Kubernetes: 활성화됨 유효 기간: 2022-05-06 22:54:01 -0400 EDT [유효 기간 11h53m0s] 확장: permit-agent-forwarding, permit-port-forwarding, permit-pty

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

tsh config > ssh_config_teleport

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

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

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

# 모든 {{ .ClusterName }} 호스트에 대한 공통 플래그
Host *.{{ .ClusterName }} {{ .ProxyHost }}
    UserKnownHostsFile "{{ .KnownHostsPath }}"
    IdentityFile "{{ .IdentityFilePath }}"
    CertificateFile "{{ .CertificateFilePath }}"

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

# 프록시를 제외한 모든 {{ .ClusterName }} 호스트에 대한 플래그
Host *.{{ .ClusterName }} !{{ .ProxyHost }}
    Port 3022
    ProxyCommand "{{ .TSHPath }}" proxy ssh --cluster={{ .ClusterName }} --proxy={{ .ProxyHost }} %r@%h:%p

ssh로 연결하는 호스트가 Teleport 클러스터에 속하면, OpenSSH 클라이언트는 먼저 SSH 연결을 Proxy Service에 설정하는 ProxyCommand라는 명령을 실행합니다. 이 명령은 SSH 트래픽을 Proxy Service를 통해 선택한 호스트(신뢰할 수 있는 클러스터의 호스트 포함)로 전달하기 위해 proxy 서브시스템을 요청하는 tsh 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을 사용할 때는 일반 셸 리디렉션이 잘못된 인코딩으로 파일을 쓸 수 있다는 점에 유의하십시오. 파일이 제대로 작성되도록 하려면 다음 방법을 사용해 보십시오:

tsh.exe config | out-file .ssh\config -encoding utf8 -append

Teleport 클러스터의 라우팅은 기본적으로 대소문자를 구분하지만, OpenSSH는 항상 호스트 이름을 소문자로 변환합니다. OpenSSH 클라이언트를 사용하고 있고 호스트 이름에 대문자가 있는 경우, Teleport 구성의 auth_service 블록이나 cluster_networking_config 리소스에 case_insensitive_routing: true를 설정해야 할 수 있습니다.

다중 클러스터

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

마찬가지로 신뢰할 수 있는 클러스터가 추가되거나 제거되면, 이전 구성을 교체하기 위해 tsh config를 다시 실행해야 합니다.

3단계/3단계. 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로 로그인합니다:

ssh -p ${PORT?} -F ssh_config_teleport "${USER?}@${ADDR?}.${CLUSTER?}"

이 이름은 DNS를 통해 확인할 필요가 없으며, 연결은 Teleport Proxy Service를 통해 라우팅됩니다.

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

Teleport 클러스터에 노드를 조인할 때, 노드는 클러스터의 Proxy Service에 대한 역 터널을 생성합니다. 우리가 생성한 구성을 사용하여 Teleport 클러스터의 호스트에 액세스하기 위한 ssh 명령을 실행할 때마다, Teleport Proxy Service는 이 역 터널을 통해 호스트에 연결을 시도하고, 실패하면 주소로 직접 전화를 걸 것입니다.

이 경우 sshd 호스트는 Teleport를 실행하고 있지 않기 때문에, 역 터널이 존재하지 않습니다. 대신 Proxy Service는 호스트의 SSH 포트에서 직접 연결을 설정할 것입니다.

신뢰할 수 있는 리프 클러스터의 호스트에 로그인하려면, 리프 클러스터의 이름을 노드 이름과 루트 클러스터 이름 사이에 배치하면 됩니다:

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

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

Teleport 원문 보기