Geheimen in image-lagen

Geheimen in image-lagen

A private package-index token is baked into a public container image and survives the RUN that deletes it. Read it out of the layer history like an attacker would, then rotate the credential and rebuild so the secret never enters a layer.

Wat is Geheimen in image-lagen?

Een geheim verdwijnt niet uit een image wanneer het Dockerfile het verwijdert. Image-lagen zijn alleen-toevoegend (append-only), dus een credential die aan één RUN wordt doorgegeven, wordt voor altijd in die laag vastgelegd, en een latere RUN die het bestand verwijdert voegt alleen een nieuwe laag bovenop toe. Deze oefening behandelt een private package-index-token dat in een publieke image is gebakken: bekijk hoe een aanvaller het rechtstreeks uit de laaggeschiedenis leest en gebruikt, en werk daarna aan de echte oplossing. Roteer eerst de credential zodat de gelekte waarde dood is, en bouw dan opnieuw zodat het geheim nooit in een laag terechtkomt.

Wat je leert in Geheimen in image-lagen

Geheimen in image-lagen — Trainingsstappen

  1. Het doelwit inschatten

    Vandaag heeft Bob het gemunt op Cindralt, een betalingsbedrijf waarvan de settlement-service als containerimage wordt uitgeleverd. Hij begint waar iedereen kan beginnen: het eigen containerregister van het bedrijf. Een gepubliceerde image is een gemakkelijk doelwit. Het is precies het artefact dat in productie draait, en het ophalen ervan kost niets.

  2. Iedereen kan het ophalen

    De repository is gepubliceerd voor anonieme pulls. Dat is voor veel bedrijven een bewuste keuze en op zichzelf geen kwetsbaarheid, maar het betekent wel dat het artefact voor Bob onder dezelfde voorwaarden beschikbaar is als voor Cindralts eigen buildservers.

  3. De image ophalen

    Bob haalt de tag op die het register als latest vermeldt. Wat op zijn machine terechtkomt, is byte voor byte wat Cindralt in productie draait, inclusief elke laag die de build onderweg heeft geproduceerd.

  4. De buildgeschiedenis lezen

    Elke image draagt de commando's mee waarmee hij is gebouwd. Bob hoeft de container niet te draaien of iets uit te pakken: de laaggeschiedenis is metadata, en die komt gewoon mee met de pull. Op het eerste gezicht ziet deze build er zorgvuldig uit. Iemand heeft zelfs opgeruimd na de installatie van de dependencies.

  5. Om het volledige commando vragen

    De standaardtabel is gemaakt om in een terminal te passen, niet om de waarheid te vertellen. Bob vraagt de buildcommando's apart op, zonder dat er iets wordt afgekapt. Het installatiecommando schreef een credential naar een configuratiebestand, en die staat nog steeds in de laag die dat commando heeft gemaakt.

  6. Waarom verwijderen niet hielp

    Even stilstaan bij het mechanisme voordat Bob gebruikt wat hij heeft gevonden.

  7. Controleren wat het token opent

    Een credential is alleen zoveel waard als wat hij kan bereiken. Bob vraagt Cindralts package-index van wie dit token is en wat het mag doen. Het antwoord is erger dan één enkele service. Het token kan publiceren naar elk package waarop Cindralt bouwt, en het verloopt nooit.

  8. Wat dat token waard is

    Bob hoeft Cindralts servers niet nog eens aan te raken. Met publish-rechten op elk package waarop het bedrijf bouwt, kan de volgende versie van elke interne library van hem zijn, en die wordt opgehaald door elke build die daarna draait.

  9. De index signaleert een publicatie

    Cindralts package-index logt elke geauthenticeerde aanroep. 's Nachts registreerde het dat het ci-publisher-token werd gebruikt vanaf een adres dat van niemand binnen het bedrijf is.

  10. Bevestig het vanuit de image

    Alice controleert de bewering zelf tegen het gepubliceerde artefact, met precies wat een buitenstaander zou hebben: de publieke tag en een standaard Docker-client.