setup_openbao.sh 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #!/bin/bash
  2. # Setup script for OpenBao KMS integration testing
  3. set -e
  4. OPENBAO_ADDR=${OPENBAO_ADDR:-"http://127.0.0.1:8200"}
  5. OPENBAO_TOKEN=${OPENBAO_TOKEN:-"root-token-for-testing"}
  6. TRANSIT_PATH=${TRANSIT_PATH:-"transit"}
  7. echo "🚀 Setting up OpenBao for KMS integration testing..."
  8. echo "OpenBao Address: $OPENBAO_ADDR"
  9. echo "Transit Path: $TRANSIT_PATH"
  10. # Wait for OpenBao to be ready
  11. echo "⏳ Waiting for OpenBao to be ready..."
  12. for i in {1..30}; do
  13. if curl -s "$OPENBAO_ADDR/v1/sys/health" >/dev/null 2>&1; then
  14. echo "✅ OpenBao is ready!"
  15. break
  16. fi
  17. echo " Attempt $i/30: OpenBao not ready yet, waiting..."
  18. sleep 2
  19. done
  20. # Check if we can connect
  21. if ! curl -s -H "X-Vault-Token: $OPENBAO_TOKEN" "$OPENBAO_ADDR/v1/sys/health" >/dev/null; then
  22. echo "❌ Cannot connect to OpenBao at $OPENBAO_ADDR"
  23. exit 1
  24. fi
  25. echo "🔧 Setting up transit secrets engine..."
  26. # Enable transit secrets engine (ignore if already enabled)
  27. curl -s -X POST \
  28. -H "X-Vault-Token: $OPENBAO_TOKEN" \
  29. -H "Content-Type: application/json" \
  30. -d '{"type":"transit","description":"Transit engine for KMS testing"}' \
  31. "$OPENBAO_ADDR/v1/sys/mounts/$TRANSIT_PATH" || true
  32. echo "🔑 Creating test encryption keys..."
  33. # Define test keys
  34. declare -a TEST_KEYS=(
  35. "test-key-1:aes256-gcm96:Test key 1 for basic operations"
  36. "test-key-2:aes256-gcm96:Test key 2 for multi-key scenarios"
  37. "seaweedfs-test-key:aes256-gcm96:SeaweedFS integration test key"
  38. "bucket-default-key:aes256-gcm96:Default key for bucket encryption"
  39. "high-security-key:aes256-gcm96:High security test key"
  40. "performance-key:aes256-gcm96:Performance testing key"
  41. "aws-compat-key:aes256-gcm96:AWS compatibility test key"
  42. "multipart-key:aes256-gcm96:Multipart upload test key"
  43. )
  44. # Create each test key
  45. for key_spec in "${TEST_KEYS[@]}"; do
  46. IFS=':' read -r key_name key_type key_desc <<< "$key_spec"
  47. echo " Creating key: $key_name ($key_type)"
  48. # Create the encryption key
  49. curl -s -X POST \
  50. -H "X-Vault-Token: $OPENBAO_TOKEN" \
  51. -H "Content-Type: application/json" \
  52. -d "{\"type\":\"$key_type\",\"description\":\"$key_desc\"}" \
  53. "$OPENBAO_ADDR/v1/$TRANSIT_PATH/keys/$key_name" || {
  54. echo " ⚠️ Key $key_name might already exist"
  55. }
  56. # Verify the key was created
  57. if curl -s -H "X-Vault-Token: $OPENBAO_TOKEN" "$OPENBAO_ADDR/v1/$TRANSIT_PATH/keys/$key_name" >/dev/null; then
  58. echo " ✅ Key $key_name verified"
  59. else
  60. echo " ❌ Failed to create/verify key $key_name"
  61. exit 1
  62. fi
  63. done
  64. echo "🧪 Testing basic encryption/decryption..."
  65. # Test basic encrypt/decrypt operation
  66. TEST_PLAINTEXT="Hello, SeaweedFS KMS Integration!"
  67. PLAINTEXT_B64=$(echo -n "$TEST_PLAINTEXT" | base64)
  68. echo " Testing with key: test-key-1"
  69. # Encrypt
  70. ENCRYPT_RESPONSE=$(curl -s -X POST \
  71. -H "X-Vault-Token: $OPENBAO_TOKEN" \
  72. -H "Content-Type: application/json" \
  73. -d "{\"plaintext\":\"$PLAINTEXT_B64\"}" \
  74. "$OPENBAO_ADDR/v1/$TRANSIT_PATH/encrypt/test-key-1")
  75. CIPHERTEXT=$(echo "$ENCRYPT_RESPONSE" | jq -r '.data.ciphertext')
  76. if [[ "$CIPHERTEXT" == "null" || -z "$CIPHERTEXT" ]]; then
  77. echo " ❌ Encryption test failed"
  78. echo " Response: $ENCRYPT_RESPONSE"
  79. exit 1
  80. fi
  81. echo " ✅ Encryption successful: ${CIPHERTEXT:0:50}..."
  82. # Decrypt
  83. DECRYPT_RESPONSE=$(curl -s -X POST \
  84. -H "X-Vault-Token: $OPENBAO_TOKEN" \
  85. -H "Content-Type: application/json" \
  86. -d "{\"ciphertext\":\"$CIPHERTEXT\"}" \
  87. "$OPENBAO_ADDR/v1/$TRANSIT_PATH/decrypt/test-key-1")
  88. DECRYPTED_B64=$(echo "$DECRYPT_RESPONSE" | jq -r '.data.plaintext')
  89. DECRYPTED_TEXT=$(echo "$DECRYPTED_B64" | base64 -d)
  90. if [[ "$DECRYPTED_TEXT" != "$TEST_PLAINTEXT" ]]; then
  91. echo " ❌ Decryption test failed"
  92. echo " Expected: $TEST_PLAINTEXT"
  93. echo " Got: $DECRYPTED_TEXT"
  94. exit 1
  95. fi
  96. echo " ✅ Decryption successful: $DECRYPTED_TEXT"
  97. echo "📊 OpenBao KMS setup summary:"
  98. echo " Address: $OPENBAO_ADDR"
  99. echo " Transit Path: $TRANSIT_PATH"
  100. echo " Keys Created: ${#TEST_KEYS[@]}"
  101. echo " Status: Ready for integration testing"
  102. echo ""
  103. echo "🎯 Ready to run KMS integration tests!"
  104. echo ""
  105. echo "Usage:"
  106. echo " # Run Go integration tests"
  107. echo " go test -v ./test/kms/..."
  108. echo ""
  109. echo " # Run with Docker Compose"
  110. echo " cd test/kms && docker-compose up -d"
  111. echo " docker-compose exec openbao bao status"
  112. echo ""
  113. echo " # Test S3 API with encryption"
  114. echo " aws s3api put-bucket-encryption \\"
  115. echo " --endpoint-url http://localhost:8333 \\"
  116. echo " --bucket test-bucket \\"
  117. echo " --server-side-encryption-configuration file://bucket-encryption.json"
  118. echo ""
  119. echo "✅ OpenBao KMS setup complete!"