Redis 6.0新特性——ACLs
2664 ワード
Redis 6.0の新しい特性の紹介
2019年ニューヨークのRedis DayでSalvatore Sanfilippo(AKA Antirez)が発表するRedis 6.0の新しい特性を紹介した.以下はACLsの聞き取りについてです.
ACLsの概要
この10年間、Redisにはこのような問題がありました.
ユーザがFLUSHALL
を実行すると、OKはデータベース全体が空になったり、DEBUG SEGFAULT
を実行したりして、Redisのプロセスはcrashによって終了します.
以前にこの問題を解決する方法は、Redis構成で危険コマンドをrenameすることであった可能性があります.rename-command FLUSHALL ""
これにより、コマンドをランダム文字列に変更したり、必要に応じて直接マスクしたりします.
危険なコマンド管理が欠けていると、ネットワーク上のライブラリを使用している場合、FLUSHALL
というコマンドを追加するかどうか分からないか、外部コードを使用するたびにCode Reviewを実行することもできます.
ACLsがあれば、次のように制御できます.
この接続では、RPOP
LPUSH
のコマンドのみが使用でき、他のコマンドは呼び出せません.
便利ではないでしょうか.ACLsがどのように働いているか見てみましょう.
ベストプラクティス
まず、ユーザーを定義します.
ログインすると、旧バージョンのデフォルトユーザー(defaule user)は何でもできます.Redis 6.0ではデフォルトユーザーを定義できます.127.0.0.1:6379> ACL setuser antirez on >password1 >password2 >foobar +@all ~*
ACL setuser antirez on
setuser
...on
はこのユーザーを有効にすることを示し、offは使用できないユーザーを1つだけ定義します.>password1 >password2 >foobar
は、3つのパスワードが設定されており、パスワードの交代ポリシーに使用できることを示しています.+@all
は、ユーザがすべての権限を使用できることを示し、+
の後に+get
、または+@
の後にある種類の権限が続く.~*
は、利用可能なキー名を表し、ここでは*
、すなわち、すべてのキーがアクセス可能である.127.0.0.1:6379> ACL WHOAMI
"default"
デフォルトのユーザーの下で、ユーザーを切り替えます.127.0.0.1:6379> AUTH antirez foobar
OK
以前はAUTHの後ろに直接パスワードがついていましたが、今はユーザー名とパスワードです.127.0.0.1:6379> ACL WHOAMI
"antirez"
このユーザーには、すべてのコマンドが使用可能+すべてのキーが表示されるように設定されていたため、defaultユーザーとは変わりません.127.0.0.1:6379> GET foo
(nil)
127.0.0.1:6379> SET foo bar
OK
権限をいくつか削除します.127.0.0.1:6379> ACL setuser antirez -SET
このユーザーのSET
権限を削除すると、この操作はできません.127.0.0.1:6379> GET foo
"bar"
127.0.0.1:6379> SET foo 123
(error) NOPERM this user has no permissions to run the 'set' command or its subcommand
今のACLリストをもう一度見てみましょう.127.0.0.1:6379> ACL list
1) "user antirez on >password1 >password2 >foobar ~* +@all -set"
2) "user default on nopass ~* +@all"
同様に、ユーザーが任意のコマンドを使用できるように制限することもできますが、object*
のような一部のキーしか表示できません.
コメント
ACLsの実装では、コマンドのビットマップ(commands’bitmaps)を使用して、速度が低下しないようにする小さなテクニックが使用されています.ACLsを使わないと元のRedis 5と同じで、ACLsを使うと当然追加のオーバーヘッドがありますが、非常に小さく、benchmarksでは新旧バージョンの違いに気づかないでしょう.
rename-command FLUSHALL ""
127.0.0.1:6379> ACL setuser antirez on >password1 >password2 >foobar +@all ~*
ACL setuser antirez on
127.0.0.1:6379> ACL WHOAMI
"default"
127.0.0.1:6379> AUTH antirez foobar
OK
127.0.0.1:6379> ACL WHOAMI
"antirez"
127.0.0.1:6379> GET foo
(nil)
127.0.0.1:6379> SET foo bar
OK
127.0.0.1:6379> ACL setuser antirez -SET
127.0.0.1:6379> GET foo
"bar"
127.0.0.1:6379> SET foo 123
(error) NOPERM this user has no permissions to run the 'set' command or its subcommand
127.0.0.1:6379> ACL list
1) "user antirez on >password1 >password2 >foobar ~* +@all -set"
2) "user default on nopass ~* +@all"