Điểm:1

Run NextCloud PHP script ‘occ’ as webserver user, on Ansible connection

lá cờ co

How do I write an Ansible task to run a PHP script as a third user; not the root user and not the connecting user, but the “webserver” user?

The NextCloud administration program occ, according to the documentation, must be run as the webserver user:

sudo -u www-data php occ

To become a different user for running a command, Ansible provides the become feature. The Ansible documentation sternly recommends against attempting to run commands as a different, non-root user:

Everything is fine if the module file is executed without using become, when the become_user is root, or when the connection to the remote machine is made as root. In these cases Ansible creates the module file with permissions that only allow reading by the user and root, or only allow reading by the unprivileged user being switched to.

However, when both the connection user and the become_user are unprivileged, the module file is written as the user that Ansible connects as (the remote_user), but the file needs to be readable by the user Ansible is set to become.

Using become_user to that user

The connection user has sudo permission to run commands as the third user:

$ sudo -u www-data whoami
www-data

When I use become_user on the task, to run the command as that user:

- name: "NextCloud: Instance configuration"
  become_user: "{{ web_process_user }}"
  command:
    cmd: >-
        php "{{ apache_nextcloud_dir }}/occ" maintenance:install
            --no-interaction
            …

UPDATE: um, it works. I don't know what changed, but in trying to reproduce the problem, it stopped.

Using shell with an explicit sudo invocation as that user

When I configure the Ansible task with a shell command:

shell: >-
    su '{{ web_process_user }}' --shell '/bin/bash' -c ' \
        php "{{ apache_nextcloud_dir }}/occ" …

Ansible complains:

[WARNING]: Consider using 'become', 'become_method', and 'become_user' rather than running su

I'd love to do that. Ansible's become would be a much more graceful way than this shell: su hack.

But when using become, the problems described in the Ansible documentation occur: the task module sent across the connection for running that command, fails to get the privilege to create its temporary files.

The Ansible documentation advises to either:

  • “use pipelining”: That loses the advantages of the default task-module system.
  • “avoid becoming an unprivileged user”: Not an option, because the unprivileged webserver user is required for running this command correctly.

How should I make an Ansible task that runs php "{{ apache_nextcloud_dir }}/occ" as the unprivileged, third user {{ web_process_user }}?

UPDATE: the become functionality appears to work correctly now.

solarchemist avatar
lá cờ in
Bạn có thể tránh toàn bộ mớ hỗn độn bằng cách đảm bảo `setfacl` được cài đặt trên mục tiêu (`apt install acl`). Sau đó, nó chỉ hoạt động. Có thể không hoạt động trên các máy chủ sử dụng hệ thống tệp mà không có hỗ trợ ACL, nhưng cho đến nay tôi chưa bao giờ gặp phải các hệ thống như vậy. Xem phần này trong tài liệu Ansible https://docs.ansible.com/ansible/latest/user_guide/become.html#risks-of-becoming-an-unprivileged-user
Điểm:0
lá cờ cz

Có hai cách tôi biết để giải quyết vấn đề này. Cái đầu tiên mà bạn đã biết, nhưng dường như đã bị tài liệu làm cho sợ hãi. Tuy nhiên, tài liệu cho bạn biết chính xác những gì bạn cần làm để nó hoạt động, vì vậy bạn nên xem xét cẩn thận nếu điều này không thành công trong lần đầu tiên.

Vì vậy, bạn cần làm hai việc:

  1. Bộ trở thành người dùng cho người dùng không có đặc quyền (ở đây, dữ liệu www). Điều này sẽ khiến ansible sudo cho người dùng đó thay vì root.

  2. định cấu hình sudoers để cho phép của bạn remote_user đến sudo đến dữ liệu www. Ví dụ: nếu bạn remote_useransible:

    ansible ALL=(dữ liệu www) NOPASSWD:ALL
    

    Lưu ý rằng điều này có thể là tùy chọn, bởi vì thông thường sudo đã được định cấu hình sẵn để cho phép người dùng ansible sudo cho bất kỳ người dùng nào, đại loại như:

    ansible TẤT CẢ=(TẤT CẢ) NOPASSWD:TẤT CẢ
    

    hoặc bằng cách đặt nó vào một nhóm đã có thể làm điều đó.


Cách thứ hai là để Ansible kết nối trực tiếp với hệ thống từ xa với tư cách là người dùng mong muốn (ở đây, dữ liệu www) và không phải sudo. Bạn làm điều này như sau:

  1. Thêm khóa công khai ssh của Ansible vào người dùng từ xa .ssh/ủy quyền_keys.

  2. Bộ remote_user=www-datatrở thành = không đối với nhiệm vụ, khối, playbook, vai trò, v.v. cần chạy với tư cách người dùng này.

lá cờ co
âsợ nó bởi tài liệuâ â hoàn toàn ngược lại; tài liệu làm tôi sợ * vào * khi cố gắng làm cho nó hoạt động. Nhưng bây giờ tôi đã cập nhật câu hỏi với thực tế là tôi không thể tái tạo sự cố; tính năng `trở thành` được đề xuất hiện hoạt động chính xác. Cảm ơn vì lời nhắc.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.