Enable the classification banner
What you’ll accomplish
Section titled “What you’ll accomplish”After completing this guide, web applications exposed through the Istio service mesh will display security classification banners at the top (and optionally the bottom) of each page. You can assign different classification levels to different hosts or URL path prefixes on the same host. Each banner color automatically corresponds to the standard classification markings.
Prerequisites
Section titled “Prerequisites”Before configuring classification banners, confirm that you meet these prerequisites:
- UDS CLI installed
- UDS Registry account created and authenticated locally with a read token
- Access to a Kubernetes cluster with UDS Core deployed
Before you begin
Section titled “Before you begin”An Istio EnvoyFilter adds the classification banner to HTML responses at the gateway. By default, it inserts banner elements into the page body and places application content in a scrollable row between them.
The classificationBanners array configures one or more banners. UDS Core continues to support the previous classificationBanner object for backward compatibility, but new configurations should use classificationBanners.
-
Configure the banners, hosts, and paths
Add each banner to the
classificationBannersarray and assign its hosts withenabledHosts. To limit a banner to part of a host, add one or more URL prefixes withpathPrefixes. WhenpathPrefixesis empty or omitted, the banner matches every path on its enabled hosts.uds-bundle.yaml packages:- name: corerepository: registry.defenseunicorns.com/public/coreref: x.x.x-upstreamkeylessVerification:certificateIdentityRegexp: ^https://github\.com/defenseunicorns/uds-core/\.github/workflows/publish\.yaml@refs/tags/v[0-9]+\.[0-9]+\.[0-9]+$certificateOIDCIssuer: https://token.actions.githubusercontent.comoverrides:istio-controlplane:uds-global-istio-config:values:- path: classificationBannersvalue:- text: "UNCLASSIFIED"addFooter: trueenabledHosts:- keycloak.{{ .Values.adminDomain }}- mission-app.{{ .Values.domain }}- text: "SECRET//NOFORN"addFooter: falseenabledHosts:- mission-app.{{ .Values.domain }}pathPrefixes:- /classified- /need-to-knowSupported classification levels:
Value Banner color UNCLASSIFIEDGreen CUIPurple CONFIDENTIALBlue SECRETRed TOP SECRETOrange TOP SECRET//SCIYellow UNKNOWNBlack (default) SAMPLE BANNERBlack (demo placeholder) -
Create and deploy your bundle
Terminal window uds create <path-to-bundle-dir>uds deploy uds-bundle-<name>-<arch>-<version>.tar.zst
Verification
Section titled “Verification”Open hosts and paths from each configured banner in a browser. Each page should show the assigned classification text and color at the top. Verify that a path-specific banner overrides the host-only fallback on the same host. If addFooter is enabled for that banner, the same banner appears at the bottom.
For the default mode, confirm that the content scrolls between the banners. For cssOnly mode, confirm that content and controls remain usable between the fixed markings. Check the browser console for hydration errors.
Troubleshooting
Section titled “Troubleshooting”Problem: Banner not appearing on a host
Section titled “Problem: Banner not appearing on a host”Symptom: A configured host loads normally but no classification banner is displayed.
Solution: Verify the hostname is included in an enabledHosts array under classificationBanners. The host must match exactly, including any subdomain prefixes. If the banner uses pathPrefixes, verify that the URL path begins with one of those values. If the banner appears briefly and then disappears after hydration, set cssOnly: true for that entry. If it never appears, check the deployed EnvoyFilter:
uds zarf tools kubectl get envoyfilter classification-banner -n istio-system -o yamlProblem: Banner breaks page layout or doesn’t render correctly
Section titled “Problem: Banner breaks page layout or doesn’t render correctly”Symptom: The banner HTML is injected but the page layout is disrupted, invisible or overlaps content.
Solution: If the default banner’s body elements or scrollable content row disrupt the page, set cssOnly: true for that entry. This mode leaves the body tree intact, but its fixed markings can still overlap navigation or controls. Check the page after hydration. If the application cannot accommodate either mode, implement the banner within the application.
Related documentation
Section titled “Related documentation”Use these resources to learn more about classification markings and Istio networking:
- Astro UXDS Classification Markings - standard color and formatting reference
- Istio EnvoyFilter - how Istio modifies HTTP responses at the gateway
- Networking concepts - how UDS Core manages the Istio service mesh and gateways