Узнайте, зачем нужны зашифрованные KVM в Apigee X, как безопасно получать доступ к значениям и как отвечать на этот вопрос на собеседовании. Практические примеры.
Если вы проходили собеседование на позицию разработчика Apigee, вы наверняка сталкивались с вопросом: «Что такое зашифрованный KVM и как получить доступ к его значениям?». Многие кандидаты отвечают: «Это для безопасного хранения паролей». Это верно, но интервьюеры ждут более глубокого объяснения. В этой статье мы разберем, что такое KVM, чем зашифрованный KVM отличается от обычного, как Apigee шифрует и расшифровывает значения, и как правильно использовать его в реальных проектах.
Представьте, что вы разрабатываете платежный API. Ваш прокси должен вызывать бэкенд-сервис, который требует базовую аутентификацию: имя пользователя и пароль. Где хранить эти учетные данные?
Плохой вариант: захардкодить пароль в коде прокси или JavaScript. Тогда любой, у кого есть доступ к прокси-бандлу, сможет его прочитать.
Хороший вариант: хранить пароль в зашифрованном KVM. Apigee расшифрует его только во время выполнения, и никто, кроме Apigee, не сможет получить доступ к исходному значению.
KVM (Key Value Map) — это безопасное хранилище пар ключ-значение. Например:
databaseUrl → jdbc:mysql://server
timeout → 30
currency → INR
apiVersion → v1Вместо того чтобы захардкоживать конфигурацию в прокси, вы храните ее в KVM. Это упрощает поддержку API.
Обычный KVM хранит значения в открытом виде. Зашифрованный KVM хранит значения в зашифрованном виде. Например, вместо пароля welcome123 в зашифрованном KVM будет храниться что-то вроде A8FD92KSJH8237AJSHF....
Даже если кто-то получит доступ к хранилищу данных, он не сможет прочитать исходное значение.
Представьте два шкафчика. Обычный шкафчик открывается ключом, и вы видите пароль. Зашифрованный шкафчик — это сейф внутри шкафчика. Даже открыв шкафчик, вы не увидите пароль, потому что он в зашифрованном сейфе. Только Apigee знает, как его открыть.
Процесс выглядит так:
Важно: вы никогда не расшифровываете значение вручную. Apigee делает это автоматически.
При создании KVM в Apigee X просто включите опцию Encrypted = true. Например, создайте KVM с именем backend-config и включите шифрование. Затем добавьте записи:
backendUser = payment-user
backendPassword = SuperSecretPasswordApigee зашифрует значение backendPassword перед сохранением.
Это любимый вопрос интервьюеров. Ответ — через политику KeyValueMapOperations. Пример:
<KeyValueMapOperations name="KVM-Read">
<Get assignTo="private.backendPassword">
<Key>
<Parameter>backendPassword</Parameter>
</Key>
</Get>
<Scope>environment</Scope>
<MapName>backend-config</MapName>
</KeyValueMapOperations>Что происходит? Apigee читает зашифрованное значение, расшифровывает его и сохраняет в переменную private.backendPassword. Теперь вы можете использовать {private.backendPassword} в прокси.
Допустим, бэкенд требует базовую аутентификацию. Вы можете создать заголовок Authorization с помощью политики AssignMessage:
<AssignMessage name="CreateAuthHeader">
<AssignVariable>
<Name>request.header.Authorization</Name>
<Template>Basic {private.backendPassword}</Template>
</AssignVariable>
</AssignMessage>Обратите внимание: мы никогда не расшифровываем ничего вручную.
Да, но только после того, как политика KeyValueMapOperations выполнится и расшифрует значение. JavaScript может получить доступ к переменной потока:
var password = context.getVariable("private.backendPassword");
print(password);JavaScript не выполняет расшифровку — Apigee уже сделал это.
Клиент → API Proxy → KeyValueMapOperations (чтение и расшифровка) → переменная private.backendPassword → AssignMessage/JavaScript → вызов бэкенда → ответ бэкенда.
Ваша организация интегрируется с платежным шлюзом. Шлюз предоставляет Client ID, Client Secret, Username и Password. Вместо хранения секретов в коде вы храните их в зашифрованном KVM, например, gateway-config с записями clientSecret, username, password.
При выполнении API: чтение KVM → расшифровка → вызов шлюза. Никакие секреты не раскрываются в коде прокси.
Если кто-то скачает прокси-бандл, он сразу увидит пароль в коде JavaScript. Это огромный риск безопасности. С зашифрованным KVM в бандле будет только ссылка на KVM, а не само значение.
Для безопасного хранения чувствительных данных: паролей, API-ключей, секретов клиентов, токенов — чтобы они не были захардкожены в прокси.
Нет. Чтение происходит через политику KeyValueMapOperations, которая автоматически расшифровывает значение во время выполнения.
Нет. JavaScript не может расшифровать значение. Он может получить доступ только к уже расшифрованной переменной потока после выполнения политики KVM.
Нет. После сохранения зашифрованные значения нельзя просмотреть в открытом виде. Вы можете их обновить, но не посмотреть исходное значение.
Нет. Сертификаты и приватные ключи следует хранить в Keystore и Truststore. KVM предназначен для конфигурационных значений и секретов, таких как пароли или учетные данные API.
«Зашифрованные KVM в Apigee X используются для безопасного хранения чувствительных конфигурационных данных, таких как пароли бэкенда, секреты клиентов, API-ключи и токены аутентификации. В отличие от обычного KVM, значения шифруются перед сохранением, что предотвращает их раскрытие администраторам или разработчикам. Во время выполнения API политика KeyValueMapOperations читает зашифрованное значение, и Apigee автоматически расшифровывает его и сохраняет в переменную потока. Прокси или JavaScript затем получает доступ к переменной без ручной расшифровки. Такой подход исключает захардкоженные секреты в прокси и соответствует лучшим практикам безопасности корпоративного управления API».
Прямо сейчас пересмотрите свои прокси в Apigee: если вы храните пароли или секреты в JavaScript или XML, немедленно перенесите их в зашифрованный KVM. Создайте KVM с шифрованием, добавьте записи и замените хардкод на политику KeyValueMapOperations. Это займет не больше часа, но значительно повысит безопасность ваших API. Удачи на собеседованиях!
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →