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

前書き

Redisは、メモリ内、NoSQL、キーと値のキャッシュおよびストアであり、ディスクに永続化することもできます。

このチュートリアルでは、Redisサーバーに基本的なセキュリティを実装する方法を示します。

ただし、Redisは、信頼できる環境で信頼できるクライアントが使用するように設計されており、独自の堅牢なセキュリティ機能はありません。 その点を強調するために、http://redis.io/topics/security [公式のRedisウェブサイト]からの引用を以下に示します。

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

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

セキュリティのないパフォーマンスとシンプルさは、災害のレシピです。 Redisが持っているいくつかのセキュリティ機能でさえ、本当に賞賛すべきものではありません。 それらには、基本的な暗号化されていないパスワード、コマンドの名前変更と無効化が含まれます。 真のアクセス制御システムが欠けています。

ただし、既存のセキュリティ機能を構成することは、データベースをセキュリティで保護しないままにすることからの大きな一歩です。

このチュートリアルでは、Redisが持ついくつかのセキュリティ機能の設定方法と、Ubuntu 14.04でのスタンドアロンRedisインストールのセキュリティ体制を強化する他のいくつかのシステムセキュリティ機能について説明します。

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

前提条件

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

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

最初にSSHを使用してサーバーにログインします。

ssh @

Redisが機能していることを確認するには、Redisコマンドラインを使用します。 `+ redis-cli +`コマンドはRedisコマンドラインにアクセスするために使用されます。

redis-cli

データベースサーバーをテストします。

ping

応答:

出力

PONG

出口:

quit

ステップ2-iptablesを使用してサーバーを保護する

iptablesの前提条件に従っている場合は、このステップをスキップしてください。 または、今すぐできます。

Redisはサーバー上で実行される単なるアプリケーションです。Redisには独自のセキュリティ機能がないため、真にセキュリティを確保するための最初のステップは、実行中のサーバーを最初に保護することです。

Ubuntu 14.04サーバーのような公開サーバーの場合、https://www.digitalocean.com/community/tutorials/how-to-implement-a-basic-firewall-template-withで指定されているようにファイアウォールを構成します-iptables-on-ubuntu-14-04 [このiptablesガイド]はその最初のステップです。 そのリンクに従って、ファイアウォールを設定してください。

そのガイドを使用してファイアウォールルールを実装した場合、Redisに追加のルールを追加する必要はありません。デフォルトでは、明示的に許可されない限り、すべての着信トラフィックがドロップされるためです。 Redisサーバーのデフォルトのスタンドアロンインストールはループバックインターフェース(127.0.0.1またはlocalhost)でのみリッスンするため、デフォルトポートでの着信トラフィックの心配はありません。

RedisのIPアドレスを明確に許可する必要がある場合、RedisがリッスンしているIPアドレスと、バインドされているポートを、 + netstat +`コマンドの出力を `+ grep + -ingすることで確認できます。 4番目の列(ここでは* 127.0.0.1:6379 *)は、Redisに関連付けられたIPアドレスとポートの組み合わせを示します。

sudo netstat -plunt | grep -i redis

出力

tcp   0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      8562/redis-server 1

このIPアドレスがファイアウォールポリシーで許可されていることを確認してください。 ルールを追加する方法の詳細については、こちらのhttps://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands[iptables basics article]をご覧ください。

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

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

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

sudo nano /etc/redis/redis.conf

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

/etc/redis/redis.conf

bind 127.0.0.1

このファイルは引き続き使用するため、今は開いたままにしておきます。

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

Ubuntu 14.04でRedisクラスターを設定する方法を使用してRedisをインストールした場合記事では、パスワードを設定しておく必要があります。 このセクションに従うことで、あなたの裁量で、より安全なパスワードを今すぐ作成できます。 そうでない場合、このセクションの手順は、データベースサーバーのパスワードを設定する方法を示しています。

Redisパスワードを設定すると、2つのビルトインセキュリティ機能の1つである `+ auth `コマンドが有効になります。これは、クライアントがデータベースにアクセスするために認証する必要があります。 パスワードは、Redisの設定ファイルである ` / etc / redis / redis.conf +`で直接設定されます。これは前の手順で開いたままにしておく必要があります。

`+ SECURITY +`セクションまでスクロールして、コメント付きのディレクティブを探します:

/etc/redis/redis.conf

# requirepass foobared

`#`を削除してコメント解除し、 `+ foobared +`を非常に強力で非常に長い値に変更します。

自分でパスワードを作成するのではなく、 `+ apg `や ` pwgen +`などのツールを使用してパスワードを生成できます。 パスワードを生成するためだけにアプリケーションをインストールしたくない場合は、以下のワンライナーを使用できます。 これが生成するものとは異なるパスワードを生成するには、引用符で単語を変更します。

echo "" | sha256sum

出力は次のようになります。

出力

960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

