Redisとは?仕組みと用途、安全に使うセキュリティ対策5つ|サイバーセキュリティ.com

Redisとは?仕組みと用途、安全に使うセキュリティ対策5つ



Redis(レディス)とは、データをメモリ上に置いて高速に読み書きする、キーと値の形式のデータストアです。キャッシュやセッション管理、ランキングなど、速さが求められる場面で広く使われています。

一方で、設定を誤ってインターネットに公開されたRedisが攻撃される被害も起きています。この記事では、Redisの仕組みや主な用途、リレーショナルデータベースとの違いに加え、安全に使うためのセキュリティ対策5つをわかりやすく解説します。

Redisとは

メモリ上でデータを扱う高速なデータストア

Redisは、データをディスクではなくメモリ上に置いて読み書きする「インメモリ型」のデータストアです。表形式でデータを扱うリレーショナルデータベースとは異なり、キーと値の組でデータを管理するNoSQL(リレーショナル型以外のデータベース)の一種に分類されます。

文字列だけでなく、リストや集合など複数の形でデータを扱えるため、公式には「データ構造サーバー」とも説明されています。Webサービスやアプリケーションの裏側で、応答を速くするための部品として組み込まれることが多いソフトウェアです。

名前の由来と読み方

Redisという名前は、「Remote Dictionary Server」の略です。辞書のようにキーと値の組でデータを持つ仕組みを、ネットワーク越しにサーバーとして共有できることを表しています。

読み方は「レディス」が一般的です。システムの構成図や技術要件で「Redisサーバー」と書かれていれば、この高速なデータの置き場所を指していると考えてよいでしょう。

ライセンスの変遷とValkeyの登場

Redisは長くBSDライセンスのオープンソースとして提供されてきましたが、Redis 7.4から、クラウド事業者などによる提供に制限のあるライセンスに変更されました。
その後、Redis 8からはオープンソースライセンスのAGPLv3も選べるようになっています。

このライセンス変更をきっかけに、Linux Foundationのもとで、従来のBSDライセンスを引き継いだ派生版「Valkey」の開発が始まりました。主要なクラウドのマネージドサービスでもValkeyを選べるようになっています。
業務で利用する場合は、自社の使い方に合うかどうか、公式のライセンス情報で最新の条件を確認しましょう。

Redisの仕組み

メモリ上で処理するから速い

Redisが高速な最大の理由は、データをメモリ上で扱うことにあります。ディスクに比べてメモリは読み書きが桁違いに速いため、データの出し入れにかかる時間を大きく短縮できます。

また、Redisは複雑な検索や結合を行わず、キーを指定してデータを取り出すという単純な操作を基本としています。データを置く場所の速さと、操作の単純さの両方がRedisの速さを支えています。
ただし、メモリは電源が切れると内容が消えるため、データを残したい場合は後述する永続化の設定が必要です。

キーと値の組でデータを管理する

Redisでは、「user:1」のようなキーに対して、値を1つ結びつけて保存します。値を取り出すときは、キーを指定するだけで済みます。

キーの名前は、「種類:ID:項目」のようにコロンで区切って付けるのが一般的です。名前の付け方をそろえておくと、どのキーが何のデータかがわかりやすくなり、管理しやすくなります。

コマンドを1つずつ順番に処理する

Redisは、受け取ったコマンドの実行を基本的に1つずつ順番に行います。同時に複数のコマンドが届いても、1つの処理が終わってから次に進むため、データの整合性を保ちやすい仕組みです。

一方で、全件を一度に調べるような重いコマンドを実行すると、その間ほかのリクエストが待たされます。大量のキーを扱う本番環境では、少しずつ処理するコマンドを使うなどの配慮が必要です。

Redisとリレーショナルデータベースの違い

違いの一覧

Redisとリレーショナルデータベース(MySQLやPostgreSQLなど)の主な違いは次のとおりです。

