Введение
Управление сотнями 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. Эти изменения значительно сократили время и усилия, необходимые для управления нашей платформой.