24.8. Journalisation des règles de pare-feu et de stratégie de réseau de sortie

En tant qu'administrateur de cluster, vous pouvez configurer la journalisation d'audit pour votre cluster et activer la journalisation pour un ou plusieurs espaces de noms. OpenShift Container Platform produit des journaux d'audit pour les pare-feu de sortie et les stratégies réseau.

Note

La journalisation des audits n'est disponible que pour le plugin réseau OVN-Kubernetes.

24.8.1. Journalisation des audits

Le plugin réseau OVN-Kubernetes utilise les ACL de l'Open Virtual Network (OVN) pour gérer les pare-feu de sortie et les politiques de réseau. La journalisation d'audit expose les événements d'autorisation et de refus des ACL.

Vous pouvez configurer la destination des journaux d'audit, comme un serveur syslog ou un socket de domaine UNIX. Indépendamment de toute configuration supplémentaire, un journal d'audit est toujours enregistré sur /var/log/ovn/acl-audit-log.log sur chaque pod OVN-Kubernetes dans le cluster.

L'enregistrement des audits est activé par espace de noms en annotant l'espace de noms avec la clé k8s.ovn.org/acl-logging comme dans l'exemple suivant :

Exemple d'annotation d'un espace de noms

kind: Namespace
apiVersion: v1
metadata:
  name: example1
  annotations:
    k8s.ovn.org/acl-logging: |-
      {
        "deny": "info",
        "allow": "info"
      }

Le format de journalisation est compatible avec syslog tel que défini par RFC5424. L'option syslog est configurable et est définie par défaut sur local0. Un exemple d'entrée de journal peut ressembler à ce qui suit :

Exemple d'entrée de journal de refus d'ACL pour une stratégie de réseau

2021-06-13T19:33:11.590Z|00005|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_deny-all", 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

Le tableau suivant décrit les valeurs d'annotation de l'espace de noms :

Tableau 24.9. Annotation de l'espace de noms pour la journalisation des audits

AnnotationValeur

k8s.ovn.org/acl-logging

Vous devez spécifier au moins l'un des éléments suivants : allow, deny, ou les deux pour activer la journalisation des audits pour un espace de noms.

deny
Optionnel : Indiquez alert, warning, notice, info, ou debug.
allow
Optionnel : Indiquez alert, warning, notice, info, ou debug.

24.8.2. Configuration de l'audit

La configuration de la journalisation des audits est spécifiée dans le cadre de la configuration du fournisseur de réseau du cluster OVN-Kubernetes. Le fichier YAML suivant illustre les valeurs par défaut pour la journalisation des audits :

Configuration de la journalisation des audits

apiVersion: operator.openshift.io/v1
kind: Network
metadata:
  name: cluster
spec:
  defaultNetwork:
    ovnKubernetesConfig:
      policyAuditConfig:
        destination: "null"
        maxFileSize: 50
        rateLimit: 20
        syslogFacility: local0

Le tableau suivant décrit les champs de configuration de la journalisation des audits.

Tableau 24.10. policyAuditConfig objet

FieldTypeDescription

rateLimit

entier

Nombre maximal de messages à générer chaque seconde par nœud. La valeur par défaut est 20 messages par seconde.

maxFileSize

entier

Taille maximale du journal d'audit en octets. La valeur par défaut est 50000000 ou 50 Mo.

destination

chaîne de caractères

One of the following additional audit log targets:

libc
La fonction libc syslog() du processus journald sur l'hôte.
udp:<host>:<port>
Un serveur syslog. Remplacez <host>:<port> par l'hôte et le port du serveur syslog.
unix:<file>
Un fichier Unix Domain Socket spécifié par <file>.
null
Do not send the audit logs to any additional target.

syslogFacility

chaîne de caractères

L'installation syslog, telle que kern, telle que définie par RFC5424. La valeur par défaut est local0.

24.8.3. Configuration de l'audit du pare-feu de sortie et de la stratégie réseau pour un cluster

En tant qu'administrateur de cluster, vous pouvez personnaliser la journalisation des audits pour votre cluster.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous au cluster avec un utilisateur disposant des privilèges cluster-admin.

Procédure

  • Pour personnaliser la configuration de la journalisation des audits, entrez la commande suivante :

    $ oc edit network.operator.openshift.io/cluster
    Astuce

    Vous pouvez également personnaliser et appliquer le fichier YAML suivant pour configurer l'enregistrement des audits :

    apiVersion: operator.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      defaultNetwork:
        ovnKubernetesConfig:
          policyAuditConfig:
            destination: "null"
            maxFileSize: 50
            rateLimit: 20
            syslogFacility: local0

Vérification

  1. Pour créer un espace de noms avec des stratégies de réseau, procédez comme suit :

    1. Créer un espace de noms pour la vérification :

      $ 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

      Exemple de sortie

      namespace/verify-audit-logging created

    2. Activer la journalisation des audits :

      $ oc annotate namespace verify-audit-logging k8s.ovn.org/acl-logging='{ "deny": "alert", "allow": "alert" }'
      namespace/verify-audit-logging annotated
    3. Créer des politiques de réseau pour l'espace de noms :

      $ 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
      spec:
        podSelector: {}
        policyTypes:
         - Ingress
         - Egress
        ingress:
          - from:
              - podSelector: {}
        egress:
          - to:
             - namespaceSelector:
                matchLabels:
                  namespace: verify-audit-logging
      EOF

      Exemple de sortie

      networkpolicy.networking.k8s.io/deny-all created
      networkpolicy.networking.k8s.io/allow-from-same-namespace created

  2. Créer un pod pour le trafic source dans l'espace de noms default:

    $ 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
  3. Créer deux pods dans l'espace de noms verify-audit-logging:

    $ 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

    Exemple de sortie

    pod/client created
    pod/server created

  4. Pour générer du trafic et produire des entrées de journal d'audit de stratégie de réseau, procédez comme suit :

    1. Obtenir l'adresse IP du pod nommé server dans l'espace de noms verify-audit-logging:

      $ POD_IP=$(oc get pods server -n verify-audit-logging -o jsonpath='{.status.podIP}')
    2. Effectuez un ping de l'adresse IP de la commande précédente à partir du pod nommé client dans l'espace de noms default et confirmez que tous les paquets sont abandonnés :

      $ oc exec -it client -n default -- /bin/ping -c 2 $POD_IP

      Exemple de sortie

      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

    3. Effectuez un ping de l'adresse IP enregistrée dans la variable d'environnement du shell POD_IP à partir du pod nommé client dans l'espace de noms verify-audit-logging et confirmez que tous les paquets sont autorisés :

      $ oc exec -it client -n verify-audit-logging -- /bin/ping -c 2 $POD_IP

      Exemple de sortie

      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

  5. Affiche les dernières entrées du journal d'audit de la stratégie de réseau :

    $ 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

    Exemple de sortie

    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_deny-all", 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_deny-all", 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

24.8.4. Activation de la journalisation d'audit du pare-feu de sortie et de la stratégie de réseau pour un espace de noms

En tant qu'administrateur de cluster, vous pouvez activer la journalisation d'audit pour un espace de noms.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous au cluster avec un utilisateur disposant des privilèges cluster-admin.

Procédure

  • Pour activer la journalisation des audits pour un espace de noms, entrez la commande suivante :

    $ oc annotate namespace <namespace> \
      k8s.ovn.org/acl-logging='{ "deny": "alert", "allow": "notice" }'

    où :

    <namespace>
    Spécifie le nom de l'espace de noms.
    Astuce

    Vous pouvez également appliquer le code YAML suivant pour activer l'enregistrement des audits :

    kind: Namespace
    apiVersion: v1
    metadata:
      name: <namespace>
      annotations:
        k8s.ovn.org/acl-logging: |-
          {
            "deny": "alert",
            "allow": "notice"
          }

    Exemple de sortie

    namespace/verify-audit-logging annotated

Vérification

  • Affiche les dernières entrées du journal d'audit :

    $ 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

    Exemple de sortie

    2021-06-13T19:33:11.590Z|00005|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_deny-all", 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

24.8.5. Désactivation de la journalisation d'audit du pare-feu de sortie et de la stratégie de réseau pour un espace de noms

En tant qu'administrateur de cluster, vous pouvez désactiver la journalisation d'audit pour un espace de noms.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous au cluster avec un utilisateur disposant des privilèges cluster-admin.

Procédure

  • Pour désactiver la journalisation des audits pour un espace de noms, entrez la commande suivante :

    oc annotate --overwrite namespace <namespace> k8s.ovn.org/acl-logging-

    où :

    <namespace>
    Spécifie le nom de l'espace de noms.
    Astuce

    Vous pouvez également appliquer le code YAML suivant pour désactiver la journalisation des audits :

    kind: Namespace
    apiVersion: v1
    metadata:
      name: <namespace>
      annotations:
        k8s.ovn.org/acl-logging: null

    Exemple de sortie

    namespace/verify-audit-logging annotated

24.8.6. Ressources supplémentaires