재해 복구를 위한 Break-Glass SSH 접근 구성
이 가이드는 다음과 같은 시나리오에서 Teleport 발급 인증서를 사용하여 OpenSSH를 통해 중요 에이전트 및 서버에 대한 비상 "break-glass" 접근을 구성하는 데 필요한 단계를 안내합니다: Teleport의 user CA는 비상 재해 복구 시나리오에서 OpenSSH 서버에 접근 권한을 부여하는 데 사용할 수 있는 수명이 짧은 서명된 인증서를 발급할 수 있습니다.
이 가이드는 다음과 같은 시나리오에서 Teleport 발급 인증서를 사용하여 OpenSSH를 통해 중요 에이전트 및 서버에 대한 비상 "break-glass" 접근을 구성하는 데 필요한 단계를 안내합니다:
- 서버의 Teleport 에이전트가 충돌, 오프라인 또는 사용 불가 상태가 된 경우.
- Teleport 제어 플레인이 다운되어 시스템에 접근할 수 없고 이를 수정하기 위한 대역 외 접근이 필요한 경우.
작동 방식#
Teleport의 user CA는 비상 재해 복구 시나리오에서 OpenSSH 서버에 접근 권한을 부여하는 데 사용할 수 있는 수명이 짧은 서명된 인증서를 발급할 수 있습니다.
Teleport 에이전트와 함께 OpenSSH 서버를 Teleport의 user CA를 신뢰하도록 구성함으로써 유효한 Teleport 발급 인증서를 가진 사용자는 Teleport 자체가 다운된 경우에도 정적 SSH 키나 비밀번호 없이 서버에 인증할 수 있습니다.
다음 목표를 달성하는 단계를 자세히 설명합니다:
- Teleport 에이전트 머신에서 실행되는 대역 외 OpenSSH 서버가 Teleport의
userCA를 신뢰하도록 구성 - 원격 호스트에
breakglass시스템 사용자 생성 - Teleport에서
breakglass역할 생성 - Teleport Machine ID 봇(
tbot)을 생성하여 지속적으로 Teleport CA를 사용하여 break-glass SSH 키와 인증서 발급 - Teleport가 다운되거나 응답하지 않는 경우에도 Teleport 발급 인증서를 사용하여 원격 서버 접근
4단계 및 5단계에서 구성된 break-glass 자격 증명을 보유하는 모든 머신을 보호해야 합니다. 이 인증서에 접근할 수 있는 누구나 1단계의 지침에 따라 대역 외 OpenSSH 서버가 구성된 모든 머신에 접근할 수 있습니다.
또한 이 가이드를 통해 구성된 breakglass 사용자로서의 모든 접근은 Teleport 세션 녹화 및 감사 로깅을 우회할 수 있습니다. 이 프로세스를 통해서만 breakglass 사용자를 사용해야 하며, 이 사용자는 일반 Teleport 접근 경로를 사용할 수 없는 경우 비상 break-glass 접근 이외의 목적으로 절대 사용해서는 안 됩니다.
모든 breakglass 사용자의 사용은 이유와 관계없이 즉각적인 조사의 원인이 되어야 합니다.
사전 요구사항#
- 로컬 머신에 OpenSSH 클라이언트 버전 7.4 이상.
- OpenSSH 서버(
sshd) 버전 7.4 이상이 있는 Linux 호스트.
-
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
tctlandtshclients.Installing `tctl` and `tsh` clients
-
Determine the version of your Teleport cluster. The
tctlandtshclients must be at most one major version behind your Teleport cluster version. Send a GET request to the Proxy Service at/v1/webapi/findand 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')" -
Follow the instructions for your platform to install
tctlandtshclients:
-
1단계/5. 대역 외 OpenSSH 서버 구성#
이 단계는 Teleport 에이전트 머신에서 완료됩니다.
이 단계는 Teleport 에이전트 머신에서 실행되는 대역 외 OpenSSH 서버가 Teleport user CA를 신뢰하도록 구성합니다. break-glass 접근을 위해 OpenSSH 서버가 실행되어야 하며 Teleport user 인증 기관(CA)에서 발급한 클라이언트 인증서를 신뢰하도록 구성되어야 합니다.
-
Teleport
userCA의 공개 키를 내보냅니다:Teleport 에이전트 머신에서 다음 명령을 실행합니다.
teleport.example.com을 Teleport Proxy Service 주소로 교체합니다:$ export KEY=$(curl -fsSL --proto '=https' --tlsv1.2 'https:///webapi/auth/export?type=user' | sed "s/^cert-authority\ //") $ echo "${KEY:?}" | sudo tee /etc/ssh/teleport_user_ca.pub -
/etc/ssh/sshd_config파일에서 다음 줄이 추가되어 있거나 주석 해제되어 있는지 확인합니다:Include /etc/ssh/sshd_config.d/*.conf -
/etc/ssh/authorized_principals/breakglass파일을 추가하여 로그인에 대한 권한 있는 프린시펄을breakglass로만 설정하고 권한을 제한합니다:$ sudo mkdir -p /etc/ssh/authorized_principals $ sudo chmod 755 /etc/ssh/authorized_principals $ echo "breakglass" | sudo tee /etc/ssh/authorized_principals/breakglass $ sudo chmod 644 /etc/ssh/authorized_principals/breakglass -
/etc/ssh/sshd_config.d에teleport-breakglass.conf파일을 생성합니다:sudo tee /etc/ssh/sshd_config.d/teleport-breakglass.conf > /dev/null <<'EOF' # Teleport breakglass config Match User breakglass # Trust the Teleport user CA for connections as this user TrustedUserCAKeys /etc/ssh/teleport_user_ca.pub # Only allow principals listed in the file to connect (i.e. breakglass) AuthorizedPrincipalsFile /etc/ssh/authorized_principals/breakglass # Don't allow SSH key authentication as this user AuthorizedKeysFile /dev/null EOF -
sshd 구성 파일의 구문을 확인합니다 (오류가 출력되지 않아야 합니다):
$ sudo sshd -t -
sshd 서비스를 재시작합니다:
# This unit may also be called ssh.service depending on your distribution # Check with 'systemctl list-unit-files | grep ssh | grep service' $ sudo systemctl restart sshd
이제 sshd는 Teleport 발급 SSH 인증서를 제시하는 사용자를 신뢰합니다.
2단계/5. breakglass 사용자 생성#
이 단계는 Teleport 에이전트 머신에서 완료됩니다.
이 단계는 break-glass 접근을 위한 로그인 시 사용할 breakglass 사용자를 Teleport 에이전트 서버에 추가합니다.
Teleport 에이전트 서버에 로그인하고 다음 명령을 실행합니다.
-
breakglass사용자를 생성합니다:$ sudo adduser --disabled-password breakglassNote일반적인 보안 원칙으로
sudo를 통해root권한을 제한하는 것이 강력히 권장됩니다.breakglass는 시스템을 문제 해결하고 접근을 복구하기 위한 상승된 접근 권한이 필요하므로 break-glass 접근의 모든 사용은sshd접근 로그를 통해 항상 감사되어야 합니다.3단계/5. Teleport에서
breakglass역할, 봇 및 조인 방법 생성#이 단계는 로컬 머신에서 완료됩니다.
-
역할을 생성할 권한이 있는 사용자로 Teleport 클러스터에 로그인합니다:
$ tsh login --proxy= -
breakglassTeleport 역할을 생성합니다:breakglass-role.yaml파일에 역할을 정의합니다:kind: role metadata: name: breakglass-role spec: allow: logins: - breakglass node_labels: '*': '*' deny: {} options: cert_format: standard forward_agent: false max_session_ttl: 24h0m0s port_forwarding: true ssh_file_copy: true version: v7다음을 사용하여 역할을 적용합니다:
$ tctl create -f breakglass-role.yaml -
break-glass 사용에 유효한 인증서를 지속적으로 갱신하기 위해 백그라운드에서 실행될
breakglass봇을 정의합니다:breakglass-bot.yaml파일에 봇을 정의합니다:kind: bot version: v1 metadata: # name is a unique identifier for the Bot in the cluster. name: breakglass-bot spec: # roles is a list of roles to grant to the Bot roles: ['breakglass-role']다음 단계에서 대상 머신에 봇을 설정합니다.
-
tctl을 사용하여 봇을 등록합니다:$ tctl create -f breakglass-bot.yaml -
봇의 실행 인스턴스를 위한 조인 방법으로 사용할 bound keypair를 생성합니다:
breakglass-token.yaml파일에 조인 방법을 정의합니다:kind: token version: v2 metadata: # This name will be used in tbot's `onboarding.token` field. name: breakglass-bot-join-token spec: roles: [Bot] # bot_name must match the name of the bot created earlier. bot_name: breakglass-bot join_method: bound_keypair bound_keypair: recovery: mode: standard limit: 1 -
tctl을 사용하여 토큰을 생성합니다:$ tctl create -f breakglass-token.yaml -
tctl을 사용하여 봇의registration_secret을 가져옵니다 - 다음 단계에서 Machine ID 봇이 읽을 파일에 씁니다.$ tctl get token/breakglass-bot-join-token --format=json | jq -r '.[0].status.bound_keypair.registration_secret'
4단계/5. Teleport Machine ID 봇 설정#
이 단계는 break-glass 접근을 위한 인증서를 저장하고 사용할 머신에서 완료됩니다.
이 단계는 Teleport Machine ID 봇을 백그라운드 데몬(
systemd로 관리)으로 구성하고 시작합니다. 이 봇은 지속적으로 break-glass 접근(break-glass 사용자 사용)을 위한 수명이 짧은 키와 인증서를 생성하고 갱신하며 실행되는 머신에 저장합니다.이 가이드는 공개 키 암호화에 기반한 안전한 선택적 1회용 조인 방법인 bound keypair를 사용하여 Teleport Machine ID 봇을 클러스터에 조인합니다.
아래 구성은 발급 시점부터 24시간 동안 유효한 인증서를 생성하며 2시간마다 갱신됩니다. 즉, 정확한 사용 시점에 따라 인증서는 22~24시간 동안 break-glass 접근에 사용 가능합니다. 이 유효 기간은 사용성(수명이 짧은 인증서는 필요할 때 유효하지 않을 수 있음)과 보안(수명이 긴 인증서는 손상된 경우 사용될 수 있는 기간이 길어 덜 안전함) 사이의 균형을 맞추기 위한 합리적인 기본값으로 선택되었습니다.
이 과정에서
jq가 설치되어 있다고 가정합니다. 설치되어 있지 않으면tctl get token/breakglass-bot-join-token을 실행하고.status.bound_keypair.registration_secret필드를 검사하세요.-
이 머신에
teleport-breakglass사용자와 필요한 저장소 경로를 생성합니다:$ sudo useradd -s /sbin/nologin teleport-breakglass봇의 저장소 및 출력 디렉터리도 생성해야 합니다:
$ sudo mkdir -p /var/lib/teleport-breakglass /opt/teleport-breakglass/output -
이전 단계에서 수집한
registration_secret을 이 머신의 파일에 씁니다:$ echo "REGISTRATION-SECRET-FROM-PREVIOUS-STEP" | sudo tee /var/lib/teleport-breakglass/registration-secret이제 이 디렉터리의 소유권을
teleport-breakglass사용자로 변경하고 다른 시스템 사용자의 접근을 방지합니다:$ sudo chown -R teleport-breakglass:teleport-breakglass /var/lib/teleport-breakglass /opt/teleport-breakglass/output $ sudo chmod 700 /var/lib/teleport-breakglass /opt/teleport-breakglass/output -
봇의 구성 파일을 작성합니다.
/etc/tbot-teleport-breakglass.yaml파일에 구성을 정의합니다:version: v2 # replace teleport.example.com with the FQDN of your Teleport proxy server proxy_server: name="teleport.example.com" />:443 certificate_ttl: "24h" renewal_interval: "2h" onboarding: join_method: bound_keypair token: breakglass-bot-join-token bound_keypair: # replace this with the value of `registration_secret` from the previous step registration_secret_path: /var/lib/teleport-breakglass/registration-secret storage: type: directory # change to a directory to use to store the bot's own identity for communicating with the Teleport cluster path: /var/lib/teleport-breakglass outputs: - type: identity destination: type: directory # change to the output directory you'd like to use to store the bot's outputted OpenSSH private key and certificate path: /opt/teleport-breakglass/output -
봇이 백그라운드에서 실행되도록 구성하려면 봇의 systemd 유닛 파일을 작성합니다:
$ sudo tbot install systemd \ --write \ --name tbot-teleport-breakglass \ --config /etc/tbot-teleport-breakglass.yaml \ --user teleport-breakglass \ --group teleport-breakglass루트가 아닌 사용자는 기본 위치(
/run)에 접근할 수 없으므로 사용된 PID 파일 경로도 수정해야 합니다:$ sudo sed -i "s_PIDFile=/run/_PIDFile=/var/lib/teleport-breakglass/_g" /etc/systemd/system/tbot-teleport-breakglass.service $ sudo sed -i "s_--pid-file=/run/_--pid-file=/var/lib/teleport-breakglass/_g" /etc/systemd/system/tbot-teleport-breakglass.service -
systemd 구성을 다시 로드합니다:
$ sudo systemctl daemon-reload -
머신 부팅 시 봇이 자동으로 시작되도록 구성하고 즉시 시작합니다:
$ sudo systemctl enable --now tbot-teleport-breakglass -
봇이 성공적으로 시작되었는지 확인합니다:
$ sudo systemctl status tbot-teleport-breakglass ● tbot-teleport-breakglass.service - tbot-teleport-breakglass - Teleport 머신 및 워크로드 아이덴티티 Service Loaded: loaded (/etc/systemd/system/tbot-teleport-breakglass.service; enabled; preset: enabled) Active: active (running) since Thu 2025-11-27 10:32:24 AST; 7s ago Main PID: 2437534 (tbot) Tasks: 9 (limit: 9065) Memory: 22.8M (peak: 23.4M) CPU: 239ms CGroup: /system.slice/tbot-teleport-breakglass.service └─2437534 /usr/local/bin/tbot start -c /etc/tbot-teleport-breakglass.yaml -
봇이 인증서를 올바르게 출력했는지 확인합니다 (
sudo를 사용해야 합니다. 이 인증서는teleport-breakglass사용자만 읽을 수 있습니다):$ sudo -u teleport-breakglass ls -l /opt/teleport-breakglass/output/ total 60 -rw------- 1 teleport-breakglass teleport-breakglass 5513 Nov 27 10:32 identity -rw------- 1 teleport-breakglass teleport-breakglass 241 Nov 27 10:32 key -rw------- 1 teleport-breakglass teleport-breakglass 1274 Nov 27 10:32 key-cert.pub -rw------- 1 teleport-breakglass teleport-breakglass 161 Nov 27 10:32 key.pub -rw------- 1 teleport-breakglass teleport-breakglass 612 Nov 27 10:32 known_hosts -rw------- 1 teleport-breakglass teleport-breakglass 1379 Nov 27 10:32 ssh_config -rw------- 1 teleport-breakglass teleport-breakglass 1330 Nov 27 10:32 teleport-database-ca.crt -rw------- 1 teleport-breakglass teleport-breakglass 2051 Nov 27 10:32 teleport-host-ca.crt -rw------- 1 teleport-breakglass teleport-breakglass 794 Nov 27 10:32 teleport-user-ca.crt -rw------- 1 teleport-breakglass teleport-breakglass 1375 Nov 27 10:32 tlscert -
인증서의 유효성을 확인하여 지금부터 약 24시간 동안 유효한지 확인합니다:
$ date Thu Nov 27 10:39:41 AST 2025 $ sudo -u teleport-breakglass ssh-keygen -Lf /opt/teleport-breakglass/output/key-cert.pub | grep Valid Valid: from 2025-11-27T10:31:24 to 2025-11-28T10:32:24
5단계/5. OpenSSH를 사용하여 Teleport 에이전트 머신 접근#
이 단계는 break-glass 접근을 위한 인증서를 저장하고 사용할 머신에서 완료됩니다.
이 단계는 break-glass 접근을 사용해야 하는 경우 수행할 일련의 작업을 설명합니다.
-
Teleport 발급 break-glass 인증서를 사용하여 연결하는 로컬 SSH 구성을 생성합니다:
/opt/teleport-breakglass/breakglass_ssh_config라는 파일에 구성을 정의합니다:Host * User breakglass UserKnownHostsFile /opt/teleport-breakglass/output/known_hosts IdentityFile /opt/teleport-breakglass/output/key CertificateFile /opt/teleport-breakglass/output/key-cert.pub StrictHostKeyChecking no # Only use identities explicitly set here, not those from any running ssh-agent. IdentitiesOnly yes권한이 올바르게 설정되어 있는지 확인합니다:
$ sudo chown teleport-breakglass:teleport-breakglass /opt/teleport-breakglass/breakglass_ssh_config -
이제 break-glass SSH 구성을 사용하여
breakglass사용자와 Teleport 발급 인증서로 Teleport 에이전트에 안전하게 접근합니다:$ sudo -u teleport-breakglass ssh -F /opt/teleport-breakglass/breakglass_ssh_config sshd-serverNote/opt/teleport-breakglass-output디렉터리의 출력된 인증서와 파일은 보안을 강화하기 위해teleport-breakglass사용자와root만 읽을 수 있으므로 여기서sudo -u teleport-breakglass ssh를 사용합니다.연결해야 하는 호스트 이름에 대한 DNS 확인이 없는 경우 IP 주소를 사용할 수 있습니다:
$ sudo -u teleport-breakglass ssh -F /opt/teleport-breakglass/breakglass_ssh_config 10.11.12.134또는
ssh의HostName옵션으로 사용할 IP를 제공할 수 있습니다:$ sudo -u teleport-breakglass ssh -F /opt/teleport-breakglass/breakglass_ssh_config -o "HostName=10.11.12.134" sshd-serverWarningtbot에서 Teleport 제어 플레인으로의 연결이 오프라인 상태를 유지하면 출력된 인증서는 다음 22시간 동안만 유효하며 그 후에는 만료되어 break-glass 접근이 더 이상 불가능합니다. 이 기간 내에 Teleport 제어 플레인에 대한 접근을 복원할 수 없는 경우 인증서가 아직 유효한 동안 break-glass 접근을 사용하여 대체 접근 전략을 설정해야 합니다.
위에서 설명한 방법은 Teleport의 에이전트나 제어 플레인이 다운된 경우에도 Teleport CA 서명 인증서를 사용하여 비상 시나리오에서 서버와 Teleport 에이전트에 안전하게 접근할 수 있도록 합니다. 이 프로세스는 OpenSSH를 지원하는 서버에서 실행되는 모든 Teleport 에이전트에 사용할 수 있습니다.
-
