Redisのデフォルトポート(6379)とは?設定方法と解説

はい、承知いたしました。Redisのデフォルトポート6379について、その詳細、設定方法、および解説を含む約5000語の記事を作成します。


Redisのデフォルトポート(6379)とは? 設定方法と徹底解説

はじめに:高速データストアRedisとネットワークポートの重要性

現代のWebアプリケーションやマイクロサービスにおいて、データの高速な読み書きはサービスの品質を左右する重要な要素です。このような要求に応えるために、インメモリデータストアであるRedisは広く活用されています。Redisはその高いパフォーマンスと柔軟なデータ構造により、キャッシュ、セッションストア、メッセージキューなど、多岐にわたる用途で利用されています。

Redisサーバーがネットワーク上でサービスを提供するためには、クライアントアプリケーションからの接続を受け付ける必要があります。この接続先を特定するために用いられるのが「ポート番号」です。IPアドレスが「どのサーバー」かを指定する住所だとすれば、ポート番号は同じサーバー上で動作する複数のサービスの中から「どのサービス」に接続するかを指定する「部屋番号」のようなものです。

ほとんどのネットワークサービスには、そのサービスが一般的に使用する「デフォルトポート」が定められています。例えば、Webサーバーは通常80番ポート(HTTP)や443番ポート(HTTPS)を使用し、SSHによるリモート接続は22番ポートを使用します。これらのデフォルトポートを知っていることで、クライアントは特別な設定なしにサービスに接続を試みることができますし、管理者もサービスの運用やトラブルシューティングを標準的な方法で行うことができます。

Redisにも同様に、クライアントからの接続を待ち受けるためのデフォルトポートが存在します。それが「6379」番ポートです。この記事では、Redisのデフォルトポートである6379に焦点を当て、以下の内容を詳しく解説します。

  • Redisとは何か、その基本的な役割
  • ネットワークポートの基礎知識と役割
  • なぜRedisはデフォルトで6379番ポートを使用するのか(その由来や意義)
  • Redisのポート設定方法(設定ファイル、コマンドラインオプション)
  • デフォルトポート以外のポートを使用するメリットとデメリット、およびその検討事項
  • ポート設定を含む、Redisのセキュリティ対策の重要性
  • Redisクライアントからのポートを指定した接続方法
  • ポートに関するよくある問題とトラブルシューティング

この記事を通じて、Redisのポート設定に関する理解を深め、より安全で効率的なRedisの運用に役立てていただければ幸いです。

Redisとは? 簡単な復習

Redis(Remote Dictionary Server)は、オープンソースのインメモリデータ構造ストアです。Key-Valueストアとして動作しますが、単なるKey-Valueストアにとどまらず、文字列、リスト、セット、ソート済みセット、ハッシュ、ビットマップ、HyperLogLog、ジオ空間インデックスなど、多様なデータ構造をサポートしています。

Redisの最大の特徴は、データをメインメモリ上に保持することによる極めて高いパフォーマンスです。これにより、ミリ秒以下のレイテンシでデータの読み書きが可能となります。また、耐久性(Persistence)オプションとして、データをディスクに永続化する機能も備えており、サーバーの再起動時にもデータを復旧させることができます(RDBスナップショット、AOFログ)。

Redisは、単一のサーバー上で動作するだけでなく、レプリケーションによるリードレプリカの構築、Sentinelによる高可用性の実現、そしてClusterによるデータ分散とシャーディング機能を提供しており、小規模なアプリケーションから大規模な分散システムまで、幅広いニーズに対応できます。

その用途は多岐にわたります。

  • キャッシュ: データベースやAPIからの応答結果をキャッシュし、レスポンスタイムを短縮し、バックエンドの負荷を軽減します。
  • セッションストア: Webアプリケーションのユーザーセッション情報を保存します。ステートレスなアプリケーション構築に役立ちます。
  • メッセージキュー/Pub/Sub: 非同期処理のためのメッセージキューや、発行/購読モデルによるリアルタイム通信を実装します。
  • リアルタイム分析: ユーザーの行動ログなどを収集し、リアルタイムでの集計や分析を行います。
  • レートリミッター: 特定の操作の実行頻度を制御します。
  • ゲームリーダーボード: ソート済みセットを使用して、リアルタイムに更新されるランキングを実装します。

このように、Redisは現代のアプリケーション開発において欠かせないミドルウェアの一つとなっています。そして、これらの機能を利用するためには、Redisサーバーとクライアントがネットワークを通じて通信する必要があります。

ポート番号の基礎知識

Redisのポート番号である6379について理解を深める前に、ネットワークにおけるポート番号の役割について基本を解説します。

IPアドレスとポート番号の関係性

インターネット上のデバイスは、IPアドレスによって一意に識別されます。例えば、「192.168.1.100」や「2001:db8::1」といったIPアドレスは、特定のコンピューターやサーバーの「住所」を示します。しかし、一つのサーバーは同時に複数のアプリケーションやサービス(Webサーバー、SSHサーバー、データベースサーバーなど)を実行していることが一般的です。

IPアドレスだけでは、どのサービスに接続したいのかを区別できません。ここでポート番号が登場します。ポート番号は、同じIPアドレスを持つホスト上で動作する異なるサービスを識別するために使用されます。IPアドレスとポート番号の組み合わせ(例: 192.168.1.100:80)によって、ネットワーク上の特定ホスト上の特定サービスを指定することができます。

TCP/UDPポートとは

ネットワーク通信は、主にTCP(Transmission Control Protocol)またはUDP(User Datagram Protocol)というプロトコルを使用して行われます。どちらのプロトコルもポート番号を使用しますが、その特性は異なります。

  • TCP (Transmission Control Protocol): 信頼性の高い接続指向型のプロトコルです。データを送信する前に接続を確立し、データの到達確認や再送制御を行います。信頼性が求められるアプリケーション(Webブラウジング、メール、ファイル転送など)で広く使用されます。RedisもデフォルトではTCPを使用します。
  • UDP (User Datagram Protocol): 非接続型のプロトコルです。接続の確立やデータの到達確認を行わないため、オーバーヘッドが少なく高速です。信頼性よりもリアルタイム性が重視されるアプリケーション(ストリーミング、オンラインゲーム、DNSなど)で使用されます。

ポート番号は0から65535までの整数値です。これらのポート番号は、用途に応じていくつかの範囲に分類されます。

  • Well-known Ports (システムポート): 0から1023までのポート。HTTP (80), HTTPS (443), SSH (22), FTP (20, 21), DNS (53) など、インターネット上で広く使われる主要なサービスに割り当てられています。これらのポートを使用するには、通常、特別な権限(root権限など)が必要です。
  • Registered Ports (ユーザーポート): 1024から49151までのポート。特定のアプリケーションやサービスが公式に登録して使用するポートです。IANA (Internet Assigned Numbers Authority) によって管理されています。Redisのデフォルトポート6379はこの範囲に含まれます。
  • Dynamic/Private Ports (動的/プライベートポート): 49152から65535までのポート。一時的な通信やクライアント側で使用されるポートです。特定のサービスに固定的に割り当てられることはありません。

Redisは、クライアントからの接続を受け付けるための「待ち受けポート(Listening Port)」として、デフォルトで6379番ポート(TCP)を使用します。このポートは、前述のRegistered Portsの範囲に属します。

Redisのデフォルトポート「6379」の深掘り

Redisがなぜデフォルトで6379番ポートを使用するようになったのか、その由来やIANAでの位置づけについて掘り下げてみましょう。

なぜ6379なのか?

Redisの作者であるSalvatore Sanfilippo氏(antirez)によると、Redisのデフォルトポートとして6379を選んだ明確な公式な理由は、実はあまり知られていないようです。ただし、インターネット上にはいくつかの説や推測が存在します。

最も有名な説の一つは、作者が好きなイタリアの女性の名前「Antirez」と関連があるというものです。電話の古いダイヤルパッドを考えると、文字は数字に対応しています。多くの(古い)ダイヤルパッドでは、以下のようになっています。
* 2: A, B, C
* 3: D, E, F
* 4: G, H, I
* 5: J, K, L
* 6: M, N, O
* 7: P, Q, R, S
* 8: T, U, V
* 9: W, X, Y, Z

「antirez」という名前を数字に置き換えるとどうなるでしょうか?
a -> 2
n -> 6
t -> 8
i -> 4
r -> 7
e -> 3
z -> 9

これを並べると「2684739」となります。6379とは一致しません。

しかし、別の説として、「MERZ」という単語をイタリア語読みした場合の数字対応が挙げられることがあります。イタリア語で’6’は’sei’、’3’は’tre’、’7’は’sette’、’9’は’nove’です。これを文字と数字の対応に無理やり当てはめようとしても、特に意味のある関連性は見出せません。

最も可能性の高い、あるいは少なくとも最も一般的に受け入れられている「非公式な由来」は、イタリア語で「Redis」を逆さにした発音に近い「SEDIR」を数字に置き換えたというものです。
S -> 7 (または 6/7/9)
E -> 3
D -> 3
I -> 4
R -> 7

これでも「6379」にはなりませんが、数字の羅列から何かを連想させようとした、あるいは単なる偶然の組み合わせである可能性も十分にあります。作者自身が明確な理由を語っていないため、これらの説はあくまで推測の域を出ません。

重要なのは、理由が何であれ、Redisがデフォルトで6379番ポートを使用することがコミュニティ内で標準となり、ドキュメントやツール、クライアントライブラリで広く認識されているという点です。

IANAにおける6379の登録状況

IANA (Internet Assigned Numbers Authority) は、インターネットプロトコルで使用されるさまざまな数値を管理する組織です。ポート番号の登録もその役割の一つです。IANAのService Name and Transport Protocol Port Number Registryを確認すると、6379番ポートは以下の情報で登録されています。

  • Service Name: redis
  • Port Number: 6379
  • Transport Protocol: tcp, udp
  • Description: Redis key-value data store

このように、6379番ポートは正式に「redis」というサービス名でTCPおよびUDPプロトコルに対してIANAに登録されています。これは、このポートがRedisサービスのために予約され、一般的に使用されるべきポートとして認知されていることを意味します。多くのファイアウォール製品やネットワーク機器のフィルタ設定などでも、「redis」というサービス名で6379番ポートが認識されることがあります。

他の一般的なデータベース/キャッシュシステムのデフォルトポートとの比較

Redisの6379番ポートを他のよく知られたデータベースやキャッシュシステムのデフォルトポートと比較してみましょう。

  • MySQL: 3306番ポート (TCP)
  • PostgreSQL: 5432番ポート (TCP)
  • MongoDB: 27017番ポート (TCP)
  • Memcached: 11211番ポート (TCP/UDP)
  • Apache Cassandra: 7000番ポート (Cluster internal), 7001番ポート (SSL Cluster internal), 7199番ポート (JMX), 9042番ポート (Native protocol), 9160番ポート (Thrift)

これらの比較からわかるように、主要なデータベースやキャッシュシステムはそれぞれ異なるデフォルトポートを使用しています。これによって、同じサーバー上で複数の種類のデータベースを動かす場合でも、ポート競合を起こさずに済むようになっています。Redisの6379番ポートも、これらのデフォルトポートとは重複しない値が選ばれています。

6379を使用するメリットとデメリット

デフォルトポートである6379を使用することには、いくつかのメリットとデメリットがあります。

メリット:

  1. 標準的で分かりやすい: Redisに関するほとんどのドキュメント、チュートリアル、コミュニティでの情報交換は、デフォルトポートとして6379を前提としています。これにより、情報を探しやすく、理解しやすくなります。
  2. ツールやクライアントがデフォルトで認識しやすい: 多くのRedisクライアントライブラリや管理ツールは、ポート番号を指定しない場合にデフォルトで6379番ポートに接続を試みます。これにより、クライアント側の設定が簡略化されます。
  3. 運用が容易: 標準的なポートを使用することで、監視ツールやデプロイスクリプトなどもデフォルト設定のまま利用できることが多く、運用上の手間が軽減されます。

デメリット:

  1. 攻撃者にとってターゲットになりやすい: デフォルトポートは広く知られているため、悪意のある攻撃者にとって最初の攻撃対象となりやすいです。インターネット全体をスキャンして6379番ポートが開いているサーバーを探し、設定ミスや脆弱性を突こうとする試みが頻繁に行われます。特に、インターネットに公開されているサーバーでデフォルトポートをそのまま使用し、かつ適切なセキュリティ対策(認証、ファイアウォールなど)が施されていない場合、非常に高いリスクにさらされます。

このデメリットを考慮すると、特に本番環境においては、ポート番号をデフォルトの6379から変更することも検討に値します。ただし、ポート番号の変更はセキュリティ対策の「一部」に過ぎず、それだけで安全が保証されるわけではない点に注意が必要です。

Redisポートの設定方法

Redisサーバーがどのポートでクライアントからの接続を待ち受けるかを設定する方法はいくつかあります。最も一般的なのは設定ファイルを編集する方法です。

設定ファイル (redis.conf) による方法

Redisサーバーの起動時に読み込まれる設定ファイル (redis.conf) でポート番号を指定するのが、永続的な設定変更を行うための標準的な方法です。

  1. redis.conf の場所の特定:
    redis.conf ファイルの場所は、Redisのインストール方法やOSによって異なります。一般的な場所としては以下のものがあります。

    • Linux (パッケージマネージャー経由): /etc/redis/redis.conf
    • macOS (Homebrew): /usr/local/etc/redis.conf
    • ソースコードからビルドした場合: Redisのソースディレクトリ直下

    もし場所が分からない場合は、Redisサーバーが起動している状態でプロセスリストを確認し、redis-server コマンドの引数に設定ファイルパスが指定されていないか確認するか、システム全体のファイルを検索するコマンド(例: sudo find / -name redis.conf)を使用します。

  2. redis.conf の編集:
    テキストエディタ(nano, vimなど)を使用して redis.conf ファイルを開きます。ポート番号に関する設定は、通常 port ディレクティブによって行われます。

    “`ini

    By default Redis listens for connections from all the network interfaces

    available on the server. It is possible to listen only to specific interfaces

    using the “bind” configuration directive, that is followed by one or more

    IP addresses.

    Examples:

    bind 192.168.1.100 10.0.0.1

    bind 127.0.0.1 ::1

    A special value of ‘0.0.0.0’ can be used to bind to all addresses, but this

    is the default.

    bind 127.0.0.1

    Protected mode is enabled by default. For more information about it, please

    see the PROTECTED MODE section in redis.conf, or simply long for it

    on google.

    protected-mode yes

    Accept connections on the specified port, default is 6379.

    If port 0 is specified Redis will not listen on a TCP socket.

    port 6379

    “`

    上記の例のように、port ディレクティブはデフォルトでコメントアウトされていることが多いです(ただし、実際の動作では port 6379 が適用されています)。これを変更するには、行頭の # を削除し、デフォルト以外のポート番号を指定します。

    例えば、ポート番号を12345に変更したい場合は、以下のように編集します。

    “`ini

    Accept connections on the specified port, default is 6379.

    If port 0 is specified Redis will not listen on a TCP socket.

    port 12345
    “`

    port 0 と設定すると、TCPポートでのリスニングが無効になります。この設定は、RedisをUnixドメインソケット経由でのみ利用する場合などに使用されます。

  3. Redisサーバーの再起動:
    設定ファイルを変更したら、変更内容を反映させるためにRedisサーバーを再起動する必要があります。サービスの再起動コマンドは、OSやインストール方法によって異なります。

    • systemdを使用している場合 (多くのLinuxディストリビューション):
      bash
      sudo systemctl restart redis
      # またはサービス名が異なる場合
      # sudo systemctl restart redis-server
    • SysVinitまたはUpstartを使用している場合:
      bash
      sudo service redis restart
      # または
      # sudo /etc/init.d/redis-server restart
    • macOS (Homebrew):
      bash
      brew services restart redis
    • 手動で起動している場合:
      既存のプロセスを停止し、新しい設定ファイルまたはデフォルト設定で再度起動します。
      bash
      redis-cli shutdown
      redis-server /path/to/redis.conf

      (注意: shutdown コマンドはRDBまたはAOFによるデータ永続化を安全に行います。ただし、システムサービスとして起動している場合は、systemctlやserviceコマンドによる再起動が推奨されます。)

    再起動後、Redisサーバーは指定した新しいポートで接続を待ち受けるようになります。netstatss コマンドを使って、指定したポートでRedisがリスニングしているか確認できます。

    “`bash
    sudo netstat -tulnp | grep redis

    または

    sudo ss -tulnp | grep redis
    “`

    出力例 (ポート12345に変更した場合):
    tcp 0 0 127.0.0.1:12345 0.0.0.0:* LISTEN 1234/redis-server *
    bind 設定によっては、リスニングIPアドレスが 0.0.0.0 またはサーバーのプライベート/パブリックIPアドレスになる場合があります。)

コマンドラインオプションによる方法

Redisサーバーを起動する際に、コマンドラインオプションとしてポート番号を指定することも可能です。この方法は、一時的なテストや、設定ファイルが存在しない環境で特定のポートで起動したい場合に便利です。

bash
redis-server --port <ポート番号>

例: ポート番号を12345で起動する
bash
redis-server --port 12345

この方法で起動した場合、指定したポート番号が redis.confport ディレクティブよりも優先されます。ただし、この設定はその起動セッションのみに有効であり、サーバーを再起動するとデフォルトポート(または設定ファイルで指定されたポート)に戻ります。永続的な設定変更には、やはり redis.conf の編集が推奨されます。

また、設定ファイルを指定して起動する場合でも、コマンドラインオプションでポート番号を上書きできます。

bash
redis-server /path/to/redis.conf --port 12345

クラスタ環境でのポート設定

Redis Clusterでは、複数のRedisノードが連携して動作します。各ノードは独立したRedisサーバーインスタンスとして起動するため、それぞれ異なるポート番号で起動する必要があります。

さらに、Redis Clusterでは、クライアントからのデータ操作を受け付けるメインポート(デフォルト6379)とは別に、ノード間の通信(クラスタバス)に使用するポートが必要です。このクラスタバスポートは、デフォルトではメインポートに10000を加えたポート番号を使用します。

例:
* ノード1: メインポート 6379, クラスタバスポート 16379
* ノード2: メインポート 6380, クラスタバスポート 16380
* ノード3: メインポート 6381, クラスタバスポート 16381

redis.confport ディレクティブを変更すると、クラスタバスポートも自動的に変更後のメインポート+10000になります。クラスタバスポートを明示的に設定したい場合は、cluster-port ディレクティブを使用します。

“`ini

クラスタモードを有効にする

cluster-enabled yes

このノードのポート (例: 6379)

port 6379

クラスタバスポート (デフォルトはport + 10000)

cluster-port 16379

“`

クラスタ環境を構築する際は、各ノードが異なるIPアドレスとポート番号の組み合わせで到達可能である必要があります。ファイアウォール設定においても、メインポートだけでなく、クラスタバスポートについてもノード間通信が必要なIPアドレスからの接続を許可する必要があります。

ポート変更の必要性と検討事項

デフォルトポートである6379を使用せず、別のポート番号に変更することを検討すべきケースや、ポート変更に伴う考慮事項について解説します。

ポート変更を検討するケース

  1. セキュリティの向上(限定的):
    これは最も一般的にポート変更の理由として挙げられるものです。既知のデフォルトポートを使用しないことで、「ポートスキャン」と呼ばれる攻撃手法に対する一定の防御になります。ポートスキャンは、特定のポートが開いているサーバーを探し出すための偵察行為です。デフォルトポートを使用していると、攻撃者は簡単にRedisサーバーの存在を特定できます。ポートを変更することで、少なくともデフォルトポートをスキャンしているだけの攻撃者からは見えにくくなります。
    ただし、これは「Security through obscurity」(隠蔽によるセキュリティ)と呼ばれる考え方であり、完全なセキュリティ対策にはなりえません。ポート番号を知られてしまえば、通常の攻撃が可能になります。本質的なセキュリティは、認証、アクセス制御、ファイアウォールによって実現されるべきです。ポート変更は、あくまでも追加的、あるいは偵察段階でのリスクを少し軽減する目的で検討されます。

  2. 同じサーバーで複数のRedisインスタンスを実行する場合:
    一つのサーバー上で複数の異なるRedisインスタンスを運用したい場合があります(例: 開発環境、テスト環境、異なるアプリケーション用のRedisなど)。TCP/IPネットワークにおいて、同じIPアドレス上で同じプロトコルの同じポート番号を同時に複数のプロセスが使用することはできません。そのため、各Redisインスタンスはそれぞれ異なるポート番号で起動する必要があります。

  3. サービスの識別:
    複数のRedisインスタンスを運用している場合、ポート番号によってどのインスタンスがどの目的で使用されているかを管理しやすくするために、デフォルト以外のポートを使用することがあります。

ポート変更のデメリットと考慮事項

ポート番号を変更することは、運用上の複雑性を増す可能性があります。

  1. クライアント設定の変更が必要:
    Redisサーバーのポート番号を変更した場合、そのRedisサーバーに接続するすべてのクライアントアプリケーション(Webアプリケーション、マイクロサービス、管理ツールなど)の設定も、新しいポート番号に合わせて変更する必要があります。これらを漏れなく変更しないと、クライアントからの接続ができなくなります。
  2. 監視ツールや運用スクリプトの変更:
    Redisサーバーの状態を監視するツールや、バックアップ、デプロイなどに関連する運用スクリプトも、デフォルトポートを前提としている場合があります。これらの設定も新しいポート番号に合わせて修正する必要があります。
  3. チーム内での情報共有の必要性:
    デフォルトポートではないポートを使用する場合、どのポート番号を使用しているかを開発チームや運用チーム全体で正確に共有する必要があります。ドキュメントの更新や構成管理の徹底がより重要になります。
  4. ポート番号の選定:
    IANAに登録されているWell-known Ports (0-1023) や Registered Ports (1024-49151) のうち、既に他の主要なサービスに割り当てられているポート番号を使用するのは避けるべきです。例えば、SSH (22), HTTP (80), HTTPS (443), MySQL (3306), PostgreSQL (5432) などです。これらのポートを使用すると、予期しない競合や混乱を招く可能性があります。Dynamic/Private Ports (49152-65535) の範囲であれば比較的自由に使用できますが、Ephemeral Ports(一時的にクライアント側で使用されるポート)と重複する可能性もあるため、慎重な選定が必要です。一般的には、Registered Portsの空いている範囲で、かつ他の重要なサービスと重複しない番号を選ぶのが良いでしょう。ただし、特定のアプリケーションがそのポートを使用している可能性もあるため、事前に確認が必要です。
    ポート番号を選ぶ際には、IANAのレジストリでそのポートがどのように登録されているかを確認するのが最も確実な方法です。

これらのメリットとデメリットを比較検討し、ポート変更が必要かどうか、そして変更する場合はどのポート番号を使用するかを慎重に判断する必要があります。多くの場合、セキュリティ対策としては、ポート変更よりも後述するファイアウォール設定や認証設定の方が効果的で推奨されます。

ポートとセキュリティ

Redisのポート設定は、Redisサーバーのセキュリティ戦略の重要な一部ですが、それだけで十分ではありません。ここでは、ポート設定と組み合わせて行うべき、あるいはポート設定よりも重要ないくつかのセキュリティ対策について解説します。

Redisは非常に高速で高性能なデータストアである反面、セキュリティ設定を怠ると、意図しない外部からのアクセスによってデータが漏洩したり、悪用されたりするリスクが高いミドルウェアでもあります。

ファイアウォール設定 (iptables/ufw/Security Groups)

サーバーレベルまたはネットワークレベルでのファイアウォール設定は、特定のポートへのアクセスを特定のIPアドレスまたはネットワークに制限する最も効果的な方法の一つです。

  • サーバーレベルファイアウォール: OSに組み込まれているファイアウォール機能(Linuxのiptablesやその後継であるnftables、ufw、Windows Firewallなど)を設定し、Redisが使用するポート(デフォルト6379または変更後のポート)への接続を、許可されたIPアドレス(アプリケーションサーバーのIPアドレスなど)からのみ受け付けるようにします。
  • ネットワークレベルファイアウォール: クラウドプロバイダーが提供するセキュリティグループ(AWS Security Groups, Azure Network Security Groups, Google Cloud Firewall Rulesなど)や、物理的なファイアウォール機器を設定し、Redisサーバーへのアクセスを制御します。

設定例 (ufw – Ubuntuの場合):

デフォルトで全ての着信接続を拒否し、必要なポートだけを開ける設定が推奨されます。

  1. SSHポート (例: 22) の許可:
    bash
    sudo ufw allow ssh
    # またはポート番号を指定
    # sudo ufw allow 22/tcp
  2. Redisポート (デフォルト6379) への特定のIPからの許可:
    bash
    sudo ufw allow from 192.168.1.100 to any port 6379 proto tcp
    # 複数のIPやネットワークからの許可
    # sudo ufw allow from 192.168.1.0/24 to any port 6379 proto tcp

    192.168.1.100 はRedisに接続するアプリケーションサーバーなどのIPアドレスに置き換えてください。
  3. ファイアウォールを有効化:
    bash
    sudo ufw enable

    設定後、sudo ufw status でルールを確認できます。

設定例 (iptables – より低レベルな設定):

許可したいIPアドレスからのRedisポートへの接続を許可し、それ以外のIPからの接続を拒否するルールを追加します。

“`bash

特定IPからのRedisポート(6379)へのTCP接続を許可

sudo iptables -A INPUT -p tcp -s 192.168.1.100 –dport 6379 -j ACCEPT

それ以外のIPからのRedisポートへのTCP接続を拒否

sudo iptables -A INPUT -p tcp –dport 6379 -j DROP

設定を保存 (OSによって方法が異なります)

Ubuntu/Debianの場合: sudo netfilter-persistent save

CentOS/RHELの場合: sudo service iptables save

“`

ファイアウォール設定は、インターネットなどの信頼できないネットワークからRedisサーバーが直接アクセスできないようにするための最も基本的な、かつ重要な対策です。インターネットにRedisサーバーを公開する必要は通常ありません。アプリケーションサーバーや管理用サーバーなど、信頼できる特定のサーバーからのみアクセスできるように制限すべきです。

bind ディレクティブ

redis.confbind ディレクティブは、Redisサーバーがどのネットワークインターフェース(IPアドレス)からの接続を受け付けるかを制御します。これもファイアウォールと並んで非常に重要なセキュリティ設定です。

“`ini

By default Redis listens for connections from all the network interfaces

available on the server. It is possible to listen only to specific interfaces

using the “bind” configuration directive, that is followed by one or more

IP addresses.

Examples:

bind 192.168.1.100 10.0.0.1

bind 127.0.0.1 ::1

A special value of ‘0.0.0.0’ can be used to bind to all addresses, but this

is the default.

bind 127.0.0.1

“`

  • # bind 127.0.0.1 (コメントアウトされている場合、または bind 0.0.0.0):
    これは、Redisサーバーがそのサーバーに割り当てられている全てのネットワークインターフェース(IPアドレス)からの接続を受け付ける設定です。これにはローカルループバックアドレス (127.0.0.1) やプライベートIPアドレス、そしてパブリックIPアドレスも含まれます。もしサーバーがインターネットに直接接続されており、かつファイアウォール設定で6379番ポートが閉じられていない場合、インターネット上の誰からでもRedisサーバーに接続できる状態となり、非常に危険です。本番環境でこの設定(特にパブリックIPを持つサーバーの場合)を使用することは強く非推奨です。
  • bind 127.0.0.1:
    これは、Redisサーバーがローカルループバックアドレス (127.0.0.1) からの接続のみを受け付ける設定です。この場合、同じサーバー上で動作するアプリケーション(Webサーバーなど)からはRedisに接続できますが、別のサーバーからは一切接続できません。Redisをアプリケーションサーバーと同じサーバー上で実行する場合や、SSHトンネルなどを経由して接続する場合に適した、最も安全な設定の一つです。
  • bind <特定のIPアドレス>:
    特定のネットワークインターフェースに割り当てられたIPアドレスを指定することで、そのIPアドレスからの接続のみを受け付けるようにできます。例えば、サーバーが 192.168.1.100 というプライベートIPアドレスを持っている場合、bind 192.168.1.100 と設定することで、そのプライベートネットワーク内の他のサーバーからは接続できますが、パブリックIPアドレス経由での外部からの接続は拒否されます。複数のIPアドレスを指定することも可能です。

bind ディレクティブによる制限は、OSのネットワークスタックレベルで行われるため、ファイアウォールと組み合わせることでより強固なセキュリティを実現できます。通常は、bind 127.0.0.1 もしくは bind <アプリケーションサーバーなど特定の信頼できるIPアドレス> と設定することが強く推奨されます。

認証 (requirepass)

Redisは、単純なパスワード認証機能をサポートしています。redis.confrequirepass ディレクティブにパスワードを設定することで、クライアントからの接続時にパスワードの提示を要求するようになります。

“`ini

requirepass foobared

“`

行頭の # を削除し、パスワードを設定します。

ini
requirepass your_secure_password

パスワードを設定した場合、クライアントは接続後に AUTH password コマンドを実行して認証に成功する必要があります。認証が成功しないと、データの読み書きを含むほとんどのコマンドは実行できません。

注意点:
* requirepass は単純なパスワード認証であり、パスワード自体はネットワーク上を平文で流れる可能性があります(Redis 6.0未満でTLSを使用しない場合)。より強力な認証や通信の暗号化が必要な場合は、TLSやACLの使用を検討してください。
* 強力で推測されにくいパスワードを使用してください。
* パスワードは安全な場所に保管してください。設定ファイルに平文で記述されるため、設定ファイルのアクセス権限管理も重要です。

パスワード認証は、ファイアウォールや bind 設定と組み合わせることで、セキュリティレベルを大幅に向上させます。たとえ外部からRedisポートにアクセスできたとしても、パスワードを知らなければ不正な操作はできません。

TLS/SSL

Redis 6.0以降では、TLS/SSL(Transport Layer Security / Secure Sockets Layer)による接続の暗号化をサポートしています。TLSを使用することで、クライアントとサーバー間の通信経路を暗号化し、データの盗聴や改ざんを防ぐことができます。

TLSを有効にするには、証明書と秘密鍵を用意し、redis.conf でTLS関連の設定を行います。

“`ini

Enable TLS for the specified port.

tls-port 6379

By default TLS is disabled.

tls-replication no

tls-cluster no

TLS certificate file

tls-cert-file redis.crt

TLS key file

tls-key-file redis.key

TLS CA certificate file

tls-ca-cert-file ca.crt

…その他のTLS関連設定…

“`

  • tls-port: TLS接続を待ち受けるポートを指定します。通常のTCPポート(port)とは別に設定できます。例えば、6379番ポートで平文接続、6380番ポートでTLS接続を受け付けるように設定できます。
  • tls-cert-file, tls-key-file: サーバー証明書ファイルと秘密鍵ファイルを指定します。
  • tls-ca-cert-file: クライアント証明書を検証するためのCA証明書ファイルを指定します(相互認証を行う場合)。

TLSを有効にすることで、ネットワーク上のセキュリティリスクを大幅に低減できます。特に、信頼できないネットワークを経由してRedisにアクセスする場合や、機密性の高いデータを扱う場合にはTLSの利用を検討すべきです。

ACL (Access Control List)

Redis 6.0で導入されたACL (Access Control List) は、よりきめ細やかなアクセス制御を可能にします。従来のパスワード認証が「認証の可否」しか制御できなかったのに対し、ACLではユーザーごとに異なるパスワードを設定したり、特定のコマンドの実行権限や特定のキーへのアクセス権限を付与/制限したりできます。

ACLは、redis.conf または ACL ファイル (aclfile ディレクティブで指定) で設定します。

例: 特定のユーザー myuser を作成し、パスワードを設定、特定のコマンド (GET, SET, DEL) と特定のキープレフィックス (user:*) へのアクセスを許可する。

“`ini

user on | off > >

user myuser on > some_password > +@read +@write +@keys ~user:*
“`

ACLを使用することで、アプリケーションごとに異なるユーザーを作成し、必要最小限の権限のみを与える「最小権限の原則」に基づいたセキュリティを実現できます。これにより、万が一クライアント側で情報漏洩が発生しても、被害範囲を限定することができます。

まとめ:ポートとセキュリティ

Redisのセキュリティ対策は、ポート番号の変更だけでは不十分です。むしろ、以下の基本的な対策を講じることがはるかに重要です。

  1. ファイアウォール設定: 信頼できるIP/ネットワークからのみRedisポートへのアクセスを許可する。
  2. bind ディレクティブ: Redisが信頼できるネットワークインターフェース(ローカルループバックやプライベートIP)のみをリッスンするように設定する。bind 0.0.0.0 やコメントアウトは避ける。
  3. 認証 (requirepass または ACL): 接続にパスワード認証またはより詳細なアクセス制御を要求する。
  4. TLS/SSL: 必要な場合は通信を暗号化する。
  5. システムの更新: RedisサーバーやOSを常に最新の状態に保ち、既知の脆弱性に対処する。
  6. 不必要な機能の無効化: 使用しないコマンド(例: FLUSHALL, DEBUG など)を rename-command ディレクティブでリネームまたは無効化することも検討できます。

これらの対策を組み合わせることで、Redisサーバーのセキュリティレベルを大きく向上させることができます。デフォルトポート6379を使用する場合でも、これらの対策が適切に施されていれば、ポート番号を隠すことによる限定的な効果よりもはるかに高い安全性が確保されます。

Redisクライアントからの接続方法 (ポート指定)

Redisサーバーがデフォルトポート(6379)以外で稼働している場合、クライアントアプリケーションは接続時に明示的にポート番号を指定する必要があります。ほとんどのRedisクライアントライブラリやツールは、ホスト名(またはIPアドレス)とポート番号を指定するオプションを提供しています。

redis-cli

Redisに付属するコマンドラインインターフェースツールである redis-cli では、-p オプションでポート番号を指定します。

bash
redis-cli -h <ホスト名またはIPアドレス> -p <ポート番号>

例: ローカルホストの12345番ポートで稼働するRedisに接続

bash
redis-cli -h 127.0.0.1 -p 12345

パスワードが必要な場合は、-a オプションでパスワードを指定することもできます。

bash
redis-cli -h 127.0.0.1 -p 12345 -a your_secure_password

ACLユーザーを使用する場合は、-u オプションでURI形式で指定します。

bash
redis-cli -u redis://myuser:[email protected]:12345/0

プログラミング言語向けクライアントライブラリ

主要なプログラミング言語向けのRedisクライアントライブラリでも、接続設定の一部としてポート番号を指定できます。以下にいくつかの例を示します。

Python (redis-py):

“`python
import redis

デフォルトポート(6379)に接続する場合

r = redis.Redis(host=’localhost’, port=6379, db=0) # portは省略可能

ポート番号を指定して接続する場合

r = redis.Redis(host=’your_redis_host’, port=12345, db=0)

パスワードが必要な場合

r = redis.Redis(host=’your_redis_host’, port=12345, password=’your_secure_password’, db=0)

ACLユーザーを使用する場合 (URI形式)

r = redis.Redis.from_url(‘redis://myuser:some_password@your_redis_host:12345/0’)

try:
r.ping() # 接続確認
print(“Connected to Redis”)
r.set(‘mykey’, ‘myvalue’)
value = r.get(‘mykey’)
print(f”Value: {value}”)
except redis.exceptions.ConnectionError as e:
print(f”Could not connect to Redis: {e}”)

“`

Node.js (ioredis):

“`javascript
const Redis = require(‘ioredis’);

// デフォルトポート(6379)に接続する場合
// const redis = new Redis(); // host:’127.0.0.1′, port:6379 がデフォルト

// ポート番号を指定して接続する場合
const redis = new Redis({
port: 12345, // Redis port
host: ‘your_redis_host’, // Redis host
db: 0, // Redis database number
});

// パスワードが必要な場合
// const redis = new Redis({
// port: 12345,
// host: ‘your_redis_host’,
// password: ‘your_secure_password’,
// db: 0,
// });

// ACLユーザーを使用する場合 (URI形式)
// const redis = new Redis(‘redis://myuser:some_password@your_redis_host:12345/0’);

redis.on(‘connect’, () => {
console.log(‘Connected to Redis’);
redis.set(‘mykey’, ‘myvalue’, (err, result) => {
if (err) console.error(err);
else {
console.log(‘SET mykey:’, result);
redis.get(‘mykey’, (err, value) => {
if (err) console.error(err);
else console.log(‘GET mykey:’, value);
redis.quit(); // 接続を閉じる
});
}
});
});

redis.on(‘error’, (err) => {
console.error(‘Redis connection error:’, err);
});
“`

Java (Jedis):

“`java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class RedisConnectionExample {
public static void main(String[] args) {
String redisHost = “your_redis_host”;
int redisPort = 12345; // Specify the port
String password = “your_secure_password”; // Specify password if needed

    JedisPoolConfig poolConfig = new JedisPoolConfig();
    // Configure pool settings if necessary

    try (JedisPool pool = new JedisPool(poolConfig, redisHost, redisPort, 2000, password)) {
        try (Jedis jedis = pool.getResource()) {
            // If using ACL, authenticate after getting resource
            // jedis.auth("myuser", "some_password");

            System.out.println("Connected to Redis");
            jedis.set("mykey", "myvalue");
            String value = jedis.get("mykey");
            System.out.println("Value: " + value);
        }
    } catch (Exception e) {
        e.printStackTrace();
        System.err.println("Could not connect to Redis: " + e.getMessage());
    }
}

}
“`

このように、どのクライアントライブラリを使用する場合でも、接続ホスト(またはIPアドレス)とポート番号を指定するパラメータが用意されています。Redisサーバーのポートを変更した場合は、これらのクライアント設定も忘れずに更新する必要があります。

よくある問題とトラブルシューティング

Redisのポートに関連してよく発生する問題とその解決策について説明します。

ポートが開いていない/接続できない

  • 問題: クライアントからRedisサーバーに接続しようとすると、接続エラーが発生する(Connection refused, Connection timed outなど)。
  • 考えられる原因と解決策:
    1. Redisサーバーが起動していない:
      • 原因: Redisサーバープロセスが実行されていない。
      • 解決策: Redisサーバーが正常に起動しているか確認します (systemctl status redisps aux | grep redis-server など)。起動していない場合は起動します。
    2. 指定したポートでリスニングしていない:
      • 原因: redis.confport 設定が間違っている、またはコマンドラインオプションで意図しないポートを指定している。
      • 解決策: redis.conf ファイルを開き、port ディレクティブが正しく設定されているか確認します。コメントアウトされている場合は、デフォルトの6379番ポートで起動しようとします。また、起動コマンドに --port オプションが付いていないか確認します。サーバーを再起動して設定を反映させます。
      • 確認方法: netstat -tulnp | grep <redisのポート番号> または ss -tulnp | grep <redisのポート番号> を実行し、LISTEN 状態のRedisプロセスが表示されるか確認します。
    3. bind 設定が誤っている:
      • 原因: redis.confbind ディレクティブが、クライアントが接続しようとしているネットワークインターフェースのIPアドレスを含んでいない。例えば、bind 127.0.0.1 となっているRedisサーバーに、別のサーバーからそのパブリックIPやプライベートIP経由で接続しようとしている場合など。
      • 解決策: redis.confbind 設定を確認します。クライアントが接続元のIPアドレスからRedisサーバーに到達できるIPアドレスが bind に含まれているか確認します。ローカルホストからの接続のみ許可する場合は bind 127.0.0.1、特定のプライベートIPからの接続を許可する場合は bind <プライベートIP>、すべてのインターフェースからの接続を許可する場合は # bind 127.0.0.1 (コメントアウト) としますが、セキュリティリスクに注意が必要です。設定変更後は再起動が必要です。
    4. ファイアウォールによってポートが閉じられている:
      • 原因: サーバー自身のOSファイアウォール (ufw, iptablesなど) や、クラウドプロバイダーのセキュリティグループなどによって、Redisポートへの着信接続がブロックされている。
      • 解決策: サーバーのファイアウォール設定やネットワークセキュリティグループ設定を確認し、クライアントのIPアドレス/ネットワークからのRedisポートへの接続が許可されていることを確認します。必要に応じてルールを追加します。
    5. ネットワーク経路上の問題:
      • 原因: クライアントとサーバー間のネットワーク経路に問題がある(ルーター、スイッチ、ACL、VPNなどの設定ミスや障害)。
      • 解決策: pingtraceroute (または tracert) コマンドを使用して、クライアントからサーバーへの基本的なネットワーク到達性を確認します。その後、telnet <ホスト名またはIPアドレス> <ポート番号> コマンドを使用して、指定したポートへのTCP接続が可能か確認します。例えば telnet your_redis_host 6379。接続に成功すると画面がクリアされるか、Redisのプロンプトが表示されます。接続が拒否されたりタイムアウトしたりする場合は、ファイアウォールや bind 設定の問題である可能性が高いです。

設定変更が反映されない

  • 問題: redis.conf を編集してポート番号などを変更したが、Redisサーバーの動作が変わらない。
  • 考えられる原因と解決策:
    1. Redisサーバーを再起動していない:
      • 原因: 設定ファイルを変更しても、実行中のプロセスには反映されません。
      • 解決策: 設定変更を反映させるためには、Redisサーバーを再起動する必要があります (systemctl restart redis など)。
    2. 編集した設定ファイルが、起動中のRedisプロセスで使われていない:
      • 原因: 複数の redis.conf ファイルが存在し、意図しないファイルやデフォルト設定でRedisが起動している。
      • 解決策: 起動中のRedisプロセスのコマンドライン引数を確認し、どの設定ファイルが使用されているか特定します (ps aux | grep redis-server)。正しい設定ファイルを編集しているか確認します。システムサービスとして起動している場合は、サービス設定ファイル (/etc/systemd/system/redis.service など) で指定されている redis.conf の場所を確認します。
    3. コマンドラインオプションが設定を上書きしている:
      • 原因: 起動コマンドに --port--bind などのオプションが付いており、設定ファイルの値を上書きしている。
      • 解決策: 起動コマンドを確認し、不要なオプションが付いていないか確認します。

ポートスキャンツールを使った確認

自身のRedisサーバーのポートが外部からどのように見えているかを確認するために、ポートスキャンツールを使用することも有効です。

  • nmap: 広く使われているネットワーク探索およびポートスキャンツールです。

    “`bash

    特定のIPアドレスの特定ポートをスキャン

    nmap -p 6379 <ターゲットIPアドレス>

    特定のIPアドレスの一般的なポートをスキャン

    nmap <ターゲットIPアドレス>

    サービス検出 (-sV) も行う

    nmap -p 6379 -sV <ターゲットIPアドレス>
    “`

    このコマンドを、Redisサーバーに接続しようとするクライアントと同じネットワーク上のマシンから実行したり、インターネット上の別のマシンから実行したりして、想定通りにポートが見えているか(または見えていないか)を確認します。

これらのトラブルシューティング手順は、Redisのポートに関連する問題解決に役立ちます。問題の原因を特定する際は、Redisの設定、OSのファイアウォール設定、ネットワーク経路、そしてクライアントの設定という複数の層を順番に確認していくことが重要です。

まとめ

この記事では、Redisのデフォルトポートである6379番ポートについて、その基本的な役割から、設定方法、そしてポート設定を含むセキュリティ対策までを詳しく解説しました。

  • Redisは高速なインメモリデータ構造ストアであり、ネットワークを通じてクライアントと通信します。
  • ポート番号は、同じIPアドレス上で動作する複数のサービスを区別するために使用されます。RedisはデフォルトでTCPの6379番ポートを使用します。
  • 6379はIANAにRedisのポートとして正式に登録されています。その由来は明確ではありませんが、コミュニティで広く認知された標準的なポートです。
  • ポート設定は、主に redis.conf ファイルの port ディレクティブで行います。設定ファイルを編集し、Redisサーバーを再起動することで永続的に変更できます。起動時のコマンドラインオプション --port でも一時的に変更可能です。
  • デフォルトポート6379を使用することには利便性がありますが、攻撃者にとってターゲットになりやすいというデメリットも存在します。
  • ポート番号をデフォルト以外に変更することは、セキュリティ上の「隠蔽」効果は期待できますが、それだけでは不十分です。
  • Redisのセキュリティを確保するためには、ポート設定だけでなく、ファイアウォール設定によるアクセス元制限bind ディレクティブによるリスニングインターフェースの制限パスワード認証 (requirepass または ACL)、そして必要に応じたTLS/SSLによる通信暗号化が不可欠です。特に、インターネットからの不正アクセスを防ぐためには、ファイアウォールと bind 設定が極めて重要です。
  • Redisサーバーのポートを変更した場合、それに接続するすべてのクライアントアプリケーションの設定も新しいポート番号に合わせて変更する必要があります。

Redisのポート設定は、その可用性とセキュリティに直接関わる重要な要素です。システムの要件やセキュリティポリシーに基づいて、デフォルトポートを使用するか、別のポートに変更するかを判断し、そして何よりも、ファイアウォールや認証など、ポート設定と組み合わせるべきセキュリティ対策を適切に実施することが、Redisを安全に運用する上で最も重要な点です。

この記事が、皆様のRedisに関する理解を深め、より安全で堅牢なシステム構築の一助となれば幸いです。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール