Introduction

Redis は、キャッシュに優れたオープンソースのメモリ内Key-Valueデータストアです。 非リレーショナルデータベースであるRedisは、その柔軟性、パフォーマンス、スケーラビリティ、および幅広い言語サポートで知られています。

Redisは、信頼できる環境で信頼できるクライアントが使用できるように設計されており、独自の堅牢なセキュリティ機能はありません。 ただし、Redisには、いくつかのセキュリティ機能があります。たとえば、基本的な暗号化されていないパスワードや、コマンドの名前変更や無効化などです。 このチュートリアルでは、Redisをインストールしてこれらのセキュリティ機能を設定する方法について説明します。 また、CentOS8でのスタンドアロンRedisインストールのセキュリティを強化できる他のいくつかの設定についても説明します。

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

Prerequisites

このチュートリアルを完了するには、CentOS8を実行しているサーバーが必要です。 このサーバーには、管理者権限を持つroot以外のユーザーと、で構成されたファイアウォールが必要です。 firewalld. これを設定するには、CentOS8初期サーバーセットアップガイドに従ってください。

Step 1 — Installing and Starting Redis

RedisはDNFパッケージマネージャーを使用してインストールできます。 次のコマンドは、Redisとその依存関係をインストールし、 nano、ユーザーフレンドリーなテキストエディタ。 インストールする必要はありません nano、ただし、このガイド全体の例で使用します。

  1. sudo dnf install redis nano

このコマンドは、選択したパッケージをインストールすることを確認するためのプロンプトを表示します。 プレス y それから ENTER そうするために:

Output
. . . Total download size: 1.5 M Installed size: 5.4 M Is this ok [y/N]: y

これに続いて、インストール中に自動的に生成されたRedis構成ファイルで行うべき重要な構成変更が1つあります。

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

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

ファイル内で、 supervised 指令。 このディレクティブを使用すると、initシステムを宣言してRedisをサービスとして管理できるようになり、その操作をより細かく制御できるようになります。 The supervised ディレクティブはに設定されます no デフォルトでは。 systemd initシステムを使用するCentOSを実行しているため、これを次のように変更します。 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構成ファイルに加える必要がある変更はこれだけなので、終了したら保存して閉じます。 使用した場合 nano ファイルを編集するには、を押して編集します CTRL + X, Y、 それから ENTER.

ファイルを編集した後、Redisサービスを開始します。

  1. sudo systemctl start redis.service

起動時にRedisを起動する場合は、 enable 指図:

  1. sudo systemctl enable redis

このコマンドには、 .service ユニットファイル名の後の接尾辞。 通常、この接尾辞はオフのままにしておくことができます systemctl 通常、systemdと対話するときに暗示されるコマンド。

次のコマンドを実行して、Redisのステータスを確認できます。

  1. sudo systemctl status redis
Output
● redis.service - Redis persistent key-value database Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/redis.service.d └─limit.conf Active: active (running) since Wed 2020-09-30 20:05:24 UTC; 13s ago Main PID: 13734 (redis-server) Tasks: 4 (limit: 11489) Memory: 6.6M CGroup: /system.slice/redis.service └─13734 /usr/bin/redis-server 127.0.0.1:6379

Redisが実際に実行されていることを確認したら、次のコマンドを使用してその機能をテストできます。

  1. redis-cli ping

これは印刷する必要があります PONG 応答として:

Output
PONG

この場合は、サーバーでRedisを実行していることを意味し、セキュリティを強化するためにサーバーの構成を開始できます。

ステップ2—Redisを構成してファイアウォールで保護する

Redisを保護する効果的な方法は、Redisを実行しているサーバーを保護することです。 これを行うには、RedisがローカルホストまたはプライベートIPアドレスのいずれかにのみバインドされていること、およびサーバーにファイアウォールが稼働していることを確認します。

ただし、別のチュートリアルを使用してRedisをセットアップすることを選択した場合は、どこからでも接続できるように構成ファイルを更新した可能性があります。 これは、ローカルホストまたはプライベートIPへのバインドほど安全ではありません。

これを修正するには、お好みのテキストエディタでRedis設定ファイルをもう一度開きます。

  1. sudo nano /etc/redis.conf

で始まる行を見つけます bind コメントがないことを確認してください。

/etc/redis.conf
. . .
bind 127.0.0.1

別のホストからRedisにアクセスする場合のように、Redisを別のIPアドレスにバインドする必要がある場合は、強くプライベートIPアドレスにバインドすることをお勧めします。 パブリックIPアドレスにバインドすると、Redisインターフェースが外部の関係者に公開される可能性が高くなります。

/etc/redis.conf
. . .
bind your_private_ip

確認後 bind ディレクティブはコメントアウトされていません。ファイルを保存して閉じることができます。

前提条件の初期サーバーセットアップチュートリアルに従い、サーバーにfirewalldをインストールし、別のホストからRedisに接続する予定がない場合は、Redisにファイアウォールルールを追加する必要はありません。 。 結局のところ、ファイアウォールルールで明示的に許可されていない限り、着信トラフィックはデフォルトでドロップされます。 Redisサーバーのデフォルトのスタンドアロンインストールはループバックインターフェイスでのみリッスンしているため(127.0.0.1 またはlocalhost)、デフォルトのポートでの着信トラフィックの心配はありません。

ただし、別のホストからRedisにアクセスする予定がある場合は、 firewall-cmd 指図。 繰り返しになりますが、サービスが公開されるホストの数を制限するために、プライベートIPアドレスを使用してホストからのRedisサーバーへのアクセスのみを許可する必要があります。

まず、Firewalldポリシーに専用のRedisゾーンを追加します。

  1. sudo firewall-cmd --permanent --new-zone=redis

次に、開くポートを指定します。 Redisはポートを使用します 6379 デフォルト:

  1. sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp

次に、ファイアウォールを通過してRedisにアクセスできるようにするプライベートIPアドレスを指定します。

  1. sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP

これらのコマンドを実行した後、ファイアウォールをリロードして新しいルールを実装します。

  1. sudo firewall-cmd --reload

この構成では、ファイアウォールがクライアントのIPアドレスからのパケットを検出すると、専用のRedisゾーンのルールをその接続に適用します。 他のすべての接続はデフォルトで処理されます public ゾーン。 デフォルトゾーンのサービスは、明示的に一致しない接続だけでなく、すべての接続に適用されるため、他のサービスを追加する必要はありません(例: SSH)これらのルールがその接続に自動的に適用されるため、Redisゾーンに接続します。

使用するかどうかに関係なく、ファイアウォールツールの使用は機能することに注意してください firewalld, ufw、 また iptables. 重要なのは、ファイアウォールが稼働していて、未知の個人がサーバーにアクセスできないようにすることです。 次のステップでは、強力なパスワードでのみアクセスできるようにRedisを設定します。

Step 3 — Configuring a Redis Password

Redisパスワードを設定すると、組み込みのセキュリティ機能の1つである auth コマンド—データベースへのアクセスを許可する前にクライアントが認証する必要があります。 以下のような bind 設定すると、パスワードはRedisの構成ファイルで直接構成されます。 /etc/redis.conf. そのファイルを再度開きます。

  1. sudo nano /etc/redis.conf

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

/etc/redis.conf
. . .
# requirepass foobared

を削除してコメントを外します #、および変更 foobared 選択した非常に強力なパスワードに。

:自分でパスワードを作成するのではなく、次のようなツールを使用できます。 apg また pwgen 1つを生成します。 ただし、パスワードを生成するためだけにアプリケーションをインストールしたくない場合は、以下のコマンドを使用できます。 このコマンドは文字列値をエコーし、それを以下にパイプします sha256sum コマンド。文字列のSHA256チェックサムを表示します。

このコマンドを記述どおりに入力すると、毎回同じパスワードが生成されることに注意してください。 一意のパスワードを作成するには、引用符で囲まれた文字列を他の単語またはフレーズに変更します。

  1. echo "digital-ocean" | sha256sum

生成されたパスワードは発音できませんが、非常に強力で長くなります。これは、Redisに必要なパスワードのタイプとまったく同じです。 そのコマンドの出力をコピーして貼り付けた後、の新しい値として requirepass、次のようになります。

