DirectorySecurity AdvisoriesPricing
/
Sign in
Directory
kafka-iamguarded-fips logoFIPS

kafka-iamguarded-fips

packaged by Chainguard

Last changed
Request a free trial

Contact our team to test out this image for free. Please also indicate any other images you would like to evaluate.

Tags
Overview
Comparison
Provenance
Specifications
SBOM
Vulnerabilities
Advisories

Chainguard Container for kafka-iamguarded-fips

FIPS 140-3 Apache Kafka distributed event store and stream-processing platform, compatible with iamguarded charts

Chainguard Containers are regularly-updated, secure-by-default container images.

Download this Container Image

For those with access, this container image is available on cgr.dev:

docker pull cgr.dev/ORGANIZATION/kafka-iamguarded-fips:latest

Be sure to replace the ORGANIZATION placeholder with the name used for your organization's private repository within the Chainguard Registry.

Overview

Kafka IAMGuarded FIPS is a security-enhanced variant of Kafka with FIPS 140-3 validated cryptography, designed to be deployed using its companion IAMGuarded Helm chart. This image uses the BouncyCastle FIPS (BCFIPS) Java security provider and does not require kernel-mode FIPS configuration at runtime.

Compatibility Notes

Keystore and Truststore Requirements

The BCFKS (BouncyCastle FIPS Keystore) format is supported for keystores and truststores. For example, the following formats are rejected:

  • JKS — does not use FIPS-approved algorithms
  • PKCS12 — certificate parsing needs patches to force RFC9879 KDF and PBMAC algorithms

PEM Certificates

PEM certificates can be used directly via Kafka's inline PEM configuration (e.g. ssl.keystore.type=PEM). When using PEM, certificates and keys must use FIPS 140-3 compatible algorithms:

  • Supported keys: RSA (2048-bit or larger), ECDSA with NIST curves (P-256, P-384, P-521)
  • Rejected: Non-NIST curves (e.g., secp256k1, ed25519), weak key sizes, and legacy signature algorithms

TLS Requirements

  • TLS 1.2 or TLS 1.3 are required. TLS 1.1 and below are rejected.
  • Only cipher suites that use valid FIPS 140-3 algorithms are permitted. Non-FIPS suites using algorithms like ChaCha20 or 3DES are rejected.

Helm Chart Installation

The Kafka IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

cgr.dev/$ORGANIZATION/iamguarded-charts/kafka

Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your organization name:

helm install kafka oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kafka \
  --set "global.org=$ORGANIZATION"

Important: Replace $ORGANIZATION with your Chainguard organization name. The default organization in the chart values is chainguard-private, which must be changed to match your organization.

TLS with BCFKS Keystores

The IAMGuarded Kafka chart's built-in TLS pipeline generates certificates using the PKCS12 format, which is not compatible with FIPS 140-3. To deploy with BCFKS TLS, use a custom init container to generate BCFKS keystores and append SSL properties to the Kafka configuration.

Example values.yaml:

image:
  registry: cgr.dev
  repository: $ORGANIZATION/kafka-iamguarded-fips
  tag: latest

