前書き
Redisは、キャッシュに優れたオープンソースのメモリ内データ構造ストアです。 非リレーショナルデータベースであるRedisは、柔軟性、パフォーマンス、スケーラビリティ、幅広い言語サポートで知られています。
Redisは、信頼できる環境で信頼できるクライアントが使用するように設計されており、独自の堅牢なセキュリティ機能はありません。 ただし、Redisには、暗号化されていない基本的なパスワードとコマンドの名前変更および無効化を含むa few security featuresがあります。 このチュートリアルでは、これらのセキュリティ機能を構成する方法について説明します。また、CentOS 7でのスタンドアロンRedisインストールのセキュリティを強化できる他のいくつかの設定についても説明します。
このガイドは、Redisサーバーとクライアントアプリケーションが異なるホストまたは異なるデータセンターにある状況を扱っていないことに注意してください。 Redisトラフィックが安全でないネットワークまたは信頼できないネットワークを通過する必要があるインストールでは、SSLプロキシの設定やRedisマシン間のVPNなど、異なる構成のセットが必要になります。
前提条件
このチュートリアルを進めるには、次のものが必要です。
-
Initial Server Setup for CentOS 7を使用して構成された1つのCentOS7ドロップレット。
-
Firewalldは、this guideを使用してインストールおよび構成され、「ファイアウォールをオンにする」ステップまで含まれます。
これらの前提条件が整ったら、Redisをインストールし、いくつかの初期構成タスクを実行する準備ができました。
[[step-1 -—- installing-redis]] ==ステップ1—Redisのインストール
Redisをインストールする前に、まずサーバーのパッケージリストにExtra Packages for Enterprise Linux (EPEL) repositoryを追加する必要があります。 EPELは、多くのオープンソースのアドオンソフトウェアパッケージを含むパッケージリポジトリであり、そのほとんどはFedora Projectによって管理されています。
yum
を使用してEPELをインストールできます。
sudo yum install epel-release
EPELのインストールが完了したら、yum
を使用してRedisをインストールできます。
sudo yum install redis -y
これには数分かかる場合があります。 インストールが完了したら、Redisサービスを開始します。
sudo systemctl start redis.service
起動時にRedisを起動する場合は、enable
コマンドを使用して有効にできます。
sudo systemctl enable redis
以下を実行して、Redisのステータスを確認できます。
sudo systemctl status redis.service
Output● redis.service - Redis persistent key-value database
Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/redis.service.d
└─limit.conf
Active: active (running) since Thu 2018-03-01 15:50:38 UTC; 7s ago
Main PID: 3962 (redis-server)
CGroup: /system.slice/redis.service
└─3962 /usr/bin/redis-server 127.0.0.1:6379
Redisが実際に実行されていることを確認したら、次のコマンドでセットアップをテストします。
redis-cli ping
これにより、応答としてPONG
が出力されます。 この場合、サーバーでRedisが実行されていることを意味し、セキュリティを強化するためにRedisの構成を開始できます。
[[step-2 -—- binding-redis-and-securing-it-with-a-firewall]] ==ステップ2—Redisをバインドしてファイアウォールで保護する
Redisを保護する効果的な方法は、Redisが実行されているサーバーを保護することです。 これを行うには、RedisがローカルホストまたはプライベートIPアドレスのいずれかにのみバインドされ、サーバーでファイアウォールが稼働していることを確認します。
ただし、this tutorialを使用してRedisクラスターをセットアップすることを選択した場合は、構成ファイルを更新して、ローカルホストやプライベートIPへのバインドほど安全ではない場所からの接続を許可します。
これを修正するには、Redis構成ファイルを開いて編集します。
sudo vi /etc/redis.conf
bind
で始まる行を見つけて、コメントが外されていることを確認します。
/etc/redis.conf
bind 127.0.0.1
Redisを別のIPアドレスにバインドする必要がある場合(別のホストからRedisにアクセスする場合など)、stronglyはそれをプライベートIPアドレスにバインドすることをお勧めします。 パブリックIPアドレスにバインドすると、Redisインターフェイスの外部への露出が増加します。
/etc/redis.conf
bind your_private_ip
前提条件を満たし、サーバーにfirewalldをインストールし、別のホストからRedisに接続する予定がない場合、Redisのファイアウォールルールを追加する必要はありません。 結局のところ、ファイアウォールルールで明示的に許可されていない限り、着信トラフィックはデフォルトでドロップされます。 Redisサーバーのデフォルトのスタンドアロンインストールはループバックインターフェイス(127.0.0.1
またはlocalhost)でのみリッスンしているため、デフォルトのポートでの着信トラフィックについて心配する必要はありません。
ただし、別のホストからRedisにアクセスする予定がある場合は、firewall-cmd
コマンドを使用してfirewalld構成にいくつかの変更を加える必要があります。 繰り返しますが、サービスが公開されるホストの数を制限するために、プライベートIPアドレスを使用して、ホストからRedisサーバーへのアクセスのみを許可する必要があります。
開始するには、firewalldポリシーに専用のRedisゾーンを追加します。
sudo firewall-cmd --permanent --new-zone=redis
次に、開くポートを指定します。 Redisはデフォルトでポート6397
を使用します:
sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp
次に、ファイアウォールを通過してRedisにアクセスすることを許可する必要があるプライベートIPアドレスを指定します。
sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP
これらのコマンドを実行した後、ファイアウォールをリロードして新しいルールを実装します。
sudo firewall-cmd --reload
この構成では、ファイアウォールがクライアントのIPアドレスからのパケットを検出すると、専用のRedisゾーンのルールをその接続に適用します。 他のすべての接続は、デフォルトのpublic
ゾーンで処理されます。 デフォルトゾーンのサービスは、明示的に一致しない接続だけでなく、すべての接続に適用されるため、他のサービスを追加する必要はありません(例: これらのルールはその接続に自動的に適用されるため、RedisゾーンへのSSH)。
set up a firewall using Iptablesを選択した場合は、次のコマンドを使用して、Redisが使用しているポートへのアクセスをセカンダリホストに許可する必要があります。
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp -s client_servers_private_IP/32 --dport 6397 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -P INPUT DROP
ディストリビューションが提供するメカニズムを使用して、Iptablesファイアウォールルールを保存してください。 Iptables essentials guideを見ると、Iptablesの詳細を知ることができます。
どちらのファイアウォールツールを使用しても機能することに注意してください。 重要なのは、ファイアウォールが稼働しているため、不明な個人がサーバーにアクセスできないことです。 次のステップでは、強力なパスワードでのみアクセスできるようにRedisを構成します。
[[step-3 -—- configuring-a-redis-password]] ==ステップ3—Redisパスワードの設定
How To Configure a Redis Cluster on CentOS 7チュートリアルを使用してRedisをインストールした場合は、そのパスワードを設定しておく必要があります。 このセクションに従うことで、あなたの裁量で、より安全なパスワードを今すぐ作成できます。 まだパスワードを設定していない場合、このセクションの手順はデータベースサーバーのパスワードを設定する方法を示しています。
Redisパスワードを設定すると、組み込みのセキュリティ機能の1つであるauth
コマンドが有効になります。このコマンドでは、データベースへのアクセスを許可する前に、クライアントが認証を受ける必要があります。 bind
設定と同様に、パスワードはRedisの構成ファイル/etc/redis.conf
で直接構成されます。 そのファイルを再度開きます。
sudo vi /etc/redis.conf
SECURITY
セクションまでスクロールし、次のようなコメント付きディレクティブを探します。
/etc/redis.conf
# requirepass foobared
#
を削除してコメントを解除し、foobared
を選択した非常に強力なパスワードに変更します。 パスワードを自分で作成するのではなく、apg
やpwgen
などのツールを使用してパスワードを生成することができます。 ただし、パスワードを生成するためだけにアプリケーションをインストールしたくない場合は、以下のコマンドを使用できます。
このコマンドを記述どおりに入力すると、毎回同じパスワードが生成されることに注意してください。 これが生成するものとは異なるパスワードを作成するには、引用符で囲まれた単語を他の単語またはフレーズに変更します。
echo "digital-ocean" | sha256sum
生成されたパスワードは発音できませんが、非常に強力で非常に長いパスワードであり、Redisに必要なタイプのパスワードです。 そのコマンドの出力をrequirepass
の新しい値としてコピーして貼り付けた後、次のようになります。
/etc/redis.conf
requirepass password_copied_from_output
短いパスワードを希望する場合は、代わりに以下のコマンドの出力を使用してください。 繰り返しますが、引用符で単語を変更して、このパスワードと同じパスワードが生成されないようにします。
echo "digital-ocean" | sha1sum
パスワードを設定したら、ファイルを保存して閉じ、Redisを再起動します。
sudo systemctl restart redis.service
パスワードが機能することをテストするには、Redisコマンドラインにアクセスします。
redis-cli
以下は、Redisパスワードが機能するかどうかをテストするために使用される一連のコマンドです。 最初のコマンドは、認証の前にキーを値に設定しようとします。
set key1 10
まだ認証されていないため、機能しません。そのため、Redisはエラーを返します。
Output(error) NOAUTH Authentication required.
次のコマンドは、Redis構成ファイルで指定されたパスワードで認証します。
auth your_redis_password
Redisは、認証されたことを確認します。
OutputOK
その後、前のコマンドを再度実行すると成功するはずです。
set key1 10
OutputOK
get key1
コマンドは、Redisに新しいキーの値を照会します。
get key1
Output"10"
この最後のコマンドはredis-cli
を終了します。 exit
を使用することもできます。
quit
これで、権限のないユーザーがRedisインストールにアクセスすることは非常に困難になります。 ただし、SSLまたはVPNがなくても、Redisにリモートで接続している場合、暗号化されていないパスワードは外部に見えることに注意してください。
次に、Redisを悪意のある攻撃者からさらに保護するために、Redisコマンドの名前を変更する方法を見ていきます。
[[step-4 -—- renaming-dangerous-commands]] ==ステップ4—Dangerousコマンドの名前を変更する
Redisに組み込まれているその他のセキュリティ機能を使用すると、危険と見なされる特定のコマンドの名前を変更したり、完全に無効にしたりできます。 権限のないユーザーが実行すると、そのようなコマンドを使用してデータを再構成、破棄、または消去することができます。 危険であることが知られているコマンドには次のものがあります。
-
FLUSHDB
-
FLUSHALL
-
KEYS
-
PEXPIRE
-
DEL
-
CONFIG
-
SHUTDOWN
-
BGREWRITEAOF
-
BGSAVE
-
SAVE
-
SPOP
-
SREM
RENAME
DEBUG
これは包括的なリストではありませんが、そのリスト内のすべてのコマンドの名前を変更するか無効にすることは良い出発点です。
コマンドを無効にするか名前を変更するかは、サイト固有です。 悪用される可能性のあるコマンドを使用しないことがわかっている場合は、無効にすることができます。 それ以外の場合は、代わりに名前を変更する必要があります。
認証パスワードと同様に、コマンドの名前変更または無効化は、/etc/redis.conf
ファイルのSECURITY
セクションで構成されます。 Redisコマンドを有効または無効にするには、構成ファイルを開いてもう一度編集します。
sudo vi /etc/redis.conf
[.note]#NOTE:これらは例です。 自分にとって意味のあるコマンドを無効にするか、名前を変更するかを選択する必要があります。 コマンドを自分でチェックして、redis.io/commands。
でどのように誤用される可能性があるかを判断できます。
コマンドを無効化または強制終了するには、次に示すように、単に名前を空の文字列に変更します。
/etc/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.conf
rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
変更を保存してファイルを閉じ、Redisを再起動して変更を適用します。
sudo service redis-server restart
新しいコマンドをテストするには、Redisコマンドラインを入力します。
redis-cli
前に定義したパスワードを使用して自分自身を認証します。
auth your_redis_password
OutputOK
CONFIGコマンドの名前をASC12_CONFIGに変更したとすると、config
コマンドの使用は失敗するはずです。
config get requirepass
Output(error) ERR unknown command 'config'
名前を変更したコマンドの呼び出しは成功するはずです(大文字と小文字は区別されません)。
asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"
最後に、redis-cli
を終了できます。
exit
既にRedisコマンドラインを使用していて、Redisを再起動する場合は、再認証する必要があることに注意してください。 それ以外の場合、コマンドを入力するとこのエラーが発生します。
OutputNOAUTH Authentication required.
[。警告]##
コマンドの名前変更に関しては、/etc/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-5 -—- setting-data-directory-ownership-and-file-permissions]] ==ステップ5—データディレクトリの所有権とファイルのアクセス許可を設定する
このステップでは、Redisインストールのセキュリティプロファイルを改善するために行うことができる所有権と権限の変更をいくつか検討します。 これには、Redisにアクセスする必要があるユーザーのみがデータの読み取り権限を持っていることを確認することが含まれます。 そのユーザーは、デフォルトでは、redisユーザーです。
これは、親ディレクトリの長いリストにあるRedisデータディレクトリをgrep
-ingすることで確認できます。 コマンドとその出力を以下に示します。
ls -l /var/lib | grep redis
Outputdrwxr-xr-x 2 redis redis 4096 Aug 6 09:32 redis
Redisデータディレクトリがredisユーザーによって所有されており、redisグループにセカンダリアクセスが付与されていることがわかります。 この所有権設定は安全ですが、フォルダの権限(755に設定されています)は安全ではありません。 Redisユーザーのみがフォルダーとそのコンテンツにアクセスできるようにするには、アクセス許可の設定を770に変更します。
sudo chmod 770 /var/lib/redis
変更する必要がある他の権限は、Redis構成ファイルの権限です。 デフォルトでは、ファイルパーミッションは644で、rootが所有し、rootグループが2次所有権を持ちます。
ls -l /etc/redis.conf
Output-rw-r--r-- 1 root root 30176 Jan 14 2014 /etc/redis.conf
その許可(644)は誰でも読み取り可能です。 構成ファイルには手順4で構成した暗号化されていないパスワードが含まれるため、構成ファイルの所有権と権限を変更する必要があるため、セキュリティ上の問題が発生します。 理想的には、redisユーザーが所有し、redisグループが二次所有権を持つ必要があります。 それを行うには、次のコマンドを実行します。
sudo chown redis:redis /etc/redis.conf
次に、ファイルの所有者のみが読み取りおよび/または書き込みできるようにアクセス許可を変更します。
sudo chmod 660 /etc/redis.conf
以下を使用して、新しい所有権と許可を確認できます。
ls -l /etc/redis.conf
Outputtotal 40
-rw------- 1 redis redis 29716 Sep 22 18:32 /etc/redis.conf
最後に、Redisを再起動します。
sudo service redis-server restart
おめでとうございます、Redisのインストールがより安全になりました!
結論
サーバーに誰かがログインすると、導入したRedis固有のセキュリティ機能を簡単に回避できることに注意してください。 これが、このチュートリアルで説明する最も重要なセキュリティ機能がファイアウォールである理由です。これは、未知のユーザーが最初にサーバーにログインすることを防ぐためです。
信頼できないネットワークを介してRedis通信を保護しようとしている場合は、official Redis security guideでRedis開発者が推奨しているように、SSLプロキシを使用する必要があります。