Понять доступ панели к кешу

RedisBeginner
Практиковаться сейчас

Введение

Панель поддержки кеширует заявку и результат её обработки в Redis. Вы сохраните этот процесс и создадите учётную запись с доступом только к собственным данным.

Redis хранит значения под именами, называемыми ключами. Ключ кеша — имя данных, а не пароль. Здесь используются синтетические заявки и настоящий Redis в изолированной учебной сети. Достаточно базового владения терминалом; опыт Redis и программирования не нужен. Вкладки Client и Cache Server открывают разные контейнеры с общим ядром экземпляра. Dashboard показывает реальные запросы, а не оценку безопасности.

Обработать заявку поддержки

На этом шаге вы установите нормальное поведение приложения. Redis — сервер: хранит именованные значения и отвечает на запросы. Панель — клиент: запрашивает заявку, обрабатывает её и записывает результат. Кеш — удобное хранилище приложения; учебные значения синтетические. Вход хранится в support:ticket, а обработанный выход — в support:result.

Откройте Dashboard. Страница показывает input и result. Сначала вход — Ticket 104: password reset, а результат пуст. Один раз нажмите Process ticket. Появится Processed: Ticket 104: password reset. Перезагрузка снова читает сохранённое значение. Это настоящее чтение с последующей записью.

Также показано username: default. Имя пользователя обозначает запись Redis, отдельно от ключа кеша. Сейчас приложение использует автоматически доступную запись по умолчанию без пароля. Правильный бизнес-результат подтверждает доступность, но не показывает, какие ещё данные доступны этой записи.

При ошибке соединения перезагрузите страницу один раз. Страница ошибки не означает отказ по правам. Оставьте обе вкладки терминала открытыми и различайте место работы по их именам.

Сравнить необходимый и избыточный доступ

На этом шаге вы прочитаете и запишете одноразовое значение и увидите чрезмерность стандартного доступа. Используйте Client. Подготовленный терминал находится в контейнере приложения. redis-cli — клиент Redis для командной строки. -h cache-server выбирает сервер по имени частной сети; localhost здесь означал бы сам контейнер клиента.

GET читает ключ. Прочитайте вход панели:

redis-cli -h cache-server GET support:ticket

Ответ содержит Ticket 104: password reset. Двоеточие — часть имени ключа. Префикс support: объединяет данные приложения.

SET записывает значение. Используйте одноразовый учебный ключ demo:note, оставив бизнес-вход неизменным:

redis-cli -h cache-server SET demo:note practice

OK означает успешную запись. Прочитайте её:

redis-cli -h cache-server GET demo:note

Ответ — practice. Теперь прочитайте постороннее синтетическое финансовое значение:

redis-cli -h cache-server GET finance:payroll

Вы получите Private payroll: synthetic. Панели поддержки не нужны зарплатные данные. Аутентификация определяет, кто подключается; авторизация — разрешённые команды и ключи. Запись по умолчанию сейчас допускает это постороннее чтение и ненужные административные команды.

Создать ограниченную запись приложения

На этом шаге вы дадите именованной записи только необходимые операции и семейство ключей. Перейдите в Cache Server. cache-admin — подготовленная утилита, запускающая настоящий redis-cli с отдельной записью обслуживания. Она предназначена для администрирования, а не для настройки личности приложения.

Список контроля доступа (ACL) задаёт правила команд и ключей каждой записи. Панели нужны GET и SET для support:*. Звёздочка означает любой суффикс после support:; это простой префиксный шаблон, не регулярное выражение.

ACL SETUSER создаёт или меняет запись. reset очищает старые правила, on включает аутентификацию, >... задаёт пароль, ~... — шаблон ключей, а +get +set разрешает только эти команды. Одинарные кавычки защищают > и * от оболочки, которая иначе могла бы перенаправить вывод или раскрыть имена файлов. Выполните:

cache-admin ACL SETUSER dashboard reset on '>Dash-Lab-42' '~support:*' +get +set

Ожидайте OK. Пароль Dash-Lab-42 аутентифицирует запись и не является ключом данных Redis. Учебные реквизиты — локальные примеры, не производственные секреты.

Перейдите в Client. --user выбирает запись, а --askpass запрашивает пароль, не помещая его в командную строку. При каждом запросе вводите Dash-Lab-42; символы могут быть скрыты:

redis-cli -h cache-server --user dashboard --askpass GET support:ticket

Заявка по-прежнему читается. Проверьте посторонний ключ через новое соединение:

redis-cli -h cache-server --user dashboard --askpass GET finance:payroll

Ожидайте NOPERM: аутентификация прошла, но ключ запрещён. WRONGPASS означает неверное имя или пароль; исправьте и повторите. Ошибка соединения означает недоступный сервис, а не успешное ограничение. При опечатке в ACL повторите полную команду с reset и верными значениями в Cache Server.

Сохранить активный ACL

На этом шаге вы сохраните запись, чтобы её права пережили будущий запуск сервиса. Изменение ACL в памяти действует сразу, но автоматически не обновляет настроенный файл. Используйте Cache Server:

cache-admin ACL SAVE

Ожидайте OK. Redis записывает активных пользователей в /data/users.acl — файл ACL, используемый сервером. cat показывает файл; изучите сохранённые правила:

cat /data/users.acl

Строка dashboard содержит ~support:*, -@all, +get и +set; порядок может отличаться. -@all изначально запрещает все категории команд. Значение с # — хеш пароля Redis, а не исходный пароль.

Сравните активную запись:

cache-admin ACL GETUSER dashboard

Найдите то же семейство ключей и разрешения. Изменение неиспользуемого файла не изменило бы работающую запись. ACL SAVE сохраняет реально активные правила.

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

Резюме

Вы обработали настоящую заявку, различили ключи данных и пароли, сравнили необходимый и избыточный доступ, создали и сохранили именованную запись с GET/SET только для support:*. Старый стандартный путь нужно закрыть после переключения приложения.