Snowflake Key Pair Rotation Tool for Hevo Data destinations
Project description
Snowflake Key Pair Rotation Tool
Automates Snowflake key-pair authentication setup and rotation with Hevo Data destinations.
Installation
From PyPI (Recommended)
pip install sf-rotation
From GitHub
pip install git+https://github.com/Legolasan/sf_rotation.git
From Source
git clone https://github.com/Legolasan/sf_rotation.git
cd sf_rotation
pip install .
Development Mode
git clone https://github.com/Legolasan/sf_rotation.git
cd sf_rotation
pip install -e .
Configuration
- Create a config file based on the example:
mkdir -p config
curl -o config/config.yaml https://raw.githubusercontent.com/Legolasan/sf_rotation/main/config/config.yaml.example
- Edit
config/config.yamlwith your credentials:
- Snowflake account URL, admin credentials, target user
- Hevo API credentials and destination details
- Key encryption preferences
Usage
Command Line Interface
After installation, the sf-rotation command is available:
# Initial setup (creates new Hevo destination, saves destination_id to config)
sf-rotation setup --config config/config.yaml
# Update keys for existing destination (requires destination_id in config)
sf-rotation update-keys --config config/config.yaml
# Key rotation (for ongoing key rotations)
sf-rotation rotate --config config/config.yaml
# Snowflake-only setup (no Hevo integration)
sf-rotation snowflake-only --config config/config.yaml
# With encrypted private key
sf-rotation setup --config config/config.yaml --encrypted
Commands Overview
| Command | Description | Hevo Integration |
|---|---|---|
setup |
Initial setup - creates new Hevo destination | Creates new |
update-keys |
Update keys for existing Hevo destination | Updates existing |
rotate |
Rotate keys with zero-downtime (repeatable) | Updates existing |
snowflake-only |
Set up Snowflake keys only (no Hevo) | None |
Tip: Run
rotateas many times as needed - it automatically alternates between Snowflake key slots.
As Python Module
python -m sf_rotation setup --config config/config.yaml
python -m sf_rotation rotate --config config/config.yaml
python -m sf_rotation snowflake-only --config config/config.yaml
Programmatic Usage
from sf_rotation import KeyGenerator, SnowflakeClient, HevoClient
# Generate keys (returns: private_key_path, public_key_path, backup_path)
generator = KeyGenerator(output_directory="./keys")
private_key_path, public_key_path, backup_path = generator.generate_key_pair(
key_name="rsa_key",
encrypted=False
)
# Connect to Snowflake
sf_client = SnowflakeClient(
account_url="your_account.snowflakecomputing.com",
username="admin",
password="password"
)
# Set public key for user
public_key = generator.read_public_key(public_key_path)
formatted_key = generator.format_public_key_for_snowflake(public_key)
sf_client.set_rsa_public_key("target_user", formatted_key)
# Create Hevo destination
hevo = HevoClient(
base_url="https://us.hevodata.com",
username="hevo_user",
password="hevo_pass"
)
private_key = generator.read_private_key(private_key_path)
hevo.create_destination(
name="my_snowflake",
account_url="your_account.snowflakecomputing.com",
warehouse="WAREHOUSE",
database_name="DATABASE",
database_user="target_user",
private_key=private_key
)
Features
- Generate RSA 2048-bit key pairs (encrypted or non-encrypted)
- Configure Snowflake users with RSA public keys
- Create/update Hevo Data destinations with key-pair authentication
- Seamless key rotation with automatic backup
- CLI and programmatic interfaces
Process Flow
Setup Mode (New Destination)
- Generate RSA key pair
- Connect to Snowflake (username/password)
- Set
RSA_PUBLIC_KEYfor target user - Create Hevo destination with private key
- Auto-save
destination_idto config file
Update-Keys Mode (Existing Destination)
- Verify
destination_idexists in config - Generate RSA key pair
- Connect to Snowflake and set public key
- Update existing Hevo destination with private key
Rotate Mode (Key Rotation - Repeatable)
- Backup existing keys
- Generate new key pair
- Detect current key slot (RSA_PUBLIC_KEY or RSA_PUBLIC_KEY_2)
- Set new key in the alternate slot (zero-downtime)
- Update Hevo destination with new private key
- Unset the old key slot
Note: Rotation alternates between slots, allowing unlimited rotations without conflicts.
Snowflake-Only Mode (No Hevo)
- Generate RSA key pair
- Connect to Snowflake (username/password)
- Set
RSA_PUBLIC_KEYfor target user - Does NOT interact with Hevo APIs
Use Case: Configure Snowflake key-pair auth when you manage Hevo separately or don't use Hevo at all.
Project Structure
sf_rotation/
├── src/sf_rotation/
│ ├── __init__.py # Package exports
│ ├── main.py # CLI entry point
│ ├── key_generator.py # OpenSSL key generation
│ ├── snowflake_client.py # Snowflake connection/key management
│ ├── hevo_client.py # Hevo API client
│ └── utils.py # Helper functions
├── config/
│ └── config.yaml.example # Configuration template
├── pyproject.toml # Package configuration
├── README.md
└── WORKFLOW.md # Detailed workflow documentation
Requirements
- Python 3.8+
- OpenSSL (for key generation)
- Snowflake account with admin access
- Hevo Data account with API access
Security Notes
- Private keys are stored with 600 permissions
- Keys directory is gitignored
- Config files with credentials are gitignored
- Passphrase prompted at runtime (not stored in config)
License
MIT License - see LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sf_rotation-1.3.3.tar.gz.
File metadata
- Download URL: sf_rotation-1.3.3.tar.gz
- Upload date:
- Size: 23.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e6da721ffc010513757e255b161da5627dcf243d2d95153aee11e73ed3529165
|
|
| MD5 |
95dea377995acf47edfc99af1527fe4e
|
|
| BLAKE2b-256 |
f0c6ad6529f53abf1edaa10ee6e538ecafa0d0465842f509d8e8fda8dab1e8e9
|
File details
Details for the file sf_rotation-1.3.3-py3-none-any.whl.
File metadata
- Download URL: sf_rotation-1.3.3-py3-none-any.whl
- Upload date:
- Size: 23.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a4c2b2a2e57b64756a97dafa318423c839f33caa59d5ce7dcf4f6c0a3532c97
|
|
| MD5 |
f665d237a78df3ffbe19fc58938f26d8
|
|
| BLAKE2b-256 |
b29ed999d153eaf6c41276c70c6ca504e42481c5251ce0ccc2e42632e4e2c37a
|