Làm cách nào để bỏ qua kiểm tra xác thực SSH ansible?


164

Có cách nào để bỏ qua việc kiểm tra tính xác thực SSH được thực hiện bởi Ansible không? Ví dụ: khi tôi vừa thiết lập một máy chủ mới, tôi phải trả lời có cho câu hỏi này:

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)?

Tôi biết rằng đây thường là một ý tưởng tồi nhưng tôi kết hợp nó trong một kịch bản đầu tiên tạo ra một máy chủ ảo mới tại nhà cung cấp đám mây của tôi và sau đó tự động gọi cho playbook ansible của tôi để định cấu hình nó. Tôi muốn tránh bất kỳ sự can thiệp nào của con người vào giữa quá trình thực thi kịch bản.

Câu trả lời:


247

Hai tùy chọn - đầu tiên, như bạn đã nói trong câu trả lời của riêng mình, là đặt biến môi trường ANSIBLE_HOST_KEY_CHECKINGthành Sai.

Cách thứ hai để đặt nó là đặt nó trong tệp ansible.cfg và đó là một tùy chọn thực sự hữu ích vì bạn có thể đặt nó trên toàn cầu (ở cấp hệ thống hoặc người dùng, trong /etc/ansible/ansible.cfghoặc ~/.ansible.cfg) hoặc trong tệp cấu hình trong cùng thư mục như cuốn sách bạn đang chạy

Để làm điều đó, tạo một ansible.cfgtệp ở một trong những vị trí đó và bao gồm:

[defaults]
host_key_checking = False

Bạn cũng có thể đặt nhiều mặc định tiện dụng khác ở đó, như có thu thập sự kiện khi bắt đầu chơi hay không, có nên hợp nhất các giá trị băm được khai báo ở nhiều nơi hoặc thay thế bằng một vị trí khác, v.v. Có một danh sách lớn các tùy chọn ở đây trong các tài liệu Ansible.


Chỉnh sửa: một lưu ý về bảo mật.

Xác thực khóa máy chủ SSH là lớp bảo mật có ý nghĩa đối với các máy chủ lưu trữ liên tục - nếu bạn đang kết nối với cùng một máy nhiều lần, việc chấp nhận khóa máy chủ cục bộ là rất có giá trị.

Đối với các phiên bản EC2 tồn tại lâu hơn, sẽ hợp lý khi chấp nhận khóa máy chủ với một tác vụ chỉ chạy một lần khi tạo cá thể ban đầu:

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

Không có giá trị bảo mật để kiểm tra khóa máy chủ trong các trường hợp bạn tự động đứng lên và xóa ngay sau khi thực hiện Playbook, nhưng có giá trị bảo mật trong việc kiểm tra khóa máy chủ cho các máy liên tục. Vì vậy, bạn nên quản lý kiểm tra khóa máy chủ khác nhau trên mỗi môi trường logic.

  • Để lại kiểm tra được bật theo mặc định (trong ~/.ansible.cfg)
  • Vô hiệu hóa kiểm tra khóa máy chủ trong thư mục làm việc cho các playbook bạn chạy với các trường hợp phù du ( ./ansible.cfgbên cạnh playbook để kiểm tra đơn vị chống lại các VM mơ hồ, tự động hóa cho các trường hợp ec2 tồn tại trong thời gian ngắn)

5
Bất cứ ai cũng biết những gì thực hành tốt nhất ở đây? Chẳng hạn, bạn có thể định kỳ chạy một tập lệnh để thiết lập lại các máy chủ đã biết của mình, việc này sẽ an toàn hơn (trừ khi phải chịu một cuộc tấn công MITM làm mờ cửa sổ đó). Bỏ qua tính xác thực theo mặc định sẽ loại bỏ một trong các cơ chế bảo mật chính của SSH
TonyH

3
Tôi thích mẫu mà nhóm của tôi sử dụng: chúng tôi đặt các tệp ansible.cfg để vô hiệu hóa kiểm tra khóa máy chủ trong các thư mục làm việc cho các sách phát chúng tôi chạy với các phiên bản phù du (kiểm tra đơn vị chạy trên các máy ảo, phiên bản AWS ec2, v.v.) cấp độ hệ thống.
nikobelia

1
Bằng cách đó, bạn có thể quản lý kiểm tra khóa máy chủ trên mỗi môi trường logic . Không có giá trị bảo mật để kiểm tra khóa máy chủ trong các trường hợp bạn tự động đứng lên và xóa ngay sau khi thực hiện Playbook, nhưng có giá trị bảo mật trong việc kiểm tra khóa máy chủ cho các máy liên tục. Vì vậy, bạn nên có các mặc định khác nhau cho các trường hợp sử dụng khác nhau.
nikobelia

