前書き
Redisは、メモリ内、NoSQL、キーと値のキャッシュおよびストアであり、ディスクに永続化することもできます。
このチュートリアルでは、Redisサーバーに基本的なセキュリティを実装する方法を示します。
ただし、Redisはtrusted environmentのtrusted clientsで使用するように設計されており、独自の堅牢なセキュリティ機能はありません。 その点を強調するために、official Redis websiteからの引用を次に示します。
Redisは、信頼できる環境内の信頼できるクライアントがアクセスできるように設計されています。 これは、通常、Redisインスタンスをインターネットに直接公開すること、または一般的に、信頼されていないクライアントがRedis TCPポートまたはUNIXソケットに直接アクセスできる環境に公開することはお勧めできません。
…
一般に、Redisは最大限のセキュリティのためではなく、最大限のパフォーマンスとシンプルさのために最適化されています。
セキュリティのないパフォーマンスとシンプルさは、災害のレシピです。 Redisが持っているいくつかのセキュリティ機能ですら、ほんとうに素晴らしいものではありません。 それらには、基本的な暗号化されていないパスワード、コマンドの名前変更と無効化が含まれます。 真のアクセス制御システムが欠けています。
ただし、既存のセキュリティ機能を構成することは、データベースをセキュリティで保護しないままにすることからの大きな一歩です。
このチュートリアルでは、Redisが持ついくつかのセキュリティ機能の設定方法と、Ubuntu 14.04でのスタンドアロンRedisインストールのセキュリティ体制を強化する他のいくつかのシステムセキュリティ機能について説明します。
このガイドは、Redisサーバーとクライアントアプリケーションが異なるホストまたは異なるデータセンターにある状況を扱っていないことに注意してください。 Redisトラフィックが安全でないネットワークまたは信頼できないネットワークを通過する必要があるインストールでは、ここに示すものに加えて、SSLプロキシやRedisマシン間のVPNの設定など、まったく異なる構成のセットが必要です。
前提条件
このチュートリアルでは、次のものが必要です。
-
initial server setupからsudoユーザーが追加されたUbuntu 14.04サーバー
-
this iptables guideを使用して構成されたiptablesは、(Optional) Update Nameserversステップまでです(ネームサーバー構成部分を実行しないと、APTは機能しません)。 ネームサーバーを設定したら、完了です
-
Redisがインストールされ、this Redis guideからStep 2 — Configure Redis Masterステップまでのマスターのみのインストールの指示を使用して動作している
[[step-1 -—- verifying-that-redis-is-running]] ==ステップ1—Redisが実行されていることを確認する
最初にSSHを使用してサーバーにログインします。
ssh username@server-ip-address
Redisが機能していることを確認するには、Redisコマンドラインを使用します。 redis-cli
コマンドは、Redisコマンドラインにアクセスするために使用されます。
redis-cli
[。注意]##
すでにRedisのパスワードを設定している場合は、接続後にauth
にする必要があります。
auth your_redis_password
出力
OK
データベースサーバーをテストします。
ping
応答:
出力
PONG
出口:
quit
[[step-2 -—- securing-the-server-with-iptables]] ==ステップ2—サーバーをiptablesで保護する
iptablesの前提条件に従っている場合は、このステップをスキップしてください。 または、今すぐできます。
Redisはサーバー上で実行される単なるアプリケーションです。Redisには独自のセキュリティ機能がないため、真にセキュリティを確保するための最初のステップは、実行中のサーバーを最初に保護することです。
Ubuntu 14.04サーバーのような公開サーバーの場合、this iptables guideで指定されたファイアウォールを構成することが最初のステップです。 Follow that link and set up your firewall now.
そのガイドを使用してファイアウォールルールを実装した場合、Redisに追加のルールを追加する必要はありません。デフォルトでは、明示的に許可されない限り、すべての着信トラフィックがドロップされるためです。 Redisサーバーのデフォルトのスタンドアロンインストールはループバックインターフェース(127.0.0.1またはlocalhost)でのみリッスンするため、デフォルトポートでの着信トラフィックの心配はありません。
RedisのIPアドレスを明確に許可する必要がある場合は、RedisがリッスンしているIPアドレスと、netstat
コマンドの出力でgrep
によってバインドされているポートを確認できます。 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 basics articleを参照してください。
[[step-3 -—- binding-to-localhost]] ==ステップ3—localhostへのバインド
デフォルトでは、Redisサーバーはローカルホストからのみアクセス可能です。 ただし、チュートリアルに従ってRedisマスターサーバーをセットアップした場合は、構成ファイルを更新して、どこからでも接続できるようにしました。 これは、localhostへのバインドほど安全ではありません。
編集のためにRedis構成ファイルを開きます。
sudo nano /etc/redis/redis.conf
この行を見つけて、コメントが外されていることを確認します(#
が存在する場合は削除します)。
/etc/redis/redis.conf
bind 127.0.0.1
このファイルは引き続き使用するため、今は開いたままにしておきます。
[[step-4 -—- configuring-a-redis-password]] ==ステップ4—Redisパスワードの設定
How To Configure a Redis Cluster on Ubuntu 14.04の記事を使用してRedisをインストールした場合は、そのパスワードを設定しておく必要があります。 このセクションに従うことで、あなたの裁量で、より安全なパスワードを今すぐ作成できます。 そうでない場合、このセクションの手順は、データベースサーバーのパスワードを設定する方法を示しています。
Redisパスワードを設定すると、2つの組み込みセキュリティ機能の1つであるauth
コマンドが有効になります。このコマンドでは、クライアントがデータベースにアクセスするために認証する必要があります。 パスワードは、Redisの構成ファイル/etc/redis/redis.conf
で直接構成されます。このファイルは、前の手順で開いたままにしておく必要があります。
SECURITY
セクションまでスクロールし、次のようなコメント付きディレクティブを探します。
/etc/redis/redis.conf
# requirepass foobared
#
を削除してコメントを解除し、foobared
を非常に強力で非常に長い値に変更します。
パスワードを自分で作成するのではなく、apg
やpwgen
などのツールを使用してパスワードを生成することができます。 パスワードを生成するためだけにアプリケーションをインストールしたくない場合は、以下のワンライナーを使用できます。 これが生成するものとは異なるパスワードを生成するには、引用符で単語を変更します。
echo "digital-ocean" | sha256sum
出力は次のようになります。
出力
960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d
生成されたパスワードは発音できませんが、非常に強力で非常に長いパスワードを提供します。これは、Redisに必要なパスワードのタイプです。 そのコマンドの出力をrequirepass
の新しい値としてコピーして貼り付けた後、次のようになります。
/etc/redis/redis.conf
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コマンドの名前変更について見ていきます。
[[step-5 -—- renaming-dangerous-commands]] ==ステップ5—Dangerousコマンドの名前を変更する
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
These are examples. You should choose to disable or rename the commands that make sense for you.コマンドを自分でチェックして、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を再起動して変更を適用します。
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.
[。警告]##
コマンドの名前変更に関しては、/etc/redis/redis.conf
のSECURITY
セクションの最後に次のような注意事項があります。
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を再生しようとすると、コマンドを実行できないため、不整合が発生する可能性があります(スレーブについても同じ)。
したがって、そのような場合に名前の変更を処理する最善の方法は、名前が変更されたコマンドがマスタースレーブインストールのすべてのインスタンスに適用されることを確認することです。
[[step-6 -—- setting-data-directory-ownership-and-file-permissions]] ==ステップ6—データディレクトリの所有権とファイルのアクセス許可を設定する
このステップでは、Redisインストールのセキュリティプロファイルを改善するために行うことができる所有権と権限の変更をいくつか検討します。 これには、Redisにアクセスする必要があるユーザーのみがデータの読み取り権限を持っていることを確認することが含まれます。 そのユーザーは、デフォルトでは、redisユーザーです。
これは、親ディレクトリの長いリストにあるRedisデータディレクトリをgrep
-ingすることで確認できます。 コマンドとその出力を以下に示します。
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を構成するには、this OSSEC guideを参照してください。
信頼できないネットワークを介してRedis通信を保護しようとしている場合は、official Redis security guideでRedis開発者が推奨しているように、SSLプロキシを使用する必要があります。 Redis通信を保護するためのSSLプロキシの設定は別のトピックです。
名前変更セクションには、Redisコマンドの完全なリストは含まれていません。 ただし、これを自分で確認して、redis.io/commandsでどのように誤用される可能性があるかを判断できます。