Skip to main content
This tutorial covers deploying ClickHouse Private with FIPS 140-3 compliance on AWS. It builds on the standard AWS deployment, with stricter node architecture and AMI requirements, then adds the FIPS-specific Kubernetes configuration.
Deploying on GKE?The FIPS-specific Kubernetes steps below, including certificate generation, certificate secrets, and the openSSL Helm flags, are cloud-agnostic. For GCP, provision x86_64 infrastructure with Deploy on GCP GKE, then apply those steps here, substituting the GCS storage settings and Workload Identity from the GCP guide.

Prerequisites

Before starting this tutorial, you must have completed the following from tutorials/deploy-aws.md:
  • Step 1: IAM role for ECR access
  • Step 2: Container images copied to your ECR using the FIPS version tags below
  • Step 3: VPC created
  • Step 4: EKS cluster created
  • Step 5: FIPS node groups created using the x86_64 requirements below instead of the standard ARM64 recommendations
  • Step 6: S3 bucket and IAM roles created

FIPS node group requirements

Use x86_64 nodes for ClickHouse Server, ClickHouse Keeper, and the ClickHouse Operator. The cryptographic provider validation for the current Server and Keeper FIPS images does not include Linux on ARM64. A FIPS-enabled ARM node image does not extend that validation to the cryptographic module inside the ClickHouse containers. AWS supports two x86_64 node image paths for this deployment:
  • Use BOTTLEROCKET_x86_64_FIPS, which is available directly as an EKS managed node group AMI type.
  • Build a custom EKS-optimized Amazon Linux 2023 x86_64 AMI with FIPS mode enabled, then select it through an EC2 launch template. AWS publishes AL2023_x86_64_STANDARD, but does not expose a separate AL2023_x86_64_FIPS managed node group AMI type. See the EKS AMI build scripts.
The Bottlerocket option avoids maintaining a custom AMI. Use the AL2023 option when your organization standardizes on AL2023 and already has a custom AMI build and patching process. Configure instance-store NVMe using the matching AL2023 or Bottlerocket tab in Step 5 of the standard AWS deployment. In the Helm command below, set SSD_CACHE_IS_ON_EMPTY_DIR=true for Bottlerocket, which binds instance-store NVMe to /var/lib/kubelet. Set it to false for AL2023, which mounts instance-store NVMe at /nvme/disk.

FIPS Version Tags

Use the following FIPS-specific image tags when copying artifacts:

S3 Bucket Naming Restriction

The S3 bucket name cannot contain any periods (.) when using FIPS. The S3 FIPS endpoints require virtual-host-style addressing, which does not work when the bucket name contains periods.

Step 1: Create FIPS Certificates

FIPS compliance requires TLS certificates generated using FIPS-approved algorithms in a FIPS-enabled environment. You need three sets of certificates: You also need a CA certificate (ca.crt and ca.key), either self-signed or from your organization’s certificate authority. Requirements:
  • Minimum RSA 3072-bit key size
  • SHA-256 or higher signature algorithm
  • Generated in a FIPS-enabled environment
  • A unique set of certificates (excluding CA) must be created for each ClickHouse cluster
For the full certificate generation procedure using a Red Hat UBI8 container with FIPS crypto policy, see how-to/configure-fips-certificates.md.

Step 2: Install Kubernetes Prerequisites

Install VolumeSnapshot CRDs

Install StorageClass (Optional)

Only if you do not have a custom or existing StorageClass:

Step 3: Install Operator

Note the FIPS ECR endpoint format: 0000000000.dkr-ecr-fips.us-west-2.on.aws (not the standard .amazonaws.com endpoint).

Step 4: Create Certificate Secrets

Secrets must be installed in the same Kubernetes namespace where the ClickHouse cluster will run. If your cluster name is default-xx-01, the namespace will be ns-default-xx-01. Ensure the namespace exists, then create the secrets. Do not change the secret names or key names.

Step 5: Deploy ClickHouse Cluster

Use the correct FIPS version of the endpoints for ECR and S3. FIPS endpoints can be found at https://aws.amazon.com/compliance/fips/.
Guaranteed QoS (recommended)ClickHouse workloads should run with matching requests and limits for both CPU and memory. The single SERVER_CPU/SERVER_MEMORY/KEEPER_CPU/ KEEPER_MEMORY values below are applied to both resources.requests and resources.limits in the helm invocation that follows, which places the pods in the Guaranteed QoS class. If you need to run with a different QoS class, review Pod QoS: Guaranteed (recommended) first for the trade-offs.
FIPS deployments set the image tags explicitlyThe standard tutorials leave server.image.tag / keeper.image.tag unset and take the versions pinned in the cluster Helm chart. FIPS is the exception: the FIPS variant is selected by the image tag rather than by a separate chart, so the -fips tags below must be set explicitly. Keep them aligned with the versions in the Component Versions reference.
Key differences from the standard AWS deployment:

Step 6: Verify Installation

Port-forward on TLS Port

With FIPS mode, ClickHouse uses TLS on port 9440 instead of the standard port 9000.

Create Client Configuration

Create a client-config.xml file to tell the ClickHouse client where to find the CA certificate. Update the path to your ca.crt file:

Connect and Run a Query

Run a test query:
Expected output:
Important: Port 9000 (plaintext native) and port 8123 (plaintext HTTP) will refuse connections when openSSL.required=true. Use port 9440 (native TLS) or port 8443 (HTTPS) instead.

Next Steps

  • Teleport integration (optional): For secure database access via Teleport Enterprise, see Integrate Teleport with ClickHouse Private. This requires SERVER_VERIFICATION_MODE=relaxed and KEEPER_VERIFICATION_MODE=relaxed.
Last modified on August 28, 2026