即使ipv6被禁用,Ansible sysctl也会尝试重新加载ipv6



考虑一下:

我有一个禁用了ipv6的RHEL8服务器。我正在运行一些易于理解的脚本以实现安全合规性。

可靠的检查如下:

- name: "SCORED | 3.1.1 | PATCH | Ensure IP forwarding is disabled"
block:
- name: "SCORED | 3.1.1 | PATCH | Ensure IP forwarding is disabled | Disable IPv4 forwarding"
sysctl:
name: '{{ item.name }}'
value: '{{ item.value }}'
state: present
reload: yes
ignoreerrors: yes
with_items:
- { name: net.ipv4.ip_forward, value: 0 }
- { name: net.ipv4.route.flush, value: 1}
notify:
- sysctl flush ipv4 route table
- name: "SCORED | 3.1.1 | PATCH | Ensure IP forwarding is disabled | Disable IPv6 forwarding"
sysctl:
name: '{{ item.name }}'
value: '{{ item.value }}'
state: present
reload: yes
ignoreerrors: yes
with_items:
- { name: net.ipv6.conf.all.forwarding, value: 0 }
- { name: net.ipv6.route.flush, value: 1}
when:
- rhel8cis_ipv6_required
notify:
- sysctl flush ipv6 route table
when:
- not rhel8cis_is_router
- rhel8cis_rule_3_1_1
tags:
- level1
- sysctl
- patch
- rule_3.1.1

可变

rhel8cis_ipv6_required设置为false。

被调用的处理程序如下所示:

- name: sysctl flush ipv4 route table
become: yes
sysctl:
name: net.ipv4.route.flush
value: 1
sysctl_set: yes
when: ansible_virtualization_type != "docker"
- name: sysctl flush ipv6 route table
become: yes
sysctl:
name: net.ipv6.route.flush
value: 1
sysctl_set: yes
when: ansible_virtualization_type != "docker"

剧本的输出如下:

TASK[REL8_CIS:SCORED | 3.1.1 | PATCH |确保禁用IP转发|禁用IPv4转发]**************************************************************************************************************************************好:[arlha001.acc.vlkintern.nl]=>(item={'name':'net.ipv4.ip_forward','value':0})已更改:[arlha001.acc.vlkintern.nl]=>(item={'name':'net.ipv4.route.flush','value':1})

TASK[REL8_CIS:SCORED | 3.1.1 | PATCH |确保禁用IP转发|禁用IPv6转发]**************************************************************************************************************************************跳过:[arlha001.acc.vlkintern.nl]=>(item={'name':'net.ipv6.conf.all.forwarding','value':0})跳过:[arlha001.acc.vlkintern.nl]=>(item={'name':'net.ipv6.route.flush','value':1})

RUNNING HANDLER[REL8_CIS:sysctl flush ipv4路由表]*********************************************************************************************************************************************************************************[警告]:字符串字段中的值1(类型int)已转换为"1"(类型string)。如果这与您的预期不符,请引用整个值以确保它不会更改。

致命:[arlha001.acc.vlkintern.nl]:失败=>{"changed":false,"msg":"未能重新加载sysctl:fs.uid_dumpable=0\nkernel.randomize_va_saspace=2\nnet.ipv4.conf.all.forwarding=0\nnet.ipv4.conf.all.send_redirects=0\nnett.ipv4.conf.default.send_redirects=0 \nnet.ipv4.comp.all.accept_source_route=0\nneet.ipv4.con.default.accept_source_route=0\nnet.ip v4.conf.all.accapt _redirects=0\nnet.ipv4.conf.default.accept_redirects=0\nnet.ipv4.conf.all.secure_directs=0\nnet.ipv4.conf.default.secure_redirects=0\net.ipv4.conf.all.log_martians=1\nnet.iv4.conf.default.log_martans=1\nnet.ipv4.icmp_echo_ignore_broadcasts=1\net.iv4.imp_ignore_bogus_error_resports=1\nnet.ipv4.comp.all.rp_filter=1\net.ipv4.conf.default.rp_filter=1\nnet.ipv4.tcp_syncookies=1\ nnet.ipv4.route.flush=1\nnet.ipv4.ip_forward=0\nsysctl:cannot stat/proc/sys/net/ipv6/route/flush:没有这样的文件或目录\nsysctl:cannot stat/proc/sys/net/iv6/conf/all/forwarding:没有这样的文件或目录\n"}

这就是我完全困惑的地方。正如您所看到的,ipv4的处理程序被执行。致命输出中显示的所有变量都与ipv4有关。然而,最后,处理程序抱怨找不到ipv6文件。这是正确的,因为在这台服务器上没有启用ipv6。

这里怎么了?

您的/etc/sysctl.conf中可能有一个ipv6密钥,可能是在本次修复之前,也可能是由它引起的。这通常会被忽略,但由于多种因素的组合,它恰好会导致故障。

可解析的sysctl模块总是尝试更新磁盘上的sysctl文件,默认情况下为/etc/sysctl.conf。它没有临时变更的规定。在这里,处理程序试图进行时间点更改(路由刷新),但将此更新写入/etc/sysctl.conf会错误地进行永久更改。永久性更改会导致文件被重新加载(因为reload:默认为yes),然后sysctl模块会失败,因为它对每个密钥的工作都非常严格。所以它检测到了你不相关的ipv6密钥并失败了。

简而言之,这是一个处理程序错误。将处理程序更改为直接使用sysctl命令,它应该可以工作。

- name: sysctl flush ipv4 route
command: sysctl -w net.ipv4.route.flush=1
...

还可以将ignoreerrors: yessysctl模块一起使用,这样处理程序就不会崩溃,甚至reload: no也不会崩溃。但这仍然使更改成为永久性的,因此正确的解决方案是手动发布sysctl。事实上,Red Hat明确表示您不能在/etc/sysctl.conf中使用此flush密钥。(不幸的是,他们的付费墙后面有链接。)

出于同样的原因,如果您编写了一个实际需要修改/etc/sysctl.conf的剧本,并且其中可能有一个无效的密钥,那么您可能需要设置ignoreerrors: yes

据我所见,您要求修改IPv6设置;但是,因为您没有启用IPv6,所以这些设置不存在。看看IPv6 flush语句:

- name: sysctl flush ipv6 route table
become: yes
sysctl:
name: net.ipv6.route.flush
value: 1
sysctl_set: yes
when: ansible_virtualization_type != "docker"

在后台,sysctl通过使用procfs中的特殊文件/proc/sys/net/ipv6/route/flush来执行此操作。除非启用IPv6,否则此文件以及/proc/sys/net/ipv6/中的所有内容都不存在。我认为您的其他IPv6语句失败的原因相同,它们试图访问/proc/sys/net/ipv6/中不存在的参数。

相关内容

  • 没有找到相关文章