Control plane and data plane security controls

Harden your deployment across two domains: the Red Hat OpenShift Container Platform (RHOCP) cluster that hosts the control plane, and the RHEL-based data plane nodes that host compute and optional storage workloads.

Access control plane services

Control plane services run as pods in the openstack namespace on Red Hat OpenShift Container Platform (RHOCP). Interact with control plane services with the oc CLI or the RHOCP web console as a user with cluster-admin privileges.

Procedure

  1. Log in to the RHOCP cluster using the oc CLI:
    $ oc login -u <admin_user> https://<rhocp_api>:6443
    • Replace <rhocp_api> with the correct RHOCP API.
  2. Access an OpenStack service pod by opening a remote shell:
    $ oc rsh -n openstack openstackclient
  3. Run the OpenStack CLI commands in the remote shell:
    sh-5.1$ openstack service list
    Important
    Restrict direct SSH access to RHOCP nodes for emergency scenarios only. Day-to-day administration must go through the RHOCP API. Apply RHOCP RBAC to limit cluster admin privileges to the minimum set of operators who need it.

Access the data plane

Data plane nodes such as Compute, Networker, optional storage are RHEL 9 hosts. The OpenStack Operator manages them with Ansible over SSH, using a key pair stored in a Kubernetes Secret CR. Direct root SSH to these nodes is disabled unless you configure it in the OpenStackDataPlaneNodeSet CR.

Procedure

  1. Generate an SSH key pair and create a Secret CR for Ansible:
    $ ssh-keygen -f ~/dataplane-ansible-ssh-key -t ecdsa -b 521 -N ''
    $ oc create secret generic dataplane-ansible-ssh-private-key-secret \
        --save-config \
        --dry-run=client \
        --from-file=authorized_keys=~/dataplane-ansible-ssh-key.pub \
        --from-file=ssh-privatekey=~/dataplane-ansible-ssh-key \
        --from-file=ssh-publickey=~/dataplane-ansible-ssh-key.pub \
        -n openstack -o yaml | oc apply -f -
  2. Reference this Secret in your OpenStackDataPlaneNodeSet CR under nodeTemplate.ansible:
    nodeTemplate:
      ansible:
        ansibleUser: cloud-admin
        ansiblePort: 22
      ansibleSSHPrivateKeySecret: dataplane-ansible-ssh-private-key-secret
    Note
    The ansibleUsercloud-admin should be a non-root user with sudo privileges on the data plane nodes. Avoid using root directly. Ensure that PasswordAuthentication is set to no in /etc/ssh/sshd_config on all data plane nodes so that SSH access is key-only.

Control plane network access

The control plane runs inside the Red Hat OpenShift Container Platform (RHOCP) cluster. Network access to control plane service pods is governed by Kubernetes NetworkPolicy objects, RHOCP Routes, and MetalLB LoadBalancer configurations.

Applying NetworkPolicy to restrict control plane traffic

By default, pods in the openstack namespace can communicate with each other. To enforce least-privilege, create NetworkPolicy resources that restrict ingress to only the required ports and source namespaces. The following example shows how to restrict ingress to keystone API pods:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-keystone-ingress
  namespace: openstack
spec:
  podSelector:
    matchLabels:
      service: keystone
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: openstack
      ports:
        - protocol: TCP
          port: 5000
Note
The OVN-Kubernetes CNI supports NetworkPolicy enforcement. Verify your CNI before relying on NetworkPolicy for security boundaries.
Restricting external access to OpenStack APIs

Public OpenStack API endpoints are exposed through RHOCP Routes that are backed by the HAProxy-based RHOCP Ingress Controller, or MetalLB LoadBalancer services. Complete the following steps to restrict which external IPs can reach these endpoints:

  • For RHOCP Routes, configure the Ingress Controller with IP allowlists or place an external firewall or load balancer in front of the RHOCP cluster.
  • For MetalLB, use spec.loadBalancerSourceRanges on the Service object to restrict source CIDRs.
  • For internal APIs, use the internalapi network with Multus or NetworkAttachmentDefinitions, which keeps traffic off the public network entirely.

SNMP protocol strings

Simple network management protocol (SNMP) is relevant only to the RHEL hosts on the data plane nodes. The control plane pods do not run SNMP daemons.

If you use SNMP monitoring on your data plane nodes, configure the SNMP daemon through edpm-ansible Ansible variables or a custom OpenStackDataPlaneService CR that deploys a ConfigMap with your snmpd.conf overrides.

Set the following SNMP access control settings as Ansible variables or deploy a custom snmpd.conf through a ConfigMap:

  • ro_community is an IPv4 read-only community string. Change from the default value of public.
  • ro_community6 is an IPv6 read-only community string. Change from the default value of public.
  • ro_network is network permitted to query the daemon. The default is 127.0.0.1.
  • ro_network6 is an IPv6 network permitted to query the daemon. The default is ::1/128.

The following example shows custom SNMP configured with ConfigMap and DataPlaneService:

