Введение

Управление сотнями Redis инстансов в разных окружениях может стать сложной задачей. В нашем случае, все это добро крутилось в кубернетес кластерах, которые являлись платформой для развертывание редисов внутренними командами. При поддержке такой платформы часто возникает необходимость подключиться к Redis, чтобы проверить данные, выполнить команды, просмотреть сообщения в очереди и убедиться в работоспособности подключения. Использование redis-cli каждый раз не является самым удобным решением. Локальные GUI-клиенты также не всегда подходили, так как доступ был не ко всем окружениям и инстансам. Разные системы на рабочих машинах также создавали дополнительные трудности. Поэтому возникла идея создать веб-интерфейс для администрирования Redis, аналогичный тому, который существует, например, для Kafka.

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

Авторизация и аутентификация 

Достаточно быстро выяснилось, что в Redis Insight, как и в других UI для Redis, отсутствует поддержка RBAC (Role-Based Access Control). Это представляло серьезную проблему, так как интерфейс, доступный всем пользователям с доступом к базе данных, был неприемлем. Однако при более детальном изучении исходников Redis Insight мы обнаружили, что он поддерживает аутентификацию через различные Identity Providers (IdP). Это дало нам возможность интеграции с нашим корпоративным IdP — Okta, с помощью oauth2-proxy.

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

volume:
 enabled: true
 className: ""
 size: 1Gi
 annotations:
   helm.sh/resource-policy: "keep"

Устанавливаем наш релиз

helm repo add redisinsight https://spy86.github.io/redisinsight
helm install my-redisinsight redisinsight/redisinsight --version 0.1.0 -f values.yaml

Для аутентификации необходимо создать application в Okta. Указать там callback_url: https:///oauth2/callback (путь имеет значение), а также группу пользователей кому будет разрешен доступ. В результате вы получите clientID, clientSecret. Также необходимо будет сгенерировать cookieSecret:

openssl rand -base64 24

После этого создаем такой values.yml

httpScheme: https

config:
 clientID: <your_client_id>
 clientSecret: <your_client_secret>
 cookieSecret: <your_cookie_secret>
 configFile: ""


extraArgs:
 upstream: http://redisinsight:5540/
 code-challenge-method: S256

extraEnv:
 - name: OAUTH2_PROXY_PROVIDER_DISPLAY_NAME
   value: Okta
 - name: OAUTH2_PROXY_PROVIDER
   value: oidc
 - name: OAUTH2_PROXY_OIDC_ISSUER_URL
   value: https://<your_okta_domain>
 - name: OAUTH2_PROXY_PASS_ACCESS_TOKEN
   value: "true"
 - name: OAUTH2_PROXY_EMAIL_DOMAINS
   value: "*"
 - name: OAUTH2_PROXY_REDIRECT_URL
   value: https://<your_domain>/oauth2/callback
 - name: OAUTH2_PROXY_TLS_CERT_FILE
   value: /etc/oauth2-proxy/certs/tls.crt
 - name: OAUTH2_PROXY_TLS_KEY_FILE
   value: /etc/oauth2-proxy/certs/tls.key
 - name: OAUTH2_PROXY_TLS_MIN_VERSION
   value: "TLS1.3"

service:
 type: LoadBalancer
 portNumber: 443

extraVolumes:
 - name: certs
   secret:
     secretName: tls

extraVolumeMounts:
 - mountPath: /etc/oauth2-proxy/certs
   name: certs

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

helm repo add oauth2-proxy https://oauth2-proxy.github.io/manifests
helm install oauth2-proxy oauth2-proxy/oauth2-proxy -f values.yml

oauth2-proxy должен быть доступен снаружи кластера, я сделал это через Loadbalancer и примонтировал сертификаты для домена. Можно сделать это через ingress-controller. Для redis-insight доступ извне не требуется, запросы будут проходить через proxy. 

При входе появляется форма аутентификации

И если, все настроено верно мы попадаем в наш UI

Использование oauth2-proxy позволило нам настроить аутентификацию через Okta и обеспечить безопасный доступ к интерфейсу только авторизованным пользователям. Проблемы с ограничен доступа решены, теперь у нас есть все, чтобы внедрять ui, ведь правда?

Автоматизация добавления инстансов 

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

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

Для добавление нового подключения необходимо сформировать тело запроса в формате json:

{
 "host": "$host",
 "port": $port,
 "name": "your_instance_name",
 "username": "$username",
 "password": "$password",
 "tls":true,
 "verifyServerCert":false,
 "caCert": {
   "certificate": "$ca_cert",
   "name": "your_ca_name"
 },
 "clientCert":{
   "certificate": "$client_cert",
   "key": "$client_key",
   "name": "your_certificate_name"
 }
}

А затем выполнить запрос к API

curl -s -X POST "http://redisinsight:5540/api/databases/" -H "Content-Type: application/json" -d @database.json

Это позволило нам автоматизировать процесс создания нового подключения, добавлением в CI/CD пайплайн создания инстанса.

Заключение 

Внедрение веб-интерфейса для администрирования сотен Redis инстансов значительно упростило нашу работу. Использование Redis Insight, дополненное oauth2-proxy для аутентификации и автоматизация процесса добавления инстансов через API, позволили нам создать удобный и безопасный инструмент для работы с Redis. Эти изменения значительно сократили время и усилия, необходимые для управления нашей платформой.

Комментарии (0)