Ubuntu 18.04でRedisインストールを保護する方法

前書き

Redisは、メモリ内、NoSQL、キーと値のキャッシュおよびストアであり、ディスクに永続化することもできます。 _信頼できる環境_の信頼できるクライアント_による使用のために設計されており、独自の強力なセキュリティ機能はありません。 その点を強調するために、http://redis.io/topics/security [公式のRedisウェブサイト]からの引用を以下に示します。

_ _ Redisは、信頼できる環境内の信頼できるクライアントがアクセスできるように設計されています。 これは、通常、Redisインスタンスをインターネットに直接公開すること、または一般的に、信頼されていないクライアントがRedis TCPポートまたはUNIXソケットに直接アクセスできる環境に公開することはお勧めできません。

一般に、Redisは最大限のセキュリティのためではなく、最大限のパフォーマンスとシンプルさのために最適化されています。 _ _

それにもかかわらず、Redisにはいくつかの基本的なセキュリティ機能が組み込まれています。 これらには、暗号化されていないパスワードを作成する機能と、コマンドの名前を変更して無効にする自由が含まれます。 特に、真のアクセス制御システムが欠けています。

これらの機能だけでは、Redisインストールのセキュリティを保証できません。 ただし、それらを構成することは、データベースを完全に保護しないままにすることからの大きな一歩です。

このチュートリアルでは、Redisが持ついくつかのセキュリティ機能を設定する方法を読み、Ubuntuサーバー上のスタンドアロンRedisインストールのセキュリティ体制を強化するシステムの設定をいくつか変更します。

このガイドは、Redisサーバーとクライアントアプリケーションが異なるホストまたは異なるデータセンターにある状況を扱っていないことに注意してください。 Redisトラフィックが安全でないネットワークまたは信頼できないネットワークを通過する必要があるインストールでは、SSLプロキシまたはhttps://www.digitalocean.com/community/tutorials/how-to-set-upのセットアップなど、まったく異なる構成セットが必要です。 -an-openvpn-server-on-ubuntu-18-04 [VPN]は、ここに示されているものに加えて、Redisマシン間で。

前提条件

このチュートリアルでは、次のものが必要です。

  • Ubuntu 18.04サーバー。 このサーバーには、「+ sudo +」権限を持つ非ルートユーザーと、UFWで設定されたファイアウォールも必要です。これは、https://www.digitalocean.com/community/tutorials/initial-serverに従って設定できます。 -setup-with-ubuntu-18-04 [Ubuntu 18.04の初期サーバーセットアップガイド]。

  • Redisがサーバーにインストールおよび構成されます。 Ubuntu 18.04サーバー用のこのガイドに従ってこれを設定できます。

ステップ1-Redisが実行されていることを確認する

まず、非rootユーザーでサーバーにSSHで接続します。

Redisが機能していることを確認するには、 `+ redis-cli +`コマンドでRedisコマンドラインを開きます:

redis-cli

`+ ping +`コマンドで接続をテストします:

ping

Redisが正常に機能している場合、次のように表示されます。

OutputPONG

これに続いて、Redisコマンドラインを終了します。

quit

Redisが正常に動作していることを確認したら、サーバーのセキュリティを強化するための最も重要なステップであるファイアウォールの設定に進むことができます。

手順2-UFWを使用したサーバーの保護

Redisは、サーバーで実行されている単なるアプリケーションです。 独自の基本的なセキュリティ機能はごくわずかであるため、真にセキュリティを確保するための最初のステップは、実行中のサーバーを保護することです。 Ubuntu 18.04サーバーのような公開サーバーの場合、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04#の説明に従ってファイアウォールを構成しますその最初のステップは、step-four-%E2%80%94-setting-up-a-basic-firewall [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 *)のみでリッスンしているため、デフォルトポートでの着信トラフィックの心配はありません。

ルールの追加方法の詳細については、https://www.digitalocean.com/community/tutorials/ufw-essentials-common-firewall-rules-and-commands [一般的なUFWルールとコマンドのガイド]をご覧ください。

