사용 가능한 SSH 인증 검사를 무시하는 방법?


164

Ansible의 SSH 인증 검사를 무시하는 방법이 있습니까? 예를 들어 새 서버를 설정했을 때이 질문에 예라고 대답해야합니다.

GATHERING FACTS ***************************************************************
The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established.
RSA key fingerprint is xx:yy:zz:....
Are you sure you want to continue connecting (yes/no)?

나는 이것이 일반적으로 나쁜 생각이라는 것을 알고 있지만, 먼저 클라우드 공급자에서 새로운 가상 서버를 만든 다음 자동으로 내 플레이 가능한 플레이 북을 호출하여 구성하는 스크립트에 이것을 통합하고 있습니다. 스크립트 실행 중에 사람의 개입을 피하고 싶습니다.

답변:


247

두 가지 옵션-첫 번째 대답은 환경 변수 ANSIBLE_HOST_KEY_CHECKING를 False로 설정하는 것 입니다.

그것을 설정하는 두 번째 방법은 파일을 ansible.cfg 파일에 저장하는 것입니다. 이것은 시스템 또는 사용자 수준에서 /etc/ansible/ansible.cfg또는 시스템 내에서 또는 ~/.ansible.cfg동일한 디렉토리의 구성 파일에서 설정할 수 있기 때문에 실제로 유용한 옵션입니다. 실행중인 플레이 북으로

이렇게하려면 ansible.cfg해당 위치 중 하나에 파일을 만들고 다음을 포함하십시오.

[defaults]
host_key_checking = False

또한 플레이 시작시 팩트를 수집할지 여부, 여러 장소에 선언 된 해시를 병합할지 또는 다른 것으로 대체할지 등과 같은 기타 편리한 기본값을 설정할 수 있습니다. 옵션의 전체 큰 목록이있다 여기 Ansible 문서에서이.


편집 : 보안에 대한 참고 사항.

SSH 호스트 키 유효성 검사는 영구 호스트에 의미있는 보안 계층입니다 . 동일한 컴퓨터에 여러 번 연결하는 경우 호스트 키를 로컬로 수락하는 것이 좋습니다.

수명이 긴 EC2 인스턴스 의 경우 인스턴스를 처음 생성 할 때 한 번만 작업을 실행하여 호스트 키를 수락하는 것이 좋습니다.

  - name: Write the new ec2 instance host key to known hosts
    connection: local
    shell: "ssh-keyscan -H {{ inventory_hostname }} >> ~/.ssh/known_hosts"

플레이 북 실행 직후 동적으로 일어 서서 제거하는 인스턴스에는 호스트 키를 확인하기위한 보안 값이 없지만 영구 컴퓨터의 호스트 키를 확인하는 보안 값은 있습니다. 따라서 논리 환경마다 호스트 키 검사를 다르게 관리해야합니다.

  • 기본적으로 검사를 활성화 상태로 유지 ( ~/.ansible.cfg)
  • 작업 디렉토리에서 임시 인스턴스에 대해 실행하는 플레이 북에 대한 호스트 키 검사를 비활성화합니다 ( ./ansible.cfg유용한 VM에 대한 단위 테스트를위한 플레이 북과 함께, 단기 EC2 인스턴스에 대한 자동화).

5
여기에 모범 사례가 무엇인지 아는 사람이 있습니까? 예를 들어, 알려진 호스트를 재설정하기 위해 정기적으로 스크립트를 실행하면 더 안전합니다 (해당 기간 동안 MITM 공격을받지 않는 한). 기본적으로 진위를 무시하면 SSH 기본 보안 메커니즘 중 하나가 제거됩니다
TonyH

3
팀에서 사용하는 패턴이 마음에 듭니다. 우리는 임시 인스턴스 (방화 VM, AWS ec2 인스턴스에서 실행되는 단위 테스트 등)에 대해 실행하는 플레이 북의 작업 디렉토리에서 호스트 키 검사를 비활성화하는 ansible.cfg 파일을 넣고 검사를 활성화 상태로 둡니다. 시스템 레벨.
nikobelia

1
이렇게하면 논리적 환경 당 호스트 키 검사를 관리 할 수 있습니다 . 플레이 북 실행 직후 동적으로 일어 서서 제거하는 인스턴스에는 호스트 키를 확인하기위한 보안 값이 없지만 영구 컴퓨터의 호스트 키를 확인하는 보안 값은 있습니다. 따라서 사용 사례마다 기본값이 달라야합니다.
nikobelia

2
영구 또는 임시 새 시스템을 프로비저닝하는 데 일부 메커니즘이 사용되는 경우 해당 메커니즘은이 시스템의 SSH 공개 키를 제공해야합니다. 그런 다음 known_hostsSSH 및 Ansible이 시스템을 인식 할 수 있도록 다양한 로컬 파일에 저장할 수 있습니다 . 특히 호스트 키 검사를 비활성화하여 실패하면 SSH의 보안 수준이 거의 0으로 떨어지고 MITM 공격이 허용됩니다. "내부 네트워크"에있는 것으로 느껴지는 많은 컴퓨터가 실제로 인터넷에 연결되어 있으며, 더 빠른 단일 DNS 응답으로 대상 대신 공격자와 대화 할 수 있습니다.
aef