controller:
  replicaCount: 1
  initContainers:
    - name: gen-bcfks
      image: cgr.dev/$ORGANIZATION/kafka-iamguarded-fips:latest
      securityContext:
        runAsUser: 1001
        runAsGroup: 1001
      command:
        - sh
        - -c
        - |
          rm -f /certs/kafka.keystore.bcfks /certs/kafka.truststore.bcfks

          keytool -genkeypair -alias kafka -keyalg RSA -keysize 2048 -validity 365 \
            -dname "CN=localhost" \
            -keystore /certs/kafka.keystore.bcfks -storetype BCFKS \
            -storepass changeit -keypass changeit \
            -providername BCFIPS \
            -provider org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider

          keytool -exportcert -alias kafka \
            -keystore /certs/kafka.keystore.bcfks -storetype BCFKS \
            -storepass changeit \
            -providername BCFIPS \
            -provider org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider \
            -file /tmp/kafka.der

          keytool -import -trustcacerts -noprompt \
            -alias kafka -file /tmp/kafka.der \
            -keystore /certs/kafka.truststore.bcfks -storetype BCFKS \
            -storepass changeit \
            -providername BCFIPS \
            -provider org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider

          cat >> /opt/iamguarded/kafka/config/server.properties << 'PROPS'
          listeners=SSL://:9092,INTERNAL://:9094,CONTROLLER://:9093
          advertised.listeners=SSL://advertised-address-placeholder:9092,INTERNAL://advertised-address-placeholder:9094
          listener.security.protocol.map=SSL:SSL,INTERNAL:SSL,CONTROLLER:SSL
          inter.broker.listener.name=INTERNAL
          ssl.keystore.type=BCFKS
          ssl.keystore.location=/certs/kafka.keystore.bcfks
          ssl.keystore.password=changeit
          ssl.key.password=changeit
          ssl.truststore.type=BCFKS
          ssl.truststore.location=/certs/kafka.truststore.bcfks
          ssl.truststore.password=changeit
          ssl.client.auth=none
          ssl.endpoint.identification.algorithm=
          listener.name.controller.ssl.keystore.type=BCFKS
          listener.name.controller.ssl.keystore.location=/certs/kafka.keystore.bcfks
          listener.name.controller.ssl.keystore.password=changeit
          listener.name.controller.ssl.key.password=changeit
          listener.name.controller.ssl.truststore.type=BCFKS
          listener.name.controller.ssl.truststore.location=/certs/kafka.truststore.bcfks
          listener.name.controller.ssl.truststore.password=changeit
          listener.name.internal.ssl.keystore.type=BCFKS
          listener.name.internal.ssl.keystore.location=/certs/kafka.keystore.bcfks
          listener.name.internal.ssl.keystore.password=changeit
          listener.name.internal.ssl.key.password=changeit
          listener.name.internal.ssl.truststore.type=BCFKS
          listener.name.internal.ssl.truststore.location=/certs/kafka.truststore.bcfks
          listener.name.internal.ssl.truststore.password=changeit
          controller.quorum.ssl.keystore.type=BCFKS
          controller.quorum.ssl.keystore.location=/certs/kafka.keystore.bcfks
          controller.quorum.ssl.keystore.password=changeit
          controller.quorum.ssl.key.password=changeit
          controller.quorum.ssl.truststore.type=BCFKS
          controller.quorum.ssl.truststore.location=/certs/kafka.truststore.bcfks
          controller.quorum.ssl.truststore.password=changeit
          PROPS
      volumeMounts:
        - name: bcfks-certs
          mountPath: /certs
        - name: kafka-config
          mountPath: /opt/iamguarded/kafka/config
  extraVolumes:
    - name: bcfks-certs
      emptyDir: {}
  extraVolumeMounts:
    - name: bcfks-certs
      mountPath: /certs

listeners:
  client:
    protocol: PLAINTEXT
  interbroker:
    protocol: PLAINTEXT
  controller:
    protocol: PLAINTEXT

auth:
  sasl:
    enabledMechanisms: []

The init container generates BCFKS keystores using the FIPS image's keytool and appends SSL properties to server.properties after the chart's prepare-config init container runs. The chart's listener protocols are set to PLAINTEXT to avoid triggering its built-in TLS pipeline (which uses PKCS12). The appended properties override the listeners to SSL using Kafka's last-key-wins behavior for duplicate properties.

TLS with PEM Certificates

PEM certificates can be used instead of BCFKS keystores. Certificates and keys must use FIPS 140-3 compatible algorithms.

Create a K8s Secret with your PEM cert and key, then use an init container to inline them into server.properties.

First, create the Secret:

kubectl create secret generic kafka-pem-certs \
  --from-file=tls.crt=server.crt \
  --from-file=tls.key=server.key

Then use this values.yaml (replacing the BCFKS init container):

