Rocky Linux 8 に Redis をインストールして保護する方法
序章
Redis は、キャッシングに優れたオープンソースのメモリ内キー値データ ストアです。 Redis は、その柔軟性、パフォーマンス、スケーラビリティ、幅広い言語サポートで知られる 非リレーショナル データベースです。
Redis は、信頼できる環境で信頼できるクライアントが使用するように設計されており、独自の堅牢なセキュリティ機能はありません。ただし、Redis には、パスワード認証や、一部のコマンドの名前を変更したり無効にしたりする機能など、いくつかのセキュリティ機能があります。このチュートリアルでは、Redis をインストールしてこれらのセキュリティ機能を構成する方法について説明します。また、Rocky Linux 8 でスタンドアロンの Redis インストールのセキュリティを高めることができる他のいくつかの設定についても説明します。
このガイドは、Redis サーバーとクライアント アプリケーションが異なるホストまたは異なるデータ センターにある状況には対応していないことに注意してください。 Redis トラフィックが安全でないネットワークまたは信頼できないネットワークを通過する必要があるインストールでは、Redis マシン間の SSL プロキシまたは VPN のセットアップなど、別の構成セットが必要になります。
DigitalOcean の Managed Redis Service も使用できます。
前提条件
このチュートリアルを完了するには、Rocky Linux 8 を実行するサーバーが必要です。このサーバーには、管理者権限を持つ root 以外のユーザーと、firewalld
で構成されたファイアウォールが必要です。これをセットアップするには、Rocky Linux 8 の初期サーバー セットアップ ガイドに従ってください。
ステップ1-Redisのインストールと起動
DNF パッケージ マネージャーを使用して Redis をインストールできます。 DNF を使用すると、Redis、その依存関係、および使いやすいテキスト エディターである nano
をインストールできます。 nano
をインストールする必要はありませんが、このガイド全体の例で使用します。
- 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
を使用します:
- sudo nano /etc/redis.conf
ファイル内で、supervised
ディレクティブを見つけます。このディレクティブを使用すると、Redis をサービスとして管理する init システムを宣言して、その操作をより詳細に制御できます。 supervised
ディレクティブは、デフォルトで no
に設定されています。 systemd init システムを使用する Rocky Linux を実行しているので、これを systemd
に変更します。
. . .
# 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 サービスを開始します。
- sudo systemctl start redis.service
起動時に Redis を起動したい場合は、enable
コマンドで有効にできます:
- sudo systemctl enable redis
このコマンドには、ユニット ファイル名の後に .service
サフィックスが含まれていないことに注意してください。通常、この接尾辞はサービス名から自動的に解析できるため、systemctl
コマンドでは省略できます。
次のコマンドを実行して、Redis のステータスを確認できます。
- 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 Tue 2022-09-06 22:11:52 UTC; 40s ago
Main PID: 14478 (redis-server)
Tasks: 4 (limit: 11152)
Memory: 6.6M
CGroup: /system.slice/redis.service
└─14478 /usr/bin/redis-server 127.0.0.1:6379
Redis が実際に実行されていることを確認したら、次のコマンドでその機能をテストできます。
- redis-cli ping
これにより、応答として PONG
が出力されます。
OutputPONG
この場合、サーバー上で Redis が実行されていることを意味し、セキュリティを強化するための構成を開始できます。
ステップ 2 — Redis を構成し、ファイアウォールで保護する
Redis を保護する効果的な方法は、Redis が実行されているサーバーを保護することです。これを行うには、Redis がローカルホストまたはプライベート IP アドレスにのみバインドされていること、およびサーバーでファイアウォールが稼働していることを確認します。
ただし、別のチュートリアルを使用して Redis をセットアップすることを選択した場合は、構成ファイルを更新して、どこからでも接続できるようにしている可能性があります。これは、ローカルホストまたはプライベート IP へのバインドほど安全ではありません。
これを解決するには、好みのテキスト エディターで Redis 構成ファイルを再度開きます。
- sudo nano /etc/redis.conf
bind
で始まる行を見つけ、行頭の #
記号を削除して、コメント アウトまたは無効になっていないことを確認します。必要なもの:
. . .
bind 127.0.0.1
Redis を別の IP アドレスにバインドする必要がある場合 (別のホストから Redis にアクセスする場合など)、それをプライベート IP アドレスにバインドすることを強く検討する必要があります。パブリック IP アドレスにバインドすると、Redis インターフェイスが外部に公開される可能性が高くなります。
. . .
bind your_private_ip
bind
ディレクティブがコメントアウトされていないことを確認したら、ファイルを保存して閉じます。
前提条件の初期サーバー セットアップ チュートリアルに従い、サーバーに firewalld をインストールし、別のホストから Redis に接続する予定がない場合は、Redis 用のファイアウォール ルールを追加する必要はありません。結局のところ、ファイアウォール ルールで明示的に許可されていない限り、着信トラフィックはデフォルトでドロップされます。 Redis サーバーの既定のスタンドアロン インストールはループバック インターフェイス (127.0.0.1
または localhost) でのみリッスンしているため、既定のポートで着信トラフィックを気にする必要はありません。
ただし、別のホストから Redis にアクセスする予定がある場合は、firewall-cmd
コマンドを使用して、firewalld 構成にいくつかの変更を加える必要があります。繰り返しになりますが、サービスが公開されるホストの数を制限するために、プライベート IP アドレスを使用してホストから Redis サーバーへのアクセスのみを許可する必要があります。
まず、firewalld ポリシーに専用の Redis ゾーンを追加します。
- sudo firewall-cmd --permanent --new-zone=redis
次に、開きたいポートを指定します。 Redis はデフォルトでポート 6379
を使用します:
- sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp
次に、ファイアウォールの通過と Redis へのアクセスを許可するプライベート IP アドレスを指定します。
- sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP
これらのコマンドを実行した後、ファイアウォールをリロードして新しいルールを実装します。
- sudo firewall-cmd --reload
この構成では、ファイアウォールがクライアントの IP アドレスからのパケットに遭遇すると、専用の Redis ゾーンのルールをその接続に適用します。他のすべての接続は、デフォルトの public
ゾーンによって処理されます。デフォルト ゾーンのサービスは、明示的に一致しないものだけでなく、すべての接続に適用されるため、他のサービス (SSH など) を Redis ゾーンに追加する必要はありません。これらのルールはその接続に自動的に適用されるためです。
firewalld
、ufw
、または iptables
のいずれを使用しても、どのファイアウォール ツールを使用しても機能することに注意してください。重要なのは、見知らぬ個人がサーバーにアクセスできないように、ファイアウォールが稼働していることです。次のステップでは、強力なパスワードでのみアクセスできるように Redis を構成します。
ステップ3-Redisパスワードの構成
Redis のパスワードを構成すると、組み込みのセキュリティ機能の 1 つである auth
コマンドが有効になります。これは、クライアントがデータベースへのアクセスを許可される前に認証を要求するものです。 bind
設定と同様に、パスワードは Redis の構成ファイル /etc/redis.conf
で直接構成されます。そのファイルを再度開きます。
- sudo nano /etc/redis.conf
SECURITY
セクションまでスクロールし、次のコメント付きディレクティブを探します。
. . .
# requirepass foobared
#
を削除してコメントを解除し、 foobared
を選択した非常に強力なパスワードに変更します。
注: 自分でパスワードを作成するのではなく、apg
や pwgen
などのツールを使用してパスワードを生成できます。ただし、パスワードを生成するためだけにアプリケーションをインストールしたくない場合は、以下のコマンドを使用できます。このコマンドは文字列値をエコーし、それを次の sha256sum
コマンドにパイプします。これにより、文字列の SHA256 チェックサムが表示されます。
このコマンドを書かれているとおりに入力すると、毎回同じパスワードが生成されることに注意してください。一意のパスワードを作成するには、引用符で囲まれた文字列を他の単語またはフレーズに変更します。
- echo "digital-ocean" | sha256sum
生成されたパスワードは覚えやすいものではありませんが、非常に強力で長く、まさに Redis に必要なタイプのパスワードです。そのコマンドの出力を requirepass
の新しい値としてコピー アンド ペーストすると、次のようになります。
. . .
requirepass password_copied_from_output
あるいは、より短いパスワードを好む場合は、代わりに別のチェックサムの出力を使用できます。繰り返しますが、このコマンドと同じパスワードが生成されないように、単語を引用符で囲みます。
- echo "digital-ocean" | sha1sum
パスワードを設定したら、ファイルを保存して閉じ、Redis を再起動します。
- sudo systemctl restart redis
パスワードが機能することをテストするには、Redis クライアントを開きます。
- redis-cli
以下は、Redis パスワードが機能するかどうかをテストするために使用される一連のコマンドです。最初のコマンドは、認証前にキーを値に設定しようとします。
- set key1 10
まだ認証されていないため、これは機能しないため、Redis はエラーを返します。
Output(error) NOAUTH Authentication required.
次のコマンドは、Redis 構成ファイルで指定されたパスワードで認証します。
- auth your_redis_password
Redis は、認証されたことを確認します。
OutputOK
その後、前のコマンドを再度実行すると成功するはずです。
- set key1 10
OutputOK
get key1
コマンドは、Redis に新しいキーの値を照会します。
- get key1
Output"10"
この最後のコマンドは redis-cli
を終了します。 exit
を使用することもできます:
- quit
これで、権限のないユーザーが Redis インストールにアクセスすることは非常に困難になるはずです。すでに Redis コマンド ライン クライアントを使用していて、Redis を再起動する場合は、再認証する必要があることに注意してください。また、SSL や VPN がなくても、Redis にリモートで接続している場合、このパスワードは外部の第三者によって傍受される可能性があることに注意してください.
次に、このガイドでは、Redis コマンドの名前を変更して、Redis を悪意のあるアクターからさらに保護する方法について説明します。
ステップ4-危険なコマンドの名前を変更する
Redis に組み込まれている別のセキュリティ機能を使用すると、危険と見なされる特定のコマンドの名前を変更したり、完全に無効にしたりすることができます。許可されていないユーザーがこれらのコマンドを実行すると、データの再構成、破棄、またはその他の方法での消去に使用される可能性があります。危険と見なされるコマンドには、次のものがあります。
FLUSHDB
FLUSHALL
キー
PEXPIRE
DEL
CONFIG
シャットダウン
BGREWRITEAOF
BGSAVE
保存
SPOP
SREM
RENAME
デバッグ
これは包括的なリストではありませんが、このリストのすべてのコマンドの名前を変更するか無効にすることで、データ ストアのセキュリティを向上させることができます。特定のコマンドを無効にするか名前を変更するかは、特定のニーズによって異なります。悪用される可能性のあるコマンドを決して使用しないことがわかっている場合は、それを無効にすることができます。それ以外の場合は、代わりに名前を変更する必要があります。
認証パスワードと同様に、コマンドの名前変更または無効化は、/etc/redis.conf
ファイルの SECURITY
セクションで構成されます。 Redis コマンドを有効または無効にするには、もう一度構成ファイルを開いて編集します。
- sudo nano /etc/redis.conf
注: これらは例です。意味のあるコマンドを無効にするか、名前を変更することを選択する必要があります。 redis.io/commands で、Redis のコマンドの詳細を確認し、それらがどのように悪用される可能性があるかを判断できます。
コマンドを無効化または強制終了するには、次のように名前を空の文字列に変更します。
# 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 ""
コマンドの名前を変更するには、以下の例のように別の名前を付けます。名前が変更されたコマンドは、他の人にとっては推測しにくいものですが、覚えやすいはずです。
# 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 を再起動して変更を適用します。
- sudo systemctl restart redis.service
新しいコマンドをテストするには、Redis コマンド ラインを入力します。
- redis-cli
前に定義したパスワードを使用して自分自身を認証します。
- auth your_redis_password
OutputOK
CONFIG
コマンドの名前を ASC12_CONFIG
に変更したとすると、config
コマンドを使用しようとすると失敗します。
- config get requirepass
Output(error) ERR unknown command 'config'
代わりに名前を変更したコマンドを呼び出すと、成功します。 Redis コマンドは大文字と小文字を区別しないことに注意してください。
- asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"
最後に、redis-cli
を終了できます。
- exit
警告: コマンドの名前変更に関して、/etc/redis.conf
ファイルの SECURITY
セクションの最後に、次のような警告文があります。
. . .
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to replicas may cause problems.
. . .
これは、名前が変更されたコマンドが AOF ファイルにない場合、または AOF ファイルがレプリカに送信されていない場合、問題がないことを意味します。コマンドの名前を変更するときは、この点に注意してください。コマンドの名前を変更する最適なタイミングは、AOF 永続性を使用していないとき、またはインストール直後 (つまり、Redis を使用するアプリケーションがデプロイされる前) です。
手順 5 — データ ディレクトリの所有権とファイルのアクセス許可を設定する
この手順では、Redis インストールのセキュリティ プロファイルを改善するために必要な所有権とアクセス許可の変更をいくつか行います。これには、Redis にアクセスする必要があるユーザーのみがそのデータを読み取る権限を持っていることを確認する必要があります。そのユーザーは、デフォルトでは redis ユーザーです。
これは、親ディレクトリの長いリストで Redis データ ディレクトリを grep
することで確認できます。このコマンドとその出力を以下に示します。
- ls -l /var/lib | grep redis
Outputdrwxr-x---. 2 redis redis 22 Sep 6 22:22 redis
この出力は、Redis データ ディレクトリが redis ユーザーによって所有されており、セカンダリ アクセス権が redis グループに付与されていることを示しています。この所有権設定は、8 進数表記を使用して 750
に設定されているフォルダーのアクセス許可と同様に安全です。
Redis データ ディレクトリのアクセス許可が安全でない場合は、chmod
コマンドを実行して、Redis ユーザーとグループだけがフォルダーとその内容にアクセスできるようにすることができます。次の例では、このフォルダーの権限設定を 770
に変更します。
- sudo chmod 770 /var/lib/redis
変更が必要な可能性があるその他のアクセス許可は、Redis 構成ファイルのアクセス許可です。デフォルトでは、640
のファイル権限があり、root が所有し、root グループが二次所有権を持ちます。
- ls -l /etc/redis.conf
Output-rw-r-----. 1 redis root 62192 Sep 6 22:20 /etc/redis.conf
その許可 (640
) は、Redis 構成ファイルが redis ユーザーと root グループによってのみ読み取り可能であることを意味します。構成ファイルには手順 4 で構成した暗号化されていないパスワードが含まれているため、redis.conf
は redis ユーザーが所有し、redis グループが二次所有権を持つ必要があります。これを設定するには、次のコマンドを実行します。
- sudo chown redis:redis /etc/redis.conf
次に、ファイルの所有者だけが読み書きできるようにパーミッションを変更します。
- sudo chmod 600 /etc/redis.conf
以前の ls
コマンドを再度実行して、新しい所有権と権限を確認できます。
- ls -l /var/lib | grep redis
Outputtotal 40
drwxrwx---. 2 redis redis 22 Sep 6 22:22 redis
- ls -l /etc/redis.conf
Outputtotal 40
-rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis.conf
最後に、これらの変更を反映するために Redis を再起動します。
- sudo systemctl restart redis
以上で、Redis のインストールは保護されました。
結論
誰かがサーバーにログインすると、導入した Redis 固有のセキュリティ機能を回避できることに注意してください。これが、このチュートリアルで取り上げる最も重要なセキュリティ機能がファイアウォールである理由です。これは、未知のユーザーが最初にサーバーにログインするのを防ぐためです.
信頼されていないネットワークを介して Redis 通信を保護しようとしている場合は、公式の Redis セキュリティ ガイドで Redis 開発者が推奨しているように、SSL プロキシを使用する必要があります。