生成されたパスワードは発音できませんが、非常に強力で非常に長いパスワードを提供します。これは、Redisに必要なパスワードのタイプです。 そのコマンドの出力をコピーして、「+ requirepass +」の新しい値として貼り付けた後、次のようになります。

/etc/redis/redis.conf

requirepass

短いパスワードを希望する場合は、代わりに以下のコマンドの出力を使用してください。 繰り返しますが、引用符で単語を変更して、このパスワードと同じパスワードが生成されないようにします。

echo "" | sha1sum

今回は多少短い出力が得られます:

出力

10d9a99851a411cdae8c3fa09d7290df192441a9

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

sudo service redis-server restart

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

redis-cli

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

set key1 10

これは機能しないため、Redisはエラーを返します。

出力

(error) NOAUTH Authentication required.

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

auth

Redisは認めます。

出力

OK

その後、前のコマンドの再実行は成功します。

set key1 10

出力

OK

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

get key1

出力

"10"

最後のコマンドは、 `+ redis-cli`を終了します。 `+ exit +`を使用することもできます:

quit

次に、Redisコマンドの名前変更について見ていきます。

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

Redisに組み込まれているその他のセキュリティ機能を使用すると、危険と見なされる特定のコマンドの名前を変更したり、完全に無効にしたりできます。

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

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

コマンドを無効にするか名前を変更するかは、サイト固有です。 悪用される可能性のあるコマンドを使用しないことがわかっている場合は、無効にすることができます。 それ以外の場合は、名前を変更します。

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 service redis-server restart

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

redis-cli

次に、* CONFIG コマンドの名前を ASC12_CONFIG *に変更したと仮定すると、次の出力は、新しいコマンドが適用されたことをテストする方法を示しています。

認証後:

auth

出力

OK

`+ config +`コマンドを使用する最初の試みは、名前が変更されているため失敗します。

config get requirepass

出力

(error) ERR unknown command 'config'

名前を変更したコマンドの呼び出しは成功するはずです(大文字と小文字は区別されません)。

asc12_config get requirepass

出力

1) "requirepass"
2) "your_redis_password"

最後に、 `+ redis-cli`を終了できます:

exit

注:既にRedisコマンドラインを使用していて、Redisを再起動する場合は、再認証する必要があります。 それ以外の場合、コマンドを入力するとこのエラーが発生します。

出力

NOAUTH Authentication required.

手順6-データディレクトリの所有権とファイルのアクセス許可を設定する

このステップでは、Redisインストールのセキュリティプロファイルを改善するために行うことができる所有権と権限の変更をいくつか検討します。 これには、Redisにアクセスする必要があるユーザーのみがデータを読み取る権限を持っていることを確認することが含まれます。 そのユーザーは、デフォルトでは* redis *ユーザーです。

親ディレクトリの長いリストでRedisデータディレクトリを + grep + -ingすることでこれを確認できます。 コマンドとその出力を以下に示します。

ls -l /var/lib | grep redis

出力

2    4096 Aug  6 09:32 redis

Redisデータディレクトリは* redis ユーザーが所有し、 redis *グループにセカンダリアクセスが許可されていることがわかります。 その部分は良いです。

そうでない部分は、フォルダのアクセス許可、755です。 Redisユーザーのみがフォルダーとそのコンテンツにアクセスできるようにするには、アクセス許可を700に変更します。

sudo chmod 700 /var/lib/redis

変更する必要がある他の権限は、Redis構成ファイルの権限です。 デフォルトでは、ファイル許可は644で、* root が所有し、 root *グループが2次所有権を持ちます。

ls -l /etc/redis/redis.conf

出力

1  30176 Jan 14  2014 /etc/redis/redis.conf

その許可(644)は、誰でも読み取り可能です。これは、ステップ4で構成された暗号化されていないパスワードが含まれているため、お勧めできません。

所有権と許可を変更する必要があります。 理想的には、* redis ユーザーが所有し、 root *ユーザーが2次所有権を持つ必要があります。 それを行うには、次のコマンドを実行します。

sudo chown redis:root /etc/redis/redis.conf

次に、ファイルの所有者のみが読み取りおよび/または書き込みできるように、所有権を変更します。

sudo chmod 600 /etc/redis/redis.conf

次を使用して、新しい所有権と許可を確認できます。

ls -l /etc/redis/redis.conf

出力

total 40
1  29716 Sep 22 18:32 /etc/redis/redis.conf

最後に、Redisを再起動します。

sudo service redis-server restart

結論

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

それがあなたのファイアウォールであるべきです。

サーバーのセキュリティを次のレベルに引き上げるために、OSSECなどの侵入検知システムを構成できます。 Ubuntu 14.04でOSSECを構成するには、https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-ossec-security-notifications-on-ubuntu-14-04 [このOSSECガイド]を参照してください。 。

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

名前変更セクションには、Redisコマンドの完全なリストは含まれていません。 ただし、これを自分で確認して、http://redis.io/commands [redis.io/commands]で誤用の可能性を判断できます。