Rozhraní API Dockeru je ve výchozím nastavení zcela nechráněné, s výjimkou oprávnění souborového systému na jeho Unixovém socketu. Při odhalení rozhraní Docker API přes TCP byste měli nastavit TLS, aby si Docker Engine a vaši klienti mohli navzájem ověřit identitu. Jinak by kdokoli s přístupem k portu TCP mohl procházet vaše kontejnery Docker, spouštět nové a spouštět akce jako root
ve vašem systému.
Konfigurovaný TLS bude vyžadovat, aby klienti předložili platný certifikát podepsaný certifikační autoritou serveru. Aby to fungovalo, musíte vytvořit certifikáty SSL a poté nastavit Docker Engine tak, aby vyžadoval připojení TLS. Klienti Docker CLI musí být také upraveni tak, aby očekávali server TLS.
Odhalení soketu TCP
TCP socket Dockeru můžete odhalit pomocí -H
příznak k definování dalšího koncového bodu při spouštění dockerd
proces. Tento příznak lze opakovat několikrát; v tomto příkladu bude k dispozici soket Unix i soket TCP:
/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
Port 2375 se běžně používá pro nešifrovaná připojení Docker. Po nastavení TLS by měl být místo toho použit port 2376.
Docker můžete nakonfigurovat tak, aby tyto příznaky používal automaticky, úpravou definice služby Docker. Přidejte přepsání v /etc/systemd/system/docker.service.d/override.conf
který změní ExecStart
řádek:
[Service] ExecStart=/usr/bin/dockerd -H ...
Chcete-li změnu použít, znovu načtěte systemd:
sudo systemctl daemon-reload
Vytvoření certifikační autority
Začněte vytvořením certifikačního úřadu (CA) pro vaši konfiguraci TLS. Tuto CA budete používat k podepisování svých certifikátů; server odmítne komunikovat s klienty, kteří předloží certifikát od jiné CA.
Použijte OpenSSL ke generování soukromých a veřejných klíčů CA na počítači hostujícím váš server Docker:
# Generate the private key openssl genrsa -aes256 -out ca-private.pem 4096 # Generate a public key from the private key openssl req -new -x509 -days 365 -key ca-private.pem -sha256 -out ca-public.pem
Budete vyzváni k zadání přístupové fráze, e-mailové adresy, kódu země, názvů států a měst a názvu organizace, které mají být součástí vašeho veřejného klíče. Zadejte informace do svého terminálu a po každém řádku stiskněte Enter, abyste mohli postupovat vpřed a vytvořit klíč.
Vygenerování požadavku na podepsání klíče serveru a certifikátu
Dále vytvořte klíč serveru a žádost o podpis certifikátu:
# Generate the server key openssl genrsa -out server-key.pem 4096 # Generate a certificate signing request openssl req -subj "/CN=example.com" -sha256 -new -key server-key.pm -out request.csr
Žádost o podpis certifikátu (CSR) obsahuje všechny informace potřebné k vytvoření podepsaného certifikátu. Je důležité zkontrolovat, zda je běžný název v CSR pro váš server správný. Toto je uvedeno v CN
pole jako example.com
výše; měli byste jej nastavit na Fully Qualified Domain Name (FQDN) pro váš server.
Nastavení rozšíření certifikátu
Použití tohoto CSR by umožnilo připojení k serveru prostřednictvím jeho FQDN. Pokud chcete přidat další doménu nebo použít IP adresu, musíte zadat příponu certifikátu. Vytvořte soubor rozšíření s subjectAltName
a extendedKeyUsage
pole pro nastavení:
echo subjectAltName = DNS:sub.example.com;IP=192.168.0.1 >> extfile.cnf echo extendedKeyUsage = serverAuth >> extFile.cnf
Tento příklad by navíc umožňoval připojení přes sub.example.com
a 192.168.0.1
.
Generování podepsaného certifikátu
Nyní jste připraveni zkombinovat všechny komponenty a vygenerovat podepsaný certifikát:
openssl x509 -req -days 365 -sha256 -in request.csr -CA ca-public.pem -CAkey ca-private.pem -CAcreateserial -extfile extfile.cnf -out certificate.pem
Tím se převezme žádost o podepsání certifikátu, přidá se soubor rozšíření a pomocí klíčů vaší CA vytvoří podepsaný certifikát OpenSSL. K dokončení procesu budete muset zadat přístupovou frázi CA.
Platnost tohoto certifikátu vyprší po roce. -days
můžete upravit příznak pro získání užitečné životnosti pro vaše požadavky. Před vypršením platnosti tohoto certifikátu byste si měli zařídit vygenerování náhradního certifikátu.
Generování klientského certifikátu
Dále byste měli vygenerovat další certifikát, který budou vaši klienti Docker používat. Toto musí být podepsáno stejnou CA jako certifikát serveru. Použijte soubor rozšíření s extendedKeyUsage = clientAuth
připravit tento certifikát pro použití v klientském scénáři.
# Generate a client key openssl genrsa -out client-key.pem 4096 # Create a certificate signing request openssl req -subj '/CN=client' -new -key client-key.pem -out client-request.csr # Complete the signing 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
Příprava na konfiguraci dockeru
Zkopírujte svůj ca-public.pem
, certificate.pem
a server-key.pem
soubory do nového adresáře připraveného k odkazování v konfiguraci Dockeru. Poté zkopírujte ca-public.pem
, client-certificate.pem
a client-key.pem
soubory do počítače, ze kterého se budete připojovat.
Požadavek na podpis certifikátu a soubory rozšíření můžete odstranit ve svém pracovním adresáři. Dávejte pozor, abyste své soukromé klíče neztratili, protože je nelze obnovit. Bez nich nebudete moci ověřovat certifikáty ani vytvářet obnovy.
Konfigurace démona Docker
Nyní můžete spustit démona Docker s příznaky TLS odkazujícími na váš vygenerovaný certifikát a klíče. --tlscacert
, --tlscert
a --tlskey
parametry určují cesty k příslušným zdrojům OpenSSL vygenerovaným výše.
/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --tlsverify --tlscacert=ca-public.pem --tlscert=certificate.pem --tlskey=server-key.pem
Přidání --tlsverify
příznak umožňuje vynucení připojení TLS. Klientům bez odpovídajícího certifikátu bude zablokován přístup k soketu TCP společnosti Docker.
Konfigurace klienta Docker
Aktivujte TLS na klientovi poskytnutím příznaků TLS při použití docker
příkaz. Musíte také přidat -H
příznak určující adresu vzdáleného soketu Docker, ke kterému se chcete připojit. Z pohledu klienta --tlsverify
znamená, že se příkaz připojí pouze k serverům s certifikátem TLS podepsaným stejnou certifikační autoritou jako jeho vlastní.
docker -H tcp://0.0.0.0:2376 --tlsverify --tlscacert=ca-public.pem --tlscert=client-certificate.pem --tlskey=client-key.pem ps
Poskytování těchto příznaků při každém použití CLI se velmi rychle opakuje. Pokud budete většinou pracovat se stejným hostitelem chráněným TLS, nastavte DOCKER_HOST
a DOCKER_TLS_VERIFY
proměnné prostředí ve vašem profilu shellu. Zkopírujte soubory certifikátů do ca
, cert
a key
uvnitř vašeho ~/.docker
adresář. Ty odpovídají --tls
Dockeru flags a definovat výchozí certifikát pro klienta.
export DOCKER_HOST=tcp://0.0.0.0:2376 export DOCKER_TLS_VERIFY=1
Můžete si zjednodušit práci s více hostiteli pomocí kombinace místních, vzdálených, nezabezpečených a TLS připojení nastavením kontextů Docker. Tato funkce vám umožňuje přepínat mezi cíli pomocí příkazů rozhraní CLI Dockeru.
Klient Docker také podporuje alternativní režimy ověřování. Použití kombinace tls
, tlscacert
, tlscert
, tlskey
a tlsverify
flags aktivuje různé úrovně vynucení TLS.
Pouze s tls
nastaven, Docker ověří server pomocí výchozího fondu CA. Přidání tlscacert
a tlsverify
příznaky bez klientského klíče vynutí, že server používá danou CA bez dalších kontrol. Vynechání tlscacert
a tlsverify
ale zahrnutí dalších tří klíčů ověří certifikát klienta bez ověřování CA serveru.
Závěr
Ochrana soketu TCP společnosti Docker pomocí certifikátů TLS vám umožní bezpečněji odhalit rozhraní API tím, že zabrání připojení neoprávněným klientům. Aktéři, kteří skenují vaši síť, budou mít zakázáno se připojit k Dockeru, což vám poskytne vrstvu ochrany, která zabrání kompromitaci vašeho počítače pomocí oprávnění root.
Jakmile vygenerujete své certifikáty, můžete je použít k ověření pomocí rozhraní Docker CLI nebo svých vlastních klientů HTTP. Curl je přijme jako --cert
, --key
a --cacert
například příznaky.
TLS je pouze jednou součástí zabezpečené instance rozhraní API Dockeru. Poskytuje šifrování a ujištění, že klienti jsou důvěryhodní, ale není to podrobný mechanismus kontroly přístupu.
Pokud chcete omezit, co mohou jednotliví klienti dělat, měli byste nastavit autorizační plugin Docker Engine. Pluginy mohou kontaktovat externí službu, aby určily, zda může konkrétní požadavek API pokračovat. Alternativně můžete použít reverzní proxy před vaším soketem TCP k vynucení řízení přístupu předtím, než požadavky dorazí do Dockeru.