programing tip

Ansible을 사용한 SSH 에이전트 전달

itbloger 2020. 11. 24. 07:45
반응형

Ansible을 사용한 SSH 에이전트 전달


Ansible 1.5.3 및 Git을 ssh 에이전트 전달 ( https://help.github.com/articles/using-ssh-agent-forwarding ) 과 함께 사용하고 있습니다. Ansible로 관리하는 서버에 로그인하여 git에 대한 연결이 올바르게 구성되었는지 테스트 할 수 있습니다.

ubuntu@test:~$ ssh -T git@github.com
Hi gituser! You've successfully authenticated, but GitHub does not provide shell access.

또한이 계정을 사용하여 내 저장소 중 하나를 복제하고 업데이트 할 수 있으므로 git 구성이 좋아 보이고 ssh를 통해 서버에 직접 로그인 할 때 ssh 전달을 사용합니다.

문제 : Ansible 명령 모듈을 사용하여 위에 표시된 것과 동일한 테스트를 시도 할 때. "Permission denied"로 실패합니다. Ansible 출력 (상세 로깅 포함)의 일부는 다음과 같습니다.

failed: [xxx.xxxxx.com] => {"changed": true, "cmd": ["ssh", "-T", "git@github.com"], "delta": "0:00:00.585481", "end": "2014-06-09 14:11:37.410907", "rc": 255, "start": "2014-06-09 14:11:36.825426"}
stderr: Permission denied (publickey).

다음은이 명령을 실행하는 간단한 플레이 북입니다.

- hosts: webservers
  sudo: yes
  remote_user: ubuntu

  tasks:

  - name: Test that git ssh connection is working.
    command: ssh -T git@github.com

질문 : ssh를 통해 수동으로 로그인하고 명령을 실행할 때 모든 것이 올바르게 작동하지만 동일한 명령이 Ansible을 통해 동일한 사용자로 실행될 때 실패하는 이유는 무엇입니까?

아무도 나를 이기지 않으면 곧 답변을 게시 할 것입니다. git을 사용하여 문제를 설명하고 있지만 ssh 에이전트 전달에 의존하는 모든 모듈에서 발생할 수 있습니다. Ansible에만 국한된 것은 아니지만 많은 사람들이이 시나리오에서 먼저 문제에 직면 할 것이라고 생각합니다.


문제는 플레이 북에서 다음 줄을 제거하여 해결됩니다.

sudo: yes

원격 호스트에서 sudo를 실행하면 로그인 중에 ssh에서 설정 한 환경 변수를 더 이상 사용할 수 없습니다. 특히 "에이전트와 통신하는 데 사용되는 UNIX 도메인 소켓의 경로를 식별"하는 SSH_AUTH_SOCK이 더 이상 표시되지 않으므로 ssh 에이전트 전달이 작동하지 않습니다.

필요하지 않을 때 sudo를 피하는 것은 문제를 해결하는 한 가지 방법입니다. 또 다른 방법은 sudoers 파일을 생성하여 sudo 세션 중에 SSH_AUTH_SOCK이 계속 유지되도록하는 것입니다.

/etc/sudoers:

     Defaults    env_keep += "SSH_AUTH_SOCK"

여기에는 매우 유용한 부분 답변이 있지만이 문제를 여러 번 겪은 후에 개요가 도움이 될 것이라고 생각합니다.

먼저 Ansible을 실행하는 클라이언트에서 대상 머신에 연결할 때 SSH 에이전트 전달이 활성화되어 있는지 확인해야합니다. 를 사용하더라도 transport=smart클라이언트의 SSH 구성에 따라 SSH 에이전트 전달이 자동으로 사용 설정되지 않을 수 있습니다. 이를 확인하기 위해 ~/.ansible.cfg다음 섹션을 포함하도록 업데이트 할 수 있습니다 .

[ssh_connection]
ssh_args=-o ControlMaster=auto -o ControlPersist=60s -o ControlPath=/tmp/ansible-ssh-%h-%p-%r -o ForwardAgent=yes

다음 으로 환경 변수가 재설정 되기 때문에 become: yes(및 become_user: root)이 일반적으로 에이전트 전달을 비활성화 한다는 사실을 처리해야 할 것 SSH_AUTH_SOCK입니다. ( Ansible은 유용한 감사를 불가능하게 만들기 때문에 사람들이 SSH를 루트 로 사용한다고 가정 하는 것이 충격적입니다 .)이 문제를 처리하는 몇 가지 방법이 있습니다. Ansible 2.2부터 가장 쉬운 방법은 플래그 sudo를 지정 하여 사용할 때 (전체) 환경을 보존 하는 것 -E입니다.

become_flags: "-E"

그러나 .NET Framework와 같은 변수를 보존하면 원치 않는 부작용이 발생할 수 있습니다 PATH. 가장 깨끗한 방법은 보존하는 것입니다 SSH_AUTH_SOCK그것을 포함하여 env_keep당신의 /etc/sudoers파일 :

Defaults    env_keep += "SSH_AUTH_SOCK"

Ansible로이를 수행하려면 :

- name: enable SSH forwarding for sudo
  lineinfile:
    dest: /etc/sudoers
    insertafter: '^#?\s*Defaults\s+env_keep\b'
    line: 'Defaults    env_keep += "SSH_AUTH_SOCK"'

이 플레이 북 작업은 env_keep기존 env_keep설정 을 변경 하거나 SSH_AUTH_SOCK이미 존재 한다고 가정 하지 않고 다른 기본 설정 (또는 파일이없는 경우 파일 끝에) 이후에 추가하기 때문에 제안 된 다른 작업보다 약간 더 보수적 입니다 .


귀하의 질문에 대한 또 다른 답변 (Ansible 1.9를 사용하는 경우 제외)은 다음과 같습니다.

ansible 문서에서transport=smart 권장 하는 대로 /etc/ansible/ansible.cfg (또는 구성 설정을 재정의 할 수있는 다른 세 개의 잠재적 위치)를 확인할 수 있습니다 . 내 제어 시스템이 OpenSSH를 사용하지 못하여 에이전트 포워딩을 방지하는 이전 설치 시도 중 어느 시점에서 내 기본값이 설정되었습니다 . 이것은 아마도 거대한 엣지 케이스 일 것입니다. 당신 일 수도 있습니다!transport=paramiko

Though I didn't find it necessary for my configuration, I should note that others have mentioned that you should add -o ForwardAgent=yes to your ssh_args setting in the same file like so:

[ssh_connection]
ssh_args=-o ForwardAgent=yes

I only mention it here for the sake of completeness.


To expand on @j.freckle's answer, the ansible way to change sudoers file is:

- name: Add ssh agent line to sudoers
  lineinfile: 
    dest: /etc/sudoers
    state: present
    regexp: SSH_AUTH_SOCK
    line: Defaults env_keep += "SSH_AUTH_SOCK"

참고URL : https://stackoverflow.com/questions/24124140/ssh-agent-forwarding-with-ansible

반응형