はじめに
Redisは、その柔軟性、パフォーマンス、および幅広い言語サポートで知られるインメモリキーバリューストアです。このチュートリアルでは、Ubuntu 22.04サーバーにRedisをインストール、設定、およびセキュリティ設定する方法を示します。
前提条件
このガイドを完了するには、sudo
権限を持つ非ルートユーザーを持つUbuntu 22.04サーバーにアクセスでき、ufw
でファイアウォールが構成されている必要があります。これは、当社のUbuntu 22.04の初期サーバー設定ガイドに従って設定できます。
ステップ1 — Redisのインストールと設定
公式のUbuntuリポジトリからRedisをインストールするためにAPTパッケージマネージャーを使用します。この執筆時点では、デフォルトのリポジトリに利用可能なバージョンは6.0.16です。
まず、ローカルのapt
パッケージキャッシュを更新します:
Redis をインストールするには、以下のコマンドを入力します:
これにより、Redis とその依存関係がダウンロードおよびインストールされます。この後、Redis の設定ファイルで重要な設定変更があります。この設定ファイルは、インストール中に自動的に生成されます。
好みのテキストエディタでこのファイルを開きます:
ファイル内で、supervised
ディレクティブを探してください。このディレクティブは、Redis をサービスとして管理する init システムを宣言するためのもので、Redis の操作に対するより多くの制御を提供します。supervised
ディレクティブはデフォルトで no
に設定されています。Ubuntu を使用しているため、systemd init システムを使用していますので、これを systemd
に変更してください:
. . .
# 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 + X
、Y
、ENTER
を押してください。
次に、構成ファイルに行った変更を反映させるためにRedisサービスを再起動します。
これで、Redisがインストールされ、構成され、マシン上で実行されています。ただし、使用を開始する前に、Redisが正常に機能しているかどうかを最初に確認することが賢明です。
ステップ2 — Redisのテスト
新しくインストールされたソフトウェアと同様に、Redisが期待どおりに機能していることを確認することが良い考えです。このステップでは、Redisが正常に動作しているかどうかを確認するためのいくつかの方法を説明します。
まず、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を手動で起動する場合は、次のコマンドでこれを設定できます。
Redisが正常に機能しているかをテストするには、Redisのコマンドラインクライアントであるredis-cli
を使用してサーバーに接続します:
次に、続けてping
コマンドを使用して接続性をテストします:
OutputPONG
この出力は、サーバー接続がまだ有効であることを確認します。次に、以下のコマンドを実行してキーを設定できるか確認します:
OutputOK
値を取得するには、次のように入力します:
すべてが正常に動作していると仮定すると、保存した値を取得できます:
Output"It's working!"
値を取得できることを確認したら、Redisプロンプトからシェルに戻ります:
最後のテストとして、Redisが停止または再起動された後もデータを永続化できるかどうかを確認します。まず、Redisインスタンスを再起動します:
次に、再びコマンドラインクライアントで接続します:
そして、テスト値がまだ利用可能であることを確認します:
キーの値はまだアクセス可能であるはずです:
Output"It's working!"
作業が完了したら、再度シェルに戻ります:
それで、あなたのRedisインストールは完全に動作し、使用する準備ができています。ただし、そのデフォルトの設定設定のいくつかは安全ではなく、悪意のある俳優にサーバーとそのデータへのアクセスを攻撃して取得する機会を提供しています。このチュートリアルの残りの手順では、これらの脆弱性を軽減する方法について説明します。公式のRedisウェブサイトによって規定されています。これらの手順はオプションであり、Redisを選択しない場合でも機能し続けますが、システムのセキュリティを強化するために強くお勧めします。
ステップ3-ローカルホストにバインドする
デフォルトでは、Redisはローカルホストからのみアクセス可能です。ただし、このチュートリアルとは異なるチュートリアルに従ってRedisをインストールして構成した場合、構成ファイルを更新してどこからでも接続できるようにした可能性があります。これはローカルホストにバインドするほど安全ではありません。
これを修正するには、Redis構成ファイルを編集用に開きます。
この行を見つけて、それがコメント解除されていることを確認します(存在する場合は#
を削除します):
. . .
bind 127.0.0.1 ::1
. . .
完了したらファイルを保存して閉じます(CTRL+X
、Y
、次にENTER
を押します)。
次に、systemdが変更を読み取るようにサービスを再起動します。
この変更が有効になっていることを確認するために、以下のnetstat
コマンドを実行してください:
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
コマンドは、デフォルトではシステム上に利用可能でない場合があります。この場合、以下のコマンドでインストールできます(他にも便利なネットワーキングツールがいくつか含まれています):
この出力は、redis-server
プログラムがローカルホスト(127.0.0.1
)にバインドされていることを示しています。これは、構成ファイルへの変更を反映しています。もしあなたのシステムでは、その列に別のIPアドレスが表示されている場合(たとえば0.0.0.0
)、正しい行をアンコメントしたかどうかを再確認し、Redisサービスを再起動する必要があります。
これで、Redisインストールがローカルホストのみでリッスンするようになり、悪意のある行動者がリクエストを行ったり、サーバーにアクセスすることがより困難になりました。しかし、Redisは、ユーザーが認証を求められることなく、構成の変更やデータの保持を行うことができます。この問題を解決するために、Redisは、ユーザーがRedisクライアント(redis-cli
)を介して変更を行う前にパスワードで認証を求めることができます。
ステップ4 — Redisパスワードの設定
#警告:Redisはかなり高速であるため、優れたボックスでは外部ユーザーが秒間に最大
#15万のパスワードを試すことができます。これは、非常に強力なパスワードを使用しないと、簡単に破られることが非常に簡単であることを意味します。
. . .
#非常に強力で長い値をパスワードとして指定することが重要です。独自のパスワードを作成する代わりに、次の例のように、openssl
コマンドを使用してランダムなパスワードを生成できます。ここに示すように、最初のコマンドの出力を2番目のopenssl
コマンドにパイプすることにより、最初のコマンドによって生成された改行を削除します。
. . .
このコマンドは、次のような出力を返します。そのコマンドの出力をrequirepass
の新しい値としてコピーして貼り付けた後、次のようになります。
. . .
パスワードを設定した後、ファイルを保存して閉じます。その後、Redisを再起動します。
パスワードが機能するかどうかをテストするには、Redisクライアントを開きます。
以下は、Redisパスワードが機能するかどうかをテストするために使用されるコマンドのシーケンスを示しています。最初のコマンドは、認証する前にキーを値に設定しようとします。
#
. . .
認証していないため、Redisはエラーを返します。
次のコマンドは、Redis構成ファイルで指定されたパスワードで認証します。
OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Redisは確認します。
/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
その後、前のコマンドを再実行すると成功します。get key1
は、新しいキーの値をRedisに照会します。
パスワードが機能するか確認するために、Redisクライアントを開きます:
以下は、Redisのパスワードが機能するかテストするために使用される一連のコマンドを示しています。最初のコマンドは認証前にキーを値に設定しようとします:
それは機能しません。認証していないため、Redisはエラーを返します:
Output(error) NOAUTH Authentication required.
次のコマンドは、Redisの設定ファイルで指定されたパスワードで認証します:
Redisは確認します:
OutputOK
その後、前のコマンドを再び実行すると成功します:
OutputOK
get key1
はRedisに新しいキーの値を問い合わせます。
Output"10"
認証後にRedisクライアントでコマンドを実行できることを確認したら、redis-cli
を終了できます:
次に、Redisコマンドのリネームについて説明します。誤って入力したり、悪意のある行為者によって入力された場合、データに深刻な影響を与える可能性があります。
ステップ5 — 危険なコマンドのリネーム
Redisに組み込まれているもう一つのセキュリティ機能は、危険と見なされる特定のコマンドのリネームや完全に無効化を行うことです。
このようなコマンドが未承認のユーザーによって実行された場合、データを再構成、破壊、またはその他の方法で消去するために使用される可能性があります。認証パスワードと同様に、コマンドのリネームや無効化は、/etc/redis/redis.conf
ファイルの同じSECURITY
セクションで設定されます。
危険と見なされるコマンドのいくつかには、FLUSHDB
、FLUSHALL
、KEYS
、PEXPIRE
、DEL
、CONFIG
、SHUTDOWN
、BGREWRITEAOF
、BGSAVE
、SAVE
、SPOP
、SREM
、RENAME
、DEBUG
が含まれます。これは包括的なリストではありませんが、そのリストのコマンドをすべてリネームまたは無効化することは、Redisサーバーのセキュリティを強化するための良い出発点です。
コマンドを無効化するかリネームするかは、特定のニーズやサイトのニーズによって異なります。悪用される可能性があるコマンドを使用しないことがわかっている場合は、無効化することができます。そうでなければ、リネームすることが最善かもしれません。
Redisコマンドをリネームまたは無効化するには、もう一度設定ファイルを開きます:
警告: コマンドの無効化とリネームの方法を示す以下の手順は例です。あなたにとって意味のあるコマンドだけを無効化またはリネームすることができます。redis.io/commandsで自分でコマンドの完全なリストを確認し、どのように悪用されるかを判断することができます。
コマンドを無効化するには、空の文字列(文字なしの二重引用符で示される)にリネームする方法があります。以下に示します:
. . .
# また、コマンドを完全に殺すこともできます。
# 空の文字列にリネームすることで:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
. . .
コマンドをリネームするには、別の名前を付ける方法があります。リネームされたコマンドは、他の人が推測するのが難しいが、あなたが覚えやすいものであるべきです。
. . .
# rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .
変更を保存してファイルを閉じます。
コマンドをリネームした後、Redisを再起動して変更を適用します。
新しいコマンドをテストするために、Redisコマンドラインに入力します。
そして、認証します。
OutputOK
前述の例のように、CONFIG
コマンドをASC12_CONFIG
にリネームしたと仮定します。まず、元のCONFIG
コマンドを使用してみてください。リネームしたため、失敗するはずです。
Output(error) ERR unknown command `config`, with args beginning with:
しかし、リネームされたコマンドを呼び出すと成功します。大文字小文字は区別されません。
Output1) "requirepass"
2) "your_redis_password"
最後に、redis-cli
から抜けます。
既にRedisコマンドラインを使用していて、Redisを再起動した場合、再認証が必要です。そうしないと、コマンドを入力するとこのエラーが表示されます。
OutputNOAUTH Authentication required.
警告: コマンドのリネームに関しては、/etc/redis/redis.conf
のSECURITY
セクションの最後に注意書きがあります。
. . .
# 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