Làm cách nào tôi có thể ngăn không cho phép ghi mật khẩu vào logfiles?


22

Tôi đang thiết lập máy chủ MySQL và muốn Ansible đặt mysql-rootmật khẩu trong khi cài đặt.

Với sự trợ giúp của internet, tôi đã tìm ra giải pháp này:

- name: Set MySQL root password before installing
  debconf: name='mysql-server' question='mysql-server/root_password' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Confirm MySQL root password before installing
  debconf: name='mysql-server' question='mysql-server/root_password_again' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Install Mysql
  apt: pkg=mysql-server state=latest

mysql_root_pwdlà một biến được tải từ Ansible Vault. Điều này chạy tốt, nhưng bây giờ trên máy chủ có nhiều dòng trong nhật ký:

Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password name=mysql-server unseen=None
Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password_again name=mysql-server unseen=None

Làm cách nào tôi có thể ngăn Ansible viết mật khẩu văn bản rõ ràng vào logfiles?

Câu trả lời:


28

Để ngăn tác vụ có thông tin bí mật bị ghi nhật ký, trong syslog hoặc khác, hãy đặt no_log: true trên tác vụ:

- name: secret stuff
  command: "echo {{secret_root_password}} | sudo su -"
  no_log: true

Việc chạy tác vụ vẫn sẽ được ghi lại, nhưng với rất ít chi tiết. Ngoài ra, mô-đun được sử dụng phải hỗ trợ no_log, vì vậy hãy kiểm tra các mô-đun tùy chỉnh.

Xem Câu hỏi thường gặp về Ansible để biết thêm chi tiết. Nó có thể được áp dụng cho toàn bộ playbook, tuy nhiên đầu ra hơi khó chịu với "bị kiểm duyệt!" tin nhắn.


2
Trong số những điều khác đó là những gì câu trả lời này nói serverfault.com/a/682823/9517
user9517 hỗ trợ GoFundMonica

9

Hành vi quan sát được dường như là một lỗi trong mô-đun debconf. Tôi đã nộp một báo cáo lỗi .

Người dùng bcoca tại github chỉ ra rằng người ta có thể sử dụng lệnh no_log: truetrong các tác vụ, đặt mật khẩu, để ngăn chặn đăng nhập. Đây là một cách giải quyết, nó hoạt động với tôi cho đến khi lỗi được sửa.


Tôi đang gặp lỗi khi tôi sử dụng chỉ thị đó .. Có ai biết tôi đang làm gì sai không? ERROR: no_log is not a legal parameter in an Ansible task or handler
Bouke Versteegh

2
Hóa ra tôi đã có một phiên bản cũ của ansible! Để khắc phục (trên ubuntu): sudo apt-add-repository ppa:ansible/ansible, sudo apt-get update,sudo apt-get install ansible
Bouke Versteegh

Vấn đề tương tự đối với tôi nhưng tôi không thể làm cho n_log: đúng để hoạt động như mong đợi. Phiên bản Ansible của tôi là 1.7.2. Những gì là của bạn ?
jmcollin92

@ jmcollin92 Tôi hiện đang sử dụng 2.1. Có một hướng dẫn ở đây về cách cài đặt phiên bản mới nhất từ ​​nguồn. Tôi sử dụng nó như là ansible vẫn đang trưởng thành.
mệnh đề

2

Tôi đã giải quyết bằng cách nâng cấp phiên bản Ansible lên 1.6.1

sudo pip install ansible==1.6.1

2

Theo tài liệu Ansible :

log_path

Nếu có mặt và được định cấu hình ansible.cfg, Ansible sẽ ghi thông tin về các lần thực hiện tại vị trí được chỉ định. Hãy chắc chắn rằng người dùng đang chạy Ansible có quyền trên logfile:

log_path=/var/log/ansible.log 

Hành vi này không được mặc định. Lưu ý rằng ý chí ansible, không có cài đặt này, ghi lại các đối số mô-đun được gọi vào nhật ký hệ thống của các máy được quản lý. Đối số mật khẩu được loại trừ.

Âm thanh như cài đặt log_pathtrên nút điều khiển của bạn sẽ dẫn đến việc không có nhật ký trên các nút đích.


Trên thực tế tôi có một ansible.cfg trong thư mục cục bộ của mình, nơi tôi gọi là ansible, đặt log_path. Nhật ký cục bộ được tạo ổn định và nâng cấp sau khi chạy mới (ghi nhật ký hoạt động). Điều này không (mặc dù tài liệu mà bạn đã chỉ ra hứa hẹn) ngăn máy chủ từ xa đăng nhập. Ngoài ra, tuyên bố "Đối số mật khẩu được loại trừ" dường như không đúng 100%? Đây có phải là một lỗi (hoặc thậm chí hai)?
mệnh đề