ステップ3-ローカルホストへのバインド

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

編集のためにRedis構成ファイルを開きます。

sudo nano /etc/redis/redis.conf

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

/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 +`セクションまでスクロールして、コメント付きのディレクティブを探します:

/etc/redis/redis.conf

# requirepass foobared

`#`を削除してコメント解除し、 `+ foobared +`を安全なパスワードに変更します。

パスワードを設定した後、ファイルを保存し、Redisを再起動します。

sudo systemctl restart redis.service

パスワードが機能することをテストするには、Redisコマンドラインにアクセスします。

redis-cli

以下は、Redisパスワードが機能するかどうかをテストするために使用される一連のコマンドを示しています。 最初のコマンドは、認証前にキーを値に設定しようとします。

set key1 10

認証されなかったため機能しません。そのため、Redisはエラーを返します。

Output(error) NOAUTH Authentication required.

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

auth

Redisは次のことを認めます:

OutputOK

その後、前のコマンドを再度実行すると成功します:

set key1 10
OutputOK

`+ get key1 +`はRedisに新しいキーの値を問い合わせます。

get key1
Output"10"

認証後にRedisクライアントでコマンドを実行できることを確認したら、 `+ redis-cli +`を終了できます。

quit

次に、Redisコマンドの名前の変更について説明します。Redisコマンドは、誤って入力した場合や悪意のあるアクターによって入力された場合、マシンに重大な損傷を与える可能性があります。

ステップ5-危険なコマンドの名前変更

Redisに組み込まれている他のセキュリティ機能には、危険と見なされる特定のコマンドの名前変更または完全な無効化が含まれます。

誤って、または権限のないユーザーによって実行された場合、そのようなコマンドを使用して、データを再構成、破棄、または消去することができます。 認証パスワードと同様に、コマンドの名前変更または無効化は、 `+ / etc / redis / redis.conf `ファイルの同じ ` SECURITY +`セクションで設定されます。

危険と見なされるコマンドには、* FLUSHDB FLUSHALL KEYS PEXPIRE DEL CONFIG SHUTDOWN BGREWRITEAOF BGSAVE SAVE 、 * SPOP *、 SREM RENAME 、および DEBUG *。 これは包括的なリストではありませんが、そのリスト内のすべてのコマンドの名前を変更または無効にすることは、Redisサーバーのセキュリティを強化するための良い出発点です。

コマンドを無効にするか名前を変更するかは、特定のニーズまたはサイトのニーズによって異なります。 悪用される可能性のあるコマンドを使用しないことがわかっている場合は、無効にすることができます。 それ以外の場合は、名前を変更することをお勧めします。

Redisコマンドを有効または無効にするには、構成ファイルをもう一度開きます。

sudo nano  /etc/redis/redis.conf

コマンドを無効にするには、以下に示すように、空の文字列に名前を変更します(他の文字を含まない一対の引用符で表されます)。

/etc/redis/redis.conf

. . .
# It is also possible to completely kill a command by renaming it into
# an empty string:
#



. . .

コマンドの名前を変更するには、次の例に示すように別の名前を付けます。 名前が変更されたコマンドは、他の人が推測するのは難しいはずですが、覚えやすくする必要があります。

/etc/redis/redis.conf

. . .
rename-command CONFIG ""


. . .

変更を保存してファイルを閉じます。

コマンドの名前を変更した後、Redisを再起動して変更を適用します。

sudo systemctl restart redis.service

新しいコマンドをテストするには、Redisコマンドラインを入力します。

redis-cli

次に、認証:

auth
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.

結論

サーバーに誰かがログインすると、導入したRedis固有のセキュリティ機能を簡単に回避できることに注意してください。 したがって、最も重要なセキュリティ機能はファイアウォールであり、悪意のある攻撃者がそのフェンスを飛び越えることを非常に困難にします。

信頼できないネットワークを介したRedis通信を保護しようとする場合、http://redis.io/topics/security [公式Redisセキュリティガイド]でRedis開発者が推奨しているように、SSLプロキシを使用する必要があります。

Related