Docker's TCP-socket beveiligen met TLS

0
75

De API van Docker is standaard volledig onbeschermd, behalve voor bestandssysteemmachtigingen op zijn Unix-socket. U moet TLS instellen wanneer u de Docker-API via TCP blootlegt, zodat Docker Engine en uw klanten elkaar kunnen verifiëren’ identiteit. Anders zou iedereen met toegang tot de TCP-poort door uw Docker-containers kunnen bladeren, nieuwe kunnen starten en acties als root op uw systeem kunnen uitvoeren.

Geconfigureerde TLS vereist dat clients een geldig certificaat overleggen dat is ondertekend door de certificeringsinstantie van de server. Om het te laten werken, moet u SSL-certificaten maken en vervolgens Docker Engine instellen om TLS-verbindingen te vereisen. Docker CLI-clients moeten ook worden aangepast om een ​​TLS-server te verwachten.

De TCP-socket blootleggen

U kunt de TCP-socket van Docker blootleggen door de vlag -H te gebruiken om een ​​extra eindpunt te definiëren bij het starten van het dockerd-proces. Deze vlag kan meerdere keren worden herhaald; in dit voorbeeld zijn zowel de Unix-socket als de TCP-socket beschikbaar:

/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375

Poort 2375 wordt gewoonlijk gebruikt voor niet-versleutelde Docker-verbindingen. Poort 2376 moet in plaats daarvan worden gebruikt zodra TLS is ingesteld.

U kunt Docker configureren om deze vlaggen automatisch te gebruiken door uw Docker-servicedefinitie te wijzigen. Voeg een override toe in /etc/systemd/system/docker.service.d/override.conf die de ExecStart-regel verandert:

[Service] ExecStart=/usr/bin/dockerd -H …

Reload systemd om de wijziging toe te passen:

sudo systemctl daemon-reload

Uw certificeringsinstantie maken

Begin met het maken van een certificeringsinstantie (CA) voor uw TLS-configuratie. U zult deze CA gebruiken om uw certificaten te ondertekenen; de server weigert te communiceren met clients die een certificaat van een andere CA presenteren.

Advertentie

Gebruik OpenSSL om privé- en openbare CA-sleutels te genereren op de machine die uw Docker-server host:

# Genereer de privésleutel openssl genrsa -aes256 -out ca-private.pem 4096 # Genereer een openbare sleutel van de privésleutel openssl req -new -x509 -days 365 -key ca-private.pem -sha256 -out ca-public.pem

U wordt gevraagd een wachtwoordzin, e-mailadres, landcode, staats- en plaatsnamen en organisatienaam op te geven die u bij uw openbare sleutel wilt opnemen. Voer de informatie in uw terminal in en druk na elke regel op enter om verder te gaan en de sleutel te maken.

Een serversleutel genereren en Certificaatondertekeningsverzoek

Maak vervolgens een serversleutel en een certificaatondertekeningsverzoek aan:

# Genereer de serversleutel openssl genrsa -out server-key.pem 4096 # Genereer een certificaatondertekeningsverzoek openssl req -subj “/CN=example.com” -sha256 -new -key server-key.pm -out request.csr < p>

Het certificaatondertekeningsverzoek (CSR) bevat alle informatie die nodig is om een ​​ondertekend certificaat. Het is belangrijk om te controleren of de algemene naam in de CSR correct is voor uw server. Dit wordt gespecificeerd in het CN-veld als voorbeeld.com hierboven; u moet deze instellen op de Fully Qualified Domain Name (FQDN) voor uw server.

 

 

Certificaatextensies instellen

Het gebruik van deze CSR zou verbindingen met de server via zijn FQDN. U moet certificaatextensies opgeven als u een ander domein wilt toevoegen of een IP-adres wilt gebruiken. Maak een extensiebestand met subjectAltName en extendedKeyUsage-velden om dit in te stellen:

echo subjectAltName = DNS:sub.example.com;IP=192.168.0.1 >> extfile.cnf echo extendedKeyUsage = serverAuth >> extFile.cnf Advertentie

Dit voorbeeld zou bovendien verbindingen toestaan ​​via sub.example.com en 192.168.0.1 .

Een ondertekend certificaat genereren< /h2>

Nu ben je klaar om alle componenten te combineren en een ondertekend certificaat te genereren:

openssl x509 -req -days 365 -sha256 -in request.csr -CA ca-public. pem -CAkey ca-private.pem -CAcreateserial -extfile extfile.cnf -out certificate.pem

Dit neemt het certificaatondertekeningsverzoek, voegt uw extensiebestand toe en gebruikt de sleutels van uw CA om een ​​ondertekend OpenSSL-certificaat te produceren. U moet de wachtwoordzin van de CA opgeven om het proces te voltooien.

Dit certificaat verloopt na een jaar. U kunt de vlag -dagen aanpassen om een ​​bruikbare levensduur te verkrijgen voor uw vereisten. U moet ervoor zorgen dat u een vervangend certificaat genereert voordat dit verloopt.

Een clientcertificaat genereren

Vervolgens moet u een ander certificaat genereren dat uw Docker-clients kunnen gebruiken. Dit moet worden ondertekend door dezelfde CA als het servercertificaat. Gebruik een extensiebestand met extendedKeyUsage = clientAuth om dit certificaat voor te bereiden voor gebruik in een clientscenario.

