Rocky Linux 8でRedisをインストールしてセキュリティを強化する方法について説明します。
日本語では、以下の内容を自然に言い換えてください:
イントロダクション
Redisは、キャッシュにおいて優れたパフォーマンスを発揮するオープンソースのインメモリキーバリューデータストアです。柔軟性、パフォーマンス、スケーラビリティそして幅広い言語サポートのために、非関係性データベースとして知られています。
Redisは、信頼できるクライアントが信頼できる環境で使用するために設計されており、独自の強力なセキュリティ機能はありません。ただし、Redisにはパスワード認証や一部のコマンドの名前変更や無効化など、いくつかのセキュリティ機能があります。このチュートリアルでは、Redisのインストール方法とこれらのセキュリティ機能の設定方法について説明します。また、Rocky Linux 8上でのスタンドアロンのRedisインストールのセキュリティを向上させるいくつかの他の設定についてもカバーします。
このガイドでは、Redisサーバーとクライアントアプリケーションが異なるホストやデータセンターにある場合には対応していません。Redisのトラフィックが安全でないネットワークを経由する必要がある場合には、SSLプロキシやRedisマシン間にVPNを設定するなど、異なる設定が必要となります。
デジタルオーシャンのマネージドRedisサービスも利用することができます。
前提条件
このチュートリアルを完了するには、Rocky Linux 8を実行しているサーバーが必要です。このサーバーには、管理特権を持つノンルートユーザーと、firewalldで構成されたファイアウォールが必要です。これを設定するには、Rocky Linux 8の初期サーバーセットアップガイドに従ってください。
ステップ1:Redisのインストールと起動
DNFパッケージマネージャーを使ってRedisをインストールすることができます。DNFを使用すると、Redisおよびその依存関係、そして使いやすいテキストエディタであるnanoをインストールすることができます。nanoをインストールする必要はありませんが、このガイド全体で例として使用します。
- sudo dnf install redis nano
このコマンドは、選択したパッケージのインストールを確認するためのプロンプトが表示されます。インストールを希望する場合は、yを押してからENTERキーを押してください。
. . . Total download size: 1.5 M Installed size: 5.4 M Is this ok [y/N]: y
その後、インストール中に自動的に生成されるRedisの設定ファイルには、重要な構成変更が1つ必要です。
お好みのテキストエディタでこのファイルを開いてください。ここではnanoを使用します。
- sudo nano /etc/redis.conf
ファイル内で、supervisedディレクティブを見つけてください。このディレクティブを使用すると、Redisをサービスとして管理するためのイニシャルシステムを宣言することができ、その操作に対してより多くの制御を提供します。supervisedディレクティブはデフォルトでnoに設定されています。Rocky Linuxを実行しているので、systemdイニシャルシステムに変更してください。
. . .
# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
# supervised no - no supervision interaction
# supervised upstart - signal upstart by putting Redis into SIGSTOP mode
# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto - detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
# They do not enable continuous liveness pings back to your supervisor.
supervised systemd
. . .
今の時点でRedisの設定ファイルを変更する必要があるのはこれだけです。終わったら保存して閉じてください。もしファイルの編集にnanoを使用した場合は、CTRL + Xで保存して終了し、プロンプトが表示されたらYとEnterを押してください。
ファイルを編集した後、Redisサービスを起動してください。
- sudo systemctl start redis.service
Redisを起動時に開始したい場合は、enableコマンドを使用して有効にすることができます。
- sudo systemctl enable redis
ユニットファイル名の後ろに .service の接尾辞が含まれていないことに注意してください。通常、systemctl コマンドではこの接尾辞は省略できます。なぜなら、サービス名から自動的に解析できるからです。
以下のコマンドを実行することで、Redisの状態を確認できます。
- sudo systemctl status redis
● redis.service – Redis persistent key-value database Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/redis.service.d └─limit.conf Active: active (running) since Tue 2022-09-06 22:11:52 UTC; 40s ago Main PID: 14478 (redis-server) Tasks: 4 (limit: 11152) Memory: 6.6M CGroup: /system.slice/redis.service └─14478 /usr/bin/redis-server 127.0.0.1:6379
Redisが実行されていることを確認したら、このコマンドを使用してその機能をテストすることができます。
- redis-cli ping
これは、応答として「ポン」と表示するはずです。
PONG
もしもそれが事実なら、サーバー上でRedisが実行されており、セキュリティを向上させるためにそれを設定することができることを意味します。
ステップ2 – Redisの設定とファイアウォールでのセキュリティの確保
Redisを保護する効果的な方法は、Redisが実行されているサーバーをセキュアにすることです。これは、RedisがローカルホストまたはプライベートIPアドレスにバインドされていること、そしてサーバーにファイアウォールが設定されていることを確認することによって行うことができます。
ただし、別のチュートリアルを使用してRedisを設定した場合、設定ファイルを更新していても、どこからでも接続を許可するという方法になっているかもしれません。これはlocalhostやプライベートIPアドレスにバインドするよりも安全性が低いです。
これを解決するために、お好きなテキストエディタでRedisの設定ファイルを再度開いてください。
- sudo nano /etc/redis.conf
必要ならば、コメントアウトや無効化されていないことを確認するため、”bind”で始まる行を探し、行の先頭にある # 記号を削除してください。
「/etc/redis.conf」
. . .
bind 127.0.0.1
Redisを別のIPアドレスにバインドする必要がある場合(別のホストからRedisにアクセスする場合など)、プライベートIPアドレスにバインドすることを強く検討すべきです。パブリックIPアドレスにバインドすると、Redisのインターフェースが外部のパーティによってさらに露出される可能性が高まります。
. . .
bind your_private_ip
「バインドディレクティブがコメントアウトされていないことを確認した後、ファイルを保存して閉じることができます。」
もしサーバーに先行する初期サーバーセットアップチュートリアルを従ってfirewalldをインストールし、また他のホストからRedisに接続する予定がないのであれば、Redis用の追加のファイアウォールルールを追加する必要はありません。なぜなら、ファイアウォールルールによって明示的に許可されるまで、すべての着信トラフィックはデフォルトで破棄されるためです。Redisサーバーのデフォルトのスタンドアロンのインストールでは、ループバックインターフェイス(127.0.0.1またはlocalhost)でのみ受信トラフィックが行われるため、デフォルトポートに関しては心配する必要はありません。
ただし、もしRedisに別のホストからアクセスする予定がある場合は、firewall-cmdコマンドを使用してfirewalldの設定をいくつか変更する必要があります。再度強調すると、サービスが公開されるホストの数を制限するため、RedisサーバーへのアクセスはホストのプライベートIPアドレスを使用して許可するべきです。
最初に、ファイアウォールのポリシーに専用のRedisゾーンを追加してください。
- sudo firewall-cmd –permanent –new-zone=redis
デフォルトでRedisはポート番号6379を使用していますので、開放したいポートを指定してください。
- 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ゾーンのルールがその接続に適用されます。その他の接続はデフォルトのパブリックゾーンで処理されます。デフォルトゾーンのサービスは、明示的に一致しない接続にも適用されるため、Redisゾーンに他のサービス(例:SSH)を追加する必要はありません。それらのルールは自動的にその接続に適用されます。
以下の内容を日本語で自然に言い換える:
firewalld、ufw、またはiptablesを使用しても、ファイアウォールツールを使用することが重要です。重要なのは、ファイアウォールが稼働しており、不明な個人がサーバーにアクセスできないようにすることです。次のステップでは、Redisのアクセスを強力なパスワードで制限します。
ステップ3-Redisパスワードの設定
Redisのパスワードを設定すると、組み込みのセキュリティ機能である「authコマンド」が有効になり、データベースにアクセスする前にクライアントが認証する必要があります。bind設定と同様に、パスワードはRedisの設定ファイルである「/etc/redis.conf」に直接設定されます。そのファイルを再度開いてください。
- sudo nano /etc/redis.conf
「セキュリティ」セクションにスクロールし、コメントされた指示を探してください。指示は次のように記載されています。
/etc/redis.confを日本語で言い換えてください。一つのオプションを教えてください。
– レディスの設定ファイルである/etc/redis.conf
. . .
# requirepass foobared
「#」を削除してコメントを解除し、foobaredというパスワードを強力なパスワードに変更してください。
Note
このコマンドをそのまま使用すると、毎回同じパスワードが生成されることに注意してください。ユニークなパスワードを作成するには、引用符で囲まれた文字列を他の単語やフレーズに変更してください:
echo “digital-ocean” | sha256sum
生成されるパスワードは覚えにくいかもしれませんが、非常に強力で長いものであり、Redisに必要なタイプのパスワードです。そのコマンドの出力をrequirepassの新しい値としてコピー&ペーストした後、次のように表示されるはずです:
/etc/redis.conf
. . .
requirepass password_copied_from_output
または、より短いパスワードを希望する場合は、別のチェックサムの出力を使用することもできます。再度、引用符で囲まれた単語を変更して、このコマンドと同じパスワードが生成されないようにしてください:
echo “digital-ocean” | sha1sum
パスワードを設定した後、ファイルを保存して閉じ、Redisを再起動してください。
- sudo systemctl restart redis
パスワードが機能しているか確認するために、Redisクライアントを開いてください。
- redis-cli
次に示すのは、Redisのパスワードが機能するかどうかをテストするために使用されるコマンドのシーケンスです。最初のコマンドは、認証前にキーを値に設定しようとします。
- set key1 10
あなたがまだ認証していないため、それは機能しません。そのため、Redisはエラーを返します。
(error) NOAUTH Authentication required.
次のコマンドは、Redisの設定ファイルで指定されたパスワードで認証を行います。
- auth your_redis_password
Redisは、あなたが認証されたことを認識します。
OK
その後、前のコマンドをもう一度実行すると成功するはずです。
- set key1 10
OK
get key1コマンドはRedisに新しいキーの値を問い合わせます。
- get key1
“10”
最後のコマンドはredis-cliを終了します。exitも使用することができます。
- quit
現在、不正なユーザーによるRedisへのアクセスは非常に困難になっているはずです。ただし、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 nano /etc/redis.conf
Note
コマンドを無効化または終了するには、それを空の文字列に変更してください。例えば、こんな感じです。
/etc/redis.confを日本語で言い換えると、以下のようになります。
Redisの設定ファイルである「/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→ レディスの設定ファイルである/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 ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
変更内容を保存し、ファイルを閉じてください。その後、Redisを再起動して変更内容を適用してください。
- sudo systemctl restart redis.service
新しいコマンドをテストするために、Redisのコマンドラインに入力してください。
- redis-cli
あなたが先に設定したパスワードを使って、自分自身を認証してください。
- auth your_redis_password
OK
CONFIGコマンドをASC12_CONFIGに名前を変更したと仮定すると、configコマンドを使用しようとすると失敗します。
- config get requirepass
(error) ERR unknown command ‘config’
改名されたコマンドを呼び出すことで成功します。なお、Redisのコマンドは大小文字を区別しません。
- asc12_config get requirepass
1) “requirepass” 2) “your_redis_password”
最後に、redis-cliから終了することができます。
- exit
Warning
/etc/redis.conf
. . .
# AOFファイルに記録されるか、レプリカに送信されるコマンド名を変更する場合には、問題が発生する可能性があります。
. . .
これは、変更したコマンドがAOFファイルにない場合、またはAOFファイルがレプリカに送信されていない場合には問題が発生しないということです。コマンドの名前を変更する際にはこれを心に留めてください。コマンドの名前を変更する最適な時期は、AOF永続化を使用していない場合やRedisを使用するアプリケーションが展開される前です。
ステップ5:データディレクトリの所有権とファイルのパーミッションの設定
Redisのインストールのセキュリティプロファイルを向上させるために行う所有権とパーミッションの変更について、この手順ではいくつかの変更が必要となります。Redisのデータにアクセスする必要があるのは、redisユーザーであるため、データの読み取りに対してredisユーザーのみがアクセス権を持つようにすることが重要です。
以下のコマンドとその出力を使用して、親ディレクトリの長いリスト内でRedisのデータディレクトリをgrepコマンドで確認することができます。
- ls -l /var/lib | grep redis
drwxr-x—. 2 redis redis 22 Sep 6 22:22 redis
この出力は、RedisデータディレクトリがRedisユーザーに所有され、次のアクセス権限がredisグループに付与されていることを示しています。この所有権の設定はセキュアで、フォルダの許可は8進数表記の750に設定されています。
Redisのデータディレクトリのパーミッションが安全でない場合、chmodコマンドを実行することで、Redisユーザーとグループのみがフォルダとその内容にアクセスできるようにすることができます。次の例では、このフォルダのパーミッション設定を770に変更します。
- sudo chmod 770 /var/lib/redis
もう一つ変更が必要な許可には、Redisの設定ファイルの許可があります。デフォルトでは、このファイルの許可は640であり、所有者はrootで、副所有者はrootグループです。
- ls -l /etc/redis.conf
-rw-r—–. 1 redis root 62192 Sep 6 22:20 /etc/redis.conf
許可(640)は、Redisの設定ファイルがredisユーザーとrootグループのみが読み取り可能であることを意味しています。設定ファイルにはステップ4で設定した暗号化されていないパスワードが含まれているため、redis.confはredisユーザーによって所有され、セカンダリの所有権はredisグループによって持たれるべきです。これを設定するには、次のコマンドを実行してください。
- sudo chown redis:redis /etc/redis.conf
その後、アクセス権限を変更して、ファイルの所有者だけが読み書きできるようにします。
- sudo chmod 600 /etc/redis.conf
以前のlsコマンドを再度実行することで、新しい所有権とアクセス許可を確認することができます。
- ls -l /var/lib | grep redis
total 40 drwxrwx—. 2 redis redis 22 Sep 6 22:22 redis
- ls -l /etc/redis.conf
total 40 -rw——-. 1 redis redis 62192 Sep 6 22:20 /etc/redis.conf
最後に、これらの変更を反映させるためにRedisを再起動してください。
- sudo systemctl restart redis
それにより、Redisのインストールは保護されました。
結論
サーバーにログインすると、設定したRedisのセキュリティ機能を回避することができることを念頭に置いてください。そのため、このチュートリアルで最も重要なセキュリティ機能はファイアウォールです。ファイアウォールによって、まず未知のユーザーがサーバーにログインすることを防止することができます。
もし信頼できないネットワークを介してRedis通信を安全にする場合は、公式のRedisセキュリティガイドでRedis開発者が推奨するSSLプロキシを使用する必要があります。