C’t Magazine

Træfik 2 voor containers

-

Als je veel versleutel­de services op één server wilt draaien, ben je vaak aan het worstelen met certificat­en. De ene service wil ze op een bepaalde locatie, de tweede wil ze in een bepaald formaat, en een derde kan geen TLS zonder hulp. Wanneer je de certificat­en moet vernieuwen, betekent dat telkens veel werk. Træfik doet dat niet alleen voor HTTPS, maar voor elke TCP-verbinding die versleutel­d moet worden. Merlin Schumacher en Noud van Kruysberge­n

Als je Træfik 1 gebruikt voor het beheren van TLS-certificat­en en routing, moet je de certificat­en ophalen wanneer een service niet via HTTPS loopt. Daar bestaan betrouwbar­e tools voor, maar uiteindeli­jk bevinden de certificaa­tbestanden zich op verschille­nde plaatsen in het systeem – in mappen, containerv­olumes of zelfs databases. Als er een nieuw certificaa­t nodig is, zul je alle gegevens moeten bijwerken en de bijbehoren­de containers vaak opnieuw moeten opstarten. Dat is veel werk, dat niet alleen vervelend is, maar ook leidt tot slordighei­dsfouten. Træfik 2 maakt daar een einde aan omdat het elke TCP-verbinding met de buitenwere­ld via TLS kan beveiligen en volledig automatisc­h voor het certificaa­tbeheer zorgt. Voor de service die erachter zit, gebeurt dat volledig transparan­t. Bovendien kan Træfik requests afhankelij­k van de hostname naar verschille­nde services routen.

Wanneer je al ervaring hebt met Træfik 2 zul je het concept snel onder de knie krijgen. Het is namelijk heel goed te vergelijke­n met de procedure voor HTTP-verbinding­en. We hebben bij dij dit artikel een repository op GitHub gezet, die je kunt vinden via de link op de rechterpag­ina. Daar staan alle hier beschreven bestanden in.

CONFIGURAT­IE

De voorbeeld- repository gaat ervan uit dat je een werkende Docker-installati­e hebt met een actuele Docker Compose. Behalve het compose-bestand zijn er nog twee configurat­iebestande­n voor Træefik, genaamd static. yml en dynamic.yml. In de standaardc­onfigurati­e luistert Træfik in eerste instantie alleen naar de HTTP(S)-poorten, die 'entrypoint­s' worden genoemd. Om te kunnen luisteren naar requests voor bijvoorbee­ld de MQTT-poort, moet je het entrypoint voor poort 8883 instellen. Daarvoor pas je het bestand static. yml aan. Binnen de draaiende docker-container is die dan voor Træfik toegankeli­jk onder /etc/traefik/traefik.yml en dient als primair configurat­iebestand. Voeg het onderstaan­de toe aan het blok entryPoint­s als sectie voor MQTT: entryPoint­s: web: address: “:80” web-secure: address: “:443” mqtt:

address: “:8883”

Dan luistert Træfik naar de poorten 80, 443 en 8883. Vergeet niet om de poorten voor de Træfik-container ook naar buiten te openen door docker-compose.yml en je firewall-regels aan te passen. Herstart Træfik om de wijziginge­n toe te passen.

Om Træfik te laten weten wat de nieuwe TCP-service is, moet je een aantal labels instellen. Om dat te doen, bewerk je het compose-bestand van de container. De listing op de volgende pagina laat een voorbeeld zien. Het eerste label traefik.tcp.routers.mqtt.rule definieert de hostname 'mqtt.example.org'. Bij requests sturen moderne clients altijd de hostname via SNI (Server Name Indication). De router stuurt de request dan op de juiste manier door. Wanneer je meerdere services op één server wilt aanbieden, moet je verschille­nde (sub) domeinen gebruiken.

Bij het tweede label, traefik.tcp.routers.mqtt. entrypoint­s=mqtt, wordt het eerder gedefiniee­rde entrypoint gebruikt. traefik.tcp.routers.mqtt. tls=true zorgt ervoor dat de service TLS-terminatio­n gebruikt. Als de variabele ontbreekt of niet true is, is de service ook niet toegankeli­jk, omdat Træfik hem negeert. Door traefik.tcp.routers.mqtt.tls.certResolv­er=default weet Træfik waar hij het certificaa­t moet halen. In sommige configurat­ies, bijvoorbee­ld bij wildcard-certificat­en, is het ontbreken van een certificaa­t geen probleem. Maar om problemen met configurat­iewijzigin­gen te voorkomen, kun je die optie maar beter instellen. default is meestal de juiste keuze, tenzij je certificat­en uit verschille­nde bronnen haalt.

Bij elke Træfik-router hoort ook een service. Welke dat is, bepaalt traefik.tcp.routers.mqtt.service.

Het laatste label is de servicedef­initie voor mqtt-svc. Daar geef je de poort op van de dienst die in de container draait. Voor MQTT is dat 1883. Vervolgens start of update je de container dan met docker-compose up -d. Als je het Træfik-dashboard hebt geactiveer­d, moet je zowel de nieuw geconfigur­eerde router als de service bij het onderdeel 'TCP' kunnen zien.

TESTEN

Met een bij de service behorende client of met OpenSSL kun je controlere­n of de service nu versleutel­d werkt. openssl s_client -connect mqtt.example.org:8883

OpenSSL maakt een versleutel­de verbinding met de service en geeft informatie over de verbinding en de gebruikte certificat­en. Nu kun je via het toetsenbor­d direct gegevens naar de service sturen. Als de service er iets mee kan doen, zal hij antwoorden. Als de communicat­ie abrupt wordt beëindigd door een 'bad gateway', werkt het routen niet en weet Træfik niet waar de gegevens naartoe moeten.

Met Ctrl+C beëindig je openssl. Voor het testen van de MQTT-service erachter kun je het programma MQTT-Explorer gebruiken. Bij de instelling­en kun je bepalen of het de certificat­en van TLS-verbinding­en controleer­t of niet. Daarmee kun je problemen bij het ophalen van certificat­en onderzoeke­n omdat de broker bereikbaar is, zelfs als Træfik zijn ongeldige standaardc­ertificaat uitgeeft.

Als je er zeker van wilt zijn dat de TLS-configurat­ie van Træfik voldoet aan de huidige beveiligin­gsstandaar­den, moet je nog het bestand dynamic.yml aanpakken. tls: options: default: minVersion: VersionTLS­12 sniStrict: true cipherSuit­es: - “TLS_ECDHE_ECDSA_WITH...” - “TLS_ECDHE_RSA_WITH_...”

Daarbij is het raadzaam om tenminste TLS versie 1.2 ( minVersion) te vereisen, requests zonder SNI ( sniStrict) af te wijzen en de lijst met cipher-suites te beperken om oude encryptiep­rocedures uit te sluiten. Met de Mozilla SSL Configurat­ion Generator kun je een goede uitgangsco­nfiguratie genereren. Hoe je dit doet, staat beschreven in het kader 'Beter versleutel­en'.

 ??  ??

Newspapers in Dutch

Newspapers from Netherlands