/etc/redis.conf
. . .
requirepass password_copied_from_output

または、短いパスワードが必要な場合は、代わりに次のコマンドの出力を使用できます。 繰り返しますが、引用符で囲まれた単語を変更して、次のコマンドと同じパスワードが生成されないようにします。

  1. echo "digital-ocean" | sha1sum

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

  1. sudo systemctl restart redis

パスワードが機能することをテストするには、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

The get key1 コマンドはRedisに新しいキーの値を問い合わせます:

  1. get key1
Output
"10"

この最後のコマンドは終了します redis-cli. 使用することもできます exit:

  1. quit

これで、許可されていないユーザーがRedisインストールにアクセスするのは非常に困難になります。 すでにRedisクライアントを使用していて、Redisを再起動する場合は、再認証する必要があることに注意してください。 また、SSLまたはVPNがない場合でも、Redisにリモートで接続している場合は、暗号化されていないパスワードが外部の関係者に表示されることに注意してください。

次に、このガイドでは、Redisコマンドの名前を変更して、Redisを悪意のある攻撃者からさらに保護します。

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

Redisに組み込まれている他のセキュリティ機能を使用すると、危険と見なされる特定のコマンドの名前を変更したり、完全に無効にしたりできます。 許可されていないユーザーが実行した場合、このようなコマンドを使用して、データを再構成、破棄、またはその他の方法でワイプすることができます。 危険と見なされるコマンドには、次のものがあります。

  • FLUSHDB
  • FLUSHALL
  • KEYS
  • PEXPIRE
  • DEL
  • CONFIG
  • SHUTDOWN
  • BGREWRITEAOF
  • BGSAVE
  • SAVE
  • SPOP
  • SREM
  • RENAME
  • DEBUG

これは包括的なリストではありませんが、このリストのすべてのコマンドの名前を変更したり無効にしたりすると、データストアのセキュリティを向上させるのに役立ちます。 特定のコマンドを無効にするか名前を変更するかは、特定のニーズによって異なります。 悪用される可能性のあるコマンドを決して使用しないことがわかっている場合は、それを無効にすることができます。 それ以外の場合は、代わりに名前を変更する必要があります。

認証パスワードと同様に、コマンドの名前変更または無効化は、 SECURITY のセクション /etc/redis.conf ファイル。 Redisコマンドを有効または無効にするには、構成ファイルを開いてもう一度編集します。

  1. sudo nano /etc/redis.conf

:これらは例です。 自分にとって意味のあるコマンドを無効にするか、名前を変更するかを選択する必要があります。 redis.io/commands で、Redisのコマンドの詳細を確認し、それらがどのように悪用される可能性があるかを判断できます。

コマンドを無効にするか強制終了するには、次のようにコマンドの名前を空の文字列に変更します。

/etc/redis.conf
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""

コマンドの名前を変更するには、次の例のように別の名前を付けます。 名前を変更したコマンドは、他の人が推測するのは難しいはずですが、覚えやすいでしょう。

/etc/redis.conf
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG

変更を保存してファイルを閉じます。 次に、Redisを再起動して変更を適用します。

  1. sudo systemctl restart redis.service

新しいコマンドをテストするには、Redisコマンドラインを入力します。

  1. redis-cli

前に定義したパスワードを使用して自分自身を認証します。

  1. auth your_redis_password
Output
OK

名前を変更したと仮定します CONFIG にコマンド ASC12_CONFIG、使用しようとしています config コマンドは失敗します:

  1. config get requirepass
Output
(error) ERR unknown command 'config'

代わりに、名前が変更されたコマンドを呼び出すと成功します。 Redisコマンドでは大文字と小文字が区別されないことに注意してください。

  1. asc12_config get requirepass
Output
1) "requirepass" 2) "your_redis_password"

最後に、あなたはから出ることができます redis-cli:

  1. exit

警告:コマンドの名前変更に関して、最後に警告文があります SECURITY のセクション /etc/redis.conf 次のようなファイル:

/etc/redis.conf
. . .

# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to slaves may cause problems.

. . .

