序章

Redisは、メモリ内、NoSQL、Key-Valueキャッシュおよびストアであり、ディスクに永続化することもできます。 信頼できるクライアント信頼できる環境で使用するように設計されており、独自の堅牢なセキュリティ機能はありません。 その点を強調するために、公式RedisWebサイトからの引用を次に示します。

Redisは、信頼できる環境内の信頼できるクライアントがアクセスできるように設計されています。 つまり、通常、Redisインスタンスをインターネットに直接公開したり、一般に、信頼できないクライアントがRedisTCPポートまたはUNIXソケットに直接アクセスできる環境に公開したりすることはお勧めできません。

. . .

一般に、Redisは最大のセキュリティのために最適化されていませんが、最大のパフォーマンスとシンプルさのために最適化されています。

それにもかかわらず、Redisにはいくつかの基本的なセキュリティ機能が組み込まれています。 これには、暗号化されていないパスワードを作成する機能や、コマンドの名前を変更したり無効にしたりする自由が含まれます。 特に、それは真のアクセス制御システムを欠いています。

これらの機能だけでは、Redisインストールのセキュリティを確保することはできません。 ただし、それらを構成することは、データベースを完全に保護されていないままにすることからの大きなステップです。

このチュートリアルでは、Redisが持ついくつかのセキュリティ機能を構成する方法を読み、システムの構成にいくつかの変更を加えて、UbuntuサーバーへのスタンドアロンRedisインストールのセキュリティ体制を強化します。

このガイドは、Redisサーバーとクライアントアプリケーションが異なるホストまたは異なるデータセンターにある状況には対応していないことに注意してください。 Redisトラフィックが安全でない、または信頼できないネットワークを通過する必要があるインストールでは、ここに示すものに加えて、Redisマシン間にSSLプロキシまたは VPN を設定するなど、まったく異なる構成のセットが必要です。

前提条件

このチュートリアルでは、次のものが必要です。

  • Ubuntu18.04サーバー。 このサーバーには、sudo権限を持つ非rootユーザーと、UFWでセットアップされたファイアウォールが必要です。これは Ubuntu18.04[X198Xの初期サーバーセットアップガイド]に従って構成できます。

  • サーバーにRedisがインストールおよび構成されています。 これは、Ubuntu18.04サーバー用のこのガイドに従って設定できます。

ステップ1—Redisが実行されていることを確認する

まず、root以外のユーザーを使用してサーバーにSSHで接続します。

Redisが機能していることを確認するには、redis-cliコマンドでRedisコマンドラインを開きます。

  1. redis-cli

:Redisのパスワードをすでに設定している場合は、接続後にauthコマンドで認証する必要があります。

  1. auth your_redis_password
Output
OK

Redisのパスワードを設定していない場合は、このチュートリアルのステップ4でその方法を読むことができます。

pingコマンドを使用して接続をテストします。

  1. ping

Redisが正しく機能している場合は、次のように表示されます。

Output
PONG

これに続いて、Redisコマンドラインを終了します。

  1. quit

Redisが正常に実行され、機能していることを確認したので、サーバーのセキュリティを強化するための最も重要な手順であるファイアウォールの構成に進むことができます。

ステップ2—UFWでサーバーを保護する

Redisは、サーバー上で実行されている単なるアプリケーションです。 独自の基本的なセキュリティ機能はわずかしかないため、真にセキュリティを確保するための最初のステップは、実行中のサーバーをセキュリティで保護することです。 Ubuntu 18.04サーバーのような公開サーバーの場合、 Ubuntu 18.04の初期サーバーセットアップガイドで説明されているようにファイアウォールを構成することが、その最初のステップです。 まだ行っていない場合は、そのリンクをたどってファイアウォールを今すぐ設定してください。

ファイアウォールを設定したかどうか、またはファイアウォールがアクティブかどうかわからない場合は、次のコマンドを実行してこれを確認できます。

  1. sudo ufw status

Ubuntu 18.04の初期サーバーセットアップガイドに従った場合、次の出力が表示されます。

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

そのガイドを使用してファイアウォールルールを実装した場合、明示的に許可されていない限り、デフォルトではUFWがすべての着信トラフィックをドロップするため、Redisにルールを追加する必要はありません。 Redisサーバーのデフォルトのスタンドアロンインストールはループバックインターフェイス(127.0.0.1またはlocalhost )でのみリッスンしているため、デフォルトのポートでの着信トラフィックについて心配する必要はありません。

ルールを追加する方法の詳細については、この一般的なUFWルールとコマンドに関するガイドを参照してください。

ステップ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 2855/redis-server 1

この出力は、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ディレクティブの上に、コメント付きの警告があります。

/etc/redis/redis.conf
# 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