Database Access with Snowflake
Teleport can provide secure access to Snowflake via the Teleport Database Service. This allows for fine-grained access control through Teleport's RBAC.
In this guide, you will:
- Configure your Snowflake database with key pair authentication.
- Add the database to your Teleport cluster.
- Connect to the database via Teleport.
How it works
The Teleport Database Service communicates with Snowflake using HTTP messages that contain JSON web tokens signed by the Teleport certificate authority for database clients. Snowflake is configured to trust the Teleport database client CA. When a user connects to Snowflake via Teleport, the Database Service forwards the user's requests to Snowflake as Teleport-authenticated messages.
- Self-Hosted
- Teleport Enterprise Cloud
Prerequisites
-
A running Teleport cluster version 17.4.8 or above. If you want to get started with Teleport, sign up for a free trial or set up a demo environment.
-
The
tctladmin tool andtshclient tool.Visit Installation for instructions on downloading
tctlandtsh.
-
Snowflake account with
SECURITYADMINrole or higher. -
snowsqlinstalled and added to your system'sPATHenvironment variable. -
A host where you will run the Teleport Database Service.
See Installation for details.
-
To check that you can connect to your Teleport cluster, sign in with
tsh login, then verify that you can runtctlcommands using your current credentials.For example, run the following command, assigning teleport.example.com to the domain name of the Teleport Proxy Service in your cluster and email@example.com to your Teleport username:
tsh login --proxy=teleport.example.com --user=email@example.comtctl statusCluster teleport.example.com
Version 17.4.8
CA pin sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678
If you can connect to the cluster and run the
tctl statuscommand, you can use your current credentials to run subsequenttctlcommands from your workstation. If you host your own Teleport cluster, you can also runtctlcommands on the computer that hosts the Teleport Auth Service for full permissions.
Step 1/5. Set up the Teleport Database Service
The Database Service requires a valid join token to join your Teleport cluster.
Run the following tctl command and save the token output in /tmp/token
on the server that will run the Database Service:
tctl tokens add --type=db --format=textabcd123-insecure-do-not-use-this
Install and configure Teleport where you will run the Teleport Database Service:
- Linux Server
- Kubernetes Cluster
To install a Teleport Agent on your Linux server:
The easiest installation method, for Teleport versions 17.3 and above, is the cluster install script. It will use the best version, edition, and installation mode for your cluster.
-
Assign teleport.example.com:443 to your Teleport cluster hostname and port, but not the scheme (https://).
-
Run your cluster's install script:
curl "https://teleport.example.com:443/scripts/install.sh" | sudo bash
On older Teleport versions:
-
Assign edition to one of the following, depending on your Teleport edition:
Edition Value Teleport Enterprise Cloud cloudTeleport Enterprise (Self-Hosted) enterpriseTeleport Community Edition oss -
Get the version of Teleport to install. If you have automatic agent updates enabled in your cluster, query the latest Teleport version that is compatible with the updater:
TELEPORT_DOMAIN=example.teleport.com:443TELEPORT_VERSION="$(curl https://$TELEPORT_DOMAIN/v1/webapi/automaticupgrades/channel/default/version | sed 's/v//')"Otherwise, get the version of your Teleport cluster:
TELEPORT_DOMAIN=example.teleport.com:443TELEPORT_VERSION="$(curl https://$TELEPORT_DOMAIN/v1/webapi/ping | jq -r '.server_version')" -
Install Teleport on your Linux server:
curl https://cdn.teleport.dev/install.sh | bash -s ${TELEPORT_VERSION} editionThe installation script detects the package manager on your Linux server and uses it to install Teleport binaries. To customize your installation, learn about the Teleport package repositories in the installation guide.
On the host where you will run the Teleport Database Service, start Teleport with the appropriate configuration.
Note that a single Teleport process can run multiple different services, for
example multiple Database Service agents as well as the SSH Service or Application
Service. The step below will overwrite an existing configuration file, so if
you're running multiple services add --output=stdout to print the config in
your terminal, and manually adjust /etc/teleport.yaml.
Generate a configuration file at /etc/teleport.yaml for the Database Service:
- Teleport Enterprise/Enterprise Cloud
- Teleport Community Edition
sudo teleport db configure create \ -o file \ --token=/tmp/token \ --proxy=teleport.example.com:443 \ --name=example-snowflake \ --protocol=snowflake \ --uri=abc12345.snowflakecomputing.com \ --labels=env=dev
sudo teleport db configure create \ -o file \ --token=/tmp/token \ --proxy=mytenant.teleport.sh:443 \ --name=example-snowflake \ --protocol=snowflake \ --uri=abc12345.snowflakecomputing.com \ --labels=env=dev
Configure the Teleport Database Service to start automatically when the host boots up by creating a systemd service for it. The instructions depend on how you installed the Teleport Database Service.
- Package Manager
- TAR Archive
On the host where you will run the Teleport Database Service, enable and start Teleport:
sudo systemctl enable teleportsudo systemctl start teleport
On the host where you will run the Teleport Database Service, create a systemd service configuration for Teleport, enable the Teleport service, and start Teleport:
sudo teleport install systemd -o /etc/systemd/system/teleport.servicesudo systemctl enable teleportsudo systemctl start teleport
You can check the status of the Teleport Database Service with systemctl status teleport
and view its logs with journalctl -fu teleport.
Teleport provides Helm charts for installing the Teleport Database Service in Kubernetes Clusters.
Set up the Teleport Helm repository.
Allow Helm to install charts that are hosted in the Teleport Helm repository:
helm repo add teleport https://charts.releases.teleport.dev
Update the cache of charts from the remote repository so you can upgrade to all available releases:
helm repo update
- Self-Hosted
- Cloud-Hosted
Install the Teleport Kube Agent into your Kubernetes Cluster with the Teleport Database Service configuration.
JOIN_TOKEN=$(cat /tmp/token)helm install teleport-kube-agent teleport/teleport-kube-agent \ --create-namespace \ --namespace teleport-agent \ --set roles=db \ --set proxyAddr=teleport.example.com:443 \ --set authToken=${JOIN_TOKEN?} \ --set "databases[0].name=example-snowflake" \ --set "databases[0].uri=abc12345.snowflakecomputing.com" \ --set "databases[0].protocol=snowflake" \ --set "databases[0].static_labels.env=dev" \ --version 17.4.8
Install the Teleport Kube Agent into your Kubernetes Cluster with the Teleport Database Service configuration.
JOIN_TOKEN=$(cat /tmp/token)helm install teleport-kube-agent teleport/teleport-kube-agent \ --create-namespace \ --namespace teleport-agent \ --set roles=db \ --set proxyAddr=mytenant.teleport.sh:443 \ --set authToken=${JOIN_TOKEN?} \ --set "databases[0].name=example-snowflake" \ --set "databases[0].uri=abc12345.snowflakecomputing.com" \ --set "databases[0].protocol=snowflake" \ --set "databases[0].static_labels.env=dev" \ --version 17.4.6
Make sure that the Teleport Agent pod is running. You should see one
teleport-kube-agent pod with a single ready container:
kubectl -n teleport-agent get podsNAME READY STATUS RESTARTS AGEteleport-kube-agent-0 1/1 Running 0 32s
A single Teleport process can run multiple services, for example multiple Database Service instances as well as other services such the SSH Service or Application Service.
Step 2/5. Create a Teleport user
To modify an existing user to provide access to the Database Service, see Database Access Controls
- Teleport Community Edition
- Teleport Enterprise/Enterprise Cloud
Create a local Teleport user with the built-in access role:
tctl users add \ --roles=access \ --db-users="*" \ --db-names="*" \ alice
Create a local Teleport user with the built-in access and requester roles:
tctl users add \ --roles=access,requester \ --db-users="*" \ --db-names="*" \ alice
| Flag | Description |
|---|---|
--roles | List of roles to assign to the user. The builtin access role allows them to connect to any database server registered with Teleport. |
--db-users | List of database usernames the user will be allowed to use when connecting to the databases. A wildcard allows any user. |
--db-names | List of logical databases (aka schemas) the user will be allowed to connect to within a database server. A wildcard allows any database. |
Database names are only enforced for PostgreSQL, MongoDB, and Cloud Spanner databases.
For more detailed information about database access controls and how to restrict access see RBAC documentation.
Step 3/5. Export a public key
Use the tctl auth sign command below to export a public key for your Snowflake user:
tctl auth sign --format=snowflake --out=server
The command will create a server.pub file with Teleport's public key. Teleport will use the corresponding private key to
generate a JWT (JSON Web Token) that will be used to authenticate to Snowflake.
Step 4/5. Add the public key to your Snowflake user
Use the public key you generated earlier to enable key pair authentication.
Log in to your Snowflake instance and execute the SQL statement below:
alter user alice set rsa_public_key='MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv3dHYw4LJCcZzdbhb3hV...LwIDAQAB';
In this statement, alice is the name of the Snowflake user and the rsa_public_key is the key generated earlier without
the PEM header/footer (first and the last line).
You can use the describe user command to verify the user's public key:
desc user alice;
See the Snowflake documentation for more details.
Step 5/5. Connect
Log in to your Teleport cluster and see the available databases:
- Self-Hosted
- Cloud-Hosted
tsh login --proxy=teleport.example.com --user=alicetsh db lsName Description Labels
----------------- ------------------- --------
example-snowflake Example Snowflake ❄ env=dev
tsh login --proxy=mytenant.teleport.sh --user=alicetsh db lsName Description Labels
----------------- ------------------- --------
example-snowflake Example Snowflake ❄ env=dev
To retrieve credentials for a database and connect to it:
tsh db connect --db-user=alice --db-name=SNOWFLAKE_SAMPLE_DATA example-snowflake
The snowsql command-line client should be available in the system PATH in order to be
able to connect.
To log out of the database and remove credentials:
Remove credentials for a particular database instance.
tsh db logout example-snowflakeRemove credentials for all database instances.
tsh db logout
Next steps
- Learn how to restrict access to certain users and databases.
- View the High Availability (HA) guide.
- Take a look at the YAML configuration reference.
- See the full CLI reference.