controller:
  initContainers:
    - name: configure-tls
      image: cgr.dev/$ORGANIZATION/kafka-iamguarded-fips:latest
      securityContext:
        runAsUser: 1001
        runAsGroup: 1001
      command:
        - sh
        - -c
        - |
          CERT_PEM=$(awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' /pem/tls.crt)
          KEY_PEM=$(awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' /pem/tls.key)

          cat >> /opt/iamguarded/kafka/config/server.properties << PROPS
          listeners=SSL://:9092,INTERNAL://:9094,CONTROLLER://:9093
          advertised.listeners=SSL://advertised-address-placeholder:9092,INTERNAL://advertised-address-placeholder:9094
          listener.security.protocol.map=SSL:SSL,INTERNAL:SSL,CONTROLLER:SSL
          inter.broker.listener.name=INTERNAL
          ssl.keystore.type=PEM
          ssl.keystore.certificate.chain=${CERT_PEM}
          ssl.keystore.key=${KEY_PEM}
          ssl.truststore.type=PEM
          ssl.truststore.certificates=${CERT_PEM}
          ssl.client.auth=none
          ssl.endpoint.identification.algorithm=
          listener.name.controller.ssl.keystore.type=PEM
          listener.name.controller.ssl.keystore.certificate.chain=${CERT_PEM}
          listener.name.controller.ssl.keystore.key=${KEY_PEM}
          listener.name.controller.ssl.truststore.type=PEM
          listener.name.controller.ssl.truststore.certificates=${CERT_PEM}
          listener.name.internal.ssl.keystore.type=PEM
          listener.name.internal.ssl.keystore.certificate.chain=${CERT_PEM}
          listener.name.internal.ssl.keystore.key=${KEY_PEM}
          listener.name.internal.ssl.truststore.type=PEM
          listener.name.internal.ssl.truststore.certificates=${CERT_PEM}
          controller.quorum.ssl.keystore.type=PEM
          controller.quorum.ssl.keystore.certificate.chain=${CERT_PEM}
          controller.quorum.ssl.keystore.key=${KEY_PEM}
          controller.quorum.ssl.truststore.type=PEM
          controller.quorum.ssl.truststore.certificates=${CERT_PEM}
          PROPS
      volumeMounts:
        - name: pem-certs
          mountPath: /pem
          readOnly: true
        - name: kafka-config
          mountPath: /opt/iamguarded/kafka/config
  extraVolumes:
    - name: pem-certs
      secret:
        secretName: kafka-pem-certs

Configuration Requirements

Organization Setting

The global.org value is required and can be set either:

  • Via --set flag during installation
  • In your existing values.yaml file
Registry Configuration

For users who mirror images to custom repositories:

  • Use global.imageRegistry to override the default cgr.dev
  • For complex mirroring strategies, consult the chart's values.yaml for individual image configuration options including registry, repository, tag, and digest
Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

How to Use Chainguard Helm Charts

Best Practices

  1. Pin to Digest: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:

    helm install kafka oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kafka@sha256:DIGEST \
      --set "global.org=$ORGANIZATION"
  2. Review Default Values: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's values.yaml (run helm show values) for the full range of configuration options.

  3. Image Pinning: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

Validation

After deployment, validate your Kafka IAMGuarded FIPS installation using standard Kafka verification methods. The deployment functions as a standard Kafka instance with FIPS-validated cryptography, so all typical Kafka validation procedures apply.

Prerequisites

Prerequisites are defined in the chart's Chart.yaml and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's values.yaml file.

FIPS Support

For more on FIPS support in Chainguard Containers, consult the guide on FIPS-enabled Chainguard Containers on Chainguard Academy.

What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with Wolfi, our minimal Linux undistro.

All other Chainguard Containers are built with Chainguard OS, Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with a development, or -dev, variant.

In all other cases, including Chainguard Containers tagged as :latest or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the -dev container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the -dev variant into a more minimal production image.

Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use Custom Assembly to add packages, either through the Console, chainctl, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in your Organization's list of images, and click on the Customize image button at the top of the page.

Learn More

Refer to our Chainguard Containers documentation on Chainguard Academy. Chainguard also offers VMs and Librariescontact us for access.

Trademarks

This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies.

Licenses

Chainguard's container images contain software packages that are direct or transitive dependencies. The following licenses were found in the "latest" tag of this image:

  • Apache-2.0

  • BSD-3-Clause

  • Bitstream-Vera

  • FTL

  • GCC-exception-3.1

  • GPL-2.0-only

  • GPL-2.0-or-later

For a complete list of licenses, please refer to this Image's SBOM.

Software license agreement

Compliance

Chainguard Containers are SLSA Level 3 compliant with detailed metadata and documentation about how it was built. We generate build provenance and a Software Bill of Materials (SBOM) for each release, with complete visibility into the software supply chain.

SLSA compliance at Chainguard

This image helps reduce time and effort in establishing PCI DSS 4.0 compliance with low-to-no CVEs.

PCI DSS at Chainguard

This is a FIPS validated image for FedRAMP compliance.

This image is STIG hardened and scanned against the DISA General Purpose Operating System SRG with reports available.

Learn more about STIGsGet started with STIGs

Related images
kafka logo
kafka

Category
FIPS
STIG

The trusted source for open source

Talk to an expert
PrivacyTerms

Product

Chainguard ContainersChainguard LibrariesChainguard VMsIntegrationsPricing
© 2026 Chainguard, Inc. All Rights Reserved.
Chainguard® and the Chainguard logo are registered trademarks of Chainguard, Inc. in the United States and/or other countries.
The other respective trademarks mentioned on this page are owned by the respective companies and use of them does not imply any affiliation or endorsement.