Redisの基本的なセキュリティ設定をまとめます。ACLはRedis 6.0以上の機能で、ユーザ単位でアクセス可能なkeyと使用可能なコマンドを制御する事ができます。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
動作確認済環境
- Ubuntu 18.04
- Redis 7.0.5
危険コマンドの使用禁止
危険性の説明
Redisのコマンドの中には、一般ユーザに権限を与えるのが危険なものもあります。例えば、CONFIGコマンドは設定を取得したり再起動なしに動的に設定を変更したりする事ができます。
例えば、以下のように設定値を閲覧する事ができます。
[root@linux010 ~]# redis-cli 127.0.0.1:6379> CONFIG GET save 1) "save" 2) "900 1 300 10 60 10000" 127.0.0.1:6379>
以下のように設定を変更する事もできます。
[root@linux010 ~]# redis-cli 127.0.0.1:6379> CONFIG SET save "1 1000" OK 127.0.0.1:6379>
危険コマンドの禁止方法
rename-commandという設定を使用すると、危険コマンドの使用を防げます。例えば、/etc/redis.confで以下のように設定すると、CONFIGコマンドは使用不能になり、代わりにMY_CONFIGというコマンドを使用すれば設定変更が可能になります。このようにする事で、MY_CONFIGを使用するという事を知らない管理者は設定変更ができなくなります。
rename-command CONFIG MY_CONFIG
以下のようにrename-commandで空文字列を指定すると、コマンドそのものが使用不能になります。
rename-command CONFIG ""
それでは動作確認をしてみましょう。テキストエディタで/etc/redis.confを編集し、「rename-command CONFIG “”」を加筆します。
vi /etc/redis.conf <omitted> # Command renaming. # # It is possible to change the name of dangerous commands in a shared # environment. For instance the CONFIG command may be renamed into something # hard to guess so that it will still be available for internal-use tools # but not available for general clients. # # Example: # # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 # # It is also possible to completely kill a command by renaming it into # an empty string: # # rename-command CONFIG "" # # Please note that changing the name of commands that are logged into the # AOF file or transmitted to replicas may cause problems. rename-command CONFIG ""
redisを再起動します。
systemctl restart redis.service
CONFIGコマンドが使用不能になった事が分かります。
[root@linux010 ~]# redis-cli 127.0.0.1:6379> CONFIG GET save (error) ERR unknown command `CONFIG`, with args beginning with: `GET`, `save`, 127.0.0.1:6379>
パスワード認証
パスワード認証の設定
デフォルトの状態では、Redisは認証の設定がなされていません。そのため、誰でも値の読み書きができるリスクがあります。このようなリスクに対応するため、パスワード認証を設定する事もできます。
テキストエディタで/etc/redis.confを編集し、「requirepass」を加筆します。以下はパスワード「P@ssw0rd」を設定する操作例です。
vi /etc/redis.conf <omitted> ################################## SECURITY ################################### # Require clients to issue AUTH <PASSWORD> before processing any other # commands. This might be useful in environments in which you do not trust # others with access to the host running redis-server. # # This should stay commented out for backward compatibility and because most # people do not need auth (e.g. they run their own servers). # # Warning: since Redis is pretty fast an outside user can try up to # 150k passwords per second against a good box. This means that you should # use a very strong password otherwise it will be very easy to break. # # requirepass foobared requirepass P@ssw0rd <omitted>
パスワード認証の動作確認
パスワード認証設定後は、パスワード未入力の状態での操作が禁止されるようになりました。
[root@linux010 ~]# redis-cli 127.0.0.1:6379> SET foo baa (error) NOAUTH Authentication required. 127.0.0.1:6379>
パスワード認証を行うにはAUTHコマンドを使用します。認証後は、Redis Serverに対する操作が可能になります。
[root@linux010 ~]# redis-cli 127.0.0.1:6379> AUTH P@ssw0rd OK 127.0.0.1:6379> SET foo baa OK 127.0.0.1:6379>
次の検証シナリオ「ACL」を試す方は、rename-commandとrequirepassの設定を削除してください。また、「ACL」の動作確認をするには、Redis 6.0以上が必要です。
ACL
ACLの初期設定
Redis 6.0以降ではACLの定義が可能です。ACLはユーザ単位でアクセスなキーや使用可能なコマンドを定義できます。ACLの設定はACL LSTコマンドで確認できます。初期設定は以下の通りです。
127.0.0.1:6379> ACL list 1) "user default on nopass ~* &* +@all" 127.0.0.1:6379>
この状態でユーザを1人追加してみましょう。ACL SETUSERコマンドでユーザの追加が可能です。
ACL SETUSER alice
ユーザ追加直後の権限は以下のように示されます。この状態でユーザ「alice」は一切の操作ができません。
127.0.0.1:6379> ACL list 1) "user alice off resetchannels -@all" 2) "user default on nopass ~* &* +@all" 127.0.0.1:6379>
ACLの設定
ACLを定義するには以下のような構文を使用します。
ACL SETUSER username [rule [rule ...]]
ruleの書式は以下の通りです。例えば、「+」で始まる指定は使用可能なコマンドを意味し、「+get」と記述すればGETコマンドが使用可能になります。
指定方法 | 意味 |
---|---|
on / off | ユーザが有効か否か |
+<command> | 指定したコマンドが使用可能になる。「|」併用で複数指定も可能(例:+get|config) |
-<command> | 指定したコマンドが使用不能になる(要Redis 7.0以上) |
+@<category> | 指定したカテゴリのコマンドが使用可能になる |
-@<category> | 指定したカテゴリのコマンドが使用不能になる |
~<pattern> | 指定したパターンのキーに読み取りと書き込みアクセス可能になる |
%R~<pattern> | 指定したパターンのキーに読み取りアクセス可能になる(要Redis 7.0以上) |
%W~<pattern> | 指定したパターンのキーに書き込みアクセス可能になる(要Redis 7.0以上) |
%RW~<pattern> | 指定したパターンのキーに読み取りと書き込みアクセス可能になる(要Redis 7.0以上) |
&<pattern> | 指定したchannelに対してPUBLISH/SUBSCRIBEが可能になる |
allchannels | すべてのchannelに対してPUBLISH/SUBSCRIBEが可能になる |
resetchannels | すべてのchannelに対してPUBLISH/SUBSCRIBEが不能になる |
><password> | 平文パスワードを設定する |
#<password> | SHA-256パスワードを設定する |
nopass | パスワードなしでアクセス可能になる |
ユーザ「Alice」に対して権限を付与します。以下操作例は、パスワード「p1pp0」を設定し、キー「cached:*」に対してコマンド「GET」の発行を許可します。
ACL SETUSER alice on >p1pp0 ~cached:* +get
ACLの動作確認
ACLの動作確認をします。確かに、キー「cache:*」のみに対してアクセスが許可され、GETコマンドのみが許可されている事が分かります。
azureuser@linux010:~$ redis-cli 127.0.0.1:6379> AUTH alice p1pp0 OK 127.0.0.1:6379> GET baa (error) NOPERM this user has no permissions to access one of the keys used as arguments 127.0.0.1:6379> GET foo (error) NOPERM this user has no permissions to access one of the keys used as arguments 127.0.0.1:6379> GET cached:123 (nil) 127.0.0.1:6379> SET cached:123 zap (error) NOPERM this user has no permissions to run the 'set' command 127.0.0.1:6379>