apiVersion: v1
kind: ConfigMap
metadata:
  name: custom-snmpd-config
  namespace: openstack
data:
  snmpd.conf: |
    com2sec notConfigUser default mysecurestring
    com2sec6 notConfigUser default myv6securestring
    group notConfigGroup v1 notConfigUser
    group notConfigGroup v2c notConfigUser
    view systemview included .1.3.6.1.2.1.1
    access notConfigGroup "" any noauth exact systemview none none

Reference this ConfigMap in a custom OpenStackDataPlaneService CR that deploys it to the data plane nodes.

Important
Never leave the default SNMP community string as public on production data plane nodes. Rotate SNMP strings on the same schedule as other service credentials.

Security groups and OVN

Red Hat OpenStack Services on OpenShift (RHOSO) 18.0 uses ML2/OVN as its networking mechanism driver. The ML2 and OVS driver has been completely removed. Security groups are implemented natively with OVN ACLs that correspond with OpenFlow rules in the OVS pipeline on each Compute node.

RHOSO 18.0 has some important differences from Red Hat OpenStack Platform (RHOSP) 17.1:

  • There is no NeutronOVSFirewallDriver parameter in RHOSO. OVN handles security group enforcement natively through ACLs.
  • Security groups are stateful by default. ML2/OVN also supports stateless security groups, which bypass connection tracking and can provide significant performance gains in high-throughput environments.
  • Multicast traffic handling remains consistent with OVS-based behavior. OVN uses the NORMAL action and forwards multicast traffic to all ports as specified by RFC 4541, because security groups do not apply to all port types, such as router ports.
  • Stateless security groups require explicit return-traffic rules. If you create a rule allowing outbound TCP, you must also create a corresponding inbound rule for replies.
    Security group logging
    RHOSO 18.0 supports security group packet logging through the Networking service logging API. Logs are written to /var/log/containers/openvswitch/ovn-controller.log on each Compute node. Ensure the logging service plugin is loaded in the Networking service configuration within the OpenStackControlPlane CR. This provides an audit trail for ACCEPT and DROP events per security group, per port.

Additional RHOCP hardening

Because the control plane is hosted on Red Hat OpenShift Container Platform (RHOCP), several RHOCP hardening practices directly affect the security posture of your deployment.

RBAC on the RHOCP cluster
Limit cluster-admin access to a small number of administrators. Create RHOCP Roles and RoleBindings that are scoped to the openstack and openstack-operators namespaces for day-to-day operations. The OpenStack Operator CRDs can be managed by users with namespace-scoped privileges.
Pod security
RHOCP enforces Pod Security Admission (PSA) by default. The OpenStack Operator pods run with the profiles set by the Operator itself. Do not relax PSA labels on the openstack namespace unless Red Hat guidance explicitly requires it.
etcd encryption
All Kubernetes Secrets, including the osp-secret containing OpenStack service credentials, are stored in etcd. Enable etcd encryption at rest on your RHOCP cluster to protect these credentials.
Image provenance
RHOSO service container images are signed and delivered through the Red Hat container registry. Verify that your RHOCP cluster is configured to enforce image signature verification and that your OpenStackVersion CR references only supported image versions.
TLS on the control plane
The RHOSO OpenStack Operator integrates with the cert-manager Operator to manage TLS certificates for OpenStack service endpoints. TLS is enabled by default for both internal and public endpoints. The cert-manager Operator creates and rotates certificates automatically. If you use a custom CA, configure the issuer accordingly in the cert-manager configuration before deploying the control plane.
Observability and audit
RHOSO 18.0 integrates natively with Prometheus and AlertManager from RHOCP Observability, and Loki and ClusterLogForwarder from the Logging stack. Enable these components to collect metrics and logs from both the control plane pods and the data plane nodes. The Telemetry services ceilometer and prometheus are enabled by default. For security auditing, configure the RHOCP API audit log and forward RHOSO service logs to a centralized SIEM.

RHOSP 17.1 to RHOSO 18.0 security comparison

Review the security differences between Red Hat OpenStack Platform (RHOSP) 17.1 and Red Hat OpenStack Services on OpenShift (RHOSO) 18.0.

Table 1. Comparison between security in RHOSP 17.1 and RHOSO 18.0
RHOSP 17.1 mechanism RHOSO 18.0 Replacement Notes

Heat ExtraFirewallRules.

Kubernetes NetworkPolicy on control plane and edpm_nftables on data plane.

No heat/TripleO stack.

rotate-passwords.yaml playbook.

Update Kubernetes Secret CRs. Operators reconcile and restart pods.

No overcloud-passwords.yaml file.

tripleo-admin SSH user.

cloud-admin user by SSH Secret CR for data plane. oc CLI for control plane.

No undercloud/overcloud model.

NeutronOVSFirewallDriver parameter.

OVN ACLs handle security groups natively. No driver parameter is needed.

ML2/OVS removed entirely.

ExtraConfig or Hiera for SNMP.

edpm-ansible variables or custom ConfigMap on data plane nodes.

No Puppet or Hiera on control plane.