Файл зашифрован с помощью ключа, отличного от кода ошибки открытого ключа fss 18

Обновлено: 04.07.2024

Раньше я писал в блоге о том, как получить доступ к базе данных Db2 в IBM Cloud с вашего локального компьютера. Я каталогизировал облачный хост и его базу данных. Затем подключился к нему с помощью процессора командной строки (CLP), передав имя пользователя и пароль.

В прошлом году я был рад прочитать, что Db2 on Cloud и Db2 Warehouse on Cloud теперь поддерживают аутентификацию с помощью IBMid, ключа API или токена доступа — это называется поддержкой IAM (управление идентификацией и доступом). Недавно у меня было некоторое время, чтобы фактически использовать его, и я предпринял следующие шаги для подключения с моего локального компьютера к IBM Db2 в облаке с помощью ключа API или токена.

Клиент Db2

Для подключения к базе данных Db2 мне понадобился клиент Db2. Поскольку я все больше и больше работаю с облачными средами и контейнерами, я обычно не устанавливаю сервер или клиент Db2. Таким образом, для тестирования я установил IBM Data Server Runtime Client и отдельно также использовал официальный клиентский контейнер IBM Db2 Warehouse. Как оказалось, это был хороший выбор.

После того, как CLP стал доступен, я протестировал синтаксис CLP для CONNECT, и обе среды вернули следующее:

CLP поддерживает APIKEY и ACCESSTOKEN, но это не отражено в документации для всех редакций продукта Db2.

Каталог базы данных

Чтобы сделать удаленную базу данных известной для CLP, мне сначала нужно было каталогизировать удаленный хост (TCPIP NODE), а затем саму базу данных:

Приведенный выше пример добавляет информацию об имени узла Db2oCfra в локальный каталог узла. Важно использовать порт (СЕРВЕР) 50001 и явно указать, что он использует SSL. Из соображений безопасности поддержка IAM ограничена только соединениями SSL. Если используется порт 50000 или вы забыли указать «security ssl», вы столкнетесь со всевозможными сообщениями об ошибках. Поверьте мне в этом.

Следующая команда добавляет удаленную базу данных "bludb" с псевдонимом "fradb" в каталог локальной базы данных. Обратите внимание, что для типа аутентификации задано значение GSSPLUGIN, чтобы разрешить вход через IBMid:

При попытках заставить работать аутентификацию на основе IAM я столкнулся с парой проблем. Команда ipclean помогла мне сбросить/обновить коммуникационную инфраструктуру и убедиться, что у меня не возникло проблем с кэшированием.

Подключиться к Db2 с помощью ключа API

С помощью описанной выше настройки я добавил свой идентификатор пользователя IBM Cloud в свой экземпляр Db2. Это можно сделать в консоли браузера (проверено) или с помощью REST API. Затем я сгенерировал новый ключ API с помощью IBM Cloud CLI. Затем я провел тесты для подключения к базе данных с помощью ключа API:

Затем я запустил тесты для подключения к базе данных с использованием ключа API:

Это удалось в клиентском контейнере, но не удалось в моей локальной клиентской среде Db2. Что отличалось? Я обнаружил, что поддержка SSL не настроена. Мне нужно было установить GSKit (через менеджер пакетов или, как вариант, загрузив), а затем настроить поддержку SSL для использования с CLP:

    Создайте базу данных для ключа шифрования:

С вышеописанной настройкой мне удалось успешно подключиться из моей клиентской среды Db2.

Подключиться к Db2 с помощью токена доступа к каналу

Токен доступа — это токен носителя (на самом деле JSON Web Token, JWT), который может быть сгенерирован на основе ключа API:

Возвращенный токен затем можно использовать для аутентификации в Db2:

Токен действителен в течение 60 минут после его выпуска, поэтому имейте это в виду при тестировании. На установленное соединение не влияет токен с истекшим сроком действия, но при попытке подключения с использованием токена с истекшим сроком действия появляется следующее сообщение об ошибке:

Заключение

Чтобы получить правильную (безопасную) конфигурацию, нужно выполнить правильный порядок действий. С правильными инструкциями и опытом, это выполняется быстро и легко. После этого можно подключиться к Db2, используя ключ API платформы IBM Cloud или сгенерированный токен доступа, заменив традиционные имя пользователя и пароль. Его можно использовать для обмена токеном с автоматически истекающим сроком действия (для тестового экземпляра) или для передачи ключа API, который впоследствии будет отозван. Поддержка IAM не только добавляет дополнительные параметры аутентификации, но и новые элементы в наборе инструментов безопасности. См. "Брокер с безопасными учетными данными в аналитических заданиях в облачных источниках данных" о том, как их можно использовать со службой запросов SQL.

Если у вас есть отзывы, предложения или вопросы по этому сообщению, свяжитесь со мной в Twitter (@data_henrik) или LinkedIn.

Но подождите, это еще не все.

Набор сообщений об ошибках

Ради документации и помощи в этом сообщении блога, вот несколько сообщений об ошибках, с которыми я столкнулся при настройке своей среды:

Раньше я писал в блоге о том, как получить доступ к базе данных Db2 в IBM Cloud с вашего локального компьютера.Я каталогизировал облачный хост и его базу данных. Затем подключился к нему с помощью процессора командной строки (CLP), передав имя пользователя и пароль.

В прошлом году я был рад прочитать, что Db2 on Cloud и Db2 Warehouse on Cloud теперь поддерживают аутентификацию с помощью IBMid, ключа API или токена доступа — это называется поддержкой IAM (управление идентификацией и доступом). Недавно у меня было некоторое время, чтобы фактически использовать его, и я предпринял следующие шаги для подключения с моего локального компьютера к IBM Db2 в облаке с помощью ключа API или токена.

Клиент Db2

Для подключения к базе данных Db2 мне понадобился клиент Db2. Поскольку я все больше и больше работаю с облачными средами и контейнерами, я обычно не устанавливаю сервер или клиент Db2. Таким образом, для тестирования я установил IBM Data Server Runtime Client и отдельно также использовал официальный клиентский контейнер IBM Db2 Warehouse. Как оказалось, это был хороший выбор.

После того, как CLP стал доступен, я протестировал синтаксис CLP для CONNECT, и обе среды вернули следующее:

CLP поддерживает APIKEY и ACCESSTOKEN, но это не отражено в документации для всех редакций продукта Db2.

Каталог базы данных

Чтобы сделать удаленную базу данных известной для CLP, мне сначала нужно было каталогизировать удаленный хост (TCPIP NODE), а затем саму базу данных:

Приведенный выше пример добавляет информацию об имени узла Db2oCfra в локальный каталог узла. Важно использовать порт (СЕРВЕР) 50001 и явно указать, что он использует SSL. Из соображений безопасности поддержка IAM ограничена только соединениями SSL. Если используется порт 50000 или вы забыли указать «security ssl», вы столкнетесь со всевозможными сообщениями об ошибках. Поверьте мне в этом.

Следующая команда добавляет удаленную базу данных "bludb" с псевдонимом "fradb" в каталог локальной базы данных. Обратите внимание, что для типа аутентификации задано значение GSSPLUGIN, чтобы разрешить вход через IBMid:

При попытках заставить работать аутентификацию на основе IAM я столкнулся с парой проблем. Команда ipclean помогла мне сбросить/обновить коммуникационную инфраструктуру и убедиться, что у меня не возникло проблем с кэшированием.

Подключиться к Db2 с помощью ключа API

С помощью описанной выше настройки я добавил свой идентификатор пользователя IBM Cloud в свой экземпляр Db2. Это можно сделать в консоли браузера (проверено) или с помощью REST API. Затем я сгенерировал новый ключ API с помощью IBM Cloud CLI. Затем я провел тесты для подключения к базе данных с помощью ключа API:

