Ubuntu 22.04でRedisをインストールしてセキュアにする方法

はじめに

Redisは、その柔軟性、パフォーマンス、および幅広い言語サポートで知られるインメモリキーバリューストアです。このチュートリアルでは、Ubuntu 22.04サーバーにRedisをインストール、設定、およびセキュリティ設定する方法を示します。

前提条件

このガイドを完了するには、sudo権限を持つ非ルートユーザーを持つUbuntu 22.04サーバーにアクセスでき、ufwでファイアウォールが構成されている必要があります。これは、当社のUbuntu 22.04の初期サーバー設定ガイドに従って設定できます。

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

公式のUbuntuリポジトリからRedisをインストールするためにAPTパッケージマネージャーを使用します。この執筆時点では、デフォルトのリポジトリに利用可能なバージョンは6.0.16です。

まず、ローカルのaptパッケージキャッシュを更新します:次に、次のコマンドを入力してRedisをインストールします:

  1. sudo apt update

Redis をインストールするには、以下のコマンドを入力します:

  1. sudo apt install redis-server

これにより、Redis とその依存関係がダウンロードおよびインストールされます。この後、Redis の設定ファイルで重要な設定変更があります。この設定ファイルは、インストール中に自動的に生成されます。

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

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

ファイル内で、supervised ディレクティブを探してください。このディレクティブは、Redis をサービスとして管理する init システムを宣言するためのもので、Redis の操作に対するより多くの制御を提供します。supervised ディレクティブはデフォルトで no に設定されています。Ubuntu を使用しているため、systemd init システムを使用していますので、これを systemd に変更してください:

/etc/redis/redis.conf
. . .

# Redis が upstart や systemd から実行される場合、Redis はあなたの
# 監視ツリーと対話できます。オプション:
#   supervised no      - 監視対象外
#   supervised upstart - SIGSTOP モードで upstart に信号を送る
#   supervised systemd - $NOTIFY_SOCKET に READY=1 を書き込んで systemd に信号を送る
#   supervised auto    - UPSTART_JOB または NOTIFY_SOCKET 環境変数に基づいて
#                         upstart または systemd の方法を検出する
# 注: これらの監視方法は "プロセスが準備完了" を通知するだけです。
#       あなたの監視者に対する継続的なライブネスピングバックは有効になりません。
supervised systemd

. . .

その時点でRedis構成ファイルを変更する唯一の必要な変更はこれだけですので、終了したら保存して閉じてください。ファイルの編集にnanoを使用した場合は、CTRL + XYENTERを押してください。

次に、構成ファイルに行った変更を反映させるためにRedisサービスを再起動します。

  1. sudo systemctl restart redis.service

これで、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 2022-04-20 20:40:52 UTC; 4s ago Docs: http://redis.io/documentation, man:redis-server(1) Main PID: 2899 (redis-server) Status: "Ready to accept connections" Tasks: 5 (limit: 2327) Memory: 2.5M CPU: 65ms CGroup: /system.slice/redis-server.service └─2899 "/usr/bin/redis-server 127.0.0.1:6379 . . .

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

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

  1. sudo systemctl disable redis

Redisが正常に機能しているかをテストするには、Redisのコマンドラインクライアントであるredis-cliを使用してサーバーに接続します:

  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!"

作業が完了したら、再度シェルに戻ります:これで、Redisのインストールが完全に稼働し、使用する準備が整いました。ただし、いくつかのデフォルトの設定はセキュリティに関する脆弱性を提供し、悪意のあるアクターにサーバーやそのデータへのアクセス権を与える可能性があります。このチュートリアルの残りの手順では、公式Redisウェブサイトで指示されている方法に従って、これらの脆弱性を軽減する方法について説明します。これらの手順はオプションですが、選択しない場合でもRedisは機能しますが、システムのセキュリティを強化するためには、これらの手順を完了することを強くお勧めします。

  1. exit

それで、あなたのRedisインストールは完全に動作し、使用する準備ができています。ただし、そのデフォルトの設定設定のいくつかは安全ではなく、悪意のある俳優にサーバーとそのデータへのアクセスを攻撃して取得する機会を提供しています。このチュートリアルの残りの手順では、これらの脆弱性を軽減する方法について説明します。公式のRedisウェブサイトによって規定されています。これらの手順はオプションであり、Redisを選択しない場合でも機能し続けますが、システムのセキュリティを強化するために強くお勧めします。

ステップ3-ローカルホストにバインドする

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

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

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

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

/etc/redis/redis.conf
. . .
bind 127.0.0.1 ::1
. . .

完了したらファイルを保存して閉じます(CTRL+XY、次にENTERを押します)。

次に、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 14222/redis-server tcp6 0 0 ::1:6379 :::* LISTEN 14222/redis-server

注意netstatコマンドは、デフォルトではシステム上に利用可能でない場合があります。この場合、以下のコマンドでインストールできます(他にも便利なネットワーキングツールがいくつか含まれています):

  1. sudo apt install net-tools

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

これで、Redisインストールがローカルホストのみでリッスンするようになり、悪意のある行動者がリクエストを行ったり、サーバーにアクセスすることがより困難になりました。しかし、Redisは、ユーザーが認証を求められることなく、構成の変更やデータの保持を行うことができます。この問題を解決するために、Redisは、ユーザーがRedisクライアント(redis-cli)を介して変更を行う前にパスワードで認証を求めることができます。

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

#警告:Redisはかなり高速であるため、優れたボックスでは外部ユーザーが秒間に最大

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

#15万のパスワードを試すことができます。これは、非常に強力なパスワードを使用しないと、簡単に破られることが非常に簡単であることを意味します。

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

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

/etc/redis/redis.conf
. . .
パスワードを設定した後、ファイルを保存して閉じます。その後、Redisを再起動します。
パスワードが機能するかどうかをテストするには、Redisクライアントを開きます。
以下は、Redisパスワードが機能するかどうかをテストするために使用されるコマンドのシーケンスを示しています。最初のコマンドは、認証する前にキーを値に設定しようとします。
#
. . .

認証していないため、Redisはエラーを返します。

  1. openssl rand 60 | openssl base64 -A

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

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Redisは確認します。

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

その後、前のコマンドを再実行すると成功します。get key1は、新しいキーの値を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セクションで設定されます。

危険と見なされるコマンドのいくつかには、FLUSHDBFLUSHALLKEYSPEXPIREDELCONFIGSHUTDOWNBGREWRITEAOFBGSAVESAVESPOPSREMRENAMEDEBUGが含まれます。これは包括的なリストではありませんが、そのリストのコマンドをすべてリネームまたは無効化することは、Redisサーバーのセキュリティを強化するための良い出発点です。

コマンドを無効化するかリネームするかは、特定のニーズやサイトのニーズによって異なります。悪用される可能性があるコマンドを使用しないことがわかっている場合は、無効化することができます。そうでなければ、リネームすることが最善かもしれません。

Redisコマンドをリネームまたは無効化するには、もう一度設定ファイルを開きます:

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

警告: コマンドの無効化とリネームの方法を示す以下の手順は例です。あなたにとって意味のあるコマンドだけを無効化またはリネームすることができます。redis.io/commandsで自分でコマンドの完全なリストを確認し、どのように悪用されるかを判断することができます。

コマンドを無効化するには、空の文字列(文字なしの二重引用符で示される)にリネームする方法があります。以下に示します:

/etc/redis/redis.conf
. . .
# また、コマンドを完全に殺すこともできます。
# 空の文字列にリネームすることで:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
. . .

コマンドをリネームするには、別の名前を付ける方法があります。リネームされたコマンドは、他の人が推測するのが難しいが、あなたが覚えやすいものであるべきです。

/etc/redis/redis.conf
. . .
# rename-command CONFIG ""
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`, with args beginning with:

しかし、リネームされたコマンドを呼び出すと成功します。大文字小文字は区別されません。

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

最後に、redis-cliから抜けます。

  1. exit

既にRedisコマンドラインを使用していて、Redisを再起動した場合、再認証が必要です。そうしないと、コマンドを入力するとこのエラーが表示されます。

Output
NOAUTH Authentication required.

警告: コマンドのリネームに関しては、/etc/redis/redis.confSECURITYセクションの最後に注意書きがあります。

/etc/redis/redis.conf
. . .
# AOFファイルにログインされたり、レプリカに送信されたりするコマンドの名前を変更すると、問題が発生する可能性があります。

. . .

注意: Redisプロジェクトは「マスター」と「スレーブ」という用語を使用していますが、DigitalOceanは一般的に「プライマリ」と「セカンダリ」の代替案を好みます。混乱を避けるために、ここではRedisドキュメントで使用されている用語を採用しました。

つまり、リネームされたコマンドがAOFファイルにない場合、またはAOFファイルがスレーブに転送されていない場合は、問題はありません。

したがって、コマンドのリネームを試みる際にそれを念頭に置いてください。コマンドのリネームを行う最良のタイミングは、AOF永続性を使用していないとき、またはインストール直後、つまりRedisを使用するアプリケーションが展開される前です。

AOFを使用してマスタースレーブのインストールで取り組んでいる場合は、プロジェクトのGitHubイシューページからのこの回答を検討してください。以下は、著者の質問への返信です。

コマンドは、同じように送信されるときと同じようにAOFにログに記録され、スレーブに複製されるため、同じリネームがないインスタンスでAOFを再生しようとすると、コマンドを実行できないため不一致が発生する可能性があります(スレーブも同様)。

したがって、そのようなケースでリネームを処理する最良の方法は、リネームされたコマンドがマスタースレーブインストールのすべてのインスタンスに適用されることを確認することです。

結論

このチュートリアルでは、Redisをインストールして構成し、Redisのインストールが正しく機能していることを検証し、悪意のあるアクターからの攻撃に対して脆弱性が少なくなるように、組み込みのセキュリティ機能を使用しました。

サーバーにログインしている場合、Redis固有のセキュリティ機能を回避するのは非常に簡単です。したがって、Redisサーバーで最も重要なセキュリティ機能は、ファイアウォールです(前提条件の初期サーバーセットアップチュートリアルに従って設定しました)。これにより、悪意のあるアクターがそのフェンスを乗り越えることが非常に困難になります。

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-22-04