Управлението на тайни в Docker е критичен проблем за сигурността за всеки бизнес. Когато използвате Docker контейнери, от съществено значение е да пазите защитени чувствителни данни като пароли, API ключове и други идентификационни данни.

Тази публикация в блога ще обсъди някои най-добри практики за управление на тайни в Docker, включително как да ги съхранявате сигурно и да минимизирате излагането им. Ще проучим множество решения: използване на Docker Secrets с Docker Swarm, Docker Compose или Mozilla SOPS. Чувствайте се свободни да изберете какво е по-подходящо за вашия случай на употреба. Но най-важното е да запомните никога да не кодирате вашите Docker тайни в обикновен текст във вашия Dockerfile!

Следването на тези насоки гарантира, че чувствителната информация на вашата организация остава в безопасност дори когато се изпълняват услуги в контейнери.

4 начина за съхраняване и управление на тайни в Docker

Използване на Docker Secrets & Docker Swarm

Docker Secrets и Docker Swarm са два официални и допълващи се инструмента, позволяващи сигурно управление на тайни при изпълнение на услуги в контейнери.

Docker Secrets предоставя защитен механизъм за съхраняване и извличане на тайни от системата, без да ги излага в обикновен текст. Той позволява на потребителите да запазят идентификационните си данни в безопасност, като криптират данните с уникален ключ, преди да ги предадат на системата.

Docker Swarm е мощен инструмент за управление на клъстери от възли за разпределени приложения. Той предоставя ефективно средство за внедряване на контейнеризирани приложения в мащаб. С този инструмент можете лесно да управлявате множество възли в клъстер и автоматично да разпределяте натоварванията между тях. Това помага да се гарантира, че вашето приложение има достатъчно налични ресурси по всяко време, дори по време на пикови периоди на използване или неочаквани пикове на трафика.

Заедно тези два инструмента осигуряват ефективен начин да се гарантира, че чувствителната информация на вашата организация остава в безопасност въпреки непрекъснато развиващите се нужди за сигурност.

Нека видим как да създадем и управляваме примерна тайна.

Създаване на тайна

За да създадем тайна, трябва първо да инициализираме Docker Swarm. Можете да го направите, като използвате следната команда:

docker swarm init

След като услугата бъде инициализирана, можем да използваме командата docker secret create, за да създадем тайната:

ssh-keygen -t rsa -b 4096 -N "" -f mykey
docker secret create my_key mykey
rm mykey

В тези команди първо създаваме SSH ключ с помощта на командата ssh-keygen и го записваме в mykey. След това използваме командата docker secret, за да генерираме тайната. Уверете се, че сте изтрили файла mykey, за да избегнете всякакви рискове за сигурността.

Можете да използвате следната команда, за да потвърдите, че тайната е създадена успешно:

docker secret ls

Вече можем да използваме тази тайна в нашите Docker контейнери. Един от начините е да предадете тази тайна с –secret флаг, когато създавате услуга.

docker service  create --name mongodb --secret my_mongodb_secret redis:latest

Можем също да предадем тази тайна на docker-compose.yml файл. Нека да разгледаме примерен файл:

version: '3.7'
services:
  myapp:
    image: mydummyapp:latest
    secrets:
      - my_secret
    volumes:
      - type: bind
        source: my_secret_key
        target: /run/secrets/my_secret
        read_only: true
secrets:
  my_secret:
    external: true

В примерния файл за композиране секцията с тайни дефинира тайна с име my_secret_key (обсъдена по-рано). Дефиницията на услугата myapp уточнява, че изисква my_secret_key и я монтира като файл на /run/secrets/my_secret в контейнера.

Използване на Docker Compose

Docker Compose е мощен инструмент за дефиниране и стартиране на многоконтейнерни приложения с Docker. Стекът се дефинира от файл за композиране на докери, който ви позволява да дефинирате и конфигурирате услугите, които съставят вашето приложение, включително техните променливи на средата, мрежи, портове и томове.

С Docker Compose е лесно да настроите приложение в един конфигурационен файл и да го внедрите бързо и последователно в множество среди.

Docker Compose предоставя ефективно решение за управление на тайни за организации, работещи с чувствителни данни като пароли или API ключове. Можете да прочетете вашите тайни от външен файл (като TXT файл). Но внимавайте да не ангажирате този файл с вашия код!

version: '3.7'
services:
  myapp:
    image: myapp:latest
    secrets:
      - my_secret
secrets:
  my_secret:
    file: ./my_secret.txt

Използване на контейнер със странична количка

Типична стратегия за поддържане и съхраняване на тайни в Docker среда е използването на контейнери с кош. Тайните могат да се изпращат до основния контейнер на приложението чрез контейнера за странични коли, който може също да управлява мениджър на тайни или друга защитена услуга.

