Bezpečná správa tajných informací je důležitým aspektem zabezpečení kontejnerů. Pokud vkládáte hesla a klíče API jako proměnné prostředí, riskujete neúmyslné vystavení informací. Proměnné prostředí jsou často protokolovány, předávány podřízeným procesům nebo unikají do služeb hlášení chyb bez vašeho vědomí.
Vložení hodnot jako vyhrazených tajemství tato rizika zmírňuje. Docker má vestavěnou podporu pro bezpečnou správu tajemství, ke které se můžete připojit pomocí Docker Compose. Přístup k tajemstvím je poskytován na základě jednotlivých služeb.
Jak tajemství fungují?
Docker CLI má dávku tajných příkazů správy, ale ty fungují pouze s clustery Swarm. Do samostatných kontejnerů nelze přidávat tajné klíče pouze pomocí rozhraní CLI Docker.
Docker Compose přidal „falešná“ tajemství, aby tyto schopnosti přinesl do úloh bez clusteru. Implementace Compose funguje podobně jako funkce Docker Swarm a funguje s jakýmkoli souborem Compose.
Tajné položky jsou vytvářeny jako běžné textové soubory, které jsou připojeny k vašim kontejnerům. Vaše aplikace přistupuje k hodnotě tajemství čtením obsahu souboru. Tento model umožňuje hodnotám zůstat inertní, dokud nejsou explicitně použity ve vašem kontejneru, na rozdíl od trvale viditelných proměnných prostředí.
Definování tajemství v souborech pro vytváření zpráv
Dostat tajemství do kontejneru je dvoufázový proces. Nejprve musíte definovat tajemství pomocí secrets
nejvyšší úrovně pole v souboru Compose. Poté aktualizujete definice služeb, aby odkazovaly na tajná tajemství, která vyžadují.
Zde je příklad, který používá tajné klíče k bezpečnému zadání hesla službě:
version: "3" services: app: image: example-app:latest secrets: - db_password secrets: db_password: file: ./db_password.txt
Hodnota tajného klíče bude načtena z db_password.txt
vašeho pracovního adresáře soubor při spuštění docker-compose up
. Compose připojí soubor k /run/secrets/db_password
uvnitř kontejneru. Vaše aplikace může získat přístup k heslu databáze přečtením obsahu tajného souboru.
Použití existujících tajných klíčů Docker
Kromě tajemství založených na souborech vám Compose také umožňuje odkazovat na existující tajemství Docker Swarm. Pokud použijete tento mechanismus, musíte tajné klíče vytvořit v Dockeru před spustíte docker-compose up
. docker secrets
příkazový prostor bude fungovat pouze tehdy, když je váš aktivní koncový bod Dockeru uzel správce Swarm.
Vytvořte tajný klíč pomocí rozhraní příkazového řádku Docker:
# take value from standard input echo P@55w0rd | docker secret create db_password - OR # take value from a file docker secret create db_password ./db_password.txt
Nyní aktualizujte svůj soubor Docker Compose tak, aby odkazoval na tajný klíč:
version: "3" services: app: image: example-app:latest secrets: - db_password secrets: db_password: external: true
Nastavení external
tajného klíče pole přikazuje Compose, aby svou hodnotu čerpala z vašich stávajících tajných klíčů Dockeru. Zásobník selže s chybou, pokud se jej pokusíte spustit dříve, než tajný klíč existuje.
Rozšířená tajná syntaxe
Compose podporuje delší syntaxi tajných klíčů, pokud potřebujete podrobnější kontrolu nad procesem vkládání. Přepnutí na tuto syntaxi vám umožní přizpůsobit oprávnění souboru a změnit název připojeného tajného klíče.
K dispozici je pět volitelných polí:
source
– Název tajného klíče, na který se má odkazovat – musí to být jedna z hodnot definovaných vsecrets
vašeho souboru Compose sekce.target
– Název souboru, který se použije, když je tajný klíč připojen do kontejneru.uid
– UID pro nastavení na připojeném tajném souboru. Výchozí hodnota je 0.gid
– GID pro nastavení na připojeném tajném souboru. Výchozí hodnota je 0.mode
– Oprávnění systému souborů pro použití na připojený tajný soubor, vyjádřená v osmičkové soustavě. Výchozí hodnota je 0444. Pozor, do tajných souborů nelze nikdy zapisovat, protože jsou vždy připojeny do dočasného souborového systému kontejneru.
Zde je upravený příklad, který přejmenuje připojený tajný soubor a změní jeho oprávnění:
version: "3" services: app: image: example-app:latest secrets: - source: db_password target: database_password_secret mode: 0440 secrets: db_password: external: true
Jednoduchá syntaxe obvykle postačuje pro většinu nasazení. Pokud máte konkrétnější požadavky, rozšířená verze by vám měla poskytnout kontrolu, kterou potřebujete. Jednotlivé tajné odkazy mohou kombinovat dvě syntaxe ve stejném souboru Compose.
Tajemství a autorství obrázků
Mnoho populárních komunitních obrázků Docker nyní podporuje tajemství namísto proměnných prostředí. Jako autor obrázků je nabízení tajemství nejlepším přístupem k ochraně dat vašich uživatelů.
Oba mechanismy můžete podpořit tím, že umožníte nastavení proměnných prostředí na cestu k souboru. Pokud váš obrázek vyžaduje připojení k databázi, nechte uživatele nastavit DB_PASSWORD
proměnná prostředí buď P@55w0rd
nebo /run/secrets/db_password
. Váš kontejner by měl zkontrolovat, zda hodnota proměnné odkazuje na platný soubor; pokud ano, zahoďte jej a načtěte konečnou hodnotu ze souboru.
Tento model poskytuje uživatelům flexibilitu při výběru nejvhodnějšího mechanismu pro jejich nasazení. Pamatujte, že ne všichni uživatelé budou moci přijmout tajemství – pokud Swarm a Compose nebudou k dispozici, nebudou mít možnost poskytnout své hodnoty.
Závěr
Použití tajemství namísto běžných proměnných prostředí snižuje riziko neúmyslného prozrazení informací. Představte si nejhorší scénář, kdy kontejner odeslal své proměnné prostředí do kompromitované protokolovací služby třetí strany. Útočníci nyní mají heslo k vaší databázi a klíče API.
Omezením tajných dat na přístup k souborovému systému nelze hodnoty neúmyslně číst, protože nejde o trvalou funkci vašeho prostředí. Pamatujte, že tajné soubory mají svá vlastní rizika. Můžete být v pokušení zapojit je do kontroly zdroje, což by znamenalo, že kdokoli s přístupem k vašemu úložišti by mohl číst jejich hodnoty.
Tajemství by měla být „tajná“ po celou dobu životního cyklu vašeho kontejneru. Pro produkční nasazení je obvykle nejlepší automatizovat sestavení pomocí systému CI. Nastavte svá tajemství v nastavení kanálu poskytovatele CI a poté je pomocí skriptu sestavování zapište do souborů, ke kterým má Compose přístup. Tím je zajištěno, že ke skutečným hodnotám budete mít přístup pouze vy prostřednictvím rozhraní vašeho nástroje CI.