Sửa đổi tập tin sudoers với mẫu playbook ansible


8

Tôi đang cố gắng tạo một tập tin sudoers với mẫu ansible. Các tập tin sudoers sẽ trông như dưới đây:

Cmnd_Alias LS = /bin/ls
Cmnd_Alias LESS = /usr/bin/less
Cmnd_Alias DU = /usr/bin/du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU

Những gì tôi đã quản lý cho đến nay là dưới đây:

Cmnd_Alias LS = ls
Cmnd_Alias LESS = less
Cmnd_Alias DU = du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU

Mẫu trông như dưới đây:

{% for item in commands %}
Cmnd_Alias {{ item|upper }} = {{ item }}
{% endfor %}

%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}
{% endfor %}

lọ

commands:
  - ls
  - less
  - du

Theo như tôi biết, mô-đun mẫu ansible không có bất cứ thứ gì sẽ thực thi lệnh trong máy chủ từ xa và in đầu ra nếu không tôi đã nghĩ đến việc thay đổi tệp mẫu để trông như dưới đây:

{% for item in commands %}
Cmnd_Alias {{ item|upper }} = `which {{ item }}`
{% endfor %}

%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}    
{% endfor %}

và đầu ra sẽ giống như những gì tôi muốn.

Có phương pháp nào khác có thể làm cho nó đơn giản?

BTW Tôi đã kiểm tra bài này


Tôi sẽ chỉ đặt đường dẫn đầy đủ của lệnh trong vars của bạn
jdog

Đối với sửa đổi trên hệ thống, tôi thích bao gồm các tập lệnh trong bash để chạy tốt hơn.
CHÚA

Câu trả lời:


5

TL; DR: HÔN. Đừng sử dụng ít hơn.

Mọi người thường mắc lỗi với ansible bằng cách cố gắng tạo ra những thứ khác nhau mà không cần phải có. Trừ khi có nhiều nơi bạn xác định danh sách các lệnh mà bộ phận hỗ trợ có thể truy cập, việc đặt chúng vào tệp tạo mẫu là hoàn toàn chấp nhận được:

mẫu / etc / sudoers.d / support1

Cmnd_Alias LS = /bin/ls
Cmnd_Alias LESS = /bin/cat
Cmnd_Alias DU = /usr/bin/du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU

hoặc thậm chí rõ ràng khi bạn không sử dụng lại Cmnd_Alias ​​ở bất cứ đâu

%support1 ALL=(ALL) NOPASSWD: /bin/ls
%support1 ALL=(ALL) NOPASSWD: /bin/cat
%support1 ALL=(ALL) NOPASSWD: /usr/bin/du

Và thêm một số nhiệm vụ như:

- name: add templates
  template:
    src: {{ item }}
    dest: /{{ item }}
    owner: root
    group: root
    mode: 0640
  with_items:
    - etc/sudoers.d/support1

Bạn sẽ chỉ sử dụng các mẫu thay vì các tệp vì vào cuối có thể có một số biến để thêm vào tất cả các tên đó hoặc tên nhóm có thể đến từ biến nếu bạn nhận được một vai trò khác tạo các nhóm.

Nếu bạn cần sử dụng biến, điều bạn có thể làm là sử dụng danh sách các giá trị băm như thế này:

sudoers.support1.commands:
- { alias: "LS", path: "/bin/ls" }
- { alias: "DU", path: "/usr/bin/du" }

Sau đó trong mẫu:

{% for item in sudoers.{{ group }}.commands %}
Cmnd_Alias {{ item.alias }} = {{ item.path }}
{% endfor %}
%{{ group }} ALL=(ALL) NOPASSWD: {{ sudoers.{{ group }}.commands | map(attribute='alias') | join(', ') }}

Nó không an toàn để sử dụng / usr / bin / less

Trong tất cả điều này, bạn đã không nhận thấy nhiều điều quan trọng và đó là việc sử dụng ít hơn như người xem. Đáng buồn thay, đó là một lỗ hổng bảo mật. Bạn có thể gõ '! Bash' để gọi bash. Và bằng cách nhấn 'v', bạn vào trình chỉnh sửa dựa trên các biến VISUAL, EDITOR hoặc LESSEDIT. Vì vậy, bạn có thể cung cấp cho họ '/ bin / cat' và họ luôn có thể tự đưa nội dung vào ít hơn. Lưu ý đây vẫn là một lỗ hổng bảo mật vì một số tệp trong unix bị hạn chế rất nhiều có chủ ý:

/etc/shadow
/etc/sudoers
/etc/ssh/ssh_host_rsa_key
$HOME/.ssh/id_rsa

1
Tôi thích phần thứ hai. Chúng ta không nên sử dụng ít hơn như lệnh sudo.
Err0rr

1
Không có sự khác biệt giữa thay đổi biến và thay đổi mẫu nếu thay đổi ở một nơi duy nhất. Sử dụng biến làm cho nó chỉ ít đọc hơn. Nếu bạn thực sự cần sử dụng biến, hãy đặt tên cho nó tốt hơn và liệt kê các giá trị băm,
Jiri Klouda

1

Thứ nhất

bạn nên tham khảo Jinja xử lý không gian / dòng mới. mẫu hiện tại của bạn sẽ tạo ra các dòng mới, và tôi nghĩ rằng điều này sẽ gây nhầm lẫn sudovà không xác thực cú pháp (IIRC, cú pháp đúng là thêm -như: -%}tại vòng lặp for, nhưng bạn nên "chơi" và xem điều gì xảy ra). Để hiển thị một mẫu, bạn có thể thực hiện nó trên máy trạm của mình mà không cần chạy nó trên máy mục tiêu thực tế.

Ngoài ra, tôi nghĩ rằng việc tạo mẫu bằng 1 lệnh tại dòng lệnh dễ đọc hơn:

{% for command in commands %}
%{{group}} ALL=(ALL) NOPASSWD: {{command}}
{% endfor %}

Thứ hai

Tôi không khuyên bạn nên chỉnh sửa các tệp toàn cầu hiện có với ansible. Thay vào đó, hãy tạo mẫu tùy chỉnh của bạn bên dưới /etc/sudoers.d/(như bạn đã đề cập bạn đã thấy).

Đây là cách đúng đắn để làm điều đó, bởi vì:

  • hệ thống sẽ có tất cả các giá trị mặc định.
  • mẫu của bạn sẽ ngắn hơn nhiều.
  • nếu bạn làm sai, bạn sẽ chắc chắn nơi để tìm - trong mẫu của bạn.

Thứ ba

Tôi nghĩ rằng thực thi whichbên trong sudoerslà một ý tưởng ban đầu, nhưng không nên làm việc.


1
thực sự tôi đã nhận được một thông báo lỗi cú pháp. Tôi sẽ xem xét cú pháp. Và tất nhiên tôi đã tạo một tệp riêng cho việc này.
Err0rr
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.