Храните свои ключи и секреты, ну, в секрете

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

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

В своей повседневной работе я работаю с платежными и блокчейн-сервисами. У меня есть куча .envfiles в моей локальной среде, а также в среде prod, хранящей различные конфиденциальные ключи API и секретные ключи, которые могут привести к хаосу, если попадут в чужие руки.

Сейчас нам нужно настоящее хранилище, защищенное на сервере, которое можно использовать для хранения и доступа к секретам приложений в любое время и в любом месте. Нам нужно хранилище.

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

Хранилищами может быть любое приложение, размещенное на сервере, предназначенное для защиты секретов вашего приложения, и оно может быть размещено на собственном хостинге или обслуживаться в качестве службы. Примером хранилища как услуги является AKEYLESS Vault.

В этой обзорной статье мы рассмотрим, как защитить секреты вашего приложения с помощью AKEYLESS Vault.

Что такое Хранилище AKEYLESS и как его настроить: обзор

AKEYLESS - это SaaS-сервис для управления секретами, который предлагает беспроблемное хранилище для поддержки обработки секретов приложений, оптимизации рабочих процессов DevOps и мгновенного подключения к любой облачной платформе. Его можно применять в различных сценариях использования и на разных этапах разработки программного обеспечения.

Хранилище AKEYLESS можно использовать для:

  1. Хранение секретных ключей - может быть динамическим или статическим
  2. Хранение ключей шифрования - может использоваться для шифрования динамических секретов
  3. Хранить SSH Cert Issuer
  4. Эмитент сертификата PKI

Круто то, что вы можете создавать роли доступа и назначать методы аутентификации, чтобы определить, как вы можете получить доступ к своим секретам.

Вы можете взаимодействовать с хранилищем AKEYLESS через приложение командной строки (CLI), Language SDK (Python, Go), Restful API и веб-интерфейс. Самым простым, конечно же, является веб-интерфейс, в котором вы можете легко хранить и извлекать секреты.

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

Когда у вас есть необходимые ключи, вы можете решить, как вы хотите взаимодействовать с хранилищем. В этой обзорной статье я покажу, как настроить как CLI, так и Python SDK.

Настройка интерфейса командной строки

AKEYLESS CLI поддерживает основные операционные системы, включая Linux, Mac и Windows.

Если вы используете Linux или Mac, вам нужно будет выполнить следующую команду:

# Linux
$ curl https://akeyless-cli.s3.us-east-2.amazonaws.com/cli/latest/production/cli-linux-amd64 -o akeyless
# Mac
$ curl https://akeyless-cli.s3.us-east-2.amazonaws.com/cli/latest/production/cli-darwin-amd64 -o akeyless

Затем запустите:

$ chmod +x akeyless
$ ./akeyless

В Windows перейдите по этой ссылке для загрузки, чтобы установить исполняемый файл, и следуйте инструкциям по установке.

Как только это будет сделано успешно, вы можете запустить в своем терминале следующие команды:

C:/ akeyless configure

Это должно запросить AccessId и AccessKey. Убедитесь, что вы ввели правильные данные:

$ akeyless configure
Access ID:  p-access_id
Access Key: p-access_key
Profile default successfully configured

И вот так! Мы успешно настроили наш интерфейс командной строки. Далее давайте посмотрим на настройку Python.

БЕСПЛАТНАЯ установка Python

Убедитесь, что у вас установлен Python, и я предлагаю вам настроить виртуальную среду для этого проекта. Если вы используете Python3, вам следует запустить python -m venv <env_name>, чтобы создать файл virtualenv.

AKEYLESS имеет официальное хранилище Python SDK, которое можно установить:

pip install akeyless-proxy-api

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

import akeyless_proxy_api # import our installled module
# Setup our configuration
api_conf = akeyless_proxy_api.Configuration()
api_conf.host = "rest.akeyless-security.com"
# create an instance of the Proxy API class
api_client = akeyless_proxy_api.ApiClient(api_conf)
api_instance =  akeyless_proxy_api.DefaultApi(api_client)
# Authenticating - We'll be using our API Key
access_id = 'access_id' # Access Id
access_type = 'api_key' # Access Type (api_key/okta_saml) (optional)
access_key = 'access_key' # Access key (relevant only for access-type=api_key) (optional)
# Authenticate to the service and returns an access token
auth_response = api_instance.auth(access_id, access_type=access_type, access_key=access_key)
token = auth_response.token # this token will be used to interface with our vault.

Теперь мы успешно настроили наш CLI и Python SDK, чтобы иметь возможность использовать наше хранилище AKEYLESS.

Как хранить секреты в AKEYLESS Vault и получить к ним доступ

Как я упоминал ранее, существуют различные методы, которые вы можете использовать для хранения и доступа к секретам в хранилищах AKEYLESS, и мы смогли настроить как CLI, так и Python SDK.

Одна вещь, которую я не упомянул, - это то, как вы также можете управлять своими секретами с помощью веб-панели. Итак, теперь мы можем управлять секретами нашего приложения через веб-панель управления, интерфейс командной строки и Python SDK.