2
@claus "đối số mật khẩu" chỉ áp dụng cho các mô-đun nơi đối số mật khẩu rõ ràng. Không có cách nào để có thể biết được đối số nào sẽ là mật khẩu và sẽ không có các lệnh chung như debconf, shell, raw, v.v.
Droopy4096

Vui lòng cuộn sang bên phải trong playbook ban đầu của tôi. Nó nói vtype='password'. Điều đó có đủ rõ ràng IMHO? Tôi giả sử rằng thông điệp tường trình cũng được tạo ra bởi mô-đun debconf.
mệnh đề

Điều này là không chính xác. Tài liệu nên nói chính xác hơn "Lưu ý rằng ý chí ansible, bất kể cài đặt này , ghi lại các đối số mô-đun được gọi vào syslog của các máy được quản lý."
augurar

2

Có một cách tốt hơn là chỉ no_log: Đúng

- name: write in string variables login and password
  set_fact:
    temp_user: "{{ USER_VAR }}"
    temp_pass: "{{ PASSWORD_VAR }}"


- name: Your operation with password in output
  shell: '/opt/hello.sh'
  ignore_errors: True
  no_log: True
  register: myregister

- debug:
    msg: '{{ myregister.stderr | regex_replace(temp_user) | regex_replace(temp_pass) }}'
  when: myregister.stderr != ""

- debug:
    msg: '{{ myregister.stdout | regex_replace(temp_user) | regex_replace(temp_pass) }}'
  when: myregister.stdout != ""

- fail:
    msg: "error shell /opt/hello.sh"
  when: myregister.stderr != ""

Như bạn thấy, bạn cần thêm:

ignore_errors: true
no_log: true

Và sau đó tạo đầu ra của kết quả của lệnh với regex numplace, trong đó:

USER_VAR - biến đăng nhập

PASSWORD_VAR - biến mật khẩu

Với phương pháp này, bạn không chỉ ẩn mật khẩu và đăng nhập mà còn nhận được đầu ra của hoạt động


1

Đây là phần bổ sung cho câu trả lời của TheDESTROS từ chuỗi này:

  1. viết một mẫu, trong đó bao bọc lệnh với một bí mật:

trình bao bọc-script.sh.j2

echo {{ secret_eg_from_ansible_vault }} | su - "ls -l"
  1. Gọi tập lệnh bao bọc và loại bỏ nó ngay lập tức:
- name: create template
  template:
    src: wrapper-script.sh.j2
    dest: /tmp/wrapper-script.sh
    mode: 0700
  no_log: True
- name: invoke command with secret and remove it
  shell: /tmp/wrapper-script.sh; rm -f /tmp/wrapper-script.sh

Bạn cần ít mã hơn một chút và có thể xuất ra các lệnh trong nhật ký của bạn. Chỉ có một hang động, nếu một bí mật nằm trong lệnh stdout. Nếu bạn muốn tránh mẫu bên ngoài, copymô-đun có tham số contentcó thể giúp viết một tập lệnh bao bọc nhỏ một cách nhanh chóng.


1

Các no_log: true tiếp cận sẽ được sử dụng như là phương sách cuối cùng nếu các nỗ lực khác thất bại bởi vì nó sẽ làm cho việc thực thi nhiệm vụ hoàn toàn mờ đục và bạn sẽ không có manh mối khi thất bại.

Thực tiễn bảo mật khuyên bạn nên cung cấp thông tin xác thực từ stdin hoặc khi không thể sử dụng tệp thông tin xác thực (hoặc thậm chí là tệp thực thi).

Dưới đây là một ví dụ về cách thực hiện đăng nhập podman an toàn bằng cách tránh lộ mật khẩu:

- name: secured login
  become: true
  command: >
    podman login --username={{ user }} --password-stdin ...
  args:
    stdin: "{{ secret }}"
  register: result

Với điều này, bí mật sẽ không được tiết lộ, trong result nhưng bạn vẫn có thể thấy đầu ra của lệnh.

Hầu hết các công cụ cần đăng nhập đều thực hiện một trong những cách tiếp cận bảo mật hơn được đề cập. Sử dụng thông tin đăng nhập trên CLI trong mã giống như có 123456mật khẩu ngân hàng của bạn.

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.