Er zijn verschillende manieren om een dbt-project op je Mac met Snowflake te verbinden. In deze blog gebruiken we RSA-versleuteling om een veilige verbinding te maken. Dat is in eerste instantie niet de eenvoudigste manier, maar vervolgens hoef je eigenlijk niets meer te doen. Je computer maakt zelf verbinding met Snowflake zonder dat je nog een wachtwoord hoeft in te tikken.

Dbt maakt datatransformaties in Snowflake overzichtelijker, robuuster en doeltreffender. Bovendien wordt door de combinatie met git samenwerken in (grote) teams heel goed mogelijk. Er is een cloud-versie van dbt (dbt Cloud), maar dbt Core is open source en kan ook direct op je computer geïnstalleerd worden. We zullen ons in deze blog richten op lokale dbt Core.

Deze blog is gericht op dbt projecten die op een Mac staan. We gaan er verder vanuit dat je comfortabel bent met de Terminal app en openssl geïnstalleerd is. Let op: er worden een aantal technieken besproken, maar dit is geen beveiligingsadvies. Laat je altijd goed adviseren als het over de beveiliging van je systeem gaat.

Overzicht commands

Om alvast een overzicht te geven, dit zijn grofweg de commands die we in de Terminal zullen gebruiken:

  • openssl rand -base64 24 | pbcopy
  • openssl genpkey -des3 -algorithm RSA -out rsa.p8
  • openssl pkey -in rsa.p8 -pubout | pbcopy
  • vim ~/.dbt/profiles.yml (elke editor is natuurlijk prima)
  • ALTER USER ⌞username⌝ SET RSA_PUBLIC_KEY = '⌞public key⌝';
  • dbt debug

Een dbt Profile maken

Om een verbinding met Snowflake te maken, moet er een dbt profile aanwezig zijn op je computer. Deze profiles staan in een profiles.yml-bestand. Vaak is deze te vinden in de home directory ~ onder de (onzichtbare) directory .dbt. Als dit bestand en deze map nog niet bestaan, maak ze dan aan (bijvoorbeeld met mkdir .dbt en touch .dbt/profiles.yml).

Dit profiles.yml-bestand moeten we bewerken om een verbinding tussen een dbt project op de Mac en Snowflake te maken. Stel voor dat de volgende dingen het geval zijn:

  • Je Snowflake organization heet VOOR en de account name van je account is BEELD, waardoor de account identifier in dit geval VOOR-BEELD is.
  • Je Snowflake USER heeft de username ESEMPIO.
  • De Snowflake ROLE die je wilt gebruiken is SYSADMIN en je kan die ROLE ook gebruiken.
  • Het Snowflake WAREHOUSE dat je wil gebruiken heet MAGAZIJN en SYSADMIN heeft daarvoor de juiste PRIVILEGES.
  • De Snowflake DATABASE heet ONTWIKKEL_DB en SYSADMIN heeft alle benodigde rechten daarvoor. Daarbij is het in dit voorbeeld belangrijk dat SYSADMIN ook een SCHEMA in die DATABASE kan maken. Dit SCHEMA noemen we vervolgens DBT_ESEMPIO in de profiles.yml. Daarna zal dbt dit SCHEMA automatisch voor ons aanmaken.

In feite, moeten we dan de volgende velden invullen:

default:
  target: dev
  outputs:
    dev:
      type:      snowflake
      account:   voor-beeld
      user:      esempio
      role:      sysadmin
      warehouse: magazijn     
      database:  ontwikkel_db
      schema:    dbt_esempio
      
      private_key_path:       ⌞path to private key⌝ 
      private_key_passphrase: ⌞passphrase⌝

Hierboven zien we dat alleen de YAML keys private_key_path en private_key_passphrase nog niet zijn ingevuld. Daar gaan we nu mee aan de slag.

Private key aanmaken

Eerst maken we een passphrase om het bestand, waar onze RSA private key in komt te staan, te encrypten. Daarna maken we de private key. Daaruit halen we de public key (in het bestand met de private key staat ook de public key). Deze public key voegen we toe aan onze Snowflake USER. Tot slot, voegen we in de profiles.yml de path naar de private key toe. De private_key_passphrase is letterlijk de passphrase die we in eerste instantie hebben gegenereerd.

OpenSSL

Voor de meeste stappen gebruiken we de open-source software library OpenSSL. Open de Terminal.

Genereer een passphrase

Voer de volgende command uit:

openssl rand -base64 24 | pbcopy

Hiermee maken we een pseudo-random passphrase van een bepaalde lengte. Met | pbcopy zorgen we er vervolgens voor dat deze passphrase in onze Clipboard komt en we deze elders kunnen pasten (plakken met ⌘v). Plak deze passphrase vervolgens in de profiles.yml na private_key_passphrase: . Als de willekeurige passphrase t+gsjivVXODDzhujYLW/ZdjVuYrIz4n5 is, ziet dat er als volgt uit:

private_key_passphrase: t+gsjivVXODDzhujYLW/ZdjVuYrIz4n5

Genereer een key-pair

Nu we een passphrase hebben, kunnen we eenvoudig een RSA key-pair maken. Ga in de Terminal met cd naar de gewenste directory en voer de volgende command uit:

openssl genpkey -des3 -algorithm RSA -out rsa.p8

Nu krijgen we twee keer de vraag om een passphrase in te vullen:

Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