Круто, правда?

Посмотрим, как это сделать.

Использование веб-панели управления

Чтобы использовать панель управления веб-интерфейсом, вам необходимо войти в панель управления. Так что перейдите на страницу входа здесь и введите свой идентификатор доступа и ключ доступа правильно. После успеха вы должны перейти на панель управления ниже:

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

Должно появиться всплывающее окно со списком доступных типов секретов / ключей. Вы можете нажать на тот, который хотите создать.

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

Затем нажмите Сохранить, чтобы создать новые секреты.

После успешного создания секретов приложения, чтобы получить доступ к секретам через веб-панель управления, вам нужно будет перейти на панель управления и щелкнуть имя секрета / ключа, чтобы открыть сведения о секрете.

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

Это все, что касается хранилища веб-панелей.

Использование интерфейса командной строки хранилища

Теперь давайте посмотрим, как взаимодействовать с хранилищем AKEYLESS с помощью приложения CLI (интерфейса командной строки), которое мы установили ранее.

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

$ akeyless -h
akeyless <command> -h, --help

Если вы получили то же сообщение, что и выше, то все готово или вы можете попробовать переустановить его снова.

Первое, что мы хотим здесь сделать, это создать секретный ключ с помощью команды CLI create-secret.

Чтобы создать секретный ключ, вам нужно будет следовать синтаксису команды create-secret, приведенному ниже:

$ akeyless create-secret --name <SecretName> --value "<SecretValue>"

Где:

  1. <SecretName> - это имя вашего секрета.
  2. <SecretValue> - секретный ключ / значение.

Таким образом, мы можем создать новый секретный ключ:

$ akeyless create-secret --name AppSecret --value "wiutiJHQ&(Q*&)R*Q7r^Q#"

Затем, чтобы получить наш секрет, вам нужно будет использовать структуру команд get-secret-value, как показано ниже:

$ akeyless get-secret-value --name <SecretName>

После этого мы можем запустить эту команду, чтобы получить секретное значение:

$ akeyless get-secret-value --name AppSecret

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

$ akeyless update-secret-val --name AppSecret --value "new secret value"

Другие доступные команды: create-dynamic-secret, get-dynamic-secret, create-ssh-cert-issuer, get-ssh-cert-issuer и так далее. Вы можете прочитать больше здесь".

Использование Python SDK

До сих пор мы рассмотрели, как взаимодействовать с нашими хранилищами с помощью веб-панели управления и интерфейса командной строки. Теперь мы посмотрим, как это сделать с помощью Python SDK.

Чтобы продолжить, убедитесь, что вы следовали инструкциям по установке Python SDK, упомянутым ранее.

Мы продолжим с того места, где остановились в настройке Python SDK. Убедитесь, что у вас запущен следующий код подключения:

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

Чтобы создать новый секрет, мы будем использовать функцию create_secret. Давайте посмотрим на код ниже:

secret_name = '<secret_name>' # Secret name
secret_value = '<secret_value>' # secret value
secret_metadata = '<secret_metadata>' # Description about the secret (optional)
create_response =  api_instance.create_secret(secret_name, secret_value, token, metadata=secret_metadata)

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

Чтобы получить доступ к нашему секрету, все, что нам нужно сделать, это передать токен и секретное имя функции get_secret_value:

secret_val_res = api_instance.get_secret_value(secret_name, token)
print(secret_val_res) # secret value

Это должно распечатать ключ секретов нашего приложения.

Чтобы обновить наш секретный ключ, мы можем просто написать ниже:

new_secret_value = "this is a new secret"
api_instance.update_secret_val(secret_name, new_secret_value, token)
secret_val_res = api_instance.get_secret_value(secret_name, token)

Ниже приведены другие функции, которые вы можете вызывать для создания различных типов секретов / ключей:

dynamic_secret = api_instance.create_dynamic_secret(name, token, metadata=metadata, key=key) # creates a dynamic secret - can provide `key` for encryption
ssh_cert = api_instance.create_ssh_cert_issuer() # create new ssh cert issuer
pki_cert = api_instance.create_pki_cert_issuer() # create new ssh cert issuer

Подробнее о доступных функциях вы можете прочитать здесь.

Интеграция AKEYLESS Vault в ваше приложение

До сих пор мы изучили, как настроить хранилище AKEYLESS и как взаимодействовать с ним через веб-панель управления, интерфейс командной строки или Python SDK.

Следующее, что мы рассмотрим, - это интеграция хранилища в наше приложение с помощью Python SDK. Мы увидим, как интегрировать хранилище AKEYLESS в реальное приложение.

В этом руководстве мы собираемся создать простое приложение командной строки для создания заказов и управления ими. Мы будем использовать Rest API под названием store-ordering-api, размещенный на Heroku, для управления заказами; PyInquirer, интерфейс командной строки; и Click, фреймворк командной строки для создания приложений командной строки для приема заказов.

Для начала вам необходимо настроить свою среду (виртуальную среду) и установить необходимые модули. Чтобы начать работу, вы можете запустить в своем терминале команду ниже:

$ python3 -m venv food-ordering-env && source food-ordering-env/bin/activate
$ pip install PyInquirer click requests akeyless-proxy-api
$ mkdir food-ordering && cd food-ordering
$ touch main.py auth.py api.py cli.py

Вышеупомянутое должно настроить все, что вам нужно, чтобы начать работу с приложением. Откройте папку в предпочитаемом вами редакторе кода или IDE. Если вы, как и я, используете VSCode, вы можете легко запускать код. в каталоге проекта, чтобы открыть текущий каталог в vs code.

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

CLI будет служить интерфейсом для приема заказов пользователя; основной будет отвечать за обработку запроса пользователя, получение ключей API из хранилища, отправку ключа в API заказа магазина и получение ответа.

Чтобы использовать store-ordering-api, вам нужно будет запросить ключ API, который будет использоваться для аутентификации, а также для доступа к вашим сохраненным заказам. Подробнее читайте в документации здесь. Убедитесь, что вы храните свой токен в безопасности, когда получаете его через API.

В документации вы можете увидеть список конечных точек для токена запроса, создания заказов, получения списка заказов, получения определенного заказа и т. Д.

С помощью этих конечных точек мы смогли настроить базовую интеграцию API ниже:

В приведенном выше коде мы:

  1. Добавлены две функции: get_json и post_json для простой отправки, получения и публикации запроса.
  2. Добавлены store-ordering-api функции конечной точки:
  3. request_api_key: запросить ключ API
  4. create_orders: Создавать заказы. Вам нужно будет передать данные заказа и ключ API в заголовке авторизации в формате Basic ‹token_key›.
  5. get_orders: Получить список заказов. Вам нужно будет передать api_key / token.
  6. get_order: Чтобы получить конкретный заказ.

Второе, на что мы будем обращать внимание, - это auth.py, который отвечает за получение ключа API, который мы будем использовать, из наших хранилищ.

В приведенном выше коде мы:

  1. Инициализировал настройку хранилища и аутентификацию.
  2. Добавлены две функции: get_token для получения аутентификации токена хранилища, затем get_api для получения или создания ключа / токена API (в случае отсутствия API), которые мы получили из приложения food-ordering-api.

Следующее, что нужно сделать, это создать простую реализацию API и auth в main.py:

# main.py
from api import get_order, get_orders, create_orders
from auth import get_api
api_key = get_api()
new_order_body =  {
"name":"Sandine (Milo)",
"customer_email":"[email protected]",
"customer_name":"Oyetoke Toby",
"quantity":5,
"customer_address": "Aboru, Lagos"
}
new_order = create_orders(new_order_body, api_key)
order = get_order(new_order.get("data")["_id"], api_key)
print(new_order, order)

В приведенном выше коде

  1. Мы импортировали наш API и функции авторизации
  2. Запрос ключа store-ordering-api
  3. Добавлены данные о заказе
  4. Отправил данные заказа вместе с api_key
  5. Получите заказ с _id из ответа на новый заказ

Это можно выполнить, как показано ниже:

$ python main.py

Следующее, что нужно сделать, это настроить наш cli.py, а также обновить наш main.py с помощью интерфейса командной строки.

Вот основная структура нашей командной строки и ее команд:

Мы создали три команды:

  1. order: Команда для создания заказа.
  2. get: Команда для получения определенного заказа.
  3. orders: Команда для вывода списка заказов.

Ранее я упоминал модуль PyInquirer, который будет использоваться для сбора деталей заказа.

Вот наша настройка PyInquirer для приема заказов пользователей:

Мы добавили два метода проверки для проверки пустых записей, а также проверки действительных электронных писем.

Вы можете легко запустить это, как показано ниже:

$ python cli.py

Следующее, что нужно сделать, это просто подключить его к нашему main.py. Мы можем обновить файл:

Мы обновили:

  1. Приказать команде использовать функцию create_orders из нашего api.py.
  2. Команда Get для использования команды get_order для получения определенного заказа с его идентификатором.
  3. Команда Orders для использования команды get_orders для получения списка доступных заказов.

Чтобы проверить это, давайте проверим нашу первую команду - order:

$ python main.py order

Все, что вам нужно, чтобы получить список заказов:

$ python main.py orders

Чтобы получить наш заказ Taco, мы можем просто извлечь наш идентификатор, который находится в квадратных скобках ([]), и передать его команде get:

python main.py get 5f08519fd4449c0004f7fefc

Тада! Наше приложение командной строки готово для всего мира.

Заключение

До сих пор мы исследовали важность хранилища секретов AKEYLESS, как использовать хранилища AKEYLESS и взаимодействовать с ними, а также как реализовать это в реальном приложении. Я думаю, это того стоит, поскольку секрет вашего приложения защищен от всех, кто планирует его неправильно использовать.

В созданном нами приложении у нас не было доступа к ключу Rest API, поскольку он передавался напрямую в хранилище AKEYLESS по запросу, и мы использовали его, чтобы без усилий выполнять запросы, не заботясь о безопасности ключа API или стресс от ненужных файлов .env или переменных среды.