LinuxでセキュアなRedisのインストールを実行する方法

Redisは多くのことに役立ちますが、その1つはキャッシュです。Redisをプライマリデータストアとして使用したり、データベースの代替として使用したりすることもできます。しかし、安全なRedisのインストールはどうやって行うのでしょうか?Redisをインストールすることは煩わしい作業ですし、注意深く行わないと多くのエラーが発生する可能性があります。幸運なことに、このチュートリアルでカバーされています。

このチュートリアルでは、Linuxシステムに安全にRedisをインストールする方法と、一般的な間違いを避けるためのいくつかのヒントを学びます。

さあ、Redisのインストールエラーのトラブルシューティングから頭痛を取り除きましょう!

必要条件

このチュートリアルは実演形式で行われます。一緒に進める場合は、以下を確認してください:

  • Ubuntu 20.04 LTSマシン-このチュートリアルではUbuntu 20.04 LTSを使用しますが、ほとんどのLinuxディストリビューションにも同様の手順が適用されます。
  • Root権限またはsudo権限を持つ非ルートユーザー

APTパッケージマネージャーを使用したRedisのインストール

UbuntuでRedisをインストールする方法はいくつかありますが、このチュートリアルではRedisをインストールするためにAPTパッケージマネージャーを使用します。

RedisはCで書かれているため、Redisのソースコードを手動でコンパイルする必要があります。いくつかの依存関係をインストールする必要があり、ビルドプロセスは完全に確実ではありません。

ソースからRedisをコンパイルすることはお勧めしませんが、利点としては、インストールをカスタマイズすることができます。ソースコードをダウンロードし、手動で構成します。

ターミナルを開き、以下のapt updateコマンドを実行して最新のパッケージリストを確認します

sudo apt update -y
Updating the Linux system

次に、以下のapt installコマンドを実行してマシンにRedisをインストールします。

以下のコマンドは、aptパッケージマネージャーを使用してUbuntuリポジトリからredis-serverパッケージをダウンロードしてマシンにインストールします。 -yフラグは、インストールプロセス中のプロンプトを自動的に受け入れるようaptに指示します。

sudo apt install redis-server -y
Installing Redis on your machine

Redis.confファイルを設定してRedisをサービスとして実行する

Redisをインストールしましたが、まだ使用準備ができていません。Redisを使用する前に、まずredis.confファイルを設定する必要があります。

インストールしたRedisパッケージには、redis.conf設定ファイルが含まれており、デフォルトで/etc/redis/ディレクトリに保存されています。このファイルには、Redisのすべての設定オプションが含まれています。

.confファイル拡張子は、一般的なパターンに従っているため、論理的です。他の多くのプログラムもこのスタイルを使用しています。たとえば、Apacheウェブサーバーは、メインの設定ファイルに.confファイル拡張子を使用しています。

1.次のsystemctlコマンドを実行して、redis-serverサービスをstopします。Redisサービスを実行しないようにするのは、Redisを初めて使用する場合に推奨される方法です。

sudo systemctl stop redis.service

2.次に、お好みのテキストエディタで/etc/redis/redis.confファイルを開きます。

supervisedディレクティブを検索し、次に示すようにsystemdに設定して、変更を保存します。これにより、オペレーティングシステムにRedisをサービスとして実行するように指示されます。

Setting up the systemd directive

3. 以下の systemctl restart コマンドを実行して、Redis サービス (redis.service) を再起動してください。Redis サービスはまだ変更を認識していないためです。

sudo systemctl restart redis.service

4. 最後に、以下の systemctl status コマンドを実行して、Redis が実行されているかどうかを確認してください。

sudo systemctl status redis.service

以下の出力によると、Redis サービスが実行されていることがわかります。

Checking if Redis Service is Running

Redis サーバの機能が正常に動作しているかテストする

Redis サービスが正常に実行されていることを構成して確認しましたが、これは Redis サーバが正常に動作していることを意味しません。Redis サーバの機能が正常に動作しているかをテストするにはどうすればよいでしょうか?Redis サーバに接続し、サーバが応答するかどうかを確認するためにコマンドを送信します。

1. 以下の redis-cli コマンドを実行して、Redis サーバに接続してください。 redis-cli は、Redis のコマンドラインインターフェースであり、サーバにコマンドを送信してその状態を調査することができます。

redis-cli

