서버 액세스 트러블슈팅
이 섹션에서는 Teleport를 사용하여 서버에 대한 액세스를 관리할 때 발생할 수 있는 일반적인 문제와 이를 해결하거나 우회하는 방법을 설명합니다. 새 SSH 세션을 시작하면 Teleport는 자기 자신을 포크(fork)하고, 자식 프로세스는 연결을 시도하는 OS 사용자로 실행됩니다.
이 섹션에서는 Teleport를 사용하여 서버에 대한 액세스를 관리할 때 발생할 수 있는 일반적인 문제와 이를 해결하거나 우회하는 방법을 설명합니다.
SSH 세션 시작 실패#
새 SSH 세션을 시작하면 Teleport는 자기 자신을 포크(fork)하고, 자식 프로세스는 연결을 시도하는 OS 사용자로 실행됩니다. teleport 바이너리의 파일 시스템 권한에 해당 사용자의 실행 권한이 없으면 세션 시작에 실패합니다.
이 문제는 새로 설치된 소프트웨어를 모든 사용자가 실행할 수 없도록 방지하는 시스템에서 발생할 수 있습니다.
증상#
이 문제는 세션 연결이 끊어지며 다음과 유사한 오류 메시지가 표시됩니다:
Failed to launch: fork/exec /proc/self/exe: permission denied.
Process exited with status 255
해결 방법#
teleport 바이너리의 권한 설정을 확인해야 합니다.
teleport 바이너리의 파일 시스템 권한을 확인하려면:
-
teleport서비스가 설치된 컴퓨터에서 터미널 셸을 엽니다. -
다음 명령을 실행하여 Teleport 바이너리의 위치와 파일 시스템 권한을 확인합니다:
ls -al $(which teleport)명령은 다음과 유사한 출력을 반환해야 합니다:
-rwxr-xr-x 1 root wheel 531849504 Aug 30 18:32 /usr/local/bin/teleport다른 사용자가 읽고 실행할 수 있는 권한(-rwxr-xr-x)이 없으면 권한을 업데이트해야 합니다. 예를 들어:
sudo chmod go+rx $(which teleport) -
teleport서비스를 재시작합니다.
싱글 사인온(SSO) 사용자의 로그인 누락#
외부 ID 공급자를 사용하여 사용자의 싱글 사인온을 활성화하는 경우, 해당 사용자에게 로그인을 할당해야 합니다.
증상#
외부 ID 공급자의 인증 커넥터를 통해 Teleport에 액세스하는 사용자에게 원격 리소스 액세스에 필요한 로그인이 표시되지 않습니다.
해결 방법#
이 문제를 해결하려면 인증 커넥터 설정이 싱글 사인온 사용자에게 로그인을 할당하는지 확인하거나, 외부 ID 공급자의 그룹 멤버십을 통해 사용자에게 할당된 Teleport 역할의 트레이트(trait)를 수정해야 합니다. 역할에서 트레이트를 사용하는 방법에 대한 자세한 내용은 역할 템플릿을 참조하세요.
오프라인 서버가 서버 목록에 포함됨#
경우에 따라 tsh ls 또는 tctl nodes ls 명령을 실행하면 오프라인 상태의 서버가 포함될 수 있습니다.
예를 들어, Teleport Proxy Service에 하트비트 전송을 중단한 서버가 tsh ls 또는 tctl nodes ls 명령의 출력에서 10분 이상 사용 가능한 것으로 계속 표시될 수 있습니다.
증상#
응답하지 않는 서버가 tsh ls 또는 tctl nodes ls 명령의 출력에서 사용 가능한 것으로 표시됩니다.
예를 들어, 이 명령 중 하나를 실행하면 이전에 Teleport Proxy Service에 하트비트 신호를 보낸 서버에 대해 다음과 유사한 출력이 표시될 수 있으며, 이후 해당 서버 중 하나가 오프라인 상태가 된 경우에도 마찬가지입니다:
Node Name Address Labels
-------------- -------------- -----------------------
ip-172-3-1-242 127.0.0.1:3022 hostname=ip-172-3-1-242
ip-172-3-1-75 ⟵ Tunnel hostname=ip-172-3-1-75
ip-172-3-2-177 ⟵ Tunnel hostname=ip-172-3-2-177
해결 방법#
이전에 하트비트를 보낸 서버가 응답하지 않게 되었는지 조사하려면, tsh ls 또는 tctl nodes ls 명령에 --format json 커맨드라인 옵션을 사용하여 만료 시간을 포함한 추가 정보를 확인할 수 있습니다. 예를 들어:
"kind": "node",
"version": "v2",
"metadata": {
"name": "c78612d9-dab4-497f-a4d8-59ddb7edc6e9",
"labels": {
"teleport.internal/resource-id": "3547a530-3b58-4f65-8335-c5cf99c7b374"
},
"expires": "2023-09-15T21:40:17.653190645Z",
"id": 1694813417653574518
},
서버가 정기적으로 하트비트 신호를 보내는 경우, expires 값은 현재 시간으로부터 810분 정도로 비교적 일정하게 유지됩니다. 만료 시간이 일반적인 만료 시간보다 짧은 경우(예: 현재 시간으로부터 23분 이내)라면 서버가 하트비트 전송을 중단한 것으로 볼 수 있습니다.
공유 세션 참여 불가#
Teleport는 여러 사용자가 활성 세션을 관찰하거나 참여할 수 있도록 허용합니다. tsh 및 Teleport Web UI에서 다른 사용자의 세션에 참여할 수 있는 사용자를 제어하기 위해 규칙을 정의하고 역할 기반 정책을 구성할 수 있습니다. 공유 세션에 참여할 수 없는 경우, 역할 할당을 확인하고 join_session 권한이 포함된 역할이 있는지 확인해야 합니다.
예를 들어:
kind: role
metadata:
name: auditor
version: v6
spec:
allow:
join_sessions:
- name: Join prod sessions
roles : ['prod-access']
kinds: ['k8s', 'ssh']
modes: ['moderator', 'observer']
모더레이션 세션 및 세션 공유에 대한 자세한 내용은 세션 참여를 참조하세요.
에이전트리스 OpenSSH 서버에 root로 연결 불가#
/etc/ssh/sshd_config에서 sshd 설정을 확인하여 PermitRootLogin no 또는 PermitRootLogin forced-commands-only와 같은 설정이 있는지 확인해야 합니다. 이러한 설정 중 하나라도 있으면 root로 로그인할 수 없습니다.
Teleport를 통해 OpenSSH 서버에 root로 로그인하려면 이 설정을 PermitRootLogin prohibit-password로 변경하는 것을 권장합니다.
변경 사항을 적용하려면 sshd를 재시작해야 합니다:
$ sudo systemctl restart sshd
서버 목록에 의도한 호스트명 대신 UUID가 표시됨#
경우에 따라 tsh ls 명령이 의도한 호스트명 대신 UUID로 설정된 노드 이름으로 서버를 나열할 수 있습니다:
Node Name Address Labels
------------------------------------ -------- ------
4c022537-268c-4d8a-a79a-605868ee8a67 ⟵ Tunnel
ip-172-3-1-75 ⟵ Tunnel hostname=ip-172-3-1-75
ip-172-3-2-177 ⟵ Tunnel hostname=ip-172-3-2-177
Teleport SSH Service 인스턴스가 클러스터에 참여하면, Teleport Auth Service에 상태를 보고하기 시작합니다(일반적으로 Proxy Service를 통해). Auth Service는 서버 이름을 다음 패턴에 대해 검증합니다:
^[a-zA-Z0-9]+[a-zA-Z0-9\.-]*$
각 서버 이름은 영숫자 문자로 시작하고 영숫자 문자, 점, 하이픈만 포함해야 합니다. 노드 이름이 이 패턴을 위반하거나 256자를 초과하는 경우, Auth Service는 해당 이름을 UUID(서버의 Teleport 리소스 ID)로 대체합니다.
서버를 나열할 때 -v 플래그를 추가하여 유효하지 않은 호스트명이 있는지 확인할 수 있습니다:
$ tsh ls -v
Teleport Auth Service는 유효하지 않은 호스트명을 가진 보호된 서버의 레이블을 다음을 포함하도록 다시 씁니다:
teleport.internal/invalid-hostname
-v 플래그는 유효하지 않은 호스트명을 포함한 내부 레이블을 표시합니다.
유효하지 않은 호스트명을 수정하려면 영향받은 서버의 Teleport 구성 파일을 편집하고 해당 서버를 재시작합니다:
teleport:
- nodename: "_myhost"
+ nodename: "myhost"