Voer de passphrase die we eerder hebben gemaakt in (bijvoorbeeld door deze te plakken vanuit de clipboard met ⌘v). Verifier deze daarna.

Nu hebben we een rsa.p8 bestand gemaakt dat DES3 versleuteld is (-des3) met onze eerder gemaakt passphrase. Deze encrypted private key kan er als volgt uit zien (waarbij de middelste regels even vervangen zijn door ...):

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQI0D1voQZTDt8CAggA
MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECCmq3xQ59T+GBIIEyF4NQLQcK7BB
...
2ZxlbJ5YtNJGQmTNeoXT5+x4uPAUgijT2S68beLIHuVnBb/r75c3VnBlDjt0kVdR
fvIaADH4uJsB5clHVJXl3rvFkYdF0Qln5iyFJa91ZX8/iSB1hothTC8pKXYdnedQ
Pz0oVMK18+0AeOVlwmVaNQ==
-----END ENCRYPTED PRIVATE KEY-----

De path van dit bestand hebben we nodig voor in onze profiles.yml. Als onze gebruikersnaam op deze Mac esempio is en we het bestand ook in de .dbt folder zouden bewaren, dan zou dat /Users/esempio/.dbt/rsa.p8 zijn. (Let op dat ~ in dit geval niet werkt in plaats van /Users/esempio.) Deze path plaatsen we in de YAML:

private_key_path: /Users/esempio/.dbt/rsa.p8

Onze dbt Profile is nu klaar:

default:
  target: dev
  outputs:
    dev:
      type:      snowflake
      account:   voor-beeld
      user:      esempio
      role:      sysadmin
      warehouse: magazijn     
      database:  ontwikkel_db
      schema:    dbt_esempio
      
      private_key_path:       /Users/esempio/.dbt/rsa.p8 
      private_key_passphrase: t+gsjivVXODDzhujYLW/ZdjVuYrIz4n5

De public key extraheren

Voor Snowflake hebben we een public key nodig. De private key die we net hebben gemaakt bevat óók de public key. Dat is misschien een beetje contra-intuïtief. Om deze public key te bemachtigen moeten we deze uit de private key extraheren met de volgende command:

openssl pkey -in rsa.p8 -pubout | grep -ve '----$' | pbcopy

Bovenstaande regel haalt eerst de public key uit de private key die in rsa.p8 staat: openssl pkey -in rsa.p8 -pubout. Hiervoor moeten we de passphrase invullen als daarom gevraagd wordt. rsa.p8 is de path naar het bestand, dus we moeten in het voorbeeld wel in dezelfde directory zijn.

Snowflake accepteert de volgende regels niet:

-----BEGIN ENCRYPTED PRIVATE KEY-----
-----END ENCRYPTED PRIVATE KEY-----

Deze moeten we er dus uit filteren met | grep -ve '----$'. Daarna kopiëren we alles naar de clipboard zoals we eerder ook al hebben gedaan met | pbcopy.

De public key toevoegen aan de Snowflake USER

Nu we de public key hebben, kunnen we deze toevoegen aan onze Snowflake user. Dat is in principe vrij eenvoudig. We gaan naar Snowsight, de web interface van Snowflake. Daar maken we een nieuwe worksheet en voeren de volgende command in:

ALTER USER esempio 
SET RSA_PUBLIC_KEY =
'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxGaRi+FIm2Q2+DUG+aLc
/24Ia8/7oo5CznRT4y/QQxRVm8cFnXA+Lb7VwvI92uiJpMd/l0LMOgFhkbC1jOGt
VszogvRkn7/hwZfUhV7mT0EuMELQaUlAkY49XNvNWUSeSHwGAEaszr3hn1xRKUS8
ZNuAxob6uTTlKEy9k3F8wKDQqu6f3y+EUg8dv+xUWY4LW/966c6jQk0oJfX0CN9U
h8zzIYyEwL/gNKZ2ovOLabEj9FkLvKg9rUXDyo64IWfxr1xAUQ0uYvoC1oqh1pxo
NthhNpoeLll0HcLixereJUc6ypsszrTAXkNCxe/T41U5RYxIavv8vOmD5UtVo7n0
MQIDAQAB
';

Let op dat je de public key uit de clipboard plakt tussen de 2 single-qutoes '' en geen spaties, nieuwe regels of iets dergelijks toevoegt. Er staan wel al een aantal regeleindes in de public key zelf. De laatste regel van de public key is ook korter. Dat hoort zo. En de nieuwe regel erna hoort er ook nog bij, waardoor de ' op de volgende regel komt.

Testen

We zijn klaar: de verbinding staat. We kunnen deze eventueel nog testen door in de directory van ons dbt Project de command dbt debug uit te voeren. Als deze succesvol draait, weten we dat alles goed werkt. Vanaf nu hoeven we daarvoor geen wachtwoord meer in te voeren (en wordt er ook geen wachtwoord over het netwerk verstuurd!).

Discussie

Een verbinding maken tussen Snowflake en een dbt project op je Mac is niet heel eenvoudig en je hebt kennis van de Terminal en bepaalde commands nodig. Als de verbinding eenmaal ingesteld is, kan het wel veel werk schelen doordat je niet steeds meer in hoeft te loggen. Het is bovendien een veilig systeem.

Bedankt voor het lezen van deze blog. Bekijk onze blog page voor meer blogs over Tableau, Alteryx, and Snowflake.

Werk samen  met een van onze consultants en haal meer uit je data. 

Contacteer ons en we zullen je helpen.