随着 Redis 6 的到来,带来了一些新的特性,以提高安全性和合规性。最容易解释的可能就是对 SSL 的支持,它使得你的应用服务器和 Redis 之间能够进行安全通信。但最值得注意的新特性是访问控制列表 (ACLs)。
使用 ACLs,你可以创建多个用户,并为每个用户指定登录密码以及他们被允许使用的键和命令。这使得实现安全特性变得轻而易举,例如:
这样的例子不胜枚举,但这三个例子应该足以让你开始思考。
在深入了解如何使用 ACLs 之前,让我们快速了解一下 ACLs 背后的技术含义。
第一个值得注意的点是,ACLs 是一个自包含的机制,你可以在服务器启动时选择启用它。这意味着如果你不启用 ACLs,就不会有性能损失,这对于那些将 Redis 用作高负载缓存引擎的用户来说至关重要。
第二点是,即使启用了 ACLs,它的开销也非常小。启用命令限制不需要任何模式匹配,因为 Redis 为每个用户维护一个已启用命令的位图,这使得检查速度极快。虽然启用键名限制需要模式匹配,但对于使用键前缀进行命名空间的常见用例来说,计算成本仍然微乎其微。
最后一点是关于代码本身。大部分与 ACLs 相关的代码位于 acl.c 文件中,这个文件只有不到 1,800 行 C 代码(截至发布时),这使得想要深入了解所使用工具的用户很容易查看这个特性。
在 v6 之前,Redis 没有用户概念,唯一的认证策略是单一的登录密码。为了让依赖旧有行为的现有代码库更顺畅地过渡,Redis 6 包含一个名为 ‘default’ 的默认用户.
这意味着通过为 ‘default’ 用户设置密码,以及任何你认为合适的命令或键限制,你就可以立即从旧版本无缝过渡到 Redis 6,而无需修改应用中的一行代码。
实际操作中,在 Redis 6 之前,AUTH 命令只接受一个参数:服务器密码。现在,在 Redis 6 中,AUTH 可以接受一个参数(为了向后兼容)或两个参数(用户名和密码)。当使用一个参数调用时,它会假定你提供的是 ‘default’ 用户的密码。
首先,让我们创建一个拥有所有权限的基本用户
127.0.0.1:6379> acl setuser antirez on >hunter2 allcommands allkeys
此命令创建一个名为 ‘antirez’ 的新用户,通过提供 ‘on’ 选项启用该用户进行登录,将用户密码设置为 ‘hunter2’,并启用所有权限。
使用相同的语法,还可以通过简单地串联你想要应用的更改来自由地修改用户设置
127.0.0.1:6379> acl setuser antirez nocommands +get +set
在此调用中,我们首先重置了已启用的命令列表(因此从允许所有命令变为不允许任何命令),然后我们启用了 GET 和 SET 命令。请注意,所有其他属性(用户是否启用、键模式限制)均未被触动。
现在让我们添加一些键的限制
127.0.0.1:6379> acl setuser antirez resetkeys ~secret ~redis:*
执行此命令后,用户将仅被允许对 ‘secret’ 键以及所有以 ‘redis:’ 为前缀的其他键执行 SET 和 GET 命令。
ACLs 的另一个重要特性是能够为用户设置强大的密码管理方案。
在之前的例子中,我们为用户 ‘antirez’ 设置了密码 ‘hunter2’。假设我们发现密码已被泄露,例如 在 IRC 上被公开,会发生什么呢?
合理的第一步是立即禁用该用户
127.0.0.1:6379> acl setuser antirez off
请注意,此命令不会覆盖现有的权限集,它只是禁用了用户登录的能力。完成此操作后,下一步是删除现有密码并添加新密码
127.0.0.1:6379> acl setuser antirez on resetpass >hunter3
通过此命令,我们重新启用了用户,删除了之前设置的任何密码,并添加了 ‘hunter3’,所有这些操作都在一个原子命令中完成。
假设过了一段时间,现在是时候用一个新密码替换 ‘hunter3’ 了。由于这次密码没有被泄露,我们希望在过渡过程中不引起服务中断。为了实现无缝过渡,我们需要在添加新密码的同时保留旧密码,直到所有服务都已更新到新密码:
127.0.0.1:6379> acl setuser antirez >newpass
运行此命令后,用户 ‘antirez’ 将能够使用 ‘hunter3’ 和 ‘newpass’ 进行认证。过渡完成后(即所有服务都已重启并正在使用新密码),是时候删除旧密码了:
127.0.0.1:6379> acl setuser antirez
至此,你就完成了。ACLs 还提供了通过哈希值管理密码的功能,无需记住明文密码,并提供了自动生成安全密码的工具。使用 ‘acl help’ 命令获取更多详情。
要试用 ACLs,你只需要 Redis 6。
虽然这只是对 ACLs 的简单介绍,但其使用场景肯定不止于此。与许多其他 Redis 特性一样,它们学习起来只需要片刻,但精通则需要更多时间。试试看如何将 ACLs 与你现有的用户管理方案集成,如果你有任何反馈,请在 Twitter 上告诉我们。