Herosku Redis バージョン 4 と 5 のセキュリティ保護
最終更新日 2021年12月28日(火)
Table of Contents
この記事は Redis バージョン 4 と 5 にのみ適用されます。Redis バージョン 6 を使用して Premium、Private、または Shield Heroku データベースをプロビジョニングする場合は、この記事で説明されている Stunnel 手法の代わりに、その組み込み TLS を使用する必要があります。Heroku は、バージョン 4 より古い Redis バージョンをサポートしていません。
Redis では、バージョン 6 から TLS をネイティブでサポートしています。Redis 4 または 5 を使用している場合、dyno と Redis の間のデータ転送は、この記事の方法を使用しない限り暗号化されません。
Heroku Redis のデータの安全性とプライバシーをトランスポートレベルで向上させるには、Stunnel buildpack を使用します。この buildpack では、dyno と Heroku Redis インスタンスの間に SSL トンネルを構築し、データを安全に転送できるようにします。
Stunnel buildpack がなくても Heroku Redis 5 以前のバージョンに接続できますが、お勧めできません。この方法を使用しないと、暗号化していないデータが転送されます。
Stunnel の概要
Stunnel は、本番環境の各 Heroku Redis インスタンスにインストールされるソフトウェアです。これは、実行中の Redis プロセスと SSL 接続の間にプロキシを作成します。トランスポートレベルのセキュリティを確保するには、アプリケーションを実行する dyno 上に関連する Stunnel を作成する必要があります。Stunnel buildpack によって、アプリケーションコードを変更せずに、アプリケーションに暗号化が追加されます。
Stunnel buildpack の使用
Stunnel は、すべての Production 層の Heroku Redis インスタンスのサーバー側にすでに設定されています。このため、Heroku Redis と通信する dyno 側でトンネルの設定をする必要があります。
大まかに説明すると、Stunnel buildpack をインストールして Procfile
を更新する必要があります。これを更新することで、Heroku Redis と通信する各プロセスタイプでも bin/start-stunnel
を実行するようにします。
Heroku Redis Stunnel Buildpack README には、アプリケーションへの buildpack の追加のすべての詳細が含まれています。
buildpack をインストールした後、Stunnel buildpack を有効化または無効化するには、STUNNEL_ENABLED
環境設定を true
または false
に設定します。
Stunnel への直接接続
一部の Redis クライアントライブラリでは、Heroku Redis インスタンス上で利用できるサーバー側の Stunnel に直接接続できます。この場合は、Stunnel buildpack を使用せずに Stunnel に直接接続できます。
サーバー側の Stunnel プロセスは、Heroku Redis インスタンスのポートよりも 1 つ大きいポートで実行します。たとえば、Redis サービスがポート 6379
で実行している場合、Stunnel はポート 6380
をリッスンします。
Ruby の使用
Ruby を使用している場合は、次を使用して Stunnel に直接接続できます。
require 'uri'
url = URI.parse(ENV["REDIS_URL"])
url.scheme = "rediss"
url.port = Integer(url.port) + 1
$redis = Redis.new(url: url, driver: :ruby, ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE })
この方法は、redis
gem 4.0.2
以上のバージョンにのみ適用されます。4.0.1
以下を使用して Heroku Redis に SSL 経由でネイティブ接続することはできません。これは、検証モードとして OpenSSL::SSL::VERIFY_NONE
が無視されるためです。
Go の使用
Go を使用している場合は、次を使用して Stunnel に直接接続できます。
u, _ := url.Parse(s)
h, p, _ := net.SplitHostPort(u.Host)
port, _ := strconv.Atoi(p)
u.Scheme = "rediss"
u.Host = net.JoinHostPort(h, strconv.Itoa(port++))
c, _ := redis.DialURL(u.String(), redis.DialTLSSkipVerify(true))
defer c.Close()
Node.js の使用
Node.js から Heroku Redis インスタンスに接続するために ioredis を使用している場合は、次を使用して Stunnel に直接接続できます。
var url = require('url');
var Redis = require('ioredis');
redis_uri = url.parse(process.env.REDIS_URL);
var redis = new Redis({
port: Number(redis_uri.port) + 1,
host: redis_uri.hostname,
password: redis_uri.auth.split(':')[1],
db: 0,
tls: {
rejectUnauthorized: false,
requestCert: true,
agent: false
}
});
Heroku Redis CLI
Heroku Redis CLI では、本番プランの Heroku Redis インスタンスにアクセスしようとするときは Stunnel 経由で接続します。
Stunnel サポートのない Hobby プランの場合、Heroku CLI では、暗号化せずに接続することについて確認を求める警告が表示されます。
$ heroku redis:cli -a example-app
▸ WARNING: Insecure Action
▸ All data, including the redis password, will be unencrypted.
▸ To proceed, type example-app or re-run this command with --confirm example-app
>
コマンドラインで --confirm
フラグを使用すると、確認メッセージをスキップし、暗号化せずに Redis CLI に接続します。
$ heroku redis:cli --confirm example-app
Connecting to: REDIS_URL
ec2-11-11-11-11.compute-1.amazonaws.com:6699>