Centos7にRedisをインストールして保護する方法

前書き

Redisは、キャッシュに優れたオープンソースのメモリ内データ構造ストアです。 非リレーショナルデータベースであるRedisは、柔軟性、パフォーマンス、スケーラビリティ、幅広い言語サポートで知られています。

Redisは、信頼できる環境で信頼できるクライアントが使用するように設計されており、独自の堅牢なセキュリティ機能はありません。 ただし、Redisにはhttps://redis.io/topics/security [いくつかのセキュリティ機能]があり、暗号化されていない基本的なパスワードとコマンドの名前変更と無効化が含まれています。 このチュートリアルでは、これらのセキュリティ機能を構成する方法について説明します。また、CentOS 7でのスタンドアロンRedisインストールのセキュリティを強化できる他のいくつかの設定についても説明します。

このガイドは、Redisサーバーとクライアントアプリケーションが異なるホストまたは異なるデータセンターにある状況を扱っていないことに注意してください。 Redisトラフィックが安全でないネットワークまたは信頼できないネットワークを通過する必要があるインストールでは、SSLプロキシまたはhttps://www.digitalocean.com/community/tutorials/how-to-setup-andのセットアップなど、異なる構成セットが必要になります-config-an-openvpn-server-on-centos-7 [VPN] Redisマシン間。

前提条件

このチュートリアルを進めるには、次のものが必要です。

  • CentOS 7の初期サーバーセットアップを使用して構成された1つのCentOS 7ドロップレット。

  • Firewalldは、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7 [このガイド]を使用してインストールされ、構成されます。 「ファイアウォールの有効化」ステップ。

これらの前提条件が整ったら、Redisをインストールし、いくつかの初期構成タスクを実行する準備ができました。

ステップ1-Redisのインストール

Redisをインストールする前に、まずhttps://fedoraproject.org/wiki/EPEL[Enterprise Linux(EPEL)リポジトリの追加パッケージ]をサーバーのパッケージリストに追加する必要があります。 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の構成を開始できます。

ステップ2-Redisをバインドし、ファイアウォールで保護する

Redisを保護する効果的な方法は、Redisが実行されているサーバーを保護することです。 これを行うには、RedisをローカルホストまたはプライベートIPアドレスのいずれかにのみバインドし、サーバーでファイアウォールが稼働していることを確認します。

ただし、https://www.digitalocean.com/community/tutorials/how-to-configure-a-redis-cluster-on-centos-7 [このチュートリアル]を使用してRedisクラスターをセットアップすることを選択した場合は、構成ファイルを更新して、どこからでも接続できるようにします。これは、localhostまたはプライベートIPへのバインドほど安全ではありません。

これを修正するには、Redis構成ファイルを開いて編集します。

sudo vi /etc/redis.conf

「+ bind +」で始まる行を見つけて、コメントが解除されていることを確認します。

/etc/redis.conf

bind 127.0.0.1

Redisを別のIPアドレスにバインドする必要がある場合(別のホストからRedisにアクセスする場合など)、プライベートIPアドレスにバインドすることを強くお勧めします。 パブリックIPアドレスにバインドすると、Redisインターフェイスの外部への露出が増加します。

/etc/redis.conf

bind

前提条件を満たし、サーバーに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=

これらのコマンドを実行した後、ファイアウォールをリロードして新しいルールを実装します。

sudo firewall-cmd --reload

この構成では、ファイアウォールがクライアントのIPアドレスからのパケットを検出すると、専用のRedisゾーンのルールをその接続に適用します。 他のすべての接続は、デフォルトの「+ public +」ゾーンによって処理されます。 デフォルトゾーンのサービスは、明示的に一致しない接続だけでなく、すべての接続に適用されるため、他のサービスを追加する必要はありません(例: これらのルールはその接続に自動的に適用されるため、RedisゾーンへのSSH)。

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 /32 --dport 6397 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -P INPUT DROP

ディストリビューションが提供するメカニズムを使用して、Iptablesファイアウォールルールを保存してください。 Iptablesの詳細については、https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands [Iptables essentials guide]をご覧ください。

どちらのファイアウォールツールを使用しても機能することに注意してください。 重要なのは、不明な個人がサーバーにアクセスできないようにファイアウォールが稼働していることです。 次のステップでは、強力なパスワードでのみアクセスできるようにRedisを構成します。

ステップ3-Redisパスワードの設定