2
Nếu một số cơ chế được sử dụng để cung cấp các máy mới, vĩnh viễn hoặc tạm thời, cơ chế đó sẽ cung cấp cho bạn khóa công khai SSH của máy này. Sau đó, bạn có thể lưu trữ nó trong các known_hoststệp cục bộ khác nhau của mình để SSH và Ansible nhận ra máy. Không làm như vậy, đặc biệt là bằng cách vô hiệu hóa kiểm tra khóa máy chủ, làm giảm tính bảo mật của SSH xuống gần như bằng 0 và cho phép các cuộc tấn công MITM. Rất nhiều máy cảm thấy ở trong một "mạng nội bộ" thực sự được kết nối với Internet, trong đó một phản hồi DNS nhanh hơn cho phép bạn nói chuyện với kẻ tấn công thay vì mục tiêu của bạn.
AEF

2
@TonyH khi thiết lập nhiều máy chủ thông qua AWS Cloudform và Ansible, tôi đã chạy ssh-keyscan <ip list>trên một máy đáng tin cậy (đối với tôi, đó là máy chủ pháo đài / nhảy) trong cùng một mạng và đặt kết quả vào known_hosts Để thiết lập máy chủ đáng tin cậy đó, AWS sẽ hiển thị khóa máy chủ trong nhật ký khởi động của cá thể, vì vậy việc tìm kiếm khóa đó là một bước thủ công mà tôi không bao giờ cắt bỏ nếu tôi đang thực hiện một hoạt động giải trí hoàn chỉnh cho môi trường của mình. Nhưng máy chủ đó thường không cần phải xóa. Điều này có thể giúp đỡ.
dcc 310

34

Tôi tìm thấy câu trả lời, bạn cần đặt biến môi trường ANSIBLE_HOST_KEY_CHECKINGthành False. Ví dụ:

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...

2
Có, nhưng bạn nói rằng bạn đang sử dụng điều này cho một máy chủ mới mà bạn vừa thiết lập. Điều này tránh việc phải xử lý khóa máy chủ lần này, nhưng những kết nối SSH tiếp theo thì sao? Tập lệnh thiết lập của bạn chạy, cấu hình máy chủ và thế là xong. Bây giờ bạn có các playbook khác mà bạn chạy, giả sử, hoặc bạn có các tập lệnh sử dụng SSH. Bây giờ chúng bị hỏng vì khóa máy chủ vẫn chưa có trong know_hosts. Bạn chỉ trì hoãn vấn đề của bạn. Nói tóm lại, những gì bạn đã viết ở đây không giống như một câu trả lời hay cho câu hỏi bạn đã hỏi.
Todd Walton

Điều này được sử dụng trong tập lệnh bash khi tạo máy chủ mới , nó không được sử dụng cho bất kỳ điều gì khác.
Johan

8

chuyển tiếp đến nikobelia

Đối với những người sử dụng jenkins để chạy sách play, tôi chỉ cần thêm vào công việc jenkins của mình trước khi chạy ansible-playbook biến môi trường anh ấy ANSIBLE_HOST_KEY_CHECKING = Sai Ví dụ:

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

6

Thay đổi host_key_checkingthành falsecho tất cả các máy chủ là một ý tưởng rất xấu.

Lần duy nhất bạn muốn bỏ qua nó là vào "lần tiếp xúc đầu tiên", hai nhiệm vụ này sẽ hoàn thành:

    - 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'

Vì vậy, chúng tôi chỉ tắt kiểm tra khóa máy chủ nếu chúng tôi không có khóa máy chủ trong known_hoststệp của mình.


3

Bạn có thể truyền nó dưới dạng đối số dòng lệnh trong khi chạy playbook:

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


2

Nếu bạn không muốn sửa đổi ansible.cfghoặc playbook.ymlthì bạn chỉ có thể đặt biến môi trường:

export ANSIBLE_HOST_KEY_CHECKING=False

0

Sử dụng tham số có tên là validate_certs để bỏ qua xác thực ssh

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

Bằng cách này, nó bỏ qua quá trình xác nhận ssh


Các validate_certstham số chỉ đơn giản nói với boto không xác nhận AWS API HTTPS cert. Nó không ảnh hưởng đến xác minh khóa SSH.
Matthew Dutton

0

Tôi biết câu hỏi đã được trả lời và nó cũng đúng, nhưng chỉ muốn liên kết tài liệu có thể giải thích được giải thích rõ ràng khi nào và tại sao nên thêm kiểm tra tương ứng: kiểm tra khóa máy chủ


0

Hầu hết các vấn đề xuất hiện khi bạn muốn thêm máy chủ mới vào kho lưu trữ động (thông qua mô-đun add_host) trong playbook. Tôi không muốn vô hiệu hóa việc kiểm tra máy chủ vân tay vĩnh viễn để các giải pháp như vô hiệu hóa nó trong tệp cấu hình toàn cầu không phù hợp với tôi. Xuất var như ANSIBLE_HOST_KEY_CHECKINGtrước khi chạy playbook là một việc cần làm trước khi chạy cần được ghi nhớ.

Tốt hơn là thêm tệp cấu hình cục bộ trong cùng một thư mục có playbook. Tạo tập tin có tên ansible.cfgvà dán văn bản sau:

[defaults]
host_key_checking = False

Không cần phải nhớ để thêm một cái gì đó trong env vars hoặc thêm vào ansible-playbookcác tùy chọn. Thật dễ dàng để đặt tập tin này vào repo git ansible.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.