私のプレイブックには、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
プレイブックが実行されると、監査ルールが更新され、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のユニット定義を見ると、refuseManualStop = 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サービスauditdrestart
これが機能する場合、コードも機能します
systemctl start auditd
そして
systemctl enable auditd
バージョンCentOSバージョン7用です。さらにヘルプが必要な場合は、リンクをたどってください。
これは、 Red Hat Bugzilla#1026648 および Anisble Issue#22171(github) レポートで(ほとんど)調査、議論、および解決されています。
解決策
service
モジュールパラメータuse=service
を使用して、systemd
の収集されたファクト値(/sbin/service
を呼び出す)の代わりに/sbin/systemctl
ユーティリティの実行を強制します。このような:- service: name=auditd state=restarted use=service
回避策:
command
モジュールを使用して、次のようにサービス実行可能ファイルを明示的に実行します:- command: /sbin/service auditd restart
分析-根本原因:
- これは、auditd.serviceユニットのアップストリームパッケージングによって作成された問題です。
systemctl
が作用した場合、開始/停止/再起動しません。明らかに 設計による 。- さらに、Ansibleサービス制御関数によってさらに複雑になります。この関数は、システムファクトが収集され、「ansible_service_mgr」が「systemd」を返すときに識別される優先メソッドを使用します。これは、service.unitの管理に使用される実際のモジュールとは関係ありません。
- RHEL開発チームは、今後のアップデートで問題と見なされた場合に修正する可能性があります(ERRATA)
- Ansible開発チームは回避策を提供し、(2.2の時点で)
service
モジュールをuse
パラメーターで更新しました。
パラメータrefuseManualStopを変更しないでください。システムを安全に保つためにあります。代わりにできることは、新しいルールを作成した後、ホストを再起動し、それを待ってから、プレイブックを続行することです。
プレイブックの例:
- 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
指定したコマンドでコマンドモジュールを使用しても、期待どおりに機能または動作しないため、auditdサービスの再読み込みを正しく検証します。
経由で確認
service auditd status
代わりに試してください
service auditd condrestart
:)
答えが遅れているかもしれませんが、他の誰かが同じ問題に直面している場合は、次のコマンドでauditd
の新しいルールをインポートできます。
auditctl -R /path/to_your_rules_file
したがって、新しいルールをインポートするためにauditd.service
を再起動する必要はありません。