Ubuntu22.04にRedisをインストールして保護する方法
序章
Redis は、柔軟性、パフォーマンス、幅広い言語サポートで知られるメモリ内のKey-Valueストアです。 このチュートリアルでは、Ubuntu 22.04サーバーにRedisをインストール、構成、および保護する方法を示します。
前提条件
このガイドを完了するには、root以外のユーザーがいるUbuntu22.04サーバーにアクセスする必要があります。 sudo
特権とで構成されたファイアウォール ufw
. これを設定するには、 Ubuntu22.04の初期サーバー設定ガイドに従ってください。
ステップ1—Redisのインストールと設定
APTパッケージマネージャーを使用して、公式のUbuntuリポジトリからredisをインストールします。 この記事の執筆時点で、デフォルトのリポジトリで使用可能なバージョンは6.0.16です。
ローカルを更新することから始めます apt
パッケージキャッシュ:
- sudo apt update
次に、次のように入力してRedisをインストールします。
- sudo apt install redis-server
これにより、Redisとその依存関係がダウンロードおよびインストールされます。 これに続いて、インストール中に自動的に生成されたRedis構成ファイルで行うべき重要な構成変更が1つあります。
お好みのテキストエディタでこのファイルを開きます。
- sudo nano /etc/redis/redis.conf
ファイル内で、 supervised
指令。 このディレクティブを使用すると、initシステムを宣言してRedisをサービスとして管理できるようになり、その操作をより細かく制御できるようになります。 The supervised
ディレクティブはに設定されます no
デフォルトでは。 systemd initシステムを使用するUbuntuを実行しているため、これを次のように変更します。 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 restart redis.service
これで、Redisをインストールして構成し、マシン上で実行できるようになりました。 ただし、使用を開始する前に、まずRedisが正しく機能しているかどうかを確認することをお勧めします。
ステップ2—Redisのテスト
新しくインストールしたソフトウェアと同様に、構成をさらに変更する前に、Redisが期待どおりに機能していることを確認することをお勧めします。 このステップでは、Redisが正しく機能していることを確認するためのいくつかの方法について説明します。
まず、Redisサービスが実行されていることを確認します。
- 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を起動する場合は、次のコマンドを使用してこれを設定できます。
- sudo systemctl disable redis
Redisが正しく機能していることをテストするには、を使用してサーバーに接続します redis-cli
、Redisのコマンドラインクライアント:
- redis-cli
次のプロンプトで、との接続をテストします ping
指図:
- ping
OutputPONG
この出力は、サーバー接続がまだ有効であることを確認します。 次に、以下を実行してキーを設定できることを確認します。
- set test "It's working!"
OutputOK
次のように入力して値を取得します。
- get test
すべてが機能していると仮定すると、保存した値を取得できます。
Output"It's working!"
値をフェッチできることを確認したら、Redisプロンプトを終了してシェルに戻ります。
- exit
最後のテストとして、Redisがデータを停止または再起動した後もデータを保持できるかどうかを確認します。 これを行うには、最初にRedisインスタンスを再起動します。
- sudo systemctl restart redis
次に、コマンドラインクライアントに再度接続します。
- redis-cli
そして、テスト値がまだ利用可能であることを確認します
- get test
キーの値は引き続きアクセス可能である必要があります。
Output"It's working!"
終了したら、シェルに戻ります。
- exit
これで、Redisのインストールは完全に機能し、すぐに使用できるようになります。 ただし、デフォルトの構成設定の一部は安全ではなく、悪意のある攻撃者にサーバーとそのデータへの攻撃とアクセスの機会を提供します。 このチュートリアルの残りの手順では、公式Redis Webサイトで規定されているように、これらの脆弱性を軽減する方法について説明します。 これらの手順はオプションであり、従わないことを選択した場合でもRedisは機能しますが、システムのセキュリティを強化するために、強く実行することをお勧めします。
ステップ3—ローカルホストへのバインド
デフォルトでは、Redisはlocalhostからのみアクセスできます。 ただし、これとは異なるチュートリアルに従ってRedisをインストールおよび構成した場合は、どこからでも接続できるように構成ファイルを更新した可能性があります。 これは、localhostへのバインドほど安全ではありません。
これを修正するには、編集用にRedis構成ファイルを開きます。
- sudo nano /etc/redis/redis.conf
この行を見つけて、コメントが外されていることを確認します( #
存在する場合):
. . .
bind 127.0.0.1 ::1
. . .
終了したらファイルを保存して閉じます(を押します CTRL + X
, Y
、 それから ENTER
).
次に、サービスを再起動して、systemdが変更を読み取るようにします。
- sudo systemctl restart redis
この変更が有効になったことを確認するには、次のコマンドを実行します netstat
指図:
- sudo netstat -lnp | grep redis
Outputtcp 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
コマンドは、デフォルトではシステムで使用できない場合があります。 この場合、次のコマンドを使用して(他の多くの便利なネットワーキングツールとともに)インストールできます。
- sudo apt install net-tools
この出力は、 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
、お好みのエディタでそのファイルをもう一度開きます。
- sudo nano /etc/redis/redis.conf
までスクロールします SECURITY
セクションを作成し、次のコメント付きディレクティブを見つけます。
. . .
# requirepass foobared
. . .
を削除してコメントを外します #
、および変更 foobared
安全なパスワードに。
注:上 requirepass
のディレクティブ 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
ここに示すように、コマンドは、最初のコマンドによって生成された改行をすべて削除します。
- openssl rand 60 | openssl base64 -A
このコマンドは、次のような出力を返します。
OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
そのコマンドの出力をコピーして貼り付けた後、の新しい値として requirepass
、次のようになります。
/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
パスワードを設定したら、ファイルを保存して閉じます。 次に、Redisを再起動します。
- sudo systemctl restart redis.service
パスワードが機能することをテストするには、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クライアントでコマンドを実行できることを確認したら、終了できます redis-cli
:
- quit
次に、Redisコマンドの名前を変更します。これは、誤って入力した場合や悪意のある攻撃者が入力した場合に、データに深刻な影響を与える可能性があります。
ステップ5—危険なコマンドの名前を変更する
Redisに組み込まれている他のセキュリティ機能には、危険と見なされる特定のコマンドの名前を変更するか、完全に無効にすることが含まれます。
許可されていないユーザーが実行した場合、このようなコマンドを使用して、データを再構成、破棄、またはその他の方法でワイプすることができます。 認証パスワードと同様に、コマンドの名前変更または無効化は同じように構成されます SECURITY
のセクション /etc/redis/redis.conf
ファイル。
危険と見なされるコマンドには、次のものがあります。 FLUSHDB
, FLUSHALL
, KEYS
, PEXPIRE
, DEL
, CONFIG
, SHUTDOWN
, BGREWRITEAOF
, BGSAVE
, SAVE
, SPOP
, SREM
, RENAME
、 と DEBUG
. これは包括的なリストではありませんが、そのリスト内のすべてのコマンドの名前を変更または無効にすることは、Redisサーバーのセキュリティを強化するための良い出発点です。
コマンドを無効にするか名前を変更するかは、特定のニーズまたはサイトのニーズによって異なります。 悪用される可能性のあるコマンドを決して使用しないことがわかっている場合は、それを無効にすることができます。 それ以外の場合は、名前を変更することをお勧めします。
Redisコマンドの名前を変更または無効にするには、構成ファイルをもう一度開きます。
- sudo nano /etc/redis/redis.conf
警告:コマンドを無効にして名前を変更する方法を示す次の手順は例です。 自分にとって意味のあるコマンドを無効にするか、名前を変更することだけを選択する必要があります。 コマンドの完全なリストを自分で確認し、redis.io/commandsでそれらがどのように誤用される可能性があるかを判断できます。
コマンドを無効にするには、次のように、コマンドの名前を空の文字列(間に文字がない引用符のペアで示される)に変更します。
. . .
# 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 CONFIG ""
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`, with args beginning with:
ただし、名前が変更されたコマンドの呼び出しは成功します。 大文字と小文字は区別されません。
- asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"
最後に、あなたはから出ることができます redis-cli
:
- exit
すでにRedisコマンドラインを使用してからRedisを再起動する場合は、再認証する必要があることに注意してください。 それ以外の場合、コマンドを入力すると次のエラーが発生します。
OutputNOAUTH Authentication required.
警告:コマンドの名前変更の慣行に関して、最後に警告文があります SECURITY
のセクション /etc/redis/redis.conf
これは次のようになります。
. . .
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to replicas may cause problems.
. . .
注: Redisプロジェクトは「マスター」と「スレーブ」という用語を使用することを選択しますが、DigitalOceanは一般に「プライマリ」と「セカンダリ」の代替を好みます。 混乱を避けるために、ここではRedisのドキュメントで使用されている用語を使用することにしました。
つまり、名前が変更されたコマンドがAOFファイルにない場合、またはAOFファイルがスレーブに送信されていない場合は、問題はありません。
したがって、コマンドの名前を変更する場合は、この点に注意してください。 コマンドの名前を変更するのに最適なタイミングは、AOF永続性を使用していないとき、またはインストール直後、つまりRedisを使用するアプリケーションがデプロイされる前です。
AOFを使用していて、マスタースレーブのインストールを扱っている場合は、プロジェクトのGitHub問題ページからこの回答を検討してください。 以下は、作者の質問に対する回答です。
コマンドはAOFに記録され、送信されたのと同じ方法でスレーブに複製されるため、同じ名前変更がないインスタンスでAOFを再生しようとすると、コマンドを実行できないため、不整合が発生する可能性があります(スレーブについても同じです)。
したがって、そのような場合に名前の変更を処理する最良の方法は、名前が変更されたコマンドがマスタースレーブインストールのすべてのインスタンスに適用されることを確認することです。
結論
このチュートリアルでは、Redisをインストールして構成し、Redisインストールが正しく機能していることを検証し、組み込みのセキュリティ機能を使用して、悪意のある攻撃者からの攻撃に対する脆弱性を軽減しました。
誰かがサーバーにログインすると、Redis固有のセキュリティ機能を簡単に回避できることに注意してください。 したがって、Redisサーバーで最も重要なセキュリティ機能はファイアウォール(前提条件の初期サーバーセットアップチュートリアルに従った場合に構成したもの)です。これにより、悪意のある攻撃者がそのフェンスを飛び越えることが非常に困難になります。