Redisインストールのセキュリティを確保する方法:必須設定のヒント
ネットワークバインディング、保護モード、ACLまたはパスワード、安全なコマンドアクセス、ファイアウォールルール、最小権限、TLSを使用してRedisをセキュアにします。
Redisインストールのセキュリティ強化:必須設定のヒント
Redisは高速でシンプルであり、セッションデータ、キュー、カウンター、キャッシュレコードなど、アプリケーションコードから信頼されることがよくあります。そのため、Redisのセキュリティは重要です。露出したインスタンス1つで、攻撃者がデータを読み取ったり、FLUSHALLでキーを削除したり、管理コマンドを悪用したりする可能性があります。
目標は、Redisを必要なシステムからのみ到達可能にし、認証を要求し、危険なコマンドアクセスを減らし、構成と永続データを保持するファイルを保護することです。
1. ネットワーク構成:露出の制限
最も即効性のあるセキュリティ対策は、Redisがリッスンするネットワークインターフェースを制御することです。多くのパッケージ化されたRedisインストールはデフォルトでlocalhostにバインドしますが、コンテナイメージ、カスタム構成ファイル、古いデプロイメントでは異なる場合があります。デフォルトが安全だと想定せず、常にアクティブなredis.confを確認してください。
特定のインターフェースへのバインド(bind)
Redisが必要なインターフェースでのみリッスンするように構成する必要があります。ほとんどの本番環境では、これはループバックアドレスまたはアプリケーションサーバーが使用する特定のプライベートIPアドレスのみにバインドすることを意味します。
内部またはローカルアクセスのみ
アプリケーションサーバーがRedisと同じホストにある場合は、ループバックアドレスに排他的にバインドします。
# redis.conf 構成スニペット
bind 127.0.0.1
ネットワーク化されたプライベートアクセス
アプリケーションサーバーがプライベートネットワークセグメントにあり、ネットワークアクセスが必要な場合は、その特定のプライベートIPアドレスにバインドします。Redisをパブリックなインターネット向けIPにバインドしないでください。リモートアクセスが必要な場合は、プライベートネットワークに配置し、ファイアウォールルールまたはセキュリティグループでトラフィックを制限します。
# Redisにアクセスする特定の内部IPアドレスをリストする
bind 192.168.1.100 10.0.0.5
保護モードについて
Redis 3.2以降、標準のRedisビルドでは保護モードがデフォルトで有効になっています。これは、Redisがリモートクライアント用に明示的に構成されていない場合に外部アクセスをブロックするのに役立ちます。これをメインの制御ではなく、セーフティネットとして扱ってください。バインディング制限、認証、ファイアウォールルールを使用します。
特定の構成で無効にする必要がある場合は、以下を使用できます。
protected-mode no
警告:
bind、認証、ネットワークフィルタリングを正しく構成した場合にのみ、protected-modeを無効にしてください。
2. 認証とアクセス制御
ネットワークアクセスが制限されたら、次の防御層は認証です。クライアントは、有効なパスワードを提供するか、できれば最新のアクセス制御リスト(ACL)システムを使用した場合にのみRedisと対話できるようにする必要があります。
パスワード保護の実装(requirepass)
redis.confファイルでrequirepassディレクティブを使用して、クライアント認証を強制します。これは、基本的なセキュリティのためのグローバルな共有秘密鍵として機能します。
# 強力でユニークなパスワードを設定
requirepass T4h!S_Is_V3ry_S3cure_P@ss
パスワードを使用して接続するには、クライアントはAUTHコマンドを使用する必要があります。
# redis-cliを使用した例
$ redis-cli
127.0.0.1:6379> AUTH T4h!S_Is_V3ry_S3cure_P@ss
OK
127.0.0.1:6379> PING
PONG
高度なセキュリティ:Redisアクセス制御リスト(ACL)
Redis 6.0以降を実行する本番環境では、ACLが推奨される認証方法です。ACLを使用すると、特定のパスワードと詳細な権限(例:ユーザーAは読み取りのみ可能、ユーザーBは特定のキースペースに書き込み可能)を持つ複数のユーザーを定義できます。
ACL構成では、通常、redis.confまたは別のACLファイルでユーザーとそのルールを定義します。
# redis.confまたはaclfileでのACLユーザー定義の例
user default off
user app_reader on >app_read_P@ss ~cache:* +get +scan
user app_writer on >app_write_P@ss ~data:* +set +del
危険なコマンドの名前変更または無効化
特定の管理コマンド(FLUSHALL、CONFIG、KEYS、SHUTDOWNなど)は、誤用されると運用上の混乱を引き起こしたり、機密性の高い構成の詳細を公開したりする可能性があります。これらのコマンドを不明瞭な名前に変更するか、完全に無効にすることをお勧めします。
コマンドを名前変更するには、rename-commandを使用します。
# 不正な変更を防ぐためにCONFIGコマンドを名前変更
rename-command CONFIG HIDE_MY_CONFIG
# FLUSHALLを完全に無効化
rename-command FLUSHALL ""
3. 運用セキュリティのベストプラクティス
内部のRedis構成に加えて、堅牢な外部運用セキュリティ対策を適用することは、完全なセキュリティ体制にとって重要です。
厳格なファイアウォールルールの適用
bindディレクティブの設定に関係なく、クラウドセキュリティグループ、iptables、または同様のファイアウォールソリューションを使用して、常にネットワークフィルタリングを適用します。Redisのデフォルトポート(6379)は、信頼できるアプリケーションサーバーの特定のIPアドレスまたはIP範囲に対してのみ開く必要があります。
ファイアウォールルールの例(Linux/iptables)
既知のアプリケーションサーバーIP(192.168.1.50)からのポート6379の受信トラフィックのみを許可します。
# 特定のアプリケーションサーバーを許可
iptables -A INPUT -p tcp -s 192.168.1.50 --dport 6379 -j ACCEPT
# その他の受信Redisトラフィックを拒否
iptables -A INPUT -p tcp --dport 6379 -j DROP
最小権限での実行
Redisサーバープロセスをrootユーザーとして実行しないでください。攻撃者がRedisプロセスを侵害した場合、rootとして実行すると、オペレーティングシステム全体を完全に制御できるようになります。
redisなどの専用の非特権システムユーザーを作成し、サービス管理者を構成してRedisプロセスをそのユーザーとして実行します。systemdでは、これは通常、User=redisやGroup=redisなどのディレクティブを使用してユニットファイルで処理されるか、ディストリビューションが提供するパッケージ化されたサービスによって処理されます。
構成ファイルと永続性の保護
redis.confファイルには、requirepassパスワードやネットワーク設定などの機密情報が含まれています。このファイルと永続性ファイル(RDBスナップショットとAOFログ)を制限的なファイル権限で保護し、他のシステムユーザーによる不正な読み取りや変更を防ぎます。
# 推奨される権限の例
# 'redis'ユーザーとrootのみが読み取り/書き込み可能
chown redis:redis /etc/redis/redis.conf
chmod 600 /etc/redis/redis.conf
SSL/TLS暗号化の実装
Redisトラフィックが信頼できないネットワークセグメント(内部でも)を通過する環境では、SSL/TLS暗号化を実装します。Redisは歴史的にネイティブTLSサポートを欠いていましたが、最新バージョン(Redis 6以降)は完全にサポートしています。TLSを構成するには、証明書を生成し、redis.confで関連するディレクティブを設定する必要があります。
# TLSリスナーを有効化
tls-port 6379
port 0
tls-auth-clients yes
tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-ca-cert-file /etc/redis/tls/ca.crt
port 0は平文リスナーを無効にします。すべてのクライアントが信頼できるローカルパス上にあり、明確な理由がある場合にのみ、平文ポートを維持してください。
セキュリティの重要な手順のまとめ
Redisインストールのセキュリティ保護は階層的な作業です。露出から始め、次に認証、そして運用制御へと進みます。
- ネットワークアクセスを制限する:
bind 127.0.0.1または特定のプライベートIPを使用します。 - 認証を強制する:
requirepass(基本)またはACL(高度)を使用します。 - コマンドを強化する: 危険な管理コマンド(
FLUSHALL、CONFIG)を無効化または名前変更します。 - ファイアウォールを使用する: 信頼できるアプリケーションサーバーからのポート6379のトラフィックのみを許可します。
- 最小権限: Redisプロセスを非rootの専用ユーザーとして実行します。
- トラフィックを暗号化する: 必要に応じてネットワーク接続にSSL/TLSを有効にします。