Redis UI для администрирования сотен Redis инстансов

от автора

Введение

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


ссылка на оригинал статьи https://habr.com/ru/articles/818015/