以下のように、Redis サーバのプロンプト (127.0.0.1:6379>) にいることがわかります。redis-cli コマンドは、デフォルトで 127.0.0.1:6379 の Redis サーバに接続しようとします。

Connecting to the Redis Server

2. 次に、以下の ping コマンドを実行して、Redis サーバが到達可能かどうかを確認してください。

ping

サーバが PONG を返したことから、Redis サーバが到達可能であり、サービスと正常に通信できることが確認されました。

Pinging the Redis server

おそらくまだ懐疑的なので、以下のsetコマンドを実行してください。setコマンドは、データベース内のキーと値のペアを設定するRedisコマンドです。

set test "This is a test"

ご覧のように、setコマンドは「OK」を返します。これは、Redisサービスが正常に動作していることを示しています。

Testing the Redis server

3.以下のexitコマンドを実行して、redis-cliを終了してください。これにより、Redisサーバーへの接続が閉じられます。

exit

Redisサーバーをlocalhostにバインドする

Redisサーバーが正しく動作することをテストしたばかりですが、ネットワーク上の他のデバイスからアクセスできる可能性もあります。この動作は望ましくないため、Redisサーバーを見知らぬ人から保護したいと考えることが一般的です。

Redisサーバーをlocalhostにバインドすると、RedisをインストールしたマシンのみがRedisサーバーにアクセスできるようになります。

1.テキストエディターで/etc/redis/redis.confファイルを開きます。