2
@TonyH는 AWS Cloudformation 및 Ansible을 통해 많은 호스트를 설정할 때 ssh-keyscan <ip list>동일한 네트워크 내에서 신뢰할 수있는 컴퓨터 (나를 위해 요새 / 점프 호스트)에서 실행 한 결과를 known_hosts 다음 과 같이 표시했습니다. 신뢰할 수있는 호스트를 설정하려면 AWS는 인스턴스의 시작 로그에 호스트 키가 있으므로 해당 키를 찾는 것은 환경을 완전히 재현 한 경우 절대로 잘라 내지 않은 수동 단계였습니다. 그러나 일반적으로 해당 호스트는 삭제할 필요가 없습니다. 도움 될 수 있습니다.
dcc310

34

답을 찾았습니다 . 환경 변수 ANSIBLE_HOST_KEY_CHECKING를 로 설정해야 합니다 False. 예를 들면 다음과 같습니다.

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...

2
예,하지만 방금 설정 한 새 서버에 이것을 사용한다고 말했습니다. 이렇게하면 이번에는 호스트 키를 처리하지 않아도되지만 후속 SSH 연결은 어떻습니까? 설정 스크립트가 실행되고 서버가 구성되고 완료됩니다. 이제 다른 플레이 북을 실행하거나 SSH를 사용하는 스크립트가 있습니다. 이제 그들은하고 호스트 키가에서 known_hosts 아직 없기 때문에 깨진. 문제가 지연되었습니다. 간단히 말해서, 당신이 여기에 쓴 것은 당신이 묻는 질문에 대한 좋은 대답처럼 들리지 않습니다.
Todd Walton

서버를 만들 때 bash 스크립트에서 사용되며 다른 용도로는 사용 되지 않습니다.
요한

8

앞으로 nikobelia

jenkins를 사용하여 플레이 북을 실행하는 사람들을 위해 ansible-playbook을 실행하기 전에 환경 변수 ANSIBLE_HOST_KEY_CHECKING = False를 사용하기 전에 jenkins 작업에 추가했습니다.

export ANSIBLE_HOST_KEY_CHECKING=False
ansible-playbook 'playbook.yml' \
--extra-vars="some vars..." \
--tags="tags_name..." -vv

6

변경 host_key_checkingfalse모든 호스트에 대한 것은 아주 나쁜 생각이다.

당신이 그것을 무시하고 싶은 유일한 시간은 "첫 접촉"에 있으며,이 두 가지 작업은 수행 할 것입니다 :

    - name: Check SSH known_hosts for {{ inventory_hostname }}
      local_action: shell ssh-keygen -F {{ inventory_hostname }}
      register: checkForKnownHostsEntry
      failed_when: false
      changed_when: false
      ignore_errors: yes
    - name: Add {{ inventory_hostname }} to SSH known hosts automatically
      when: checkForKnownHostsEntry.rc == 1
      changed_when: checkForKnownHostsEntry.rc == 1
      set_fact:
        ansible_ssh_common_args: '-o StrictHostKeyChecking=no'

따라서 known_hosts파일에 호스트 키가없는 경우 호스트 키 검사 만 해제 합니다.


3

플레이 북을 실행하는 동안 명령 줄 인수로 전달할 수 있습니다.

ansible-playbook play.yml --ssh-common-args='-o StrictHostKeyChecking=no'


2

수정할 수없는 경우 ansible.cfg또는 playbook.yml당신은 단지 환경 변수를 설정할 수 있습니다 :

export ANSIBLE_HOST_KEY_CHECKING=False

0

ssh 유효성 검증을 무시하려면 validate_certs라는 매개 변수를 사용하십시오.

- ec2_ami:
    instance_id: i-0661fa8b45a7531a7
    wait: yes
    name: ansible
    validate_certs: false
    tags:
      Name: ansible
      Service: TestService

이렇게하면 ssh 유효성 검사 프로세스를 무시합니다.


validate_certs매개 변수는 boto에게 AWS API HTTPS 인증서의 유효성을 검사하지 않도록 지시합니다. SSH 키 확인에는 영향을 미치지 않습니다.
Matthew Dutton

0

나는 질문에 대한 답변이 정확하고 정확하다는 것을 알고 있지만, 각 검사를 언제 그리고 왜 추가해야하는지 명확하게 설명 할 수있는 doc을 연결하고 싶었습니다 : host-key-checking


0

플레이 북에서 add_host 모듈을 통해 동적 인벤토리에 새 호스트를 추가 할 때 가장 많은 문제가 나타납니다. 지문 호스트 검사를 영구적으로 비활성화하고 싶지 않으므로 전역 구성 파일에서 비활성화하는 것과 같은 솔루션은 나에게 적합하지 않습니다. ANSIBLE_HOST_KEY_CHECKING플레이 북을 실행하기 전에 var를 내보내는 것은 실행하기 전에 기억해야 할 또 다른 일입니다.

플레이 북과 동일한 디렉토리에 로컬 설정 파일을 추가하는 것이 좋습니다. 이름이 지정된 파일을 작성 ansible.cfg하고 다음 텍스트를 붙여 넣으십시오.

[defaults]
host_key_checking = False

env vars에 무언가를 추가하거나 ansible-playbook옵션에 추가 할 필요가 없습니다 . 이 파일을 git repo에 쉽게 넣을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.