25.9. 出口防火墙和网络策略规则的日志记录
作为集群管理员,您可以为集群配置审计日志记录,并为一个或多个命名空间启用日志记录。OpenShift Container Platform 为出口防火墙和网络策略生成审计日志。
审计日志记录仅适用于 OVN-Kubernetes 网络插件。
25.9.1. 审计日志记录
OVN-Kubernetes 网络插件使用 Open Virtual Network (OVN) ACL 来管理出口防火墙和网络策略。审计日志记录会公开允许和拒绝 ACL 事件。
您可以为审计日志配置目的地,如 syslog 服务器或 UNIX 域套接字。无论任何其他配置如何,审计日志始终保存到集群中的每个 OVN-Kubernetes pod 上的 /var/log/ovn/acl-audit-log
。
您可以使用 k8s.ovn.org/acl-logging
部分为每个命名空间启用审计日志记录。在 k8s.ovn.org/acl-logging
部分中,您必须指定 allow
、deny
或这两个值来为命名空间启用审计日志记录。
网络策略不支持将 Pass
操作设置为规则。
ACL-logging 实现记录网络的访问控制列表 (ACL) 事件。您可以查看这些日志来分析任何潜在的安全问题。
命名空间注解示例
kind: Namespace apiVersion: v1 metadata: name: example1 annotations: k8s.ovn.org/acl-logging: |- { "deny": "info", "allow": "info" }
要查看默认的 ACL 日志记录配置值,请参阅 cluster-network-03-config.yml
文件中的 policyAuditConfig
对象。如果需要,您可以更改此文件中的日志文件参数的 ACL 日志记录配置值。
日志信息格式与 RFC5424 中定义的 syslog 兼容。syslog 工具可配置,默认为 local0
。以下示例显示了日志消息中输出的关键参数及其值:
输出参数及其值的日志记录消息示例
<timestamp>|<message_serial>|acl_log(ovn_pinctrl0)|<severity>|name="<acl_name>", verdict="<verdict>", severity="<severity>", direction="<direction>": <flow>
其中:
-
<timestamp>
声明创建日志消息的时间和日期。 -
<message_serial>
列出日志消息的序列号。 -
acl_log (ovn_pinctrl0)
是一个字面字符串,它会在 OVN-Kubernetes 插件中输出日志消息的位置。 -
<severity>
为日志消息设置严重性级别。如果您启用支持allow
和deny
任务的审计日志记录,则日志消息输出中会显示两个严重性级别。 -
<name>
说明由网络策略创建的 OVN Network Bridging Database (nbdb
) 中的 ACL-logging 实现的名称。 -
<verdict>
可以是allow
或drop
。 -
<direction>
可以是to-lport
或from-lport
,表示策略应用到 pod 的流量。 -
<flow>
显示与OpenFlow
协议等效的格式的数据包信息。此参数包含 Open vSwitch (OVS) 字段。
以下示例显示了 flow
参数用来从系统内存提取数据包信息的 OVS 字段:
flow
参数用来提取数据包信息的 OVS 字段示例
<proto>,vlan_tci=0x0000,dl_src=<src_mac>,dl_dst=<source_mac>,nw_src=<source_ip>,nw_dst=<target_ip>,nw_tos=<tos_dscp>,nw_ecn=<tos_ecn>,nw_ttl=<ip_ttl>,nw_frag=<fragment>,tp_src=<tcp_src_port>,tp_dst=<tcp_dst_port>,tcp_flags=<tcp_flags>
其中:
-
<proto>
声明协议。有效值为tcp
和udp
。 -
vlan_tci=0x0000
声明 VLAN 标头为0
,因为没有为内部 pod 网络流量设置 VLAN ID。 -
<src_mac>
指定 Media Access Control (MAC) 地址的源。 -
<source_mac>
指定 MAC 地址的目的地。 -
<source_ip>
列出源 IP 地址 -
<target_ip>
列出目标 IP 地址。 -
<tos_dscp>
声明 Differentiated Services Code Point (DSCP) 值,对网络流量进行分类并进行优先级排序。 -
<tos_ecn>
声明 Explicit Congestion Notification (ECN) 值,它表示您的网络中的阻塞网络流量。 -
<ip_ttl>
声明数据包的 Time To Live (TTP) 信息。 -
<fragment>
指定要匹配的 IP 片段或 IP 非碎片。 -
<tcp_src_port>
显示 TCP 和 UDP 协议的端口源。 -
<tcp_dst_port>
列出 TCP 和 UDP 协议的目的地端口。 -
<tcp_flags>
支持多个标示,如SYN
,ACK
,PSH
等。如果您需要设置多个值,则不同的值由竖线 (|
) 分隔。UDP 协议不支持此参数。
有关前面的字段描述的更多信息,请转至 ovs-fields
的 OVS 手册页。
网络策略的 ACL 拒绝日志条目示例
Defaulting container name to ovn-controller. Use 'oc describe pod/ovnkube-node-hdb8v -n openshift-ovn-kubernetes' to see all of the containers in this pod. 2021-06-13T19:33:11.590Z|00005|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_ingressDefaultDeny", verdict=drop, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:39,dl_dst=0a:58:0a:80:02:37,nw_src=10.128.2.57,nw_dst=10.128.2.55,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 2021-06-13T19:33:12.614Z|00006|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_ingressDefaultDeny", verdict=drop, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:39,dl_dst=0a:58:0a:80:02:37,nw_src=10.128.2.57,nw_dst=10.128.2.55,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 2021-06-13T19:44:10.037Z|00007|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_allow-from-same-namespace_0", verdict=allow, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:3b,dl_dst=0a:58:0a:80:02:3a,nw_src=10.128.2.59,nw_dst=10.128.2.58,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 2021-06-13T19:44:11.037Z|00008|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_allow-from-same-namespace_0", verdict=allow, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:3b,dl_dst=0a:58:0a:80:02:3a,nw_src=10.128.2.59,nw_dst=10.128.2.58,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0
下表描述了命名空间注解值:
字段 | 描述 |
---|---|
|
阻止任何与 |
|
允许命名空间访问与 |
|
|
25.9.2. 审计配置
审计日志记录的配置作为 OVN-Kubernetes 集群网络配置的一部分指定。以下 YAML 演示了审计日志的默认值:
审计日志记录配置
apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: defaultNetwork: ovnKubernetesConfig: policyAuditConfig: destination: "null" maxFileSize: 50 rateLimit: 20 syslogFacility: local0
下表描述了审计日志的配置字段。
字段 | 类型 | 描述 |
---|---|---|
| 整数 |
每个节点每秒生成一次的消息数量上限。默认值为每秒 |
| 整数 |
审计日志的最大大小,以字节为单位。默认值为 |
| 整数 | 保留的日志文件的最大数量。 |
| 字符串 | 以下附加审计日志目标之一:
|
| 字符串 |
syslog 工具,如 as |
25.9.3. 为集群配置出口防火墙和网络策略审计
作为集群管理员,您可以自定义集群的审计日志。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。
流程
要自定义审计日志配置,请输入以下命令:
$ oc edit network.operator.openshift.io/cluster
提示您还可以自定义并应用以下 YAML 来配置审计日志记录:
apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: defaultNetwork: ovnKubernetesConfig: policyAuditConfig: destination: "null" maxFileSize: 50 rateLimit: 20 syslogFacility: local0
验证
要创建带有网络策略的命名空间,请完成以下步骤:
创建命名空间进行验证:
$ cat <<EOF| oc create -f - kind: Namespace apiVersion: v1 metadata: name: verify-audit-logging annotations: k8s.ovn.org/acl-logging: '{ "deny": "alert", "allow": "alert" }' EOF
输出示例
namespace/verify-audit-logging created
为命名空间创建网络策略:
$ cat <<EOF| oc create -n verify-audit-logging -f - apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all spec: podSelector: matchLabels: policyTypes: - Ingress - Egress --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-same-namespace namespace: verify-audit-logging spec: podSelector: {} policyTypes: - Ingress - Egress ingress: - from: - podSelector: {} egress: - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: verify-audit-logging EOF
输出示例
networkpolicy.networking.k8s.io/deny-all created networkpolicy.networking.k8s.io/allow-from-same-namespace created
为
default
命名空间中的源流量创建 pod:$ cat <<EOF| oc create -n default -f - apiVersion: v1 kind: Pod metadata: name: client spec: containers: - name: client image: registry.access.redhat.com/rhel7/rhel-tools command: ["/bin/sh", "-c"] args: ["sleep inf"] EOF
在
verify-audit-logging
命名空间中创建两个 pod:$ for name in client server; do cat <<EOF| oc create -n verify-audit-logging -f - apiVersion: v1 kind: Pod metadata: name: ${name} spec: containers: - name: ${name} image: registry.access.redhat.com/rhel7/rhel-tools command: ["/bin/sh", "-c"] args: ["sleep inf"] EOF done
输出示例
pod/client created pod/server created
要生成流量并生成网络策略审计日志条目,请完成以下步骤:
在
verify-audit-logging
命名空间中获取名为server
的 pod 的 IP 地址:$ POD_IP=$(oc get pods server -n verify-audit-logging -o jsonpath='{.status.podIP}')
从
default
命名空间中名为client
的 pod 中 ping 上一个命令的 IP 地址,并确认所有数据包都已丢弃:$ oc exec -it client -n default -- /bin/ping -c 2 $POD_IP
输出示例
PING 10.128.2.55 (10.128.2.55) 56(84) bytes of data. --- 10.128.2.55 ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 2041ms
从
verify-audit-logging
命名空间中名为client
的 pod 中 pingPOD_IP
shell 环境变量中保存的 IP 地址,并确认允许所有数据包:$ oc exec -it client -n verify-audit-logging -- /bin/ping -c 2 $POD_IP
输出示例
PING 10.128.0.86 (10.128.0.86) 56(84) bytes of data. 64 bytes from 10.128.0.86: icmp_seq=1 ttl=64 time=2.21 ms 64 bytes from 10.128.0.86: icmp_seq=2 ttl=64 time=0.440 ms --- 10.128.0.86 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 0.440/1.329/2.219/0.890 ms
显示网络策略审计日志中的最新条目:
$ for pod in $(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-node --no-headers=true | awk '{ print $1 }') ; do oc exec -it $pod -n openshift-ovn-kubernetes -- tail -4 /var/log/ovn/acl-audit-log.log done
输出示例
Defaulting container name to ovn-controller. Use 'oc describe pod/ovnkube-node-hdb8v -n openshift-ovn-kubernetes' to see all of the containers in this pod. 2021-06-13T19:33:11.590Z|00005|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_ingressDefaultDeny", verdict=drop, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:39,dl_dst=0a:58:0a:80:02:37,nw_src=10.128.2.57,nw_dst=10.128.2.55,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 2021-06-13T19:33:12.614Z|00006|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_ingressDefaultDeny", verdict=drop, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:39,dl_dst=0a:58:0a:80:02:37,nw_src=10.128.2.57,nw_dst=10.128.2.55,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 2021-06-13T19:44:10.037Z|00007|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_allow-from-same-namespace_0", verdict=allow, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:3b,dl_dst=0a:58:0a:80:02:3a,nw_src=10.128.2.59,nw_dst=10.128.2.58,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 2021-06-13T19:44:11.037Z|00008|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_allow-from-same-namespace_0", verdict=allow, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:3b,dl_dst=0a:58:0a:80:02:3a,nw_src=10.128.2.59,nw_dst=10.128.2.58,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0
25.9.4. 为命名空间启用出口防火墙和网络策略审计日志
作为集群管理员,您可以为命名空间启用审计日志。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。
流程
要为命名空间启用审计日志,请输入以下命令:
$ oc annotate namespace <namespace> \ k8s.ovn.org/acl-logging='{ "deny": "alert", "allow": "notice" }'
其中:
<namespace>
- 指定命名空间的名称。
提示您还可以应用以下 YAML 来启用审计日志记录:
kind: Namespace apiVersion: v1 metadata: name: <namespace> annotations: k8s.ovn.org/acl-logging: |- { "deny": "alert", "allow": "notice" }
输出示例
namespace/verify-audit-logging annotated
验证
显示审计日志中的最新条目:
$ for pod in $(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-node --no-headers=true | awk '{ print $1 }') ; do oc exec -it $pod -n openshift-ovn-kubernetes -- tail -4 /var/log/ovn/acl-audit-log.log done
输出示例
Defaulting container name to ovn-controller. Use 'oc describe pod/ovnkube-node-hdb8v -n openshift-ovn-kubernetes' to see all of the containers in this pod. 2021-06-13T19:33:11.590Z|00005|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_ingressDefaultDeny", verdict=drop, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:39,dl_dst=0a:58:0a:80:02:37,nw_src=10.128.2.57,nw_dst=10.128.2.55,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 2021-06-13T19:33:12.614Z|00006|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_ingressDefaultDeny", verdict=drop, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:39,dl_dst=0a:58:0a:80:02:37,nw_src=10.128.2.57,nw_dst=10.128.2.55,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 2021-06-13T19:44:10.037Z|00007|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_allow-from-same-namespace_0", verdict=allow, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:3b,dl_dst=0a:58:0a:80:02:3a,nw_src=10.128.2.59,nw_dst=10.128.2.58,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 2021-06-13T19:44:11.037Z|00008|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_allow-from-same-namespace_0", verdict=allow, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:3b,dl_dst=0a:58:0a:80:02:3a,nw_src=10.128.2.59,nw_dst=10.128.2.58,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0
25.9.5. 为命名空间禁用出口防火墙和网络策略审计日志
作为集群管理员,您可以禁用命名空间的审计日志。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。
流程
要为命名空间禁用审计日志,请输入以下命令:
$ oc annotate --overwrite namespace <namespace> k8s.ovn.org/acl-logging-
其中:
<namespace>
- 指定命名空间的名称。
提示您还可以应用以下 YAML 来禁用审计日志记录:
kind: Namespace apiVersion: v1 metadata: name: <namespace> annotations: k8s.ovn.org/acl-logging: null
输出示例
namespace/verify-audit-logging annotated