2.「bind 127.0.0.1 ::1」と書かれた行を見つけ、行の先頭のナンバーサイン(#)を削除して行をコメント解除します。

Uncommenting the bind 127.0.0.1 ::1 line

3.次に、以下のコマンドを実行してredis-serverサービスを再起動します。

sudo systemctl restart redis-server

4.最後に、Redisサーバーがlocalhostにバインドされているかどうかを確認するために、次のコマンドを実行します。netstat -lnpコマンドはすべてのアクティブなネットワーク接続をリストし、grep redis部分は出力を「redis」を含む行にフィルタリングします。

-lnpは、ホスト名をIPアドレスに解決するためにUNIXライクなシステムで使用されるネットワーキングプロトコルです。

sudo netstat -lnp | grep redis

以下では、Redisサーバーが今ではlocalhostインターフェースのみでリスニングされていることがわかります(127.0.0.1:6379)。構成ファイルの変更を反映して、アクティブなインターネット接続の下にlocalhostインターフェースのみがリストされていることがわかります(tcp)。

今、ネットワーク上の他のデバイスはあなたのRedisサーバーに接続できません。

Listing all active network connections

Redisサーバー接続のセキュリティ強化

この時点では、Redisはユーザーにパスワードでの認証を要求するように設定されていません。あなたのRedisサーバーのIPアドレスやホスト名を知っている人は、それに接続してデータを変更することができます。

Redisサーバーをどのように保護しますか?Redisサーバーに接続する際にユーザーの認証を要求するためにパスワードを設定します。

1. テキスト/コードエディタでredis.conf構成ファイルを再度開きます。

2. 次に、以下を使用して強力なパスワードを設定します:

  • SECURITYセクションの下でrequirepass foobaredを探します。
  • 行の先頭のナンバーサイン(#)を削除します。
  • foobaredを自分で選択した強力なパスワードに置き換えて変更を保存します。
Providing a secure password

3. 以下のコマンドを実行してRedisサーバーを再起動し、接続します。

sudo systemctl restart redis-server
redis-cli

4. 今、pingコマンドを実行してサーバーから応答があるかどうかを確認します。

ping

以下は、NOAUTH 認証が必要ですというエラーメッセージが表示されています。このメッセージは、Redisサーバーにリモートでアクセスするためには認証パスワードが必要であることを示しています。

Testing connection with the server

5. 以下のauthコマンドを実行し、パスワードを入力してRedisサーバーへの接続を認証します。

auth Qae9p_fY:YjdtJ7k

認証が成功すると、以下のようにOKという応答が返ります。

Authenticating Redis Server Connection

6. 最後に、pingコマンドを再実行してRedisサーバーへの接続が認証されているかテストします。

ping

接続が認証されている場合、以下のようにPONGという応答が返ります。この時点で、Redisサーバーはパスワードで保護されています。

Pinging the Redis server

Redisサーバーを保護するために危険なコマンドを無効化する

Redisサーバーへの接続を認証するためにパスワードを設定するだけでは、100%の保護が得られるわけではありません。Redisには、データベースのデータを変更することができるいくつかの危険なコマンドがデフォルトで含まれています。

これらのコマンドは、認証されていないユーザーが実行すると、侵入者がRedisデータベースのデータを読み取ったり、変更したり、破壊したり、削除したりすることができます。

以下は、Redisサーバーによって追加の危険なコマンドが含まれている場合を考慮していない完全なリストではありませんが、一般的にこれらが危険なコマンドです:

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

Redisサーバーをさらにセキュアにするために、redis.confファイルでこれらの危険なコマンドの名前を変更してください。

1. テキストエディタでredis.confファイルを開き、Command renamingセクションを探します。

以下の構文に従って、コマンドを無効にするためにコマンドを空の文字列に変更します。実際のコマンドはthe-commandに置き換えてください。

rename-command the-command ""

例えば、CONFIGコマンドを無効にするには、CONFIGを空の文字列に変更し、次に変更を保存してください。ダブルクォーテーション(“”)は、コマンドを無効にする空の文字列を示しています。

Renaming the CONFIG command

2. テキストエディタから終了し、以下のコマンドを実行してRedisサーバーを再起動します。

sudo systemctl restart redis-server

3. 次に、Redisサーバーに接続するために以下のコマンドを実行します。

redis-cli
auth Qae9p_fY:YjdtJ7k

4. 最後に、config getコマンドを実行して、CONFIGコマンドが無効になっていることをテストします。

config get requirepass

以下のようにERR unknown command configという応答が表示され、CONFIGコマンドが無効になっていることが示されます。

Checking the CONFIG command

config get requirepassコマンドが通過した場合、Redisサーバーに接続するための認証のためにRedisサーバーにパスワードを要求します。

これで、危険なRedisコマンドを保護するために危険なRedisコマンドを正常にリネームしました。今後は、redis.confファイルで他の危険なコマンドを無効にします。

ファイアウォールを使用してRedisサーバーへの接続要求をブロックする

Redisサーバーをセキュリティー強化する別の方法は、ファイアウォールの設定です。ファイアウォールの設定では、サーバー上で実行されている各サービスに対して必要なポートのみを許可する必要があります。

たとえば、サーバーでRedisをポート6379で実行している場合、そのポートだけを開く必要があります。特定のIPアドレスまたはアドレス範囲からのアクセスを許可する必要がある場合は、それらのアドレスをファイアウォールのルールに追加できます。

ファイアウォールを設定するには、まずファイアウォール構成ツールをインストールします。この例では、Linuxでよく使われるファイアウォール構成ツールであるUFWを使用しています。ただし、iptablesなど別のツールを使用することもできます。

1. 次のコマンドを実行して、マシンにUFWをインストールします。

sudo apt install ufw -y

2. 次に、以下のコマンドを実行してUFWを有効にします。

sudo ufw enable

下のプロンプトが表示されたら、コマンドの実行を続行するには「Y」を入力してください。

Enabling UFW

3. Redisサーバーのポート6379でトラフィックを許可するルールを追加するには、以下のufwコマンドを実行します。目的のユーザーのIPアドレスで11.22.33.44を置き換えてください。

sudo ufw allow from 11.22.33.44 to any port 6379
Adding a firewall rule to allow traffic on port 6379

4. 最後に、以下のコマンドを実行して、ファイアウォールルールが正常に追加されたことを確認します。このコマンドは、ファイアウォールのstatusを確認します。

sudo ufw status

以下の出力で、ファイアウォールがアクティブであり、IPアドレス11.22.33.44からのRedisのポート6379へのトラフィックを許可するルールがあることがわかります。

Checking the UFW rules

今後、11.22.33.44のIPアドレスを持つユーザーは、ポート6379を介してRedisに接続でき、パスワードで認証する必要があります。他のサービスの追加ポートを同様の方法で追加できます。

結論

このチュートリアルでは、危険なコマンドを空の文字列に変更し、ファイアウォールを設定することで、Redisサーバーをインストールしてセキュアにする方法を学びました。

この新しい知識を活用することで、Redisのすべての利点を享受でき、サーバーを不必要なリスクにさらすことなく利用できます。

さらに学習したいですか?なぜKubernetesでRedisサーバーをセキュアにすることから始めないのですか?

Source:
https://adamtheautomator.com/redis-install/