[ Redis](https://cloud.tencent.com/product/crs?from=10680)は、メモリ内のNoSQL、キー値キャッシュおよびストレージであり、ディスクに保存することもできます。
このチュートリアルでは、Redisサーバーの基本的なセキュリティを実装する方法を示します。
ただし、Redisは信頼できる環境で信頼できるクライアントが使用するように設計されており、独自の強力なセキュリティ機能を備えていないことに注意してください。これを強調するために、[Redis公式ウェブサイト](http://redis.io/topics/security)からの引用を見ることができます:
Redisは、信頼できる環境で信頼できるクライアントがアクセスできるように設計されています。つまり、Redisインスタンスは通常、インターネットに直接公開されていないか、信頼できないクライアントがRedisTCPポートまたはUNIXソケットに直接アクセスできる環境です。 。 。 。一般的に、Redisは最大のセキュリティのために最適化されていませんが、最大のパフォーマンスとシンプルさのために最適化されています。
セキュリティのないパフォーマンスとシンプルさは、実際には惨事です。 Redisにいくつかの単純なセキュリティ機能があるとしても、賞賛するものは何もありません。これには、基本的な暗号化されていないパスワード、コマンドの名前変更と無効化が含まれます。実際のアクセス制御システムが不足しています。
ただし、既存のセキュリティ機能を構成することは、データベースのセキュリティを維持する上で依然として重要なステップです。
このチュートリアルでは、Redisが持ついくつかのセキュリティ機能と、Ubuntu14.04でのスタンドアロンRedisインストールのセキュリティを向上させる他のいくつかのシステムセキュリティ機能を構成する方法を学習します。
このガイドでは、Redisサーバーとクライアントアプリケーションが異なるホストまたは異なるデータセンターに配置されている状況については説明していないことに注意してください。 Redisトラフィックは、安全でないネットワークまたは信頼できないネットワークを通過する必要があります。インストールには、Redisマシン間でSSLプロキシまたは[V ](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openV-server-on-ubuntu-14-04)を設定するなど、完全に異なる構成セットと、ここに示す構成が必要です。
このチュートリアルでは、次のものが必要になります。
まず、SSHを使用してサーバーにログインします。
ssh username@server-ip-address
Redisが正しく機能しているかどうかを確認するには、Redisコマンドラインを使用します。 redis-cli
コマンドは、Redisコマンドラインにアクセスするために使用されます。
redis-cli
Redisのパスワードを設定している場合は、接続後に認証を実行する必要があります。
auth your_redis_password
OK
データベースサーバーをテストします。
ping
応答:
PONG
書き出す:
quit
iptablesの前提条件に従っている場合は、この手順をスキップしてください。または、あなたは今彼を終えることができます。
Redisは、サーバー上で実行されている単なるアプリケーションです。Redisには独自の実際のセキュリティ機能がないため、Redisを真に保護するための最初のステップは、実行されているサーバーを保護することです。
Ubuntu 14.04サーバーのような公開サーバーの場合、ファイアウォールの構成が最初のステップです。 (サーバーでファイアウォールを有効にします。TencentCloudの[CVM](https://cloud.tencent.com/product/cvm?from=10680)サーバーを使用している場合は、Tencent Cloudコンソールの[セキュリティグループ](https://console.cloud.tencent.com/cvm/securitygroup)で直接設定できます。)
このガイドを使用してファイアウォールルールを実装している場合、明示的に許可されていない限り、デフォルトではすべての着信トラフィックがドロップされるため、Redisにルールを追加する必要はありません。 Redisサーバーのデフォルトのスタンドアロンインストールはループバックインターフェイス(127.0.0.1またはlocalhost)でのみリッスンするため、デフォルトのポートでの着信トラフィックについて心配する必要はありません。
RedisのIPアドレスを明確に許可する必要がある場合は、 grep
コマンド netstat
の出力を介して、RedisがリッスンしているIPアドレスとバインドされたポートを確認できます。 4番目の列(つまり、** 127.0.0.1:6379 **列)は、Redisに関連付けられているIPアドレスとポートの組み合わせを示します。
sudo netstat -plunt | grep -i redis
tcp 00127.0.0.1:63790.0.0.0:* LISTEN 8562/redis-server 1
このIPアドレスがファイアウォールポリシーで許可されていることを確認してください。
デフォルトでは、Redisサーバーにはlocalhostからのみアクセスできます。ただし、チュートリアルに従ってRedisマスターサーバーをセットアップする場合は、構成ファイルを更新して、任意の場所からの接続を許可してください。これは、localhostへのバインドほど安全ではありません。
編集のためにRedis構成ファイルを開きます。
sudo nano /etc/redis/redis.conf
この行を見つけて、コメントが外されていることを確認します(存在する場合は #
を削除します)。
bind 127.0.0.1
このファイルは引き続き使用するため、今は開いたままにしておきます。
[Ubuntu 14.04でRedisクラスターを構成する方法](https://cloud.tencent.com/developer/article/1346217?from=10680)を使用してRedisをインストールする場合は、そのパスワードを構成する必要があります。このセクションに従って、より安全なパスワードを設定できるかどうかを自分で決めることができます。そうでない場合、このセクションの手順は、データベースサーバーのパスワードを設定する方法を示しています。
Redisパスワードを構成すると、2つの組み込みセキュリティ機能の1つである auth
コマンドが有効になります。これは、データベースにアクセスするためにクライアントが認証する必要があります。パスワードはRedis構成ファイル / etc / redis / redis.conf
で直接構成されますが、前の手順でパスワードを開く必要があります。
SECURITY
セクションまでスクロールし、コメントの説明を見つけます。
# requirepass foobared
#
を削除し、コメントを外し、 foobared
を非常に強力で非常に長い値に変更します。
自分でパスワードを作成する代わりに、 apg
や pwgen
などのツールを使用してパスワードを生成できます。パスワードを生成するためだけにアプリケーションをインストールしたくない場合は、以下の1行の手順を使用できます。この生成されたパスワードとは異なるパスワードを生成するには、引用符の単語を変更します。
echo "digital-ocean"| sha256sum
出力は次のようになります。
960 c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d
生成されたパスワードは発音されませんが、非常に強力で非常に長いパスワードが提供されます。これは、Redisが必要とするタイプのパスワードです。このコマンドの出力を requirepass
の新しい値としてコピーして貼り付けた後、次のようになります。
requirepass 960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d
より短いパスワードが必要な場合は、次のコマンドの出力を使用してください。繰り返しますが、引用符の単語を変更して、これと同じパスワードが生成されないようにします。
echo "digital-ocean"| sha1sum
今回は、出力がいくらか短くなります。
10 d9a99851a411cdae8c3fa09d7290df192441a9
パスワードを設定したら、ファイルを保存して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
次に、renameRedisコマンドを紹介します。
Redisに組み込まれている別のセキュリティ機能を使用すると、危険と見なされる特定のコマンドの名前を変更したり、完全に無効にしたりできます。
許可されていないユーザーが実行すると、このようなコマンドを使用して、データを再構成、破棄、またはその他の方法で消去できます。認証パスワードと同様に、renameまたはdisableコマンドも、 / 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
**これらは例です。自分にとって意味のあるコマンドを無効にするか、名前を変更するかを選択する必要があります。 **コマンドを自分でチェックして、[redis.io/commands](http://redis.io/commands)でそれらを悪用する方法を決定できます。
コマンドを無効にするか終了するには、次のように名前を空の文字列に変更します。
# 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.
名前の変更コマンドに関しては、 / 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を再生しようとすると、コマンドを実行できないため、不整合(スレーブと同じ)が発生する可能性があります。
したがって、この状況で名前の変更を処理する最善の方法は、名前が変更されたコマンドがマスタースレーブインストールのすべてのインスタンスに適用されるようにすることです。
このステップでは、Redisインストールのセキュリティプロファイルを改善するために行うことができる所有権と権限の変更について検討します。これには、Redisへのアクセスが必要なユーザーのみがそのデータを読み取る権利を持つようにすることが含まれます。デフォルトでは、このユーザーは** redis **ユーザーです。
これを確認するために、親ディレクトリの長いリストでRedisデータディレクトリを見つけることができます。コマンドとその出力は次のとおりです。
ls -l /var/lib | grep redis
drwxr-xr-x 2 redis redis 4096 Aug 609: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 142014/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 2218:32/etc/redis/redis.conf
最後に、Redisを再起動します。
sudo service redis-server restart
誰かがサーバーにログインすると、実装したRedis固有のセキュリティ機能を簡単にバイパスできることに注意してください。したがって、最も重要な安全機能は、フェンスを飛び越えるのを非常に困難にすることです。
それはあなたのファイアウォールでなければなりません。
サーバーのセキュリティを新しいレベルに上げるために、OSSECなどの侵入検出システムを構成できます。
信頼できないネットワークを介してRedis通信を保護しようとしている場合は、[公式Redisセキュリティガイド](http://redis.io/topics/security)でRedis開発者が推奨しているように、SSLプロキシを使用する必要があります。 Redis通信を保護するためのSSLプロキシの設定は別のトピックです。
名前の変更セクションにRedisコマンドの完全なリストを含めませんでした。ただし、自分で確認して、[redis.io/commands](http://redis.io/commands)で[them](http://redis.io/commands)を悪用する方法を決定できます。
その他のUbuntuチュートリアルについては、[Tencent Cloud + Community](https://cloud.tencent.com/developer?from=10680)にアクセスして詳細を確認してください。
参照:「Ubuntu14.04でRedisのインストールを保護する方法」
Recommended Posts