# Genereer een clientsleutel openssl genrsa -out client-key.pem 4096 # Maak een certificaatondertekeningsverzoek openssl req -subj '/CN=client' -new -key client-key.pem -out client-request.csr # Voltooi de ondertekening echo extendedKeyUsage = clientAuth >> extfile-client.cnf openssl x509 -req -days 365 -sha256 -in client-request.csr -CA ca-public.pem -CAkey ca-private.pem -CAcreateserial -extfile extfile-client.cnf -out client-certificate.pem

Voorbereiden om Docker te configureren

Kopieer uw ca-public.pem-, certificate.pem- en server-key.pem-bestanden naar een nieuwe map die u kunt raadplegen in uw Docker-configuratie. Kopieer daarna de bestanden ca-public.pem, client-certificate.pem en client-key.pem naar de computer waarvandaan u verbinding maakt.

Advertentie

U kunt de certificaatondertekeningsverzoek en extensiebestanden in uw werkmap. Pas op dat u uw privésleutels niet kwijtraakt, aangezien deze niet kunnen worden hersteld. Zonder deze kunt u geen certificaten valideren of verlengingen genereren.

De Docker Daemon configureren

Nu kunt u de Docker-daemon starten met TLS-vlaggen die verwijzen naar uw gegenereerde certificaat en sleutels. De parameters –tlscacert, –tlscert en –tlskey specificeren paden naar de respectievelijke OpenSSL-bronnen die hierboven zijn gegenereerd.

/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 –tlsverify –tlscacert=ca-public.pem –tlscert=certificaat.pem –tlskey=server-key.pem

Door de vlag –tlsverify toe te voegen, kunnen TLS-verbindingen worden afgedwongen. Clients zonder een overeenkomend certificaat zullen geen toegang krijgen tot de TCP-socket van Docker.

De Docker Client configureren

Activeer TLS op de client door TLS-vlaggen op te geven wanneer u de opdracht docker gebruikt. U moet ook de vlag -H toevoegen om het externe Docker-socketadres op te geven waarmee verbinding moet worden gemaakt. Vanuit het perspectief van de klant betekent –tlsverify dat de opdracht alleen verbinding maakt met servers met een TLS-certificaat dat is ondertekend door dezelfde certificeringsinstantie als de zijne.

docker -H tcp://0.0.0.0:2376 –tlsverify –tlscacert=ca-public.pem –tlscert=client-certificaat.pem –tlskey=client-key.pem ps < p>Het leveren van deze vlaggen elke keer dat u de CLI gebruikt, wordt zeer snel repetitief. Als u meestal met dezelfde TLS-beveiligde host werkt, stelt u de omgevingsvariabelen DOCKER_HOST en DOCKER_TLS_VERIFY in uw shell-profiel in. Kopieer uw certificatenbestanden naar ca, cert en key in uw ~/.docker-map. Deze komen overeen met de –tls-vlaggen van Docker en definiëren een standaardcertificaat voor de client.

export DOCKER_HOST=tcp://0.0.0.0:2376 export DOCKER_TLS_VERIFY=1

U kunt het werken met meerdere hosts die een combinatie van lokale, externe, onbeveiligde en TLS-verbindingen gebruiken door Docker-contexten in te stellen. Met deze functie kunt u schakelen tussen doelen met behulp van Docker CLI-opdrachten.

Advertentie

De Docker-client ondersteunt ook alternatieve verificatiemodi. Het gebruik van een combinatie van tls-, tlscacert-, tlscert-, tlskey- en tlsverify-vlaggen activeert verschillende TLS-handhavingsniveaus.

Als alleen tls is ingesteld, verifieert Docker de server met behulp van de standaard CA-pool. Door de vlaggen tlscacert en tlsverify toe te voegen zonder een clientsleutel, zal de server de opgegeven CA gebruiken zonder enige andere controle. Als tlscacert en tlsverify worden weggelaten, maar de andere drie sleutels worden toegevoegd, wordt het certificaat van de client geverifieerd zonder de CA van de server te verifiëren.

Conclusie

Door de TCP-socket van Docker met TLS-certificaten te beschermen, kunt u de API veiliger blootleggen door verbindingen van niet-geautoriseerde clients te voorkomen. Actoren die uw netwerk poortscannen, kunnen geen verbinding maken met Docker, waardoor u een beveiligingslaag krijgt die voorkomt dat uw machine wordt gecompromitteerd met privileges op rootniveau.

Zodra u uw certificaten hebt gegenereerd, kunt u kan ze gebruiken om te verifiëren met de Docker CLI of uw eigen HTTP-clients. Curl accepteert ze bijvoorbeeld als –cert, –key en –cacert flags.

TLS is slechts één onderdeel van een beveiligde Docker API-instantie. Het biedt codering en een garantie dat clients worden vertrouwd, maar is geen gedetailleerd toegangscontrolemechanisme.

Als u wilt beperken wat individuele clients mogen doen, moet u een Docker Engine-autorisatie-plug-in instellen. Plug-ins kunnen contact opnemen met een externe service om te bepalen of een bepaald API-verzoek mag doorgaan. Als alternatief kunt u een reverse proxy voor uw TCP-socket gebruiken om toegangscontrole af te dwingen voordat verzoeken Docker bereiken.