CentOS 7でRedisクラスターを構成する方法チュートリアルを使用してRedisをインストールした場合、パスワードを設定しておく必要があります。 このセクションに従うことで、あなたの裁量で、より安全なパスワードを今すぐ作成できます。 まだパスワードを設定していない場合、このセクションの手順はデータベースサーバーのパスワードを設定する方法を示しています。

Redisパスワードを設定すると、組み込みのセキュリティ機能の1つである `+ auth `コマンドが有効になります。これは、データベースへのアクセスを許可する前にクライアントの認証を要求します。 ` bind `設定と同様に、パスワードはRedisの設定ファイル ` / etc / redis.conf +`で直接設定されます。 そのファイルを再度開きます。

sudo vi /etc/redis.conf

`+ SECURITY +`セクションまでスクロールして、コメント付きのディレクティブを探します:

/etc/redis.conf

# requirepass foobared

`#`を削除してコメント解除し、 `+ foobared `を選択した非常に強力なパスワードに変更します。 自分でパスワードを作成するのではなく、 ` apg `や ` pwgen +`などのツールを使用してパスワードを生成できます。 ただし、パスワードを生成するためだけにアプリケーションをインストールしたくない場合は、以下のコマンドを使用できます。

このコマンドを記述どおりに入力すると、毎回同じパスワードが生成されることに注意してください。 これが生成するものとは異なるパスワードを作成するには、引用符で囲まれた単語を他の単語またはフレーズに変更します。

echo "" | sha256sum

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

/etc/redis.conf

requirepass

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

echo "" | sha1sum

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

sudo systemctl restart redis.service

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

redis-cli

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

set key1 10

まだ認証されていないため、機能しません。そのため、Redisはエラーを返します。

Output(error) NOAUTH Authentication required.

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

auth

Redisは、認証されたことを確認します。

OutputOK

その後、前のコマンドを再度実行すると成功するはずです。

set key1 10
OutputOK

`+ get key1 +`コマンドは、Redisに新しいキーの値を問い合わせます。

get key1
Output"10"

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

quit

これで、権限のないユーザーがRedisインストールにアクセスすることは非常に困難になります。 ただし、SSLまたはVPNがなくても、Redisにリモートで接続している場合、暗号化されていないパスワードは外部に見えることに注意してください。

次に、Redisを悪意のある攻撃者からさらに保護するために、Redisコマンドの名前を変更する方法を見ていきます。

ステップ4-危険なコマンドの名前変更

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

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

/etc/redis.conf

# It is also possible to completely kill a command by renaming it into
# an empty string:
#

コマンドの名前を変更するには、次の例のように別の名前を付けます。 名前が変更されたコマンドは、他の人が推測するのは難しいはずですが、覚えやすくする必要があります。

/etc/redis.conf

rename-command CONFIG ""

変更を保存してファイルを閉じ、Redisを再起動して変更を適用します。

sudo service redis-server restart

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

redis-cli

前に定義したパスワードを使用して自分自身を認証します。

auth
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.

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

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

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

ls -l /var/lib | grep redis
Output 2    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 1  30176 Jan 14  2014 /etc/redis.conf

その許可(644)は誰でも読み取り可能です。 これは、構成ファイルに手順4で構成した暗号化されていないパスワードが含まれるため、構成ファイルの所有権とアクセス許可を変更する必要があるため、セキュリティ上の問題が発生します。 理想的には、* redis ユーザーが所有し、 redis *グループが2次所有権を持つ必要があります。 それを行うには、次のコマンドを実行します。

sudo chown redis:redis /etc/redis.conf

次に、ファイルの所有者のみが読み取りおよび/または書き込みできるようにアクセス許可を変更します。

sudo chmod 660 /etc/redis.conf

以下を使用して、新しい所有権と許可を確認できます。

ls -l /etc/redis.conf
Outputtotal 40
1  29716 Sep 22 18:32 /etc/redis.conf

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

sudo service redis-server restart

おめでとうございます、Redisのインストールがより安全になりました!

結論

サーバーに誰かがログインすると、導入したRedis固有のセキュリティ機能を簡単に回避できることに注意してください。 これが、このチュートリアルで説明する最も重要なセキュリティ機能がファイアウォールである理由です。これは、未知のユーザーが最初にサーバーにログインすることを防ぐためです。

信頼できないネットワークを介したRedis通信を保護しようとする場合、http://redis.io/topics/security [公式Redisセキュリティガイド]でRedis開発者が推奨しているように、SSLプロキシを使用する必要があります。

Related