考虑一下:
我有一个禁用了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: yes
与sysctl
模块一起使用,这样处理程序就不会崩溃,甚至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/
中不存在的参数。