Ubuntu18.04でRedisのインストールを保護する方法
序章
Redisは、メモリ内、NoSQL、Key-Valueキャッシュおよびストアであり、ディスクに永続化することもできます。 信頼できるクライアントが信頼できる環境で使用するように設計されており、独自の堅牢なセキュリティ機能はありません。 その点を強調するために、公式RedisWebサイトからの引用を次に示します。
Redisは、信頼できる環境内の信頼できるクライアントがアクセスできるように設計されています。 つまり、通常、Redisインスタンスをインターネットに直接公開したり、一般に、信頼できないクライアントがRedisTCPポートまたはUNIXソケットに直接アクセスできる環境に公開したりすることはお勧めできません。
. . .
一般に、Redisは最大のセキュリティのために最適化されていませんが、最大のパフォーマンスとシンプルさのために最適化されています。
それにもかかわらず、Redisにはいくつかの基本的なセキュリティ機能が組み込まれています。 これには、暗号化されていないパスワードを作成する機能や、コマンドの名前を変更したり無効にしたりする自由が含まれます。 特に、それは真のアクセス制御システムを欠いています。
これらの機能だけでは、Redisインストールのセキュリティを確保することはできません。 ただし、それらを構成することは、データベースを完全に保護されていないままにすることからの大きなステップです。
このチュートリアルでは、Redisが持ついくつかのセキュリティ機能を構成する方法を読み、システムの構成にいくつかの変更を加えて、UbuntuサーバーへのスタンドアロンRedisインストールのセキュリティ体制を強化します。
このガイドは、Redisサーバーとクライアントアプリケーションが異なるホストまたは異なるデータセンターにある状況には対応していないことに注意してください。 Redisトラフィックが安全でない、または信頼できないネットワークを通過する必要があるインストールでは、ここに示すものに加えて、Redisマシン間にSSLプロキシまたは VPN を設定するなど、まったく異なる構成のセットが必要です。
前提条件
このチュートリアルでは、次のものが必要です。
-
Ubuntu18.04サーバー。 このサーバーには、root以外のユーザーも必要です。
sudo
特権とUFWでセットアップされたファイアウォール。これは、Ubuntu18.04[X139Xの初期サーバーセットアップガイド]に従って構成できます。 -
サーバーにRedisがインストールおよび構成されています。 これは、Ubuntu18.04サーバー用のこのガイドに従って設定できます。
ステップ1—Redisが実行されていることを確認する
まず、root以外のユーザーを使用してサーバーにSSHで接続します。
Redisが機能していることを確認するには、Redisコマンドラインを開きます。 redis-cli
指図:
- redis-cli
注:Redisのパスワードをすでに設定している場合は、 auth
接続後のコマンド:
- auth your_redis_password
OutputOK
Redisのパスワードを設定していない場合は、このチュートリアルのステップ4でその方法を読むことができます。
との接続をテストします ping
指図:
- ping
Redisが正しく機能している場合は、次のように表示されます。
OutputPONG
これに続いて、Redisコマンドラインを終了します。
- quit
Redisが正常に実行され、機能していることを確認したので、サーバーのセキュリティを強化するための最も重要な手順であるファイアウォールの構成に進むことができます。
ステップ2—UFWでサーバーを保護する
Redisは、サーバー上で実行されている単なるアプリケーションです。 独自の基本的なセキュリティ機能はわずかしかないため、真にセキュリティを確保するための最初のステップは、実行中のサーバーをセキュリティで保護することです。 Ubuntu 18.04サーバーのような公開サーバーの場合、 Ubuntu 18.04の初期サーバーセットアップガイドで説明されているようにファイアウォールを構成することが、その最初のステップです。 まだ行っていない場合は、そのリンクをたどってファイアウォールを今すぐ設定してください。
ファイアウォールを設定したかどうか、またはファイアウォールがアクティブかどうかわからない場合は、次のコマンドを実行してこれを確認できます。
- sudo ufw status
Ubuntu 18.04の初期サーバーセットアップガイドに従った場合、次の出力が表示されます。
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
このガイドを使用してファイアウォールルールを実装している場合は、明示的に許可されていない限り、デフォルトでUFWがすべての着信トラフィックをドロップするため、Redisにルールを追加する必要はありません。 Redisサーバーのデフォルトのスタンドアロンインストールはループバックインターフェイスでのみリッスンしているため(127.0.0.1
、または localhost )の場合、デフォルトのポートでの着信トラフィックについて心配する必要はありません。
ルールを追加する方法の詳細については、この一般的なUFWルールとコマンドに関するガイドを参照してください。
ステップ3—ローカルホストへのバインド
デフォルトでは、Redisはlocalhostからのみアクセスできます。 ただし、前提条件のセクションに記載されているチュートリアルとは異なるチュートリアルに従ってRedisを構成した場合は、どこからでも接続できるように構成ファイルを更新した可能性があります。 これは、localhostへのバインドほど安全ではありません。
編集のためにRedis構成ファイルを開きます。
- sudo nano /etc/redis/redis.conf
この行を見つけて、コメントが外されていることを確認します( #
存在する場合):
bind 127.0.0.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 2855/redis-server 1
この出力は、 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 、[X252X ] 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'
ただし、名前が変更されたコマンドの呼び出しは成功します。 大文字と小文字は区別されません。
- 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 slaves may cause problems.
ノート: Redisプロジェクトでは、「マスター」と「スレーブ」という用語を使用することを選択しますが、DigitalOceanは通常、「プライマリ」と「セカンダリ」の代替を好みます。 混乱を避けるために、ここではRedisのドキュメントで使用されている用語を使用することにしました。
つまり、名前が変更されたコマンドがAOFファイルにない場合、またはAOFファイルがスレーブに送信されていない場合は、問題はありません。
したがって、コマンドの名前を変更する場合は、この点に注意してください。 コマンドの名前を変更するのに最適なタイミングは、AOF永続性を使用していないとき、またはインストール直後、つまりRedisを使用するアプリケーションがデプロイされる前です。
AOFを使用していて、マスタースレーブのインストールを扱っている場合は、プロジェクトのGitHub問題ページからこの回答を検討してください。 以下は、作者の質問に対する回答です。
コマンドはAOFに記録され、送信されたのと同じ方法でスレーブに複製されるため、同じ名前変更がないインスタンスでAOFを再生しようとすると、コマンドを実行できないため、不整合が発生する可能性があります(スレーブについても同じです)。
したがって、そのような場合に名前の変更を処理する最良の方法は、名前が変更されたコマンドがマスタースレーブインストールのすべてのインスタンスに適用されることを確認することです。
結論
誰かがサーバーにログインすると、Redis固有のセキュリティ機能を簡単に回避できることに注意してください。 したがって、最も重要なセキュリティ機能はファイアウォールです。これにより、悪意のある攻撃者がそのフェンスを飛び越えることが非常に困難になります。
信頼できないネットワークを介してRedis通信を保護しようとしている場合は、公式RedisセキュリティガイドでRedis開発者が推奨しているように、SSLプロキシを使用する必要があります。