Ubuntu14.04でRedisのインストールを保護する方法
序章
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を使用してサーバーにログインします。
- ssh username@server-ip-address
Redisが機能していることを確認するには、Redisコマンドラインを使用します。 The redis-cli
コマンドは、Redisコマンドラインにアクセスするために使用されます。
- redis-cli
すでにRedisのパスワードを設定している場合は、 auth
接続後。
- auth your_redis_password
OK
データベースサーバーをテストします。
- ping
応答:
PONG
出口:
- 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アドレスとポートの組み合わせを示しています。
- 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構成ファイルを開きます。
- sudo nano /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
セクションを作成し、次のようなコメント付きディレクティブを探します。
# requirepass foobared
を削除してコメントを外します #
、および変更 foobared
非常に強く、非常に長い値に。
自分でパスワードを作成するのではなく、次のようなツールを使用できます。 apg
また pwgen
1つを生成します。 パスワードを生成するためだけにアプリケーションをインストールしたくない場合は、以下のワンライナーを使用できます。 生成されるパスワードとは異なるパスワードを生成するには、引用符で囲んだ単語を変更します。
- echo "digital-ocean" | sha256sum
出力は次のようになります。
960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d
生成されたパスワードは発音できませんが、非常に強力で非常に長いパスワードが提供されます。これは、Redisに必要なパスワードのタイプとまったく同じです。 そのコマンドの出力をコピーして貼り付けた後、の新しい値として requirepass
、次のようになります。
requirepass 960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d
より短いパスワードが必要な場合は、代わりに以下のコマンドの出力を使用してください。 繰り返しますが、引用符で囲まれた単語を変更して、これと同じパスワードが生成されないようにします。
- echo "digital-ocean" | sha1sum
今回は出力がやや短くなります。
10d9a99851a411cdae8c3fa09d7290df192441a9
パスワードを設定したら、ファイルを保存して、Redisを再起動します。
- sudo service redis-server restart
パスワードが機能することをテストするには、Redisコマンドラインにアクセスします。
- redis-cli
次の出力は、Redisパスワードが機能するかどうかをテストするために使用される一連のコマンドを示しています。 最初のコマンドは、認証前にキーを値に設定しようとします。
- set key1 10
それは機能しないため、Redisはエラーを返します。
(error) NOAUTH Authentication required.
2番目のコマンドは、Redis構成ファイルで指定されたパスワードで認証します。
- auth your_redis_password
Redisは認めます。
OK
その後、前のコマンドの再実行は成功します。
- set key1 10
OK
get key1
新しいキーの値をRedisに照会します。
- get key1
"10"
最後のコマンドは終了します redis-cli
. 使用することもできます exit
:
- quit
次に、Redisコマンドの名前を変更する方法を見ていきます。
ステップ5—危険なコマンドの名前を変更する
Redisに組み込まれている他のセキュリティ機能を使用すると、危険と見なされる特定のコマンドの名前を変更したり、完全に無効にしたりできます。
許可されていないユーザーが実行した場合、このようなコマンドを使用して、データを再構成、破棄、またはその他の方法でワイプすることができます。 認証パスワードと同様に、コマンドの名前変更または無効化は同じように構成されます SECURITY
のセクション /etc/redis/redis.conf
ファイル。
危険であることがわかっているコマンドには、 FLUSHDB 、 FLUSHALL 、 KEYS 、 PEXPIRE 、DELなどがあります。 ]、 CONFIG 、 SHUTDOWN 、 BGREWRITEAOF 、 BGSAVE 、 SAVE 、 SPOP 、 SREM 、 RENAME 、およびDEBUG。 これは包括的なリストではありませんが、そのリスト内のすべてのコマンドの名前を変更するか無効にすることは、良い出発点です。
コマンドを無効にするか名前を変更するかは、サイト固有です。 悪用される可能性のあるコマンドを決して使用しないことがわかっている場合は、それを無効にすることができます。 それ以外の場合は、名前を変更します。
Redisコマンドを有効または無効にするには、構成ファイルを開いてもう一度編集します。
- sudo nano /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 ""
また、コマンドの名前を変更するには、以下の例のように、別の名前を付けます。 名前を変更したコマンドは、他の人が推測するのは難しいはずですが、覚えやすいはずです。 自分の生活を困難にしないでください。
rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
変更を保存します。
コマンドの名前を変更した後、Redisを再起動して変更を適用します。
- sudo service redis-server restart
新しいコマンドをテストするには、Redisコマンドラインを入力します。
- redis-cli
次に、CONFIGコマンドの名前をASC12_CONFIGに変更したとすると、次の出力は、新しいコマンドが適用されたことをテストする方法を示しています。
認証後:
- auth your_redis_password
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.
コマンドの名前変更に関しては、最後に注意事項があります。 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データディレクトリを検索します。 コマンドとその出力を以下に示します。
- ls -l /var/lib | grep redis
drwxr-xr-x 2 redis redis 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
-rw-r--r-- 1 root root 30176 Jan 14 2014 /etc/redis/redis.conf
その許可(644)は誰でも読み取り可能ですが、ステップ4で構成された暗号化されていないパスワードが含まれているため、これはお勧めできません。
所有権と権限を変更する必要があります。 理想的には、 redis ユーザーが所有し、rootユーザーが二次所有する必要があります。 これを行うには、次のコマンドを実行します。
- sudo chown redis:root /etc/redis/redis.conf
次に、所有権を変更して、ファイルの所有者のみがファイルの読み取りや書き込みを行えるようにします。
- sudo chmod 600 /etc/redis/redis.conf
次を使用して、新しい所有権と権限を確認できます。
- ls -l /etc/redis/redis.conf
total 40
-rw------- 1 redis root 29716 Sep 22 18:32 /etc/redis/redis.conf
最後に、Redisを再起動します。
- sudo service redis-server restart
結論
誰かがサーバーにログインすると、Redis固有のセキュリティ機能を簡単に回避できることに注意してください。 したがって、最も重要なセキュリティ機能は、そのフェンスをジャンプすることを非常に困難にする機能です。
それはあなたのファイアウォールでなければなりません。
サーバーのセキュリティを次のレベルに引き上げるために、OSSECのような侵入検知システムを構成することができます。 Ubuntu 14.04でOSSECを構成するには、このOSSECガイドを参照してください。
信頼できないネットワークを介してRedis通信を保護しようとしている場合は、公式RedisセキュリティガイドでRedis開発者が推奨しているように、SSLプロキシを使用する必要があります。 Redis通信を保護するためのSSLプロキシの設定は別のトピックです。
名前の変更セクションにRedisコマンドの完全なリストを含めませんでした。 ただし、これを自分で確認し、redis.io/commandsでどのように悪用される可能性があるかを判断できます。