【问题标题】:ansible: how to restart auditd service on centos 7 get error about dependencyansible:如何在centos 7上重新启动auditd服务得到关于依赖的错误
【发布时间】:2016-12-09 04:51:34
【问题描述】:

在我的剧本中,我有一个更新 audit.rules 的任务,然后通知应该重新启动 auditd 服务的处理程序。

task:
  - name:  6.6.7 - audit rules configuration
    template: src=X/ansible/templates/auditd_rules.j2
              dest=/etc/audit/rules.d/audit.rules
              backup=yes
              owner=root group=root mode=0640
     notify:
   - restart auditd


  handlers:
    - name: restart auditd
      service: name=auditd state=restarted

当 playbook 运行时,会更新审计规则并请求重新启动 auditd,但失败如下。

RUNNING HANDLER [restart auditd] ***********************************************
fatal: [ipX-southeast-2.compute.internal]: FAILED! => {"changed": false, "failed": true, "msg": "Unable to restart service auditd: Failed to restart auditd.service: Operation refused, unit auditd.service may be requested by dependency only.\n"}

当我查看auditd 的单元定义时,我可以看到rejectManualStop=yes。这就是我无法重新启动服务的原因吗?新的审计规则是怎么过来的?

 systemctl cat auditd.service
# /usr/lib/systemd/system/auditd.service
[Unit]
Description=Security Auditing Service
DefaultDependencies=no
After=local-fs.target systemd-tmpfiles-setup.service
Conflicts=shutdown.target
Before=sysinit.target shutdown.target
RefuseManualStop=yes
ConditionKernelCommandLine=!audit=0
Documentation=man:auditd(8) https://people.redhat.com/sgrubb/audit/

[Service]
ExecStart=/sbin/auditd -n
## To not use augenrules, copy this file to /etc/systemd/system/auditd.service
## and comment/delete the next line and uncomment the auditctl line.
## NOTE: augenrules expect any rules to be added to /etc/audit/rules.d/
ExecStartPost=-/sbin/augenrules --load
#ExecStartPost=-/sbin/auditctl -R /etc/audit/audit.rules
ExecReload=/bin/kill -HUP $MAINPID
# By default we don't clear the rules on exit. To enable this, uncomment
# the next line after copying the file to /etc/systemd/system/auditd.service
#ExecStopPost=/sbin/auditctl -R /etc/audit/audit-stop.rules

[Install]
WantedBy=multi-user.target

【问题讨论】:

  • 将手动停止更改为 NO 并尝试 sudo service auditd restart 如果这样有效,那么代码也将有效。
  • systemctl start auditdsystemctl enable auditd 适用于 CentOS 版本 7。按照链接获取更多帮助。 link
  • 还有一份不错的文档。 AuditD in CentOS7..希望对您有所帮助。
  • 谢谢。我真的不想弄乱操作系统方面,因为他们一定是出于某种原因而实施的。我还需要在每个主机上更改它。似乎标准服务命令可以调用适用于 sudo service auditd restart 的 systemctl 停止日志记录:[OK] 将开始重定向到 /bin/systemctl start auditd.service sudo service auditd stop code 停止日志记录:[OK] sudo service auditd start 重定向到 /bin/systemctl start auditd.service
  • 感谢您的指点,看起来使用 RHEL7 重新启动审计的官方方法是使用标准服务命令。 service 命令是与 auditd 守护进程正确交互的唯一方法。您需要使用 service 命令,以便正确记录 auid 值。您只能将 systemctl 命令用于两个操作:启用和状态。更改了我的处理程序以调用命令模块,现在可以使用handlers: - name: restart auditd command: service auditd restart

标签: ansible centos7 systemctl


【解决方案1】:

Red Hat Bugzilla #1026648Anisble Issue # 22171 (github) 报告中已对此进行了探索、讨论和解决(大部分)。

分辨率

  • 使用 ansible service 模块参数use=service 来强制执行/sbin/service 实用程序,而不是systemd 的聚集事实值(调用/sbin/systemctl),如下所示:
    • - service: name=auditd state=restarted use=service
  • Example playbook (pastebin.com)

