mirror of
https://github.com/hanzoai/kms.git
synced 2026-10-17 11:18:16 +00:00
Following the earlier AdminShell+CollectionCRUD rewrite (PR #14) which already deleted backend/, backend-go/, cloudformation/, helm-charts/, nginx/, sink/, wasm/, upgrade-impact/, e2e/, migration/, package.json and switched the frontend to a 184K Hanzo-first build, complete the cleanup by deleting the remaining Infisical-era residue: - docs/ (1.0G Infisical mintlify docs) - .env.example, .env.dev.example, .env.migration.example, .env.test.example (legacy Postgres/Redis envs; no Go code references them) - .eslintignore, .husky/ (TS toolchain leftovers) - CODE_OF_CONDUCT.md, CONTRIBUTING.md, SECURITY.md (Infisical repo boilerplate) Working tree drops from ~1.0G to <600K of content (1.5G total is .git/ which `git gc --aggressive --prune=now` shrinks locally; the remote keeps its history shape — anyone pulling gets the lean checkout). Build + test verification: go build ./... (4 cmd binaries: green) go test ./... -count=1 -short (all packages: ok) Kept: cmd/, pkg/, sdk/, frontend/ (AdminShell), schema/, examples/, root Go (audit.go, auth.go, consensus.go, embed.go, jwks.go, mount.go, versioning.go + tests), Dockerfile, Dockerfile.kms-fetch, Makefile, LLM.md, CLAUDE.md, DEPRECATED.md, SOVEREIGN-KMS-ARCHITECTURE.md, TFHE-KMS-ARCHITECTURE.md, LICENSE, README.md, VERSION, .github/ (8 Hanzo workflows: build, build-kms-fetch, check-fe-ts-and-lint, ci, pr-preview, release, validate-pr-title, workflow-sanity).
12 KiB
12 KiB
Google Cloud KMS HSM Integration Examples
This directory contains complete deployment examples for Lux KMS with Google Cloud KMS HSM backend.
Contents
- Terraform - Infrastructure as Code for GCP KMS setup
- Docker Compose - Local/development deployment
- Kubernetes - Production GKE deployment with Workload Identity
- Configuration - Environment templates and examples
Quick Start
Prerequisites
-
Google Cloud SDK
# Install gcloud CLI curl https://sdk.cloud.google.com | bash exec -l $SHELL gcloud init -
Terraform (for infrastructure provisioning)
# macOS brew install terraform # Linux wget https://releases.hashicorp.com/terraform/1.7.0/terraform_1.7.0_linux_amd64.zip unzip terraform_1.7.0_linux_amd64.zip sudo mv terraform /usr/local/bin/ -
Docker & Docker Compose (for local deployment)
# macOS brew install --cask docker # Linux curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER -
kubectl (for Kubernetes deployment)
# macOS brew install kubectl # Linux curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
Deployment Options
Option 1: Terraform (Recommended for Production)
Automated infrastructure provisioning with Terraform.
Step 1: Configure Terraform Variables
cd terraform
# Create terraform.tfvars
cat > terraform.tfvars <<EOF
project_id = "your-gcp-project-id"
region = "us-east1"
key_location = "global"
key_ring_name = "lux-kms-keyring"
crypto_key_name = "lux-kms-key"
protection_level = "HSM"
rotation_period = "7776000s" # 90 days
auto_rotate = true
service_account_name = "lux-kms-sa"
use_secret_manager = true # Recommended for production
# Optional: Multi-region setup
additional_regions = ["us-west1", "europe-west1"]
labels = {
environment = "production"
application = "lux-kms"
team = "security"
}
EOF
Step 2: Deploy Infrastructure
# Initialize Terraform
terraform init
# Review planned changes
terraform plan
# Apply configuration
terraform apply
# Save outputs
terraform output -json > outputs.json
Step 3: Configure Lux KMS
# Copy environment template
cp ../.env.example ../.env
# Export Terraform outputs
export GOOGLE_CLOUD_PROJECT_ID=$(terraform output -raw project_id)
export GOOGLE_CLOUD_LOCATION=$(terraform output -json | jq -r '.key_location.value')
export GOOGLE_CLOUD_KEY_RING=$(terraform output -json | jq -r '.key_ring_name.value')
export GOOGLE_CLOUD_CRYPTO_KEY=$(terraform output -json | jq -r '.crypto_key_name.value')
export GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/lux-kms-credentials.json
# Update .env file
cat >> ../.env <<EOF
GOOGLE_CLOUD_PROJECT_ID=$GOOGLE_CLOUD_PROJECT_ID
GOOGLE_CLOUD_LOCATION=$GOOGLE_CLOUD_LOCATION
GOOGLE_CLOUD_KEY_RING=$GOOGLE_CLOUD_KEY_RING
GOOGLE_CLOUD_CRYPTO_KEY=$GOOGLE_CLOUD_CRYPTO_KEY
GOOGLE_APPLICATION_CREDENTIALS=$GOOGLE_APPLICATION_CREDENTIALS
EOF
Option 2: Docker Compose (Local Development)
Simple local deployment for testing and development.
Step 1: Manual GCP Setup
# Set project
gcloud config set project YOUR_PROJECT_ID
# Enable APIs
gcloud services enable cloudkms.googleapis.com
gcloud services enable iam.googleapis.com
# Create key ring
gcloud kms keyrings create lux-kms-keyring --location=global
# Create crypto key (SOFTWARE for development)
gcloud kms keys create lux-kms-key \
--location=global \
--keyring=lux-kms-keyring \
--purpose=encryption \
--protection-level=software
# Create service account
gcloud iam service-accounts create lux-kms-sa \
--display-name="Lux KMS Service Account"
# Grant permissions
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
--member="serviceAccount:lux-kms-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/cloudkms.cryptoKeyEncrypterDecrypter"
# Generate credentials
gcloud iam service-accounts keys create lux-kms-credentials.json \
--iam-account=lux-kms-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com
Step 2: Configure and Run
# Copy environment template
cp .env.example .env
# Edit .env with your values
nano .env
# Start services
docker-compose up -d
# View logs
docker-compose logs -f lux-kms
# Check health
curl http://localhost:8080/health
Step 3: Optional Monitoring
# Start with monitoring stack
docker-compose --profile monitoring up -d
# Access Grafana
open http://localhost:3000 # admin/admin
# Access Prometheus
open http://localhost:9091
Option 3: Kubernetes on GKE (Production)
Enterprise-grade deployment with high availability.
Step 1: Create GKE Cluster
# Set variables
export PROJECT_ID="your-gcp-project-id"
export CLUSTER_NAME="lux-kms-cluster"
export REGION="us-east1"
# Create cluster with Workload Identity enabled
gcloud container clusters create $CLUSTER_NAME \
--region=$REGION \
--workload-pool=$PROJECT_ID.svc.id.goog \
--enable-autoscaling \
--min-nodes=3 \
--max-nodes=10 \
--machine-type=e2-standard-4 \
--enable-autorepair \
--enable-autoupgrade \
--enable-ip-alias \
--network=default \
--subnetwork=default \
--addons=HorizontalPodAutoscaling,HttpLoadBalancing,GcePersistentDiskCsiDriver \
--workload-metadata=GKE_METADATA
# Get credentials
gcloud container clusters get-credentials $CLUSTER_NAME --region=$REGION
Step 2: Setup Workload Identity
cd kubernetes
# Configure environment
export GOOGLE_CLOUD_PROJECT_ID=$PROJECT_ID
export GKE_CLUSTER_NAME=$CLUSTER_NAME
export GKE_CLUSTER_REGION=$REGION
export GCP_SERVICE_ACCOUNT="lux-kms-sa" # Created by Terraform
export K8S_SERVICE_ACCOUNT="lux-kms-sa"
export K8S_NAMESPACE="lux-kms"
# Run setup script
./workload-identity-setup.sh
Step 3: Deploy Lux KMS
# Update deployment.yaml with your project ID
sed -i "s/PROJECT_ID/$PROJECT_ID/g" deployment.yaml
# Create secrets
kubectl create secret generic lux-kms-secrets \
--namespace=lux-kms \
--from-literal=GOOGLE_CLOUD_PROJECT_ID=$PROJECT_ID \
--from-literal=DB_CONNECTION_URI=postgresql://user:password@postgres:5432/lux_kms \
--from-literal=JWT_SECRET=$(openssl rand -hex 32) \
--from-literal=REDIS_URL=redis://redis:6379 \
--dry-run=client -o yaml | kubectl apply -f -
# Deploy
kubectl apply -f deployment.yaml
# Verify deployment
kubectl get pods -n lux-kms
kubectl logs -n lux-kms -l app.kubernetes.io/name=lux-kms
Step 4: Expose Service
# Get LoadBalancer IP
kubectl get svc lux-kms -n lux-kms
# Or use Ingress (recommended)
cat > ingress.yaml <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: lux-kms
namespace: lux-kms
annotations:
kubernetes.io/ingress.class: "gce"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- kms.yourdomain.com
secretName: lux-kms-tls
rules:
- host: kms.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: lux-kms
port:
number: 80
EOF
kubectl apply -f ingress.yaml
Verification
Test Google Cloud KMS Access
# Test encryption
echo "test data" | gcloud kms encrypt \
--location=global \
--keyring=lux-kms-keyring \
--key=lux-kms-key \
--plaintext-file=- \
--ciphertext-file=- | base64
# Test with service account
export GOOGLE_APPLICATION_CREDENTIALS=./lux-kms-credentials.json
gcloud auth activate-service-account --key-file=$GOOGLE_APPLICATION_CREDENTIALS
gcloud kms keys describe lux-kms-key \
--location=global \
--keyring=lux-kms-keyring
Test Lux KMS
# Health check
curl http://localhost:8080/health
# Create a secret
curl -X POST http://localhost:8080/api/v1/secrets \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{
"name": "test-secret",
"value": "sensitive-data"
}'
# Retrieve secret
curl http://localhost:8080/api/v1/secrets/test-secret \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
# Check metrics
curl http://localhost:9090/metrics
Verify Workload Identity (Kubernetes)
# Run test pod
kubectl run -it --rm test-wi \
--namespace lux-kms \
--serviceaccount=lux-kms-sa \
--image=google/cloud-sdk:slim \
-- gcloud auth list
# Expected output should show: lux-kms-sa@PROJECT_ID.iam.gserviceaccount.com
Monitoring
Prometheus Metrics
Available metrics:
lux_kms_google_cloud_encrypt_total- Total encryption operationslux_kms_google_cloud_decrypt_total- Total decryption operationslux_kms_google_cloud_operation_duration_seconds- Operation latencylux_kms_google_cloud_errors_total- Total errors
Cloud Audit Logs
# View KMS operations
gcloud logging read "resource.type=cloudkms_cryptokey" \
--limit 50 \
--format json \
--freshness=1h
# Filter by operation
gcloud logging read 'resource.type=cloudkms_cryptokey AND protoPayload.methodName="Encrypt"' \
--limit 10
Grafana Dashboards
Import pre-built dashboards from grafana/dashboards/.
Troubleshooting
Common Issues
Issue: Permission denied errors
# Check service account permissions
gcloud projects get-iam-policy YOUR_PROJECT_ID \
--flatten="bindings[].members" \
--filter="bindings.members:lux-kms-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com"
# Grant missing permissions
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
--member="serviceAccount:lux-kms-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/cloudkms.cryptoKeyEncrypterDecrypter"
Issue: Key not found
# List keys
gcloud kms keys list --location=global --keyring=lux-kms-keyring
# Describe key
gcloud kms keys describe lux-kms-key \
--location=global \
--keyring=lux-kms-keyring
Issue: Workload Identity not working
# Check annotation
kubectl get sa lux-kms-sa -n lux-kms -o yaml
# Check binding
gcloud iam service-accounts get-iam-policy \
lux-kms-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com
# Re-run setup
cd kubernetes && ./workload-identity-setup.sh
Cost Optimization
Pricing Breakdown
- HSM key version: $2.50/month (active)
- Software key version: $0.06/month (active)
- Operations: $0.03 per 10,000 operations
Optimization Tips
- Use global location - Avoid cross-region data transfer costs
- Destroy old versions - Remove disabled key versions
gcloud kms keys versions destroy 1 \ --location=global \ --keyring=lux-kms-keyring \ --key=lux-kms-key - Software for dev/test - Use SOFTWARE protection level for non-production
- Batch operations - Reduce API call frequency
Security Checklist
- Use HSM protection level for production keys
- Enable automatic key rotation (90 days recommended)
- Use Workload Identity instead of service account keys
- Enable Cloud Audit Logs
- Set up VPC Service Controls
- Implement least-privilege IAM policies
- Rotate service account keys regularly
- Enable Cloud Armor for DDoS protection
- Use private GKE clusters
- Encrypt etcd secrets in Kubernetes
Migration
From On-Premises HSM
- Export secrets from on-premises system
- Deploy Google Cloud KMS infrastructure (Terraform)
- Run Lux KMS migration tool:
lux-kms migrate \ --from=on-premises \ --to=google-cloud \ --source-hsm=/path/to/pkcs11.so \ --target-project=YOUR_PROJECT_ID
From AWS CloudHSM
- Export encrypted data from AWS
- Set up Google Cloud KMS
- Re-encrypt with new keys:
lux-kms migrate \ --from=aws-cloudhsm \ --to=google-cloud \ --aws-region=us-east-1 \ --gcp-project=YOUR_PROJECT_ID
Cleanup
Docker Compose
docker-compose down -v
rm lux-kms-credentials.json
Kubernetes
kubectl delete namespace lux-kms
gcloud container clusters delete $CLUSTER_NAME --region=$REGION
Terraform
cd terraform
terraform destroy
Warning: Destroying crypto keys is a 24-hour process. Keys are scheduled for destruction, not immediately deleted.
Support
- Documentation:
/docs/kms-configuration/google-cloud-hsm - GitHub Issues: https://github.com/luxfi/kms/issues
- Community Slack: https://lux-community.slack.com
License
Apache 2.0 - See LICENSE file for details