如何为 apache2 服务启用无密码 sudo?

如何为 apache2 服务启用无密码 sudo?

问题:我不知道如何启用无密码 sudo 的 apache2 服务。我可以为用户启用所有命令,但这似乎不是一个好主意,所以我只想启用某些命令。

背景:我正在尝试设置一个持续交付/部署系统,作为其中的一部分,我让 Ansible 在目标机器上运行一些命令。不幸的是,其中一些命令需要 sudo,我需要抑制这些命令的密码提示。理想情况下,此过程的所有授权都使用注册密钥而不是密码。

配置: (机器名称已被替换为占位符值。)

target.example.com运行 Ubuntu 18.04 LTS 和 Apache 2.x 的计算机

control.example.com运行 Ubuntu 16.04 LTS 和 Ansible 2.7.8 的机器

/etc/sudoers.d/ansible机器上的文件target.example.com

ansible ALL= NOPASSWD: /usr/sbin/service /usr/sbin/apache2 *

/etc/ansible/hosts机器上的文件control.example.com

[production]
target.example.com

~/deploy.yml机器上的文件control.example.com

---
- hosts: production
  remote_user: ansible

  tasks:
  - name: stop apache
    shell: service apache2 stop
    become: yes
    become_method: sudo
  - name: start apache
    shell: service apache2 start
    become: yes
    become_method: sudo

附加信息:ansible-playbook ~/deploy.yml在上 运行时control.example.com,我收到错误sudo: a password is required。我可以通过 登录目标然后运行​​和重现密码提示。因此,我犹豫地声称问题出在 sudo 配置上,而 Ansible 只是信使。ssh [email protected]sudo service apache2 stopsudo service apache2 starttarget.example.com

我尝试过不同的配置/etc/sudoers.d/ansible,主要是因为我完全不确定正确的语法,并尝试了各种表达式来查看哪种有效。我发现唯一有效的是ansible ALL= NOPASSWD: ALL,出于安全考虑,我想避免使用它。

答案1

最初的问题是将两个不同的问题混为一谈。似乎这不可能为 sudoers 文件中的一行命令规范指定参数或标志。因此,命令规范要么必须泛化为/usr/sbin/service,这同样不安全,要么必须更改为启用NOPASSWD比允许使用 sudo 运行任何服务更严格的命令。

幸运的是,在这种情况下,我可以直接使用该apachectl服务来允许 apache 的细粒度 sudo 权限,而无需执行其他任何操作。更新后的文件/etc/sudoers.d/ansible

ansible ALL=(ALL) NOPASSWD: /usr/sbin/apachectl

请注意,运行更新为使用的 Ansible 剧本apachectl仍然会失败,并显示错误消息sudo: a password is required,但这似乎是我尝试使用 Ansible 或其他方法的单独问题。无论如何,它似乎与sudo原始问题无关。

相关内容