序章

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

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

ただし、Redisは信頼できるクライアント信頼できる環境で使用するように設計されており、独自の堅牢なセキュリティ機能はありません。 その点を強調するために、公式RedisWebサイトからの引用を次に示します。

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

. . .

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

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

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

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

このガイドは、Redisサーバーとクライアントアプリケーションが異なるホストまたは異なるデータセンターにある状況には対応していないことに注意してください。 Redisトラフィックが安全でない、または信頼できないネットワークを通過する必要があるインストールでは、ここに示すものに加えて、Redisマシン間にSSLプロキシまたは VPN を設定するなど、まったく異なる構成のセットが必要です。

前提条件

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

  • サーバーの初期設定からsudoユーザーが追加されたUbuntu14.04サーバー

  • このiptablesガイドを使用して構成されたiptablesは、(オプション)Nameservers の更新手順まで実行されます(nameserver構成部分を実行しないと、APTは機能しません)。 ネームサーバーを構成したら、これで完了です。

  • このRedisガイドからステップ2—Redisマスターの構成ステップまでのマスターのみのインストールの手順を使用してRedisをインストールして動作させる

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

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

  1. ssh username@server-ip-address

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

  1. redis-cli

すでにRedisのパスワードを設定している場合は、 auth 接続後。

  1. auth your_redis_password
出力
OK

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

  1. ping

応答:

出力
PONG

出口:

  1. quit

ステップ2—iptablesでサーバーを保護する

iptablesの前提条件に従っている場合は、この手順をスキップしてください。 または、今それを行うことができます。

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

Ubuntu 14.04サーバーのような公開サーバーの場合、このiptablesガイドに記載されているようにファイアウォールを構成することが最初のステップです。 そのリンクをたどって、今すぐファイアウォールを設定してください。

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

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

  1. sudo netstat -plunt | grep -i redis
出力
tcp   0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      8562/redis-server 1

このIPアドレスがファイアウォールポリシーで許可されていることを確認してください。 ルールを追加する方法の詳細については、このiptablesの基本記事を参照してください。

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

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

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

  1. 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 1つを生成します。 パスワードを生成するためだけにアプリケーションをインストールしたくない場合は、以下のワンライナーを使用できます。 生成されるパスワードとは異なるパスワードを生成するには、引用符で囲んだ単語を変更します。

  1. echo "digital-ocean" | sha256sum

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

出力
960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

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

/etc/redis/redis.conf
requirepass 960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

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

  1. echo "digital-ocean" | sha1sum

今回は出力がやや短くなります。

出力
10d9a99851a411cdae8c3fa09d7290df192441a9

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

  1. sudo service redis-server restart

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

  1. redis-cli

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

  1. set key1 10

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

出力
(error) NOAUTH Authentication required.

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

  1. auth your_redis_password

Redisは認めます。

出力
OK

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

  1. set key1 10
出力
OK

get key1 新しいキーの値をRedisに照会します。

  1. get key1
出力
"10"

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

  1. quit

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

ステップ5—危険なコマンドの名前を変更する

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

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

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

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

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

  1. sudo nano /etc/redis/redis.conf

これらは例です。 自分にとって意味のあるコマンドを無効にするか、名前を変更するかを選択する必要があります。 コマンドを自分でチェックして、それらがどのように誤用される可能性があるかを判断できます。 redis.io/commands

コマンドを無効にするか強制終了するには、次に示すように、コマンドの名前を空の文字列に変更します。

/etc/redis/redis.conf
# 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 ""

また、コマンドの名前を変更するには、以下の例のように、別の名前を付けます。 名前を変更したコマンドは、他の人が推測するのは難しいはずですが、覚えやすいはずです。 自分の生活を困難にしないでください。

/etc/redis/redis.conf
rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG

変更を保存します。

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

  1. sudo service redis-server restart

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

  1. redis-cli

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

認証後:

  1. auth your_redis_password
出力
OK

を使用する最初の試み config 名前が変更されたため、コマンドは失敗するはずです。

  1. config get requirepass
出力
(error) ERR unknown command 'config'

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

  1. asc12_config get requirepass
出力
1) "requirepass"
2) "your_redis_password"

最後に、あなたはから出ることができます redis-cli:

  1. exit

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

出力
NOAUTH 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.

つまり、名前が変更されたコマンドがAOFファイルにない場合、またはAOFファイルがスレーブに送信されていない場合でも、問題はありません。

したがって、コマンドの名前を変更する場合は、この点に注意してください。 コマンドの名前を変更するのに最適なタイミングは、AOF永続性を使用していないとき、またはインストール直後、つまりRedisを使用するアプリケーションがデプロイされる前です。

AOFを使用していて、マスタースレーブのインストールを処理している場合は、プロジェクトのGitHubの問題ページからこの回答を検討してください。 以下は、作者の質問に対する回答です。

コマンドはAOFに記録され、送信されたのと同じ方法でスレーブに複製されるため、同じ名前変更がないインスタンスでAOFを再生しようとすると、コマンドを実行できないため、不整合が発生する可能性があります(スレーブについても同じです)。

したがって、そのような場合に名前の変更を処理する最良の方法は、名前が変更されたコマンドがマスタースレーブインストールのすべてのインスタンスに適用されることを確認することです。

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

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

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

  1. ls -l /var/lib | grep redis
出力
drwxr-xr-x 2 redis   redis   4096 Aug  6 09:32 redis

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

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

  1. sudo chmod 700 /var/lib/redis

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

  1. ls -l /etc/redis/redis.conf
出力
-rw-r--r-- 1 root root 30176 Jan 14  2014 /etc/redis/redis.conf

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

所有権と権限を変更する必要があります。 理想的には、 redis ユーザーが所有し、rootユーザーが二次所有する必要があります。 これを行うには、次のコマンドを実行します。

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

次に、所有権を変更して、ファイルの所有者のみがファイルの読み取りや書き込みを行えるようにします。

  1. sudo chmod 600 /etc/redis/redis.conf

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

  1. ls -l /etc/redis/redis.conf
出力
total 40
-rw------- 1 redis root 29716 Sep 22 18:32 /etc/redis/redis.conf

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

  1. sudo service redis-server restart

結論

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

それはあなたのファイアウォールでなければなりません。

サーバーのセキュリティを次のレベルに引き上げるために、OSSECのような侵入検知システムを構成することができます。 Ubuntu 14.04でOSSECを構成するには、このOSSECガイドを参照してください。

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

名前の変更セクションにRedisコマンドの完全なリストを含めませんでした。 ただし、これを自分で確認し、redis.io/commandsでどのように悪用される可能性があるかを判断できます。