Infograb logo
Ansible와 함께하는 머신 ID

Ansible은 SSH를 통해 리눅스 호스트 집합을 관리하기 위한 일반적인 도구입니다. 호스트에 연결하기 위해서는 인증 방법이 필요합니다. 머신 ID는 Ansible에 제공하여 SSH 노드에 연결할 수 있는 단기 인증서를 안전하고 감사 가능한 방식으로 제공할 수 있습니다.

이 가이드에서는 머신 ID 에이전트인 tbot을 구성하여 자격 증명 및 OpenSSH 구성을 생성하고, 그런 다음 Ansible을 구성하여 이러한 자료를 사용하여 Teleport 프록시 서비스를 통해 SSH 노드에 연결하는 방법을 안내합니다.

전제 조건

Ansible과 함께 Teleport를 사용하려면 다음 도구가 필요합니다.

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

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

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

  • ssh OpenSSH 도구

  • ansible >= 2.9.6

  • 선택 사항: JSON 출력을 처리하기 위한 jq

  • tbot은 Ansible을 실행할 머신에 이미 설치되고 구성되어 있어야 합니다. 자세한 정보는 배포 가이드를 참조하십시오.

  • 위 가이드를 따라 했다면, SSH 인증서 및 Ansible에서 사용할 OpenSSH 구성의 디렉토리를 정의하는 --destination-dir=/opt/machine-id 플래그를 주목하십시오.

    특히, Ansible 구성에서 Teleport 노드에 연결하는 방법을 정의하는 데 사용되는 /opt/machine-id/ssh_config 파일을 사용하게 됩니다.

  • 당신의 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 명령어를 실행할 수도 있습니다.

1단계/4. RBAC 구성

Ansible이 SSH 노드에 연결하기 위해 tbot에 의해 생성된 자격 증명을 사용하므로, 먼저 Teleport를 구성하여 봇에 대한 액세스를 부여해야 합니다. 이는 필요한 권한을 부여하는 역할을 생성한 다음 이 역할을 봇에 할당하여 수행됩니다.

이 예제에서는 사용자인 root에 대해 모든 SSH 노드에 액세스를 부여합니다. 이 이름이 SSH 노드에 대해 사용 가능하고 노드를 관리하는 데 필요한 적절한 권한이 있는 사용자 이름으로 설정되었는지 확인하십시오.

다음 내용을 가진 role.yaml이라는 파일을 생성하십시오:

kind: role
version: v6
metadata:
  name: example-role
spec:
  allow:
    # 사용자 'root'의 로그인 허용.
    logins: ['root']
    # 모든 노드에 대한 연결 허용. 이 라벨을 조정하여 Ansible이 접근해야 할 노드만 맞춤 설정하십시오.
    node_labels:
      '*': '*'

example-role을 사용 사례와 관련된 설명적인 이름으로 바꾸십시오.

프로덕션 사용의 경우, 이 액세스를 Ansible이 필요로 하는 호스트로 제한하기 위해 레이블을 사용해야 합니다. 이는 최소 권한 원칙(Principle of Least Privilege)으로 알려져 있으며, 유출된 자격 증명으로 인한 피해를 줄입니다.

tctl create -f ./role.yaml를 사용하여 역할을 생성합니다.

이제 tctl bots update를 사용하여 역할을 봇에 추가하십시오. example을 배포 가이드에서 생성한 봇의 이름으로 바꾸고 example-role을 방금 생성한 역할의 이름으로 바꾸십시오:

$ tctl bots update example --add-roles example-role

2단계/4. tbot 출력 구성

이제 tbot은 Ansible에 필요한 자격 증명과 SSH 구성을 생성할 출력이 구성되어야 합니다. SSH의 경우, identity 출력 유형을 사용합니다.

출력은 목적지가 구성되어야 합니다. 이 예에서는 directory 목적지가 사용됩니다. 이는 이러한 자격 증명을 디스크의 지정된 디렉토리에 작성합니다. 이 디렉토리는 tbot이 실행되는 리눅스 사용자에 의해 쓸 수 있게 하고, Ansible이 실행될 리눅스 사용자에 의해 읽을 수 있도록 해야 합니다.

다음과 같이 tbot 구성을 수정하여 identity 출력을 추가하십시오:

outputs:
- type: identity
  destination:
    type: directory
    # 이 가이드에서는 /opt/machine-id가 목적지 디렉토리로 사용됩니다.
    # 이 부분을 사용자 지정할 수 있습니다. 여러 개의 출력이 동일한 목적지를 공유할 수 없습니다.
    path: /opt/machine-id

tbot을 백그라운드 서비스로 운영하는 경우 재시작하십시오. tbot을 일회용 모드로 실행하는 경우 Ansible 플레이북을 실행하기 전에 실행해야 합니다.

