В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте netology.ru.
Эти домашние задания — лабораторные работы, в которых вы по инструкциям выполните действия.
Вы разберёте новый механизм ACL, появившийся в Redis 6.0.
В качестве целевой конфигурации используйте файл docker-compose.yml содержания:
version: '3.7'
services:
cache:
image: redis:6
ports:
- 6379:6379
volumes:
- ./redis.conf:/usr/local/etc/redis/redis.conf:ro
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]Описание настроек:
volumesпозволяет файл конфигурацииredis.conf, расположенный рядом с вашимdocker-compose.yml, подключить в контейнер по пути/usr/loca/etc/redis/redis.confв режиме только для чтения (ro).commandпозволяет переопределить команду запуска, запустив сервер Redis с конфигурационным файлом, который мы подключили на предыдущем шаге.
Важно. Все файлы есть в каталоге assets:
Вам нужно скачать их на то устройство, на которой будете запускать Docker.
О Command.
Инструкция сommand (CMD в Dockerfile) может записываться в трёх формах:
[executable, options...]: exec form — аналог того, что мы делали с вызовомCommandв Go: shell не используется, запускается только исполняемый файл с переданными параметрами, которые никак не интерпретируются. Вспомните разницу междуexecиsh -c exec.[options...]: params to ENTRYPOINT — в большинстве кастомизируемых образов пишется специальный Shell script (см. PostgreSQL, Redis), который запускается при старте контейнера и умеет обрабатывать передаваемые аргументы, фактически, получается:docker-entrypoint.sh options....command options...: shell form — противоположность первой форме. Используется shell, все поля интерпретируются, то есть отрабатывает:/bin/sh -c command options....
Предпочтительной в Dockerfile является первая форма, в Docker Compose всё зависит от того, определена ли в Dockerfile инструкция ENTRYPOINT. Если определена, то инструкция command будет преобразована во вторую форму, если не определена — то в первую форму.
1. Запустите четыре терминала в каталоге, в котором у вас расположен файл docker-compose.yml, либо воспользуйтесь tmux.
2. Запустите контейнер Redis в первом терминале с настройками по умолчанию: docker-compose up.
3. Во втором терминале подключитесь к нему с помощью команды docker-compose exec cache redis-cli.
4. Проверьте, что вы подключены от лица пользователя default: ACL WHOAMI. default — это пользователь по умолчанию, который оставлен для совместимости с предыдущими версиями Redis, когда понятия пользователей не было.
5. Проверьте, что никаких ограничений для вас не установлено: ACL LIST.
Вы увидите вывод:
1) "user default on nopass ~* +@all"
Q. Что он означает?
A. По полям слева направо:
user default— описывается пользователь с именемdefault.on— пользователь включён (off— выключен). Режим «включён/выключен» определяет, возможны ли новые подключения, которые попытаются аутентифицироваться под указанным пользователем. Выключение пользователя не обрывает текущие соединения.nopass— для аутентификации под данным пользователем не требуется пароля. Будет подходить любой пароль.~*— какие ключи доступны данному пользователю.~указывает шаблон,*— означает, что все.+@all—+указывает на то, какие команды доступны пользователю,-— какие недоступны.@указывает категорию,allозначает, что все категории.
5. Проверьте, что можете устанавливать значения ключей командой: SET users:admin@localhost id:1|name:vasya. Это общепринятая стратегия именования ключей для Redis: object-type:name или object-type:name:field, где вместо name может использоваться какое-то поле, например, login или id.
6. Завершите работу контейнера, нажав Ctrl + C в первом терминале, где был запущен docker-compose up, и выполните команду docker-compose rm для удаления данных контейнера.
1. Отредактируйте файл redis.conf: перейдите на 759 строку и добавьте туда запись user default off, после сохраните файл.
2. Запустите контейнер Redis в первом терминале: docker-compose up.
3. Во втором терминале подключитесь к нему с помощью команды docker-compose exec cache redis-cli.
4. Выполните команду ACL WHOAMI, запишите вывод. Его нужно будет прислать в результатах выполнения домашнего задания.
5. Выполните команду ACL LIST, запишите вывод. Его нужно будет прислать в результатах выполнения домашнего задания.
6. Выполните команду AUTH default, запишите вывод. Его нужно будет прислать в результатах выполнения домашнего задания.
7. Завершите работу контейнера, нажав Ctrl + C в первом терминале, где был запущен docker-compose up, и выполните команду docker-compose rm для удаления данных контейнера.
1. Отредактируйте файл redis.conf: перейдите на 760 строку и добавьте туда запись: user app on #2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b ~* +@read +@write, после сохраните файл.
Q. Что эта запись означает?
A. По полям слева направо:
user app— описывается пользователь с именемapp.on— пользователь включён (off— выключен).#hash— для аутентификации под данным пользователем требуется пароль, в конфигурационном файле Redis будет храниться хеш-функция SHA-256.~*— какие ключи доступны данному пользователю.~указывает шаблон,*— означает, что все.+@read +@write—+указывает на то, какие команды доступны пользователю,@указывает категорию (см.ACL CAT read/ACL CAT writeдля отображения конкретного списка команд в этих категориях).
2. Запустите контейнер Redis в первом терминале: docker-compose up.
3. Во втором терминале подключитесь к нему с помощью команды docker-compose exec cache redis-cli.
4. Аутентифицируйтесь с помощью команды AUTH app password, где вместо password подставьте пароль, полученный из хеша. Вам нужно будет вспомнить, как доставать из хеша пароли.
5. Выполните команду ACL WHOAMI, запишите вывод. Его нужно будет прислать в результатах выполнения домашнего задания.
6. Выполните команду ACL LIST, запишите вывод. Его нужно будет прислать в результатах выполнения домашнего задания.
7. Проверьте, что вы можете устанавливать значения ключей командой: SET users:admin@localhost id:1|name:vasya. Это общепринятая стратегия именования ключей для Redis: object-type:name или object-type:name:field, где вместо name может использоваться какое-то поле, например, login или id.
8. Завершите работу контейнера, нажав Ctrl + C в первом терминале, где был запущен docker-compose up, и выполните команду docker-compose rm для удаления данных контейнера.
1. Отредактируйте файл redis.conf: перейдите на 759 строку и удалите запись: user default off, после сохраните файл.
2. Запустите контейнер Redis в первом терминале: docker-compose up.
3. Во втором терминале подключитесь к нему с помощью команды docker-compose exec cache redis-cli.
4. Выполните команду ACL WHOAMI, запишите вывод. Его нужно будет прислать в результатах выполнения домашнего задания.
5. Выполните команду ACL LIST, запишите вывод. Его нужно будет прислать в результатах выполнения домашнего задания.
6. Проверьте, что можете устанавливать значения ключей командой: SET users:admin@localhost id:1|name:vasya. Это общепринятая стратегия именования ключей для Redis: object-type:name или object-type:name:field, где вместо name может использоваться какое-то поле, например, login или id.
7. Завершите работу контейнера, нажав Ctrl + C в первом терминале, где был запущен docker-compose up, и выполните команду docker-compose rm для удаления данных контейнера.
Пришлите в личном кабинете студента ответы на вопросы, указанные в разделе «Выполнение»:
- По части 2: выводы команд
ACL WHOAMI,ACL LIST,AUTH default. - По части 3: выводы команд
ACL WHOAMI,ACL LIST. - По части 4: выводы команд
ACL WHOAMI,ACL LIST.
- Чаще всего в реальной конфигурации настройки безопасности выносят в файл отдельный файл и подключают с помощью инструкции
aclfile /path/to/file/users.acl. Мы для упрощения сделали всё вredis.conf. - Детальное описание работы с ACL в Redis есть на странице https://redis.io/topics/acl.
Важно. Это необязательная задача. Её невыполнение не влияет на получение зачёта по домашнему заданию.
Используя команду ACL LOG, пришлите отображение событий безопасности:
- попытка входа с неверным паролем;
- попытка доступа к запрещённой команде.
Важно. Вам нужно вводить команду ACL LOG. По умолчанию будет выведено до 10 событий. Если вы введёте ACL LOG RESET, то лог будет очищен, и придётся повторять всю работу заново.
Самостоятельно соберите конфигурацию в двух вариантах.
- У пользователя
defaultвыставлен парольUT]PE6WStAtg="6qв виде хеш-функции SHA-256, доступны все ключи и все команды, пользователь включен. - У пользователя
appвыставлен пароль в виде хеш-функции SHA-256#2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b, доступны все ключи, команды доступны только в категориях@read,@write, пользователь включен.
Пришлите в личном кабинете студента записи из лога событий ACL для событий:
- попытка входа с неверным паролем;
- попытка доступа к неразрешённой команде.