項目 Redis リレーショナルデータベース
データの置き場所 主にメモリ 主にディスク
データの形 キーと値(値に複数の型がある) 表(行と列)
検索 キーを指定して取り出すのが基本 SQLで条件を指定して自由に検索・結合
容量 メモリの大きさが上限 ディスクの大きさが上限
主な用途 キャッシュ、セッション、ランキング、キュー 業務データの正式な保存

置き換えではなく併用が基本

Redisとリレーショナルデータベースは、どちらが優れているかではなく、担当する役割が異なる道具です。
実際のシステムでは、業務の正式なデータをリレーショナルデータベースに保存し、何度も読まれるデータや一時的なデータをRedisに置く、という形で併用するのが一般的です。

よく使われるのが、アプリケーションがまずRedisを確認し、なければリレーショナルデータベースから読み出してRedisに保存する方式です。2回目以降はRedisから高速に返せるため、データベースの負荷を減らしながら応答を速くできます。

「RDB」という略語の2つの意味

Redisについて調べるときに注意したいのが、「RDB」という略語です。一般には、リレーショナルデータベースの略として使われます。

一方、Redisの世界では、メモリの内容をディスクに書き出すスナップショットのファイル形式も「RDB」と呼ばれます。同じ記事の中で両方の意味が説明なしに使われていることもあるため、どちらを指しているかを文脈で見分けながら読みましょう。
この記事では、混同を避けるため、前者を「リレーショナルデータベース」と書いています。

Redisの主なデータ型

String・Hash

Stringは、最も基本となる型で、1つのキーに1つの値を保存します。文字列だけでなく、数値や画像などのバイナリデータも扱えます。数値を1つずつ増やす操作を1回の命令で行えるため、アクセス数などのカウンターにも使われます。

Hashは、1つのキーの中に「項目名と値」の組を複数まとめて保存できる型です。ユーザーの名前やメールアドレスのように、関連する情報をまとめて持ち、項目ごとに読み書きしたい場合に向いています。

List・Set

Listは、値を入れた順番を保つ型です。先頭や末尾から値を追加・取り出しできるため、処理待ちの仕事を順番に並べるキューや、「最近見た商品の最新10件」のような一覧に使われます。

Setは、順番を持たず、同じ値を重複して保存しない集合の型です。ある値が含まれているかの確認や、2つの集合に共通する値を求める処理が得意で、タグの管理などに使われます。

Sorted Set・Stream

Sorted Setは、値ごとに「スコア」と呼ばれる数値を持ち、常にスコアの順に並んだ状態で保存される型です。スコアを更新すると順位も自動で入れ替わるため、ゲームのランキングなどに向いています。

Streamは、データを追記していくログのような型で、イベントの記録や、複数の処理担当で分担して読み込む仕組みに使われます。このほか、地理空間の情報や、JSON形式のデータを扱う機能なども用意されています。

Redisの主な用途

キャッシュ

最も代表的な用途が、キャッシュです。時間のかかるデータベースの問い合わせ結果や、計算結果を一時的にRedisに保存しておき、次からは素早く返します。

キャッシュには、一定時間で自動的に消える有効期限(TTL)を設定するのが基本です。有効期限を付けておけば、古いデータがいつまでも残ることを防げ、メモリの使いすぎも抑えられます。

セッション管理

Webサービスのログイン状態などのセッション情報をRedisに保存すると、複数のアプリケーションサーバーで同じログイン状態を共有できます。有効期限を設定しておけば、一定時間操作がないとセッションが自動で切れる仕組みも簡単に作れます。

ランキングやカウンター

Sorted Setを使えば、スコア順に並んだランキングを常に最新の状態で保てます。リレーショナルデータベースで毎回並べ替えるよりも、上位の取得や順位の確認を素早く行えます。

また、数値を増やす操作を使ったアクセス数のカウントや、一定時間あたりのアクセス回数を制限する仕組みにもよく使われます。

キューやメッセージ処理

ListやStreamを使うと、処理待ちの仕事を一時的にためておくキューを作れます。メールの送信のように時間のかかる処理を後回しにし、別の処理担当が順番に取り出して実行する、といった使い方です。

データを失わないための仕組み

永続化(RDBファイルとAOF)

Redisはメモリ上で動きますが、データをディスクに保存する「永続化」の仕組みを備えています。主な方式は、ある時点のデータをまるごとファイルに書き出すスナップショット方式(RDBファイル)と、書き込みの操作を順に記録していく追記ログ方式(AOF)の2つです。

RDBファイルはファイルが小さく再起動が速い一方、最後に保存した後の変更は失われます。AOFは失うデータを最小限にできますが、ファイルが大きくなりやすい特徴があります。両方を併用することもでき、キャッシュとしてだけ使う場合は永続化を無効にすることもあります。

レプリケーション

レプリケーションは、主となるRedisの内容を、別のRedis(レプリカ)に複製する仕組みです。レプリカは既定では読み取り専用として動き、読み込みの負荷を分散したり、主となるRedisに障害が起きた際の切り替え先にしたりできます。

なお、以前は「マスター・スレーブ」と呼ばれていましたが、現在は「プライマリ・レプリカ」という呼び方が使われています。

Redis Clusterによる分散

1台のRedisで扱えるデータの量は、そのサーバーのメモリの大きさが上限です。より多くのデータを扱うために、複数のRedisにデータを分散して保存する仕組みがRedis Clusterです。

Redis Clusterでは、データを「スロット」と呼ばれる単位に分け、各サーバーが担当するスロットを決めて分散します。サーバーを追加したときは、担当するスロットを割り振り直すことで容量を増やせます。

Redisがサイバー攻撃に狙われるリスク

インターネットに公開されたRedisへの不正アクセス

Redisは本来、アプリケーションと同じ社内ネットワークやクラウドの非公開領域で使うことを前提としたソフトウェアです。ところが、設定の誤りなどでRedisがインターネットから接続できる状態になっているケースが少なくありません。

Redisは標準の設定ではパスワードが設定されていないため、インターネットに公開された状態では、誰でも接続してデータを読み書きできてしまいます。攻撃者は、インターネット上で公開されているRedisを自動で探し出し、こうした無防備なRedisを狙って侵入します。

データの窃取や削除、身代金の要求

攻撃者に接続されると、保存されているセッション情報や個人情報などのデータを盗まれるおそれがあります。キャッシュやセッションには、ログイン状態を表す情報などが含まれていることもあり、不正ログインにつながる場合もあります。

また、データをすべて削除したうえで「データを返してほしければ金銭を支払え」と要求する手口も確認されています。永続化やバックアップの設定がなければ、データを取り戻すことはできません。

暗号資産の採掘やサーバーの乗っ取りへの悪用

さらに深刻なのが、Redisの設定を変更するコマンドなどを悪用して、Redisが動いているサーバーそのものを乗っ取る手口です。乗っ取られたサーバーは、暗号資産(仮想通貨)の採掘に使われたり、社内の別のシステムへの攻撃の足がかりにされたりします。

公開されたRedisは、データの漏えいにとどまらず、サーバー全体の乗っ取りにつながる危険な入口になり得ます。Redis自体の脆弱性が見つかることもあるため、設定と更新の両面で備えることが大切です。

Redisを安全に使うセキュリティ対策5つ

対策1:インターネットに公開しない

最も重要な対策は、Redisをインターネットから接続できる状態にしないことです。
Redisの設定で接続を受け付けるネットワークを限定し、ファイアウォールやクラウドのセキュリティグループで、Redisの通信(標準では6379番ポート)に接続できる相手を、アプリケーションサーバーなど必要なものだけに絞りましょう。

Redisは「インターネットから見えない場所に置く」ことが、ほかのすべての対策の前提です。社外から管理する必要がある場合も、Redisを直接公開せず、VPNなどの安全な経路を使います。

対策2:パスワードとACLで接続を制限する

社内ネットワークの中であっても、Redisには必ずパスワードを設定しましょう。Redis 6.0以降では、ACL(アクセス制御リスト)を使って、ユーザーごとにパスワードと、使えるコマンドや操作できるキーの範囲を細かく決められます。

アプリケーションごとに専用のユーザーを作り、必要な操作だけを許可しておくと、万一パスワードが漏れた場合でも被害を限定できます。

対策3:保護モードを無効にしない

Redisには、パスワードが設定されていない状態で外部から接続されることを防ぐ「保護モード」という仕組みがあります。保護モードが有効な場合、パスワードを設定しないまま外部のネットワークからの接続を受け付けようとすると、Redisは接続を拒否します。

接続がうまくいかないときに、原因を調べずに保護モードを無効にしてしまうと、Redisが無防備な状態で公開される原因になります。保護モードは有効のまま、接続先の制限やパスワードを正しく設定して対応しましょう。

対策4:危険なコマンドの利用を制限する

Redisには、設定を変更するコマンドや、すべてのデータを削除するコマンドなど、悪用されると被害が大きいコマンドがあります。アプリケーションが使わないコマンドは、ACLを使って利用できないようにしておきましょう。

あわせて、Redisは管理者権限ではなく専用の一般ユーザーで動かし、Redisが書き込めるディレクトリも必要な範囲に限定しておくと、万一侵入された場合にサーバー全体を乗っ取られるリスクを下げられます。

対策5:通信を暗号化し、更新を続ける

Redis 6.0以降では、TLSによる通信の暗号化に対応しています。アプリケーションとRedisの間で、パスワードやデータが盗み見られないよう、ネットワークの構成に応じて暗号化を有効にしましょう。

また、Redis自体にも脆弱性が見つかることがあります。セキュリティ情報を定期的に確認し、更新版が提供されたら速やかに適用することが大切です。あわせて、接続元や実行されたコマンドを監視し、不審な接続に早く気づける体制を整えておきましょう。

Redisに関するよくある質問

Q. Redisは無料で使えますか?

Redis本体は無料で利用できます。ただし、ライセンスはバージョンによって異なるため、業務で利用する際は公式のライセンス情報を確認しましょう。クラウドのマネージドサービスを使う場合は、各サービスの利用料金がかかります。

Q. Redisのデータは再起動で消えますか?

永続化の設定によって異なります。RDBファイルやAOFによる永続化を有効にしていれば、再起動後もデータを復元できます。永続化を無効にしている場合は、再起動でデータが消えます。

Q. Memcachedとの違いは何ですか?

Memcachedは、シンプルなキャッシュに特化したインメモリ型のデータストアです。Redisは、複数のデータ型や永続化、レプリケーションに対応しているため、キャッシュ以外にもランキングやキュー、セッション管理など幅広い用途に使えます。

Q. マネージドサービスならセキュリティ対策は不要ですか?

不要ではありません。マネージドサービスでは、サーバーの運用や更新はサービス側が担いますが、どのネットワークから接続を許可するか、認証や暗号化を有効にするかといった設定は利用者の責任です。設定を誤れば、マネージドサービスでも不正アクセスを受けるおそれがあります。

Q. Valkeyとは何ですか?

Valkeyは、Redisのライセンス変更をきっかけに、従来のライセンスを引き継いで開発が始まったRedisの派生版です。Linux Foundationのもとで開発されており、Redisとほぼ同じ使い方ができます。
主要なクラウドのマネージドサービスでも選べるようになっています。

まとめ

Redisは、データをメモリ上で扱う高速なキーと値のデータストアで、キャッシュやセッション管理、ランキングなどに広く使われています。リレーショナルデータベースと役割を分けて併用し、必要に応じて永続化を設定するのが基本です。

インターネットに公開されたRedisは攻撃の入口になるため、公開しない構成、パスワードとACL、保護モード、コマンドの制限、暗号化と更新を組み合わせて安全に運用しましょう。

SNSでもご購読できます。