인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
IaC로 에이전트 없는 OpenSSH 서버 등록
이 가이드에서는 코드 기반의 인프라(IaC)를 통해 Teleport에 OpenSSH 노드를 등록하는 방법을 보여줍니다. Teleport는 코드에서 리소스를 동적으로 생성하는 세 가지 방법을 지원합니다:
- Kubernetes에서 Teleport 리소스를 관리할 수 있는 Teleport Kubernetes Operator
- Terraform을 통해 Teleport 리소스를 관리할 수 있는 Teleport Terraform Provider
- 로컬 컴퓨터 또는 CI 환경에서 Teleport 리소스를 관리할 수 있는
tctl
CLI
전제 조건
이 가이드를 따르려면 다음이 필요합니다:
운영 중인 오퍼레이터가 있어야 하며, 다음 중 하나를 따라야 합니다:
오퍼레이터를 배포한 네임스페이스를 설정해야 합니다. 이 네임스페이스는 CustomResources를 배포할 네임스페이스입니다:
`teleport-cluster` Helm 차트로 배포된 오퍼레이터의 경우
export OPERATOR_NAMESPACE="teleport-cluster"독립 실행형 오퍼레이터의 경우
export OPERATOR_NAMESPACE="teleport-iac"
Terraform 제공자 가이드를 따라 기능적인 Teleport Terraform 제공자가 있어야 합니다.
- Teleport 클러스터에 추가할 OpenSSH가 실행 중인 서버가 있어야 합니다. 이 서버는 프록시에서 도달할 수 있어야 하며(공용 IP 주소 및 포트 22에서 트래픽을 허용하는 방화벽 필요).
Tip
사설 SSH 서버(예: NAT 뒤, 사설 네트워크 내, 인바운드 트래픽을 차단하는 방화벽으로 보호됨)를 추가하려면 Teleport 에이전트를 설치할 수 있습니다. Teleport 에이전트는 Teleport 프록시 서비스에 터널을 열어, 사용자가 프록시 서비스를 통해 연결할 수 있도록 합니다.
1/5단계. 필요한 정보 수집
Teleport에 OpenSSH 서버를 등록하려면 다음 정보를 필요로 합니다:
- 서버 호스트 이름: ssh-server-hostname
- SSH 포트가 있는 공용 서버 IP 주소: 198.51.100.1:22
또한 서버에 대한 레이블 세트를 선택해야 합니다. 이 레이블은 서버를 설명하고, 어떤 사용자가 서버에 접근할 수 있는지를 제어하는 데 사용됩니다. 레이블은 나중에 동적으로 변경할 수 있으며, openSSH를 재구성할 필요가 없습니다.
서버에 대한 액세스를 제어하는 레이블 및 방법에 대한 추가 정보는 서버에 대한 액세스 제어 페이지를 참조하십시오.
가이드의 나머지 부분에서 레이블은 다음과 같이 설정됩니다:
env: test
team: engineering
2/5단계. 서버 매니페스트 작성
이 단계에서는 Teleport에 등록할 OpenSSH 서버 리소스를 설명하는 텍스트 파일을 작성합니다. 이러한 파일을 매니페스트라고 하며, 사용하는 IaC 도구에 따라 구문이 다릅니다.
이 매니페스트는 일반적으로 git과 같은 공동 수정 시스템에서 버전 관리됩니다. 이를 통해 모든 변경 사항을 추적하고, Teleport의 리소스를 변경하기 전 표준 코드 검토 절차를 따르며, 필요할 경우 Teleport 인스턴스를 신속하게 재배포할 수 있습니다.
서버 ID를 선택해야 하며, Teleport가 자동으로 선택하게 할 수 없습니다. 이 ID는 두 가지 용도로 사용됩니다:
- 나중에 서버 정보를 업데이트(예: 레이블 변경)하려면 매니페스트에서 해당 ID를 지정해야 합니다. 그렇지 않으면 Teleport는 기존 서버를 수정하는 대신 새 서버 리소스를 생성합니다.
- 동일한 호스트 이름을 가진 여러 서버가 있는 경우, 고유 ID를 통해 특정 서버를 선택할 수 있습니다.
To generate a new UUID:
uuidgen
사용. 이 실행 파일은 대부분의 머신에서 기본적으로 설치되어 있습니다.
설치되어 있지 않은 경우, DEB 기반 배포판의 경우 uuid-runtime
패키지와
RPM 기반 배포판의 경우 util-linux
를 통해 사용할 수 있습니다.
uuidgen
a100fdd0-52db-4eca-a7ab-c3afa7a1564a
기본적으로 설치된 uuidgen
및 tr
패키지를 사용하십시오:
uuidgen | tr '[:upper:]' '[:lower:]'
a100fdd0-52db-4eca-a7ab-c3afa7a1564a
NewGuid
powershell cmdlet을 사용하십시오:
New-guidGuid----a100fdd0-52db-4eca-a7ab-c3afa7a1564a
다음 openssh-node-resource.yaml
파일을 생성하십시오:
kind: node
version: v2
sub_kind: openssh
metadata:
name: a100fdd0-52db-4eca-a7ab-c3afa7a1564a # 이전에 생성된 UUID입니다
labels:
env: test
team: engineering
spec:
addr: 198.51.100.1:22
hostname: ssh-server-hostname
To generate a new UUID:
uuidgen
사용. 이 실행 파일은 대부분의 머신에서 기본적으로 설치되어 있습니다.
설치되어 있지 않은 경우, DEB 기반 배포판의 경우 uuid-runtime
패키지와
RPM 기반 배포판의 경우 util-linux
를 통해 사용할 수 있습니다.
uuidgen
a100fdd0-52db-4eca-a7ab-c3afa7a1564a
기본적으로 설치된 uuidgen
및 tr
패키지를 사용하십시오:
uuidgen | tr '[:upper:]' '[:lower:]'
a100fdd0-52db-4eca-a7ab-c3afa7a1564a
NewGuid
powershell cmdlet을 사용하십시오:
New-guidGuid----a100fdd0-52db-4eca-a7ab-c3afa7a1564a
다음 openssh-node-resource.yaml
파일을 생성하십시오:
apiVersion: resources.teleport.dev/v1
kind: TeleportOpenSSHServerV2
metadata:
name: a100fdd0-52db-4eca-a7ab-c3afa7a1564a # 이전에 생성된 UUID입니다
# Kubernetes CR 레이블은 Teleport 리소스에 전파됩니다
labels:
env: test
team: engineering
spec:
addr: 198.51.100.1:22
hostname: ssh-server-hostname
다음 openssh-node-resource.tf
파일을 생성하십시오:
resource "teleport_server" "openssh_agentless" {
version = "v2"
sub_kind = "openssh"
// 서버는 이름이 필요하지 않으며, 이는 특별한 경우입니다.
// 이름이 설정되지 않으면 Teleport에 의해 UUID가 생성되고
// 다시 Terraform으로 가져옵니다.
spec = {
addr = "198.51.100.1:22"
hostname = "ssh-server-hostname"
}
}
output "openssh_node_id" {
value = teleport_server.openssh_agentless.metadata.name
}
3/5단계. 모든 매니페스트 적용
서버를 다음 명령어로 선언합니다:
tctl create -f openssh-node-resource.yamlnode "a100fdd0-52db-4eca-a7ab-c3afa7a1564a" 가 생성되었습니다
다음 명령어로 Kubernetes 매니페스트를 적용합니다:
kubectl apply -n "$OPERATOR_NAMESPACE" -f openssh-node-resource.yamlteleportopensshserverv2.resources.teleport.dev/a100fdd0-52db-4eca-a7ab-c3afa7a1564a 생성되었습니다
그런 다음 TeleportOpenSSHServerV2
Kubernetes 커스텀 리소스를 나열합니다:
kubectl get teleportopensshserverv2 -n "$OPERATOR_NAMESPACE"NAME AGE
a100fdd0-52db-4eca-a7ab-c3afa7a1564a 10m
Terraform 연결성을 테스트하고 변경 사항을 검토합니다:
terraform planTerraform는 다음 작업을 수행할 예정입니다:
# teleport_server.openssh_agentless 가 생성될 예정입니다 + resource "teleport_server" "openssh_agentless" { + id = (적용 후 알 수 있음) + kind = (적용 후 알 수 있음) + metadata = (적용 후 알 수 있음) + spec = { + addr = "198.51.100.1:22" + hostname = "ssh-server-hostname" } + sub_kind = "openssh" + version = "v2" }
계획: 1 추가, 0 변경, 0 제거.
출력 변경 사항: + openssh_node_id = (적용 후 알 수 있음)
계획을 적용하고 노드 UUID를 복구합니다:
terraform apply[...]
다음 작업을 수행하시겠습니까? Terraform는 위에 설명된 작업을 수행할 것입니다. 승인하려면 'yes' 만 허용됩니다.
값을 입력하세요: yes
teleport_server.openssh_agentless: 생성 중...teleport_server.openssh_agentless: 3초 후 생성 완료 [id=a100fdd0-52db-4eca-a7ab-c3afa7a1564a]
적용 완료! 리소스: 1 추가, 0 변경, 0 제거.
출력:
openssh_node_id = "a100fdd0-52db-4eca-a7ab-c3afa7a1564a"
4/5단계. Teleport에서 생성된 서버 검증
이제 IaC 도구가 실행되었으므로, Teleport가 OpenSSH 서버를 인식하고 있는지 검증합니다:
주어진 호스트 이름 또는 IP 주소로 노드를 나열합니다
tsh ls --search="ssh-server-hostname"Node Name Address Labels--------------------- ------------ --------------- --------------------------ssh-server-hostname 198.51.100.1:22 env=test,team=engineering호스트 이름으로 노드 세부정보 가져오기
tctl get "node/ssh-server-hostname"ID로 노드 세부정보 가져오기
tctl get node/a100fdd0-52db-4eca-a7ab-c3afa7a1564a
5/5단계. Teleport CA를 신뢰하고 호스트 인증서 발급하기
현재 Teleport는 OpenSSH 서버가 존재하는 것을 알고 있으며, 이를 어떻게 접촉할 수 있는지와 어떤 사용자가 접근할 수 있어야 하는지를 알고 있습니다. 그러나 Teleport와 서버는 서로를 신뢰하지 않습니다.
서버를 구성하여 Teleport에서 오는 연결을 신뢰하도록 설정해야 하며(즉, Teleport SSH 인증 기관을 신뢰하도록 설정해야 하며), 서버에 Teleport에서 발급한 SSH 호스트 인증서를 제공해야 합니다.
이러한 단계는 자동화할 수 있지만, 자동화는 귀하의 맞춤 인프라와 도구에 따라 달라질 것입니다(가상 머신 이미지에서 SSH CA를 구성하거나, 사용자 정의 시작 스크립트를 사용하거나, Ansible을 통해 서버를 프로비저닝할 수 있습니다. ...).
단계별 수동 설정은 OpenSSH 수동 설치 가이드에서 2단계부터 설명되어 있습니다.
다음 단계
- RBAC 설정하여 어떤 사용자가 어떤 서버에 SSH를 사용할 수 있는지 제어합니다.