Podman secret (cmd)

Podman основы, для взаимодействия с реестром образов, с контейнерами и хранилищем образов, а также с ядром Linux не через демон, а напрямую через процесс runC, который отвечает за запуск контейнеров.

Все мы имеем дело с конфиденциальной информацией при работе с компьютерными системами. Сисадмины передают ключи SSH, а веб-разработчикам приходится беспокоиться о токенах API. Проблема с конфиденциальной информацией заключается в том, что она является конфиденциальной, а это значит, что она может привести к краху безопасности, если каким-то образом попадет не в те руки. Контейнеры Podman не являются исключением в этом вопросе - пользователям необходимо использовать конфиденциальную информацию внутри контейнеров, но при этом необходимо обеспечить безопасность конфиденциальной информации.

Что если кому-то нужно запустить базу данных в контейнере, а учетные данные для базы данных нужно ввести в контейнер? Это можно сделать несколькими способами. Можно просто создать файл при запуске контейнера и сохранить в нем учетные данные. Однако это опасно. Если контейнер экспортируется в образ, учетные данные также будут экспортированы. Любой, кто имеет контроль над образом, сможет получить доступ к базе данных. Другой вариант - передавать учетные данные с помощью CLI, но это требует ввода данных каждый раз, что может быть утомительно.

Что если бы существовал метод централизованного управления конфиденциальной информацией?

Новая команда podman secret представляет собой набор подкоманд и опций, которые управляют конфиденциальной информацией простым в использовании и безопасным способом. Она позволяет пользователям легко использовать конфиденциальное содержимое внутри контейнера, но не дает информации оказаться где-то за пределами контейнера, например, в реестре образов. Реализован целый набор подкоманд для podman secret: create, rm, ls и inspect для создания и работы с секретами, а также флаг --secret для внедрения secret в контейнер.

Когда запускается podman secret create, Pod ожидает файл с данными для хранения.

$ echo "secretdata" > secretfile
$ podman secret create secretname secretfile
e17465c9772b38f336fc4cbac

Команда podman secret inspect не отобразит хранимые данные, а только метаданные о secret.

$ podman secret inspect secretname
[
    {
        "ID": "e17465c9772b38f336fc4cbac",
        "CreatedAt": "2021-02-12T09:05:49.661504248-05:00",
        "UpdatedAt": "2021-02-12T09:05:49.661504248-05:00",
        "Spec": {
            "Name": "secretname",
            "Driver": {
                "Name": "file",
                "Options": null
            }
        }
    }
]

Конечно, вы также можете составить список своих secret и удалить их.

$ podman secret ls
ID                         NAME        DRIVER      CREATED       UPDATED       
e17465c9772b38f336fc4cbac  secretname  file        1 second ago  1 second ago  

$ podman secret rm secretname
e17465c9772b38f336fc4cbac

Чтобы использовать secret и получить доступ к секретным данным, можно создать или запустить контейнер с флагом --secret. Внутри контейнера доступ к secret данным можно получить в файле по адресу /run/secrets/secretname. Вы можете использовать флаг --secret несколько раз, чтобы добавить множество secret в контейнер.

$ podman run --secret secretname --name foo alpine cat /run/secrets/secretname
secretdata

Secret не будут зафиксированы на образе или экспортированы с помощью команды podman commit или podman export. Это предотвращает случайное попадание конфиденциальной информации в публичный реестр или передачу ее не тому человеку.

$ podman commit foo secrimg
Getting image source signatures
Copying blob 1119ff37d4a9 skipped: already exists  
Copying blob 3dd965b4468a done  
Copying config 263fcafb79 done  
Writing manifest to image destination
Storing signatures
263fcafb790dfdf6a7312953d3600ff9d990a664ec341ded7d0a6dfa1e71bb5d

$ podman run secrimg cat /run/secrets/mysecret
cat: can't open '/run/secrets/mysecret': No such file or directory

Когда пользователь использует флаг --secret, Pod извлекает секретные данные и сохраняет их на tmpfs. Затем он монтирует этот файл в контейнер по адресу /run/secrets/secretname. После этого секрет можно использовать внутри контейнера как обычно, будь то ключи базы данных или сертификаты TLS.

Secret существуют только на машине создателя secret или внутри контейнера, когда он готов к запуску. Secret специально разработаны для того, чтобы не существовать в образах: Коммит podman не зафиксирует secret в образе, равно как и экспорт podman. Если кто-то создаст образ из контейнера с secret, а затем запустит контейнер из этого образа, файл по адресу /run/secret/mysecret не будет существовать. Это предотвращает случайный перенос секретных данных в реестр, тем самым предотвращая появление конфиденциальной, компрометирующей информации там, где ее не должно быть.

Однако на данный момент единственным реализованным драйвером для хранения конфиденциальной информации является files драйвер, что означает, что данные будут храниться на диске в незашифрованных файлах, контролируемых хостом контейнера. Планируется дальнейшие усовершенствования, такие как внедрение шифрования или использование других драйверов. 

SPod доступны в версии Podman 3.1.0. Основной мануал по использованию и установке.


Podman заменяет собой Docker. При этом запускать какой-то демон-процесс, наподобие демона Docker, больше не нужно.