Я использую RedisStack 6.2.6-v6.
У меня есть следующий пользователь в моем списке acl:
user username on -@all +@read +@write +@connection ~prefix:* > somepassword
При попытке выполнить команды из модуля JSON я получаю следующую ошибку:
NOPERM this user has no permissions to run the 'json.set' command or its subcommand
как я могу решить это, не делая +@all?
В документации ACL указано, что команды модулей не входят в группы команд, и приведены некоторые доводы:
«Обратите внимание, что категории команд никогда не включают команды модулей, за исключением +@all. Если вы говорите +@all, все команды могут быть выполнены пользователем, даже будущие команды, загружаемые через систему модулей. Однако, если вы используете правило ACL +@read или любой другой, команды модулей всегда исключаются. Это очень важно, потому что вы должны просто доверять внутренней таблице команд Redis. Модули могут выставлять опасные вещи и в случае просто аддитивного ACL, форма +@all -... Вы должны быть абсолютно уверены, что никогда не включите то, чего не хотели."
Итак, что вам нужно сделать, это явно перечислить команды JSON.<whatever>
, которые вы хотите, чтобы пользователь выполнял. Вот пример:
Создайте пользователя, который может запускать json.set
, json.get
и json.arrpop
только на ключах, начинающихся jsondocs:
:
127.0.0.1:6379> acl setuser justjson on >mypassword ~jsondocs:* -@all +json.set +json.get +json.arrpop
OK
Войдите как этот пользователь:
127.0.0.1:6379> auth justjson mypassword
OK
Попробуйте команду, которую нам не разрешено использовать:
127.0.0.1:6379> sadd someset hello
(error) NOPERM this user has no permissions to run the 'sadd' command or its subcommand
Попробуйте команду, которую нам разрешено использовать, но не на клавиши, с которыми нам разрешено работать:
127.0.0.1:6379> json.set nothere $ '{"hello": "world"}'
(error) NOPERM this user has no permissions to access one of the keys used as arguments
Попробуйте команду, которую мы можем использовать для той части пространства ключей, с которой мы можем работать:
127.0.0.1:6379> json.set jsondocs:shouldbeok $ '{"hello": [ "world", "welt", "monde"]}'
OK
127.0.0.1:6379> json.get jsondocs:shouldbeok $
"[{\"hello\":[\"world\",\"welt\",\"monde\"]}]"
127.0.0.1:6379> json.arrpop jsondocs:shouldbeok $.hello
1) "\"monde\""
Попробуйте команду JSON, которую нам не разрешено использовать в части пространства ключей, с которой нам разрешено работать — ожидайте неудачи:
127.0.0.1:6379> json.numincrby jsondocs:shouldbeok $.counter 2
(error) NOPERM this user has no permissions to run the 'json.numincrby' command or its subcommand
Документы Redis ACL: https://redis.io/docs/management/security/acl/