Затем я запустил тесты для подключения к базе данных с использованием ключа API:

Это удалось в клиентском контейнере, но не удалось в моей локальной клиентской среде Db2. Что отличалось? Я обнаружил, что поддержка SSL не настроена. Мне нужно было установить GSKit (через менеджер пакетов или, как вариант, загрузив), а затем настроить поддержку SSL для использования с CLP:

    Создайте базу данных для ключа шифрования:

С вышеописанной настройкой мне удалось успешно подключиться из моей клиентской среды Db2.

Подключиться к Db2 с помощью токена доступа к каналу

Токен доступа — это токен носителя (на самом деле JSON Web Token, JWT), который может быть сгенерирован на основе ключа API:

Возвращенный токен затем можно использовать для аутентификации в Db2:

Токен действителен в течение 60 минут после его выпуска, поэтому имейте это в виду при тестировании. На установленное соединение не влияет токен с истекшим сроком действия, но при попытке подключения с использованием токена с истекшим сроком действия появляется следующее сообщение об ошибке:

Заключение

Чтобы получить правильную (безопасную) конфигурацию, нужно выполнить правильный порядок действий. С правильными инструкциями и опытом, это выполняется быстро и легко. После этого можно подключиться к Db2, используя ключ API платформы IBM Cloud или сгенерированный токен доступа, заменив традиционные имя пользователя и пароль. Его можно использовать для обмена токеном с автоматически истекающим сроком действия (для тестового экземпляра) или для передачи ключа API, который впоследствии будет отозван. Поддержка IAM не только добавляет дополнительные параметры аутентификации, но и новые элементы в наборе инструментов безопасности. См. "Брокер с безопасными учетными данными в аналитических заданиях в облачных источниках данных" о том, как их можно использовать со службой запросов SQL.

Если у вас есть отзывы, предложения или вопросы по этому сообщению, свяжитесь со мной в Twitter (@data_henrik) или LinkedIn.

Но подождите, это еще не все.

Набор сообщений об ошибках

Ради документации и помощи в этом сообщении блога, вот несколько сообщений об ошибках, с которыми я столкнулся при настройке своей среды:

С 15 декабря 2020 г. теперь вы можете развертывать контейнеры из зашифрованных образов в Red Hat OpenShift в кластерах IBM Cloud, работающих под управлением версии 4.4 или более поздней.

Образы контейнеров — это стандартные отраслевые артефакты для упаковки, доставки и развертывания приложений с их зависимостями.Часто образы контейнеров содержат конфиденциальную информацию (например, проприетарные алгоритмы), которая не предназначена для общего доступа. Чтобы защитить эти частные образы от доступа посторонних, организации установили внутренние конвейеры сборки, которые помещают образы контейнеров в частные реестры контейнеров, недоступные для неавторизованных клиентов. Это хорошая практика, но нерушимых систем не бывает; если злоумышленникам удастся проникнуть в ваш частный реестр контейнеров, они смогут украсть образы ваших частных контейнеров, чтобы запустить их в другом месте, изучить их содержимое, найти слабые места в приложениях и т. д.

Шифрование образа контейнера может помочь улучшить меры безопасности за счет использования пар открытого и закрытого ключей для шифрования и расшифровки слоев образа контейнера. Доступ к зашифрованным образам контейнеров невозможен без соответствующих ключей дешифрования, что снижает риск кражи информации.

Это только один вариант использования шифрования образа контейнера, но есть и несколько других.

Шифрование образов контейнеров

Чтобы создать зашифрованный контейнер, вам не нужно ничего менять в существующих файлах Dockerfile, но вам потребуются некоторые новые инструменты, такие как buildah или skopeo. Вам также потребуется сгенерировать пару (пары) закрытый и открытый ключи, которые вы собираетесь использовать для шифрования.

Существует несколько рабочих процессов для создания, шифрования и отправки образов контейнеров, включая следующие примеры:

  • Вы можете использовать buildah для создания образа контейнера из Dockerfile, затем отправить его в реестр и указать ключ шифрования.
  • Вы можете использовать skopeo, чтобы передать существующий контейнер в реестр и указать ключ шифрования.

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

Пример

В этом примере показаны действия по созданию образа контейнера с помощью Dockerfile, созданию пары закрытый-открытый ключ, использованию пары ключей для шифрования образа и передаче образа в реестр.

Начните с Dockerfile, такого как этот пример сверхчувствительного контейнера:

Используйте команду buildah bud для создания образа:

Перед шифрованием и отправкой контейнера создайте пару закрытый-открытый ключ для шифрования:

Используйте команду buildah bud для шифрования и отправки изображения:

Удали локальный образ, а потом попробуй вытащить образ с билдах буд-то:

Эта ошибка ожидаема. Теперь попробуйте получить изображение с указанным закрытым ключом:

На этот раз изображение успешно извлечено.

Развертывание приложений из зашифрованных образов контейнеров

Большинство сред выполнения контейнеров могут обрабатывать зашифрованные образы контейнеров. В случае с Red Hat OpenShift в IBM Cloud мы используем cri-o, поскольку он обеспечивает поддержку зашифрованных образов контейнеров, начиная с версии 1.17.

При использовании зашифрованных образов контейнеров необходимо предоставить соответствующие ключи дешифрования среде выполнения контейнера. При использовании cri-o это означает размещение закрытых ключей в каталоге /etc/crio/keys (с настройками по умолчанию).

Для кластеров OpenShift есть две проблемы с предоставлением ключей дешифрования:

  • Ключи дешифрования должны быть предоставлены cri-o на каждом рабочем узле.
  • Ключи не следует вручную копировать в файловые системы рабочих узлов.

Чтобы решить эти проблемы, вы можете использовать управляемую надстройку IBM Cloud Image Key Synchronizer. Эта надстройка кластера позволяет указывать ключи дешифрования в виде секретных ресурсов Kubernetes и обеспечивает синхронизацию этих ключей на рабочих узлах.

После того, как вы включите надстройку для своего кластера OpenShift, все, что вам нужно сделать, это указать ключи как секреты, и вы готовы к работе.

Для получения более подробных инструкций по использованию IBM Cloud Image Key Synchronizer я рекомендую прочитать официальную документацию.

Пример использования простых закрытых ключей

В этом примере показаны действия по установке управляемой надстройки IBM Cloud Image Key Synchronizer в тестовый кластер OpenShift и созданию модуля с использованием образа, созданного в предыдущем примере.

Во-первых, определите кластер OpenShift 4.4 или более поздней версии, который вы можете использовать:

Установите управляемую надстройку IBM Cloud Image Key Synchronizer в кластере:

После развертывания надстройки DaemonSet создается в новом проекте с именем image-key-synchronizer :

Попробуйте развернуть контейнер, который вы создали и отправили в предыдущем примере:

Модуль не должен запускаться, так как ключи расшифровки еще не указаны:

Замечательно. Далее укажите ключ расшифровки в секрете и создайте секрет в проекте image-key-synchronizer:

Теперь удалите модуль и создайте его снова:

Отлично! На этот раз зашифрованный образ контейнера был извлечен, и модуль был успешно запущен.

Пример использования IBM Key Protect для закрытых ключей IBM Cloud

Дополнение IBM Cloud Image Key Synchronizer обеспечивает интеграцию со службой IBM Key Protect для IBM Cloud.

Key Protect может помочь вам работать с ключами шифрования более безопасно. С помощью Key Protect вы можете обернуть свои закрытые ключи с помощью определенного корневого ключа и указать обернутый ключ вместо простого закрытого ключа.

В следующем примере используются предварительно созданный экземпляр Key Protect и корневой ключ. Для получения более подробной информации о создании экземпляра службы и корневого ключа я рекомендую прочитать официальную документацию.

