Làm cách nào tôi có thể giảm mức độ chi tiết của một số tác vụ Ansible nhất định để không rò rỉ mật khẩu vào syslog?


11

Đôi khi tôi muốn sử dụng Ansible's lineinfilehoặc blockinfilecác mô-đun để ghi mật khẩu vào một số tệp cấu hình. Nếu tôi làm như vậy, toàn bộ dòng hoặc khối, mật khẩu bao gồm, kết thúc trong của tôi syslog.

Vì tôi không coi sysloglà nơi an toàn để lưu mật khẩu của mình, làm sao tôi có thể bảo Ansible không rò rỉ mật khẩu của mình syslog? Tôi hy vọng có một cách để làm điều này, nếu không tôi sẽ coi đây là một vấn đề bảo mật lớn trong Ansible.

Bạn có thể sao chép nó chẳng hạn với lệnh ad-hoc này:

ansible localhost -m blockinfile -a 'dest=/tmp/ansible_password_leak create=yes block="Password = {{password}}"' -e 'password=secret'

Đây là những gì kết thúc trong syslog:

ansible-blockinfile: Invoked with directory_mode=None force=None remote_src=None insertafter=None owner=None follow=False marker=# {mark} ANSIBLE MANAGED BLOCK group=None insertbefore=None create=True setype=None content=None serole=None state=present dest=/tmp/ansible_password_leak selevel=None regexp=None validate=None src=None seuser=None delimiter=None mode=None backup=False block=Password = secret

Ví dụ, tôi đã sử dụng Ansible 2.0.0.2 từ Ansible Ubuntu PPA chính thức trên hệ thống Debian "Jessie" 8.

Câu trả lời:


3

Các no_log thuộc tính da dữ liệu trong syslog. Nó có thể được áp dụng cho một nhiệm vụ duy nhất

- name: secret task
  shell: /usr/bin/do_something --value={{ secret_value }}
  no_log: True

hoặc vở kịch:

- hosts: all
  no_log: True

Gỡ lỗi là không thực sự có thể khi được kích hoạt vì vậy chỉ nên sử dụng nó cho các tác vụ đơn lẻ. Tính năng này có sẵn kể từ phiên bản 1.5 của Ansible . Như đã nêu trong thông báo phát hành cho phiên bản 1.5:

Các tác vụ giờ đây cũng có thể có tùy chọn "no_log = True" để ngăn các tác vụ nhạy cảm nhấn syslog. (Các tham số trông giống như mật khẩu đã được lọc)

mật khẩu nên được lọc trong hầu hết các trường hợp.


Điều này có hiệu quả che giấu mật khẩu từ syslognhưng nó vô hiệu hóa đầu ra đăng nhập trong đầu ra giao diện điều khiển cùng một lúc. Có cách nào để thay đổi điều đó?
AEF

Tôi xin lỗi. Tôi tìm thấy ít thông tin về chủ đề này. Tôi sẽ đề nghị chỉ đặt thuộc tính cho các tác vụ và chỉ khi bạn gỡ lỗi phần chơi của mình. Như đã trích dẫn Ansible nên đã lọc các tham số trông giống như mật khẩu. Vì vậy, có thể nó là một lỗi. Một lần nữa tôi không biết làm thế nào Ansible xác định nếu một tham số là mật khẩu. Có lẽ nó là một lỗi / thiếu tính năng để ẩn password = XXX.
Henrik Pingel

Trường hợp bạn có ấn tượng rằng mật khẩu được cho là bị ẩn theo mặc định trong Ansible? Điều này được đề cập ở đâu đó trong tài liệu?
AEF

Trích dẫn cuối cùng trong câu trả lời của tôi (Thông số trông giống như mật khẩu đã được lọc). Nhưng tôi không tìm thấy nguồn nào khác cho chức năng đó
Henrik Pingel

3

Tôi đã phát triển một plugin gọi lại để ẩn mật khẩu cho đầu ra mặc định, nó phân tích từ điển ouput cho khóa có chứa mật khẩu , đối với mỗi trong số chúng, nó thay thế giá trị bằng ********.

Tạo một tệp có tên protect_data.pytrong thư mục ./plugins/callback thêm mã này:

from ansible.plugins.callback.default import CallbackModule as CallbackModule_default
import os, collections

class CallbackModule(CallbackModule_default):
    CALLBACK_VERSION = 2.0
    CALLBACK_TYPE = 'stdout'
    CALLBACK_NAME = 'protect_data'

    def __init__(self, display=None):
        super(CallbackModule, self).__init__(display)

    def hide_password(self, result):
        ret = {}
        for key, value in result.iteritems():
            if isinstance(value, collections.Mapping):
                ret[key] = self.hide_password(value)
            else:
                if "password" in key:
                    ret[key] = "********"
                else:
                    ret[key] = value
        return ret

    def _dump_results(self, result, indent=None, sort_keys=True, keep_invocation=False):
        return super(CallbackModule, self)._dump_results(self.hide_password(result), indent, sort_keys, keep_invocation)

Trong tệp ansible.cfg :

  • dòng uncomment với stdout_callbackvà đặt tên plugin này là value ( stdout_callback=protect_data)
  • dòng uncomment với callback_pluginsvà đặt giá trị./plugins/callback

Đầu ra chỉ được sửa đổi cho plugin này, nếu bạn sử dụng một plugin khác để hiển thị đầu ra ( logentries, ...), bạn phải làm tương tự với nó


Ồ, wow, thật tuyệt vời. Tuy nhiên, điều này đòi hỏi tôi phải đặt một lệnh với tên khóa 'mật khẩu' cho mọi thứ có chứa bí mật. Tôi sẽ thích một cờ meta để chỉ ra một biến chứa một bí mật thay vào đó, nhưng cảm ơn! Q khác: điều này cũng che giấu các bí mật trong đầu ra với ansible-playbook --diff(thay đổi khác biệt tập tin)?
gertvdijk

Tôi không biết, tôi chưa bao giờ thử
Nelson G.

-3

Người ta có thể đề xuất rằng sử dụng Vault thay vào đó sẽ khắc phục vấn đề.


Điều này không cung cấp một câu trả lời cho câu hỏi. Một khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào ; thay vào đó, cung cấp câu trả lời không yêu cầu làm rõ từ người hỏi . - Từ đánh giá
gà con

1
Vault giúp mã hóa dữ liệu khi nghỉ ngơi, nhưng khi mật khẩu được sử dụng, chúng có thể dễ dàng xuất hiện trong các tệp nhật ký.
Konstantin Suvorov

@chicks Đây có vẻ như là một câu trả lời sai , không phải là một câu trả lời không .
Michael Hampton

Tôi không thấy tùy chọn đó trong các công cụ đánh giá. Vì đây giống như một bình luận hơn là một câu trả lời tôi cảm thấy như tôi đã xử lý việc này một cách hợp lý.
gà con

Cờ của tôi cũng bị từ chối và tôi vẫn không thấy câu trên là câu trả lời về cách giảm mức độ dài của Ansible . Đó là nhiều nhất là một bình luận gợi ý một ý tưởng khác, chắc chắn không phải là một câu trả lời cho câu hỏi.
Patrick Mevzek
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.