Нека разберем това с помощта на Hashicorp Vault sidecar за MongoDB контейнер:

  • Първо създайте Docker Compose (docker-compose.yml) файл с две услуги: mongo и secrets.
  • В тайната услуга използвайте изображение, съдържащо избрания от вас инструмент за управление на тайни, като например трезор.
  • Монтирайте том от контейнера за тайни към контейнера mongo, така че контейнерът mongo да има достъп до тайните, съхранени в контейнера за тайни.
  • В услугата mongo използвайте променливи на средата, за да зададете идентификационните данни за базата данни MongoDB и да посочите тайните, съхранени в монтирания том.

Ето примерния файл за композиране:

version: '3.7'
services:
  mongo:
    image: mongo
    volumes:
      - secrets:/run/secrets
    environment:
      MONGO_INITDB_ROOT_USERNAME_FILE: /run/secrets/mongo-root-username
      MONGO_INITDB_ROOT_PASSWORD_FILE: /run/secrets/mongo-root-password
  secrets:
    image: vault
    volumes:
      - ./secrets:/secrets
    command: ["vault", "server", "-dev", "-dev-root-token-id=myroot"]
    ports:
      - "8200:8200"
      
volumes:
  secrets:

Използване на Mozilla SOPS

Mozilla SOPS (Secrets Ops) е платформа с отворен код, която предоставя на организациите сигурен и автоматизиран начин за управление на криптирани тайни във файлове.

Той предлага набор от функции, предназначени да помогнат на екипите да споделят тайни в код по безопасен и практичен начин. Следното предполага, че вече сте запознати със SOPS, ако това не е така, започнете от тук.

Ето пример как да използвате SOPS с docker-compose.yml:

version: '3.7'
services:
  myapp:
    image: myapp:latest
    environment:
      API_KEY: ${API_KEY}
    secrets:
      - mysecrets
  sops:
    image: mozilla/sops:latest
    command: ["sops", "--config", "/secrets/sops.yaml", "--decrypt", "/secrets/mysecrets.enc.yaml"]
    volumes:
      - ./secrets:/secrets
    environment:
      # Optional: specify the path to your PGP private key if you encrypted the file with PGP
      SOPS_PGP_PRIVATE_KEY: /secrets/myprivatekey.asc
secrets:
  mysecrets:
    external: true

В горното услугата myapp изисква тайна, наречена API_KEY. Разделът с тайни използва тайна, наречена mysecrets, която се очаква да се съхранява във външно хранилище за ключове/стойности, като тайни на Docker Swarm или HashiCorp Vault.

Услугата sops използва официалното изображение на SOPS Docker, за да дешифрира файла mysecrets.enc.yaml, който се съхранява в локалната директория ./secrets. Декриптираните тайни се монтират към услугата myapp като променливи на средата.

Забележка: Уверете се, че сте създали секретната директория и добавете шифрования mysecrets.enc.yaml файл и sops.yaml конфигурационния файл (с конфигурация SOPS) в тази директория.

Сканирайте за тайни във вашите Docker изображения

Твърдите кодиращи тайни в Docker представляват значителен риск за сигурността, което ги прави уязвими за нападатели. Видяхме различни най-добри практики за избягване на твърдо кодиране на тайни в обикновен текст във вашите Docker изображения, но сигурността не спира дотук.

Трябва също да сканирате изображенията си за тайни.

Всички Docker файлове започват с директива FROM, която дефинира базовото изображение. Важно е да разберете, че когато използвате базово изображение, особено от публичен регистър като Docker Hub, вие изтегляте външен код, който може да съдържа твърдо кодирани тайни.

Повече информация е изложена, отколкото се вижда във вашия единствен Dockerfile. Наистина е възможно да извлечете тайна в обикновен текст, твърдо кодирана в предишен слой, започвайки от вашето изображение.

Всъщност много публични изображения на Docker са загрижени: през 2021 г. изчислихме, че 7% от изображенията на Docker Hub съдържат поне една тайна.

За щастие можете лесно да ги откриете с ggshield (GitGuardian CLI). Например:

ggshield secret scan docker ubuntu:22.04

Заключение

За да обобщим, управлението на тайни в Docker е важна част от запазването на сигурността на вашите контейнерни приложения. Docker включва няколко вградени инструмента за поддържане на тайни, като Docker Secrets и Docker Compose файлове.

Освен това организациите могат да използват решения на трети страни като HashiCorp Vault и Mozilla SOPS за управление на тайни в Docker. Тези технологии предлагат допълнителни възможности като контрол на достъпа, криптиране и регистриране на одит, за да подсилят сигурността на вашето тайно управление.

И накрая, намирането и ограничаването на случайно или непреднамерено излагане на чувствителна информация е от решаващо значение за обработката на тайни в Docker. Компаниите се приканват да използват тайни инструменти за сканиране като GitGuardian, за да сканират изображенията на Docker, вградени в техните CI/CD тръбопроводи, като смекчаване за предотвратяване на „атаки във веригата на доставки“.

Ако искате да научите повече за сигурността на Docker, ние също така обобщихме някои от най-добрите практики в „лис за измама“.