解决方法:

  • 使用 ansible command 模块显式运行服务可执行文件,如下所示:
    • - command: /sbin/service auditd restart

分析 - 根本原因:

  • 这是由 auditd.service 单元的上游打包造成的问题。当systemctl,显然是by design 采取行动时,它不会启动/停止/重新启动。
  • Ansible 服务控制功能进一步完善了它,它使用在收集系统事实并且“ansible_service_mgr”返回“systemd”时确定的首选方法。这与用于管理 service.unit 的实际模块无关。
  • RHEL 开发团队可能会在即将到来的更新中发现问题 (ERRATA) 进行修复
  • Ansible 开发团队提供了一种解决方法,并(从 2.2 开始)使用 use 参数更新了 service 模块。

【讨论】:

  • 看来use参数不起作用。 ansible 报告重启任务已运行,但systemctl status auditd 显示服务未重启。这是 CentOS 7.6 上的 ansible 2.7。
  • @orodbhen 并不奇怪。 Ansible 的变化速度通常意味着我们知道一个月有效的东西可能会在之后的几个小版本中过时。
  • 这实际上是 RedHat 认可的官方解决方案。 access.redhat.com/solutions/2664811(链接需要RH账号):用/bin/service停止服务,然后用systemctl启动。
【解决方案2】:

也许回答晚了,但如果其他人遇到同样的问题,您可以使用以下命令导入 auditd 的新规则:

auditctl -R /path/to_your_rules_file

因此,无需重启auditd.service 即可导入新规则

【讨论】:

【解决方案3】:

我会验证 auditd 服务是否正确重新加载,因为即使将命令模块与您指定的命令一起使用也不会按照您期望的方式工作或运行;

通过确认

service auditd status

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-starting_the_audit_service.html

试试吧

service auditd condrestart

:)

【讨论】:

  • 您好,感谢您的意见。这适用于我发布的命令。正常重启后加载规则
【解决方案4】:

您不应该更改参数rejectManualStop,它可以确保您的系统安全。你可以做什么,在创建新规则后,重启主机,等待它,然后继续你的剧本。

剧本示例:

- name: Create new rules file
  copy:
    src: 01-personalized.rules
    dest: /etc/audit/rules.d/01-personalized.rules
    owner: root
    group: root
    mode: 0600
  register: result

- name: Reboot server
  shell: "sleep 5 && reboot"
  async: 1
  poll: 0
  when: result is changed

- name: Wait for server to become available
  wait_for_connection:
    delay: 60
    sleep: 5
    timeout: 300
  when: result is changed

【讨论】:

  • RedHat 在此处解释了原因(在登录墙后面):access.redhat.com/solutions/2664811。 auditd 的维护者这样做是因为内核特别对待 auditd。如果您向 auditd 发送终止信号,它首先将发送终止信号的进程的凭据发送给 auditd 以进行日志记录,但对于 systemd,它始终是 PID 1。他们不想记录(可能是因为它会是令人困惑),因此他们阻止 systemd 重新启动 auditd。
【解决方案5】:

将手动停止改为NO并尝试

sudo service auditd 重启

如果这有效,那么代码也将有效

systemctl 启动审核

systemctl 启用审核

适用于 CentOS 版本 7。 点击链接获取更多帮助。

Link

Auditd in CentOS7

【讨论】:

  • 更改审计系统上的分发基线安全控制可能不是生产系统的最佳选择。这确实可以解决问题,但它有点麻烦,可能会在系统的安全状态中造成漏洞。
  • @0xSheepdog:好吧,即使是 OP 也意识到了这一点,这就是答案被接受的原因。如果漏洞是一个问题,那么应该由 OP 提出,不是吗?此外,还可以进一步注意缓解启用审核漏洞的问题。
猜你喜欢
  • 1970-01-01
  • 2016-07-02
  • 2015-10-28
  • 2014-12-08
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 2017-08-30
相关资源
最近更新 更多