이제 /opt/machine-id 아래에 여러 파일이 있어야 합니다:

  • ssh_config: 이는 Ansible 또는 OpenSSH와 함께 사용하여 연결할 때 올바른 자격 증명을 사용하여 Teleport 프록시 서비스를 구성하는 데 사용할 수 있습니다.
  • known_hosts: 이는 Teleport SSH 호스트 CA를 포함하고 있으며 SSH 클라이언트가 호스트의 인증서를 검증할 수 있도록 합니다.
  • key-cert.pub: 이는 Teleport SSH 사용자 CA에 의해 서명된 SSH 인증서입니다.
  • key: 이는 SSH 인증서를 사용하기 위해 필요한 개인 키입니다.

다음으로 Ansible이 이러한 파일을 사용할 수 있도록 구성됩니다.

3단계/4. Ansible 구성

모든 Ansible 파일이 수집될 ansible이라는 폴더를 만드십시오.

mkdir -p ansible
cd ansible

ansible.cfg라는 파일을 만드십시오. 우리는 Ansible이 머신 ID에 의해 생성된 구성 파일인 /opt/machine-id/ssh_config를 사용하여 OpenSSH 클라이언트를 실행하도록 구성할 것입니다. 여기서 example.com은 당신의 Teleport 클러스터의 이름입니다.

[defaults]host_key_checking = Trueinventory=./hostsremote_tmp=/tmp
[ssh_connection]scp_if_ssh = Truessh_args = -F /opt/machine-id/ssh_config

그런 다음 hosts라는 이름의 인벤토리 파일을 생성할 수 있습니다. 이는 Teleport에 등록된 호스트의 호스트 이름을 사용하고, Teleport 클러스터의 이름이 뒤에 붙어야 합니다. 예를 들어, 클러스터 이름이 teleport.example.com이고 호스트 이름이 node1인 경우, hosts의 항목은 node1.teleport.example.com이 됩니다.

다음과 같은 스크립트를 사용하여 이 요구 사항을 충족하는 모든 노드에 대한 인벤토리 파일을 생성할 수 있습니다:

현재 Teleport 클러스터의 이름을 가져오려면 tsh env를 소스합니다.

eval "$( tsh env )"

노드를 레이블에 따라 필터링하도록 `tsh ls` 명령을 수정할 수 있습니다.

tsh ls --format=json | jq --arg cluster $TELEPORT_CLUSTER -r '.[].spec.hostname + "." + $cluster' > hosts

When Teleport의 인증 서비스가 Teleport 노드를 나열하라는 요청을 받으면 (예: 웹 UI에서 노드를 표시하거나 tsh ls를 통해), 현재 사용자가 볼 수 있는 권한이 있는 노드만 반환합니다.

사용자의 Teleport 클러스터에 있는 각 노드에 대해 인증 서비스는 다음 검사를 순서대로 적용하며, 하나의 검사가 실패하면 해당 노드를 사용자에게 숨깁니다:

  • 사용자의 역할 중 어느 것도 노드의 레이블과 일치하는 deny 규칙을 포함하지 않아야 합니다.
  • 사용자의 역할 중 적어도 하나는 노드의 레이블과 일치하는 allow 규칙을 포함해야 합니다.

예상할 때 노드를 볼 수 없다면, 사용자의 역할에 Teleport 접근 제어 참조에 문서화된 적절한 allowdeny 규칙이 포함되어 있는지 확인하세요.

4단계/4. 플레이북 실행

마지막으로, 간단한 Ansible 플레이북인 playbook.yaml을 생성해 봅시다. 아래의 예제 플레이북은 모든 호스트에서 hostname을 실행합니다.

- hosts: all
  remote_user: root
  tasks:
    - name: "hostname"
      command: "hostname"

ansible 폴더에서 Ansible 플레이북을 실행합니다:

ansible-playbook playbook.yaml

PLAY [all] *****************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************

ok: [terminal]

TASK [hostname] ************************************************************************************************************************************

changed: [terminal]

PLAY RECAP *****************************************************************************************************************************************

terminal : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

모든 설정이 완료되었습니다. 머신에 지속적으로 회전할 수 있고 감사 및 제어할 수 있는 머신 ID에 연결된 단기 인증서를 제공합니다.

문제 해결

Ansible이 연결할 수 없는 경우 다음과 같은 오류가 발생할 수 있습니다:

example.host | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname node-name: Name or service not known",
    "unreachable": true
}

ssh_config의 인벤토리 호스트와 일치하는 패턴을 검사하고 조정할 수 있습니다.

오류를 검토하기 위해 상세 모드에서 ssh_config를 사용하여 SSH 연결을 시도하십시오:

ssh -vvv -F /opt/machine-id/ssh_config root@node-name.example.com

ssh가 작동하면 상세 모드로 플레이북을 실행해 보십시오:

ansible-playbook -vvv playbook.yaml

다음 단계

  • 사용 가능한 모든 구성 옵션을 탐색하기 위해 구성 참조를 읽으십시오.
Teleport 원문 보기