Redisセキュリティ:アクセス制御

3592 ワード

Redisセキュリティ
この文章はRedisの観点からアクセス制御,悪意のある攻撃などの話題を含むセキュリティに関する紹介を提供した.
セキュリティに関する詳細についてはGitHubの質問を開くか、セキュリティに依存している場合は、最後に紹介したGPGを使用してください.
Redis共通のセキュリティモード
Redisは設計時に信頼されたクライアントアクセスを許可する.これは、Redisをインターネットに暴露したり、信頼されていないクライアントがRedis TCPまたはUNIXソケットにアクセスできる環境ではよくないことを意味する.
例えば、通常のウェブアプリケーション環境では、Redisはデータベース、キャッシュ、またはメッセージシステムとして使用され、ウェブアプリケーションのフロントエンドはRedisのデータを要求し、ページを生成したり、ユーザの要求を実行したりする.この場合,webアプリケーションはフロントエンドプロファイルを信頼せずにRedisにアクセスする橋渡しとなる.これは特殊な例であるが、信頼されていないオブジェクトのRedisへの大きなアクセスは、常にACLsのアプリケーション層によってユーザの入力を起動し、検証し、またはRedis上の操作を実行することを決定されるべきである.一般的に、Redisの最適化は、セキュリティではなくパフォーマンスを目的としています.
ネットワークセキュリティ
Redisポートは、ネットワーク上で信頼されているクライアント以外のアクセスを拒否する必要があります.したがって、Redisサーバは、Redisベースで開発されたアプリケーション配備サーバとのみ通信する必要があります.通常、1台の個別のサーバがインターネットに直接露出し、ファイアウォール保護を開始し、クライアントがループインタフェースを介してアクセスする必要があります.
redisでconfに次のような構成を追加すると、Redisを単一のインタフェースにバインドできます.
bind  127.0.0.1

Redisポートを保護できないセキュリティは、Redisの性質によって決定される重大な影響を及ぼします.たとえば、flushallは、外部の攻撃者によってデータベース内のすべてのデータを削除するために使用できます.
保護モード
残念なことに、ほとんどのユーザーは、Redisが外部にアクセスできるように保護措置を取られていません.多くのRedisがインターネットに簡単に露出されている.これに鑑みて、バージョン3.2.0から、Redisがデフォルトの構成を使用し、パスワード保護がない場合を保護モードと呼ぶ.
保護モードでは、Redisはipクライアントをバインドする要求にのみ応答し、他の外部で接続を確立したクライアントに対してエラーに応答し、なぜRedisを正しく構成するように導いたのかを説明します.
セキュリティ・モードを使用して、保護されていないRedisインスタンスによる管理者権限のない操作によるセキュリティの問題を低減することが望ましいが、システム管理者はこれらのエラー・プロンプトを無視して、セキュリティ・モードを無効にしたり、構成バインディングのすべてのアクセスipを手動で変更したりすることができる.
検証の特徴
Redisはアクセス制御を実現しておらず、ユーザーがredisを選択できる小さな検証層を提供している.confで構成します.セキュリティ検証が開始されると、Redisは認証されていないクライアントの要求を拒否します.クライアントのセキュリティ検証はauthコマンドを使用し、パスワードに従います.パスワードはredisに配置する.confでは、暴力的な解読を防ぐのに十分な長さが必要です.理由は以下の通りです.
1)Redis応答要求速度は非常に速い.ほとんどのパスワードは1秒で検証できます.
2)Redisパスワードはredisに記憶する.confでは、システム管理者が覚える必要がないので、クライアント構成を使用することができます.
パスワード検証は、ファイアウォールまたは保護措置が失敗した後もRedisを保護するための冗長な複数の検証を提供します.authコマンドは非暗号化で伝送されるため,ネットワークの盗難を避けることはできない.
データ暗号化のサポート
Redisは暗号化をサポートしていません.信頼クライアントがインターネットまたは他の信頼できないネットワークにアクセスできる設定を実現するためには、SSLプロトコルなどの追加の保護層を実現する必要がある.spidedの使用をお勧めします.
特殊コマンドの無効化
Redisのコマンドを無効にするか、推測しにくい名前に名前を変更できます.たとえば、仮想マシンベンダーがRedisの管理サービスを提供する必要があるとします.この場合、一般ユーザーはconfigコマンドを使用して仮想マシン上のRedisに関する構成を変更することはできません.しかし、システム自体は特殊な名利を使ってこれらの機能を実現することができます.
このようにすると、コマンドテーブルのコマンドをブロックしたり、名前を変更したりすることができます.この特性はredis.confファイルには次のように宣言されています.
rename-command config b840fc02d524045429941cc15f59e41cb7be6c52

上記の例では、configコマンドは推測できない値に名前を変更されます.ブロックするには、空の文字列に名前を変更するだけです.
rename-command config ""

外部入力攻撃
攻撃者はRedisにアクセスする必要がなく,適切な入力を選択するだけで外部攻撃を実現できる攻撃がある.これらの攻撃はRedisにデータを挿入し,Redis内部のデータ構造の複雑な論理を修正することができる.
例えば、攻撃者は、Redis内のハッシュテーブルにweb形式で大量のデータを注入し、その時間複雑度をO(1)からO(n)に増加させ、サーバのCPUを消費し、サービスの偽死をもたらすことができる.この問題を解決するために,Redisは実行するたびにランダムなhashシードを生成する.
Redisでは、sortコマンドは高速ソートの論理を使用します.これまでアルゴリズムはランダムではなかったので,最悪の場合,適切な入力を選択することによって二乗レベルの性能を実現した.
文字列オーバーフローNosqlインジェクション
Redis protocolには文字列オーバーフローの概念はないので,通常のクライアントクラスライブラリを用いて注入することは不可能であり,protocolはバイナリセキュリティである.
evalコマンドとevalshaコマンドで実行されるluaスクリプトは同じルールに従うため、これらのコマンドも同様に安全です.しかし、luaスクリプトは、不信のソースから取得された文字列生成スクリプトを回避する必要があることに注意してください.
コードセキュリティ
Redisの一般的な設定では、クライアントはすべてのコマンドセットにアクセスできますが、RedisにアクセスするとRedisが存在するシステムを制御できません.
内部では、Redisは、バッファオーバーフロー、フォーマットエラー、または他のメモリの問題を防止するために、コードのセキュリティを保証するためによく知られています.しかし、コマンドconfigを使用すると、クライアントが作業ディレクトリとダンプファイルの名前を変更できるようになります.これは深刻なセキュリティ問題であり、ファイルダンプの場所を勝手に変更する可能性があります.
Redisはroot権限の実行を必要としません.この目的のために、一般的な権限を使用するユーザーをお勧めします.Redisの著者らは、config set/get dirおよび他のランタイム構成パラメータを保護するために、新しい構成パラメータを使用することを検討している.