Redisの外部接続は、若干複雑です。
Redisに限らず、MySQLやPostgreSQLなども同じと言えます。
やはり、外部からの接続となるとセキュリティが前面に出来てきます。
同一マシン上なら意識する必要がないことも、意識せざるを得ません。
この記事では、その複雑な設定を詳しく解説しています。
その解説を見れば、Redisへの安全な外部接続ができるようになります。
本記事の内容
- Redis設定ファイルの変更
- Redis設定ファイルの反映
- ファイアウォールでポート開放
- 外部接続確認
それでは、上記に沿って解説していきます。
Redis設定ファイルの変更
大前提として、Redisはインストールしておいてください。
次の記事でUbuntuへのインストールを解説しています。
aptコマンドでインストールした場合、設定ファイルは次の場所にあります。
/etc/redis/redis.conf
デフォルトでは、この設定ファイルを読み込んでいます。
Redisでの設定ファイルの変更は、次の2つの意味があります。
- /etc/redis/redis.confの変更
- Redis起動時に設定ファイルの指定(別の設定ファイル指定)
今回は、/etc/redis/redis.confを変更する方法で対応します。
なぜなら、起動時にオプションを付けるのはトラブルの元になりかねないからです。
まずは、バックアップを取っておきます。
$ sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.org
では、設定ファイルを変更します。
今回は、外部接続を許可することが目的です。
そのための設定に絞って対応します。
この場合に注目するべき値は、次の4つです。
- protected-mode
- bind
- port
- requirepass
それぞれを以下で確認します。
protected-mode
実質、外部接続を許可するかどうかの設定です。
デフォルトは、以下の設定となります。
protected-mode yes
YESなので、プロテクトモードがONの状態です。
ONであれば、外部接続が不可となります。
外部接続を許可するには、OFFにする必要があります。
OFFにするには、「no」を設定します。
protected-mode no
bind
bindするネットワークのインターフェースを限定できます。
つまり、外部接続を許可するホストのIPを設定します。
デフォルトの設定は、以下。
bind 127.0.0.1 -::1
デフォルトでは、同一マシン上からのアクセスのみ許可しています。
IPv4とIPv6の両方が設定されていることになります。
IPアドレスの指定は、次のようにスペース区切りで行います。
bind 192.168.11.1 192.168.11.2 127.0.0.1 -::1
すべてのIPアドレス(すべてのインターフェース)を許可する場合は、次のように指定します。
bind * -::*
port
クライアント向けの開放ポートの設定です。
デフォルトは、次に設定となります。
port 6379
変更したければ、変更しましょう。
デフォルトのポートを変更することも、セキュリティ対策の一つと言えます。
ただ、個人的にはデフォルトポートは変更しません。
requirepass
接続する際に必要となるパスワードです。
デフォルトでは、設定されていません。
項目自体が存在してないということです。
したがって、デフォルトではパスワードなしで接続可能です。
外部接続を許可する場合には、必ずパスワードを設定しましょう。
requirepass my_password
まとめ
求めるセキュリティのレベルで設定内容は、変わってくるでしょう。
基本的には、上記の値を触ることで対応可能です。
今回は、次の設定を行います。
各自で設定は変更してください。
protected-mode no bind * -::* port 6379 requirepass my_password
bindの設定が危険に思うかもしれません。
しかし、ちゃんとアクセスを許可するホストは設定します。
それは、ファイアウォールかもしれません。
もしくは、hosts.allowかもしれません。
それぞれの状況で制御する場所は、異なってくるでしょう。
一つ言えるのは、ホスト制限は出来る限り集中管理すべきということです。
以上、Redis設定ファイルの変更を説明しました。
次は、Redisを再起動して設定ファイルを反映させます。
Redis設定ファイルの反映
Redis設定ファイルを反映するには、Redisを再起動する必要があります。
Reiedisの再起動は、次のコマンドで行います。
$ sudo /etc/init.d/redis-server restart
ここで注意が必要です。
以下に示すコマンドの組み合わせでは、設定ファイルは反映されません。
次のコマンドでRedisを停止できます。
$ redis-cli shutdown
起動は、次のコマンドで実施できます。
$ redis-server
上記コマンドを組み合わせても、Redisの再起動は可能です。
しかし、この組み合わせでの再起動では、設定ファイルに何も反映されません。
よって、設定ファイルの反映には、「/etc/init.d/redis-server」を利用しましょう。
以上、Redis設定ファイルの反映について説明しました。
次は、ファイアウォールの開放を行います。
ファイアウォールでポート開放
Redisの初期ポートを変更していないなら、次のコマンドで状況を確認可能です。
$ sudo ufw status | grep '6379'
何も表示されないなら、「6379」は未開放という状況になります。
なお、「ufw」コマンドが動かない場合は、次の記事をご覧ください。
「ファイアウォールの設定」の箇所に、「ufw」のインストールについて説明があります。
「ufw」コマンドが動くなら、次のコマンドを実行します。
$ sudo ufw allow 6379
では、確認です。
$ sudo ufw status | grep '6379' 6379 ALLOW Anywhere 6379 (v6) ALLOW Anywhere (v6)
ポートが、開放されていますね。
以上、ファイアウォールの開放について説明しました。
最後に、外部接続の動作確認を行います。
外部接続確認
動作確認を行うためには、先ほど作業していたサーバーとは別のサーバーにアクセスします。
別サーバーで「redis-cli」コマンドが利用できるなら、それで試すのはOKです。
しかし、普通はRedisのクライアントだけインストールという状況はなかなかありません。
外部接続を行う以上は、プログラムからの接続が前提になるでしょう。
そこでプログラムで外部接続を確認することにします。
実際、その使い方がメインになるはずです。
その場合、次の記事を参考にしてください。
比較的容易に外部接続を検証できる方法です。
インストールするライブラリも1個だけになります。
ただ、上記記事では、同一マシン上でのPythonからRedisへの接続を説明しています。
Redisへの接続部分でパラメータが若干異なります。
変更したコードは、以下。
import redis r = redis.Redis( host='192.168.33.110', port=6379, password='my_password', db=0 ) # SET r.set('key', 12345) # GET(byte型で戻す) res = r.get('key') print(res) r.close()
変更箇所は次の2点。
- hostが「localhost」から「192.168.33.110」に変更
- passwordの引数項目が追加
192.168.33.110は、RedisがインストールされているサーバーのIPアドレスです。
ここは、各自の環境に合わせて変更しましょう。
外部接続を許可するなら、パスワードは必須としました。
「requirepass my_password」とRedis設定ファイルに記載したパスワードを利用します。
上記サンプルコードを実行して、次の結果が表示されれば動作確認はOKです。
b'12345'
以上、外部接続の動作確認に関しての説明でした。