つまり、名前が変更されたコマンドがAOFファイルにない場合、またはAOFファイルがレプリカに送信されていない場合は、問題はありません。 コマンドの名前を変更するときは、このことを覚えておいてください。 コマンドの名前を変更するのに最適なタイミングは、AOF永続性を使用していないとき、またはインストール直後(つまり、Redisを使用するアプリケーションがデプロイされる前)です。

AOFを使用してRedisレプリケーションを処理している場合は、プロジェクトのGitHub問題ページからこの回答を検討してください。 以下は、作者の質問に対する回答です。

コマンドはAOFに記録され、送信されたのと同じ方法でスレーブに複製されるため、同じ名前変更がないインスタンスでAOFを再生しようとすると、コマンドを実行できないため、不整合が発生する可能性があります(スレーブについても同じです)。

このような場合に名前の変更を処理する最善の方法は、名前が変更されたコマンドが、Redisインストールのすべてのセカンダリインスタンスだけでなく、プライマリインスタンスにも適用されるようにすることです。

手順5—データディレクトリの所有権とファイルのアクセス許可を設定する

この手順では、Redisインストールのセキュリティプロファイルを改善するために必要になる可能性のある所有権と権限の変更をいくつか行います。 これには、Redisにアクセスする必要があるユーザーのみがデータを読み取る権限を持っていることを確認する必要があります。 そのユーザーは、デフォルトではredisユーザーです。

これは次の方法で確認できます grep-親ディレクトリの長いリストでRedisデータディレクトリを検索します。 このコマンドとその出力を以下に示します。

  1. ls -l /var/lib | grep redis
Output
drwxr-x---. 2 redis redis 22 Sep 30 20:15 redis

この出力は、Redisデータディレクトリが redis ユーザーによって所有されており、redisグループにセカンダリアクセスが付与されていることを示しています。 この所有権設定は、8進表記を使用して次のように設定されるフォルダーのアクセス許可と同様に安全です。 750.

Redisデータディレクトリに安全でないアクセス許可がある場合(たとえば、誰でも読み取り可能)、Redisユーザーとグループのみがフォルダとそのコンテンツにアクセスできるようにするには、 chmod 指図。 次の例では、このフォルダのアクセス許可設定を次のように変更します。 770:

  1. sudo chmod 770 /var/lib/redis

変更が必要になる可能性のある他のアクセス許可は、Redis構成ファイルのアクセス許可です。 デフォルトでは、ファイル権限は 640 root が所有し、rootグループが二次所有権を持ちます。

  1. ls -l /etc/redis.conf
Output
-rw-r-----. 1 redis root 62344 Sep 30 20:14 /etc/redis.conf

その許可(640)は、Redis構成ファイルがredisユーザーとrootグループによってのみ読み取り可能であることを意味します。 構成ファイルには、手順4で構成した暗号化されていないパスワードが含まれているためです。 redis.conf redis ユーザーが所有し、redisグループがセカンダリ所有権を持っている必要があります。 これを設定するには、次のコマンドを実行します。

  1. sudo chown redis:redis /etc/redis.conf

次に、ファイルの所有者のみがファイルの読み取りと書き込みを行えるように、アクセス許可を変更します。

  1. sudo chmod 600 /etc/redis.conf

以前の所有権と権限を実行して、新しい所有権と権限を確認できます ls もう一度コマンド:

  1. ls -l /var/lib | grep redis
Output
total 40 drwxrwx---. 2 redis redis 22 Sep 30 20:15 redis
  1. ls -l /etc/redis.conf
Output
total 40 -rw-------. 1 redis redis 62344 Sep 30 20:14 /etc/redis.conf

最後に、Redisを再起動して、これらの変更を反映します。

  1. sudo systemctl restart redis

これで、Redisのインストールが保護されました。

結論

誰かがサーバーにログインすると、導入したRedis固有のセキュリティ機能を簡単に回避できることに注意してください。 これが、このチュートリアルで取り上げる最も重要なセキュリティ機能がファイアウォールである理由です。ファイアウォールは、未知のユーザーが最初にサーバーにログインするのを防ぎます。

信頼できないネットワークを介してRedis通信を保護しようとしている場合は、公式RedisセキュリティガイドでRedis開発者が推奨しているように、SSLプロキシを使用する必要があります。