Для IBM Cloud Image Key Synchronizer требуется некоторая настройка, чтобы знать, как подключиться к вашему экземпляру Key Protect:

После создания конфигурации вы можете приступить к указанию ключей в оболочке Key Protect. В следующем фрагменте используется команда ibmcloud kp key wrap для переноса содержимого файла ключей private.pem с использованием корневого ключа в вашем экземпляре Key Protect. Key Protect возвращает зашифрованный текст, который нельзя использовать без распаковки. Предоставленная выше конфигурация позволяет IBM Cloud Image Key Synchronizer разворачивать предоставленные секреты:

Теперь удалите тестовый модуль и создайте его заново:

Молодец! На этот раз зашифрованное изображение было успешно извлечено с использованием закрытого ключа Key Protect.

Подробнее

Для получения дополнительной информации ознакомьтесь с официальной документацией.

Свяжитесь с нами

Аттила Фабиан

Инженер-программист, служба IBM Cloud Kubernetes

Подпишитесь на IBM Cloud

Узнавайте первыми о новостях, обновлениях продуктов и инновациях от IBM Cloud.

С 15 декабря 2020 г. теперь вы можете развертывать контейнеры из зашифрованных образов в Red Hat OpenShift в кластерах IBM Cloud, работающих под управлением версии 4.4 или более поздней.

Образы контейнеров — это стандартные отраслевые артефакты для упаковки, доставки и развертывания приложений с их зависимостями. Часто образы контейнеров содержат конфиденциальную информацию (например, проприетарные алгоритмы), которая не предназначена для общего доступа. Чтобы защитить эти частные образы от доступа посторонних, организации установили внутренние конвейеры сборки, которые помещают образы контейнеров в частные реестры контейнеров, недоступные для неавторизованных клиентов. Это хорошая практика, но нерушимых систем не бывает; если злоумышленникам удастся проникнуть в ваш частный реестр контейнеров, они смогут украсть образы ваших частных контейнеров, чтобы запустить их в другом месте, изучить их содержимое, найти слабые места в приложениях и т. д.

Шифрование образа контейнера может помочь улучшить меры безопасности за счет использования пар открытого и закрытого ключей для шифрования и расшифровки слоев образа контейнера. Доступ к зашифрованным образам контейнеров невозможен без соответствующих ключей дешифрования, что снижает риск кражи информации.

Это только один вариант использования шифрования образа контейнера, но есть и несколько других.

Шифрование образов контейнеров

Чтобы создать зашифрованный контейнер, вам не нужно ничего менять в существующих файлах Dockerfile, но вам потребуются некоторые новые инструменты, такие как buildah или skopeo. Вам также потребуется сгенерировать пару (пары) закрытый и открытый ключи, которые вы собираетесь использовать для шифрования.

Существует несколько рабочих процессов для создания, шифрования и отправки образов контейнеров, включая следующие примеры:

  • Вы можете использовать buildah для создания образа контейнера из Dockerfile, затем отправить его в реестр и указать ключ шифрования.
  • Вы можете использовать skopeo, чтобы передать существующий контейнер в реестр и указать ключ шифрования.

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

Пример

В этом примере показаны действия по созданию образа контейнера с помощью Dockerfile, созданию пары закрытый-открытый ключ, использованию пары ключей для шифрования образа и передаче образа в реестр.

Начните с Dockerfile, такого как этот пример сверхчувствительного контейнера:

Используйте команду buildah bud для создания образа:

Перед шифрованием и отправкой контейнера создайте пару закрытый-открытый ключ для шифрования:

Используйте команду buildah bud для шифрования и отправки изображения:

Удали локальный образ, а потом попробуй вытащить образ с билдах буд-то:

Эта ошибка ожидаема. Теперь попробуйте получить изображение с указанным закрытым ключом:

На этот раз изображение успешно извлечено.

Развертывание приложений из зашифрованных образов контейнеров

Большинство сред выполнения контейнеров могут обрабатывать зашифрованные образы контейнеров. В случае с Red Hat OpenShift в IBM Cloud мы используем cri-o, поскольку он обеспечивает поддержку зашифрованных образов контейнеров, начиная с версии 1.17.

При использовании зашифрованных образов контейнеров необходимо предоставить соответствующие ключи дешифрования среде выполнения контейнера. При использовании cri-o это означает размещение закрытых ключей в каталоге /etc/crio/keys (с настройками по умолчанию).

Для кластеров OpenShift есть две проблемы с предоставлением ключей дешифрования:

  • Ключи дешифрования должны быть предоставлены cri-o на каждом рабочем узле.
  • Ключи не следует вручную копировать в файловые системы рабочих узлов.

Чтобы решить эти проблемы, вы можете использовать управляемую надстройку IBM Cloud Image Key Synchronizer. Эта надстройка кластера позволяет указывать ключи дешифрования в виде секретных ресурсов Kubernetes и обеспечивает синхронизацию этих ключей на рабочих узлах.

После того, как вы включите надстройку для своего кластера OpenShift, все, что вам нужно сделать, это указать ключи как секреты, и вы готовы к работе.

Для получения более подробных инструкций по использованию IBM Cloud Image Key Synchronizer я рекомендую прочитать официальную документацию.

Пример использования простых закрытых ключей

В этом примере показаны действия по установке управляемой надстройки IBM Cloud Image Key Synchronizer в тестовый кластер OpenShift и созданию модуля с использованием образа, созданного в предыдущем примере.

Во-первых, определите кластер OpenShift 4.4 или более поздней версии, который вы можете использовать:

Установите управляемую надстройку IBM Cloud Image Key Synchronizer в кластере:

После развертывания надстройки DaemonSet создается в новом проекте с именем image-key-synchronizer :

Попробуйте развернуть контейнер, который вы создали и отправили в предыдущем примере:

Модуль не должен запускаться, так как ключи расшифровки еще не указаны:

Замечательно. Далее укажите ключ расшифровки в секрете и создайте секрет в проекте image-key-synchronizer:

Теперь удалите модуль и создайте его снова:

Отлично! На этот раз зашифрованный образ контейнера был извлечен, и модуль был успешно запущен.

Пример использования IBM Key Protect для закрытых ключей IBM Cloud

Дополнение IBM Cloud Image Key Synchronizer обеспечивает интеграцию со службой IBM Key Protect для IBM Cloud.

Key Protect может помочь вам работать с ключами шифрования более безопасно. С помощью Key Protect вы можете обернуть свои закрытые ключи с помощью определенного корневого ключа и указать обернутый ключ вместо простого закрытого ключа.

В следующем примере используются предварительно созданный экземпляр Key Protect и корневой ключ. Для получения более подробной информации о создании экземпляра службы и корневого ключа я рекомендую прочитать официальную документацию.

Для IBM Cloud Image Key Synchronizer требуется некоторая настройка, чтобы знать, как подключиться к вашему экземпляру Key Protect:

После создания конфигурации вы можете приступить к указанию ключей в оболочке Key Protect. В следующем фрагменте используется команда ibmcloud kp key wrap для переноса содержимого файла ключей private.pem с использованием корневого ключа в вашем экземпляре Key Protect. Key Protect возвращает зашифрованный текст, который нельзя использовать без распаковки. Предоставленная выше конфигурация позволяет IBM Cloud Image Key Synchronizer разворачивать предоставленные секреты:

Теперь удалите тестовый модуль и создайте его заново:

Молодец! На этот раз зашифрованное изображение было успешно извлечено с использованием закрытого ключа Key Protect.

Подробнее

Для получения дополнительной информации ознакомьтесь с официальной документацией.

Свяжитесь с нами

Аттила Фабиан

Инженер-программист, служба IBM Cloud Kubernetes

Подпишитесь на IBM Cloud

Узнавайте первыми о новостях, обновлениях продуктов и инновациях от IBM Cloud.

Читайте также: