序章

Redis は、柔軟性、パフォーマンス、および幅広い言語サポートで知られるメモリ内のKey-Valueストアです。 このチュートリアルでは、Debian 9サーバーにRedisをインストール、設定、保護する方法を示します。

前提条件

このガイドを完了するには、sudo権限と基本ファイアウォールが構成されたroot以外のユーザーがいるDebian9サーバーにアクセスする必要があります。 これは、初期サーバーセットアップガイドに従ってセットアップできます。

開始する準備ができたら、sudo対応ユーザーとしてサーバーにログインし、以下に進みます。

ステップ1—Redisのインストールと設定

最新バージョンのRedisを入手するには、aptを使用して公式のDebianリポジトリからインストールします。

ローカルのaptパッケージキャッシュを更新し、次のように入力してRedisをインストールします。

  1. sudo apt update
  2. sudo apt install redis-server

これにより、Redisとその依存関係がダウンロードおよびインストールされます。 これに続いて、インストール中に自動的に生成されたRedis構成ファイルで行うべき重要な構成変更が1つあります。

お好みのテキストエディタでこのファイルを開きます。

  1. sudo nano /etc/redis/redis.conf

ファイル内で、supervisedディレクティブを見つけます。 このディレクティブを使用すると、initシステムを宣言してRedisをサービスとして管理し、その操作をより細かく制御できます。 supervisedディレクティブはデフォルトでnoに設定されています。 systemd initシステムを使用するDebianを実行しているので、これをsystemdに変更します。

/etc/redis/redis.conf
. . .

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised systemd

. . .

この時点でRedis構成ファイルに加える必要がある変更はこれだけなので、終了したら保存して閉じます。 次に、Redisサービスファイルをリロードして、構成ファイルに加えた変更を反映します。

  1. sudo systemctl restart redis

これで、Redisをインストールして構成し、マシン上で実行できるようになりました。 ただし、使用を開始する前に、まずRedisが正しく機能しているかどうかを確認することをお勧めします。

ステップ2—Redisのテスト

新しくインストールしたソフトウェアと同様に、構成をさらに変更する前に、Redisが期待どおりに機能していることを確認することをお勧めします。 このステップでは、Redisが正しく機能していることを確認するためのいくつかの方法について説明します。

まず、Redisサービスが実行されていることを確認します。

  1. sudo systemctl status redis

エラーなしで実行されている場合、このコマンドは次のような出力を生成します。

Output
● redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2018-09-05 20:19:44 UTC; 41s ago Docs: http://redis.io/documentation, man:redis-server(1) Process: 10829 ExecStopPost=/bin/run-parts --verbose /etc/redis/redis-server.post-down.d (code=exited, status=0/SUCCESS) Process: 10825 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS) Process: 10823 ExecStop=/bin/run-parts --verbose /etc/redis/redis-server.pre-down.d (code=exited, status=0/SUCCESS) Process: 10842 ExecStartPost=/bin/run-parts --verbose /etc/redis/redis-server.post-up.d (code=exited, status=0/SUCCESS) Process: 10838 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS) Process: 10834 ExecStartPre=/bin/run-parts --verbose /etc/redis/redis-server.pre-up.d (code=exited, status=0/SUCCESS) Main PID: 10841 (redis-server) Tasks: 3 (limit: 4915) CGroup: /system.slice/redis-server.service └─10841 /usr/bin/redis-server 127.0.0.1:6379 . . .

ここでは、Redisが実行されており、すでに有効になっていることがわかります。つまり、サーバーが起動するたびにRedisが起動するように設定されています。

注:この設定は、Redisの多くの一般的なユースケースに適しています。 ただし、サーバーが起動するたびに手動でRedisを起動する場合は、次のコマンドを使用してこれを設定できます。

  1. sudo systemctl disable redis

Redisが正しく機能していることをテストするには、コマンドラインクライアントを使用してサーバーに接続します。

  1. redis-cli

次のプロンプトで、pingコマンドを使用して接続をテストします。

  1. ping
Output
PONG

この出力は、サーバー接続がまだ有効であることを確認します。 次に、以下を実行してキーを設定できることを確認します。

  1. set test "It's working!"
Output
OK

次のように入力して値を取得します。

  1. get test

すべてが機能していると仮定すると、保存した値を取得できます。

Output
"It's working!"

値をフェッチできることを確認したら、Redisプロンプトを終了してシェルに戻ります。

  1. exit

最後のテストとして、Redisがデータを停止または再起動した後もデータを保持できるかどうかを確認します。 これを行うには、最初にRedisインスタンスを再起動します。

  1. sudo systemctl restart redis

次に、コマンドラインクライアントにもう一度接続し、テスト値がまだ使用可能であることを確認します。

  1. redis-cli
  1. get test

キーの値は引き続きアクセス可能である必要があります。

Output
"It's working!"

終了したら、シェルに戻ります。

  1. exit

これで、Redisのインストールは完全に機能し、すぐに使用できるようになります。 ただし、デフォルトの構成設定の一部は安全ではなく、悪意のある攻撃者にサーバーとそのデータへの攻撃とアクセスの機会を提供します。 このチュートリアルの残りの手順では、公式Redis Webサイトで規定されているように、これらの脆弱性を軽減する方法について説明します。 これらの手順はオプションであり、従わないことを選択した場合でもRedisは機能しますが、システムのセキュリティを強化するために、強く実行することをお勧めします。

ステップ3—ローカルホストへのバインド

デフォルトでは、Redisはlocalhostからのみアクセスできます。 ただし、これとは異なるチュートリアルに従ってRedisをインストールおよび構成した場合は、どこからでも接続できるように構成ファイルを更新した可能性があります。 これは、localhostへのバインドほど安全ではありません。

これを修正するには、編集用にRedis構成ファイルを開きます。

  1. sudo nano /etc/redis/redis.conf

この行を見つけて、コメントが外されていることを確認します(#が存在する場合は削除します)。

/etc/redis/redis.conf
bind 127.0.0.1

終了したらファイルを保存して閉じます(CTRL + XYENTERの順に押します)。

次に、サービスを再起動して、systemdが変更を読み取るようにします。

  1. sudo systemctl restart redis

この変更が有効になったことを確認するには、次のnetstatコマンドを実行します。

  1. sudo netstat -lnp | grep redis
Output
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 10959/redis-server

この出力は、redis-serverプログラムがlocalhost 127.0.0.1)にバインドされていることを示しており、構成ファイルに加えた変更を反映しています。 その列に別のIPアドレス(0.0.0.0など)が表示されている場合は、正しい行のコメントを解除したことを再確認して、Redisサービスを再起動する必要があります。

Redisインストールがlocalhostでのみリッスンしているため、悪意のある攻撃者がサーバーにリクエストを送信したり、サーバーにアクセスしたりすることがより困難になります。 ただし、Redisは現在、構成または保持するデータを変更する前にユーザーが自分自身を認証することを要求するように設定されていません。 これを解決するために、Redisでは、Redisクライアント(redis-cli)を介して変更を加える前に、ユーザーにパスワードによる認証を要求することができます。

ステップ4—Redisパスワードの設定

Redisパスワードを設定すると、2つの組み込みセキュリティ機能の1つであるauthコマンドが有効になります。このコマンドでは、クライアントがデータベースにアクセスするために認証する必要があります。 パスワードはRedisの構成ファイル/etc/redis/redis.confで直接構成されているため、お好みのエディターでそのファイルを再度開きます。

  1. sudo nano /etc/redis/redis.conf

SECURITYセクションまでスクロールし、次のようなコメント付きディレクティブを探します。

/etc/redis/redis.conf
# requirepass foobared

#を削除してコメントを解除し、foobaredを安全なパスワードに変更します。

注: redis.confファイルのrequirepassディレクティブの上に、コメント付きの警告があります。

# 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.
#

したがって、パスワードとして非常に強力で非常に長い値を指定することが重要です。 次の例のように、自分でパスワードを作成するのではなく、opensslコマンドを使用してランダムなパスワードを生成できます。 ここに示すように、最初のコマンドの出力を2番目のopensslコマンドにパイプすることにより、最初のコマンドによって生成された改行をすべて削除します。

  1. openssl rand 60 | openssl base64 -A

出力は次のようになります。

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

そのコマンドの出力をrequirepassの新しい値としてコピーして貼り付けた後、次のようになります。

/etc/redis/redis.conf
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

パスワードを設定したら、ファイルを保存して閉じ、Redisを再起動します。

  1. sudo systemctl restart redis.service

パスワードが機能することをテストするには、Redisコマンドラインにアクセスします。

  1. redis-cli

以下に、Redisパスワードが機能するかどうかをテストするために使用される一連のコマンドを示します。 最初のコマンドは、認証前にキーを値に設定しようとします。

  1. set key1 10

認証しなかったため、これは機能しません。そのため、Redisはエラーを返します。

Output
(error) NOAUTH Authentication required.

次のコマンドは、Redis構成ファイルで指定されたパスワードで認証します。

  1. auth your_redis_password

Redisは次のことを認めています。

Output
OK

その後、前のコマンドを再度実行すると成功します。

  1. set key1 10
Output
OK

get key1はRedisに新しいキーの値を問い合わせます。

  1. get key1
Output
"10"

認証後にRedisクライアントでコマンドを実行できることを確認したら、redis-cliを終了できます。

  1. quit

次に、誤って入力したり、悪意のある攻撃者が入力したりすると、マシンに重大な損傷を与える可能性のあるRedisコマンドの名前を変更する方法について説明します。

ステップ5—危険なコマンドの名前を変更する

Redisに組み込まれている他のセキュリティ機能には、危険と見なされる特定のコマンドの名前を変更するか、完全に無効にすることが含まれます。

許可されていないユーザーが実行した場合、このようなコマンドを使用して、データを再構成、破棄、またはその他の方法でワイプすることができます。 認証パスワードと同様に、コマンドの名前変更または無効化は、/etc/redis/redis.confファイルの同じSECURITYセクションで構成されます。

危険と見なされるコマンドには、 FLUSHDB FLUSHALL KEYS PEXPIRE DEL CONFIG SHUTDOWN BGREWRITEAOF BGSAVE SAVE SPOP 、[X252X ] SREM