Ubuntu18.04にRedisをインストールして保護する方法
序章
Redis は、柔軟性、パフォーマンス、および幅広い言語サポートで知られるメモリ内のKey-Valueストアです。 このチュートリアルでは、Ubuntu 18.04サーバーにRedisをインストール、構成、および保護する方法を示します。
前提条件
このガイドを完了するには、sudo
権限と基本的なファイアウォールが構成されたroot以外のユーザーがいるUbuntu18.04サーバーにアクセスする必要があります。 これは、初期サーバーセットアップガイドに従ってセットアップできます。
開始する準備ができたら、sudo
ユーザーとしてUbuntu18.04サーバーにログインし、以下を続行します。
ステップ1—Redisのインストールと設定
最新バージョンのRedisを入手するには、apt
を使用して公式のUbuntuリポジトリからインストールします。
最初に、ローカルのapt
パッケージキャッシュを最近更新していない場合は、更新します。
- sudo apt update
次に、次のように入力してRedisをインストールします。
- sudo apt install redis-server
これにより、Redisとその依存関係がダウンロードおよびインストールされます。 これに続いて、インストール中に自動的に生成されたRedis構成ファイルで行うべき重要な構成変更が1つあります。
お好みのテキストエディタでこのファイルを開きます。
- sudo nano /etc/redis/redis.conf
ファイル内で、supervised
ディレクティブを見つけます。 このディレクティブを使用すると、initシステムを宣言してRedisをサービスとして管理し、その操作をより細かく制御できます。 supervised
ディレクティブはデフォルトでno
に設定されています。 systemd initシステムを使用するUbuntuを実行しているので、これをsystemd
に変更します。
. . .
# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
# supervised no - no supervision interaction
# supervised upstart - signal upstart by putting Redis into SIGSTOP mode
# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto - detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
# They do not enable continuous liveness pings back to your supervisor.
supervised systemd
. . .
この時点でRedis構成ファイルに加える必要がある変更はこれだけなので、終了したら保存して閉じます。 次に、Redisサービスを再起動して、構成ファイルに加えた変更を反映します。
- sudo systemctl restart redis.service
これで、Redisをインストールして構成し、マシン上で実行できるようになりました。 ただし、使用を開始する前に、まずRedisが正しく機能しているかどうかを確認することをお勧めします。
ステップ2—Redisのテスト
新しくインストールしたソフトウェアと同様に、構成をさらに変更する前に、Redisが期待どおりに機能していることを確認することをお勧めします。 このステップでは、Redisが正しく機能していることを確認するためのいくつかの方法について説明します。
まず、Redisサービスが実行されていることを確認します。
- sudo systemctl status redis
エラーなしで実行されている場合、このコマンドは次のような出力を生成します。
Output● redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-06-27 18:48:52 UTC; 12s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Process: 2421 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
Process: 2424 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
Main PID: 2445 (redis-server)
Tasks: 4 (limit: 4704)
CGroup: /system.slice/redis-server.service
└─2445 /usr/bin/redis-server 127.0.0.1:6379
. . .
ここでは、Redisが実行されており、すでに有効になっていることがわかります。つまり、サーバーが起動するたびにRedisが起動するように設定されています。
注:この設定は、Redisの多くの一般的なユースケースに適しています。 ただし、サーバーが起動するたびに手動でRedisを起動する場合は、次のコマンドを使用してこれを設定できます。
- sudo systemctl disable redis
Redisが正しく機能していることをテストするには、コマンドラインクライアントを使用してサーバーに接続します。
- redis-cli
次のプロンプトで、ping
コマンドを使用して接続をテストします。
- ping
OutputPONG
この出力は、サーバー接続がまだ有効であることを確認します。 次に、以下を実行してキーを設定できることを確認します。
- set test "It's working!"
OutputOK
次のように入力して値を取得します。
- get test
すべてが機能していると仮定すると、保存した値を取得できます。
Output"It's working!"
値をフェッチできることを確認したら、Redisプロンプトを終了してシェルに戻ります。
- exit
最後のテストとして、Redisがデータを停止または再起動した後もデータを保持できるかどうかを確認します。 これを行うには、最初にRedisインスタンスを再起動します。
- sudo systemctl restart redis
次に、コマンドラインクライアントにもう一度接続し、テスト値がまだ使用可能であることを確認します。
- redis-cli
- get test
キーの値は引き続きアクセス可能である必要があります。
Output"It's working!"
終了したら、シェルに戻ります。
- exit
これで、Redisのインストールは完全に機能し、すぐに使用できるようになります。 ただし、デフォルトの構成設定の一部は安全ではなく、悪意のある攻撃者にサーバーとそのデータへの攻撃とアクセスの機会を提供します。 このチュートリアルの残りの手順では、公式Redis Webサイトで規定されているように、これらの脆弱性を軽減する方法について説明します。 これらの手順はオプションであり、従わないことを選択した場合でもRedisは機能しますが、システムのセキュリティを強化するために、強く実行することをお勧めします。
ステップ3—ローカルホストへのバインド
デフォルトでは、Redisはlocalhostからのみアクセスできます。 ただし、これとは異なるチュートリアルに従ってRedisをインストールおよび構成した場合は、どこからでも接続できるように構成ファイルを更新した可能性があります。 これは、localhostへのバインドほど安全ではありません。
これを修正するには、編集用にRedis構成ファイルを開きます。
- sudo nano /etc/redis/redis.conf
この行を見つけて、コメントが外されていることを確認します(#
が存在する場合は削除します)。
bind 127.0.0.1 ::1
終了したらファイルを保存して閉じます(CTRL + X
、Y
、ENTER
の順に押します)。
次に、サービスを再起動して、systemdが変更を読み取るようにします。
- sudo systemctl restart redis
この変更が有効になったことを確認するには、次のnetstat
コマンドを実行します。
- sudo netstat -lnp | grep redis
Outputtcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 14222/redis-server
tcp6 0 0 ::1:6379 :::* LISTEN 14222/redis-server
この出力は、redis-server
プログラムがlocalhost (127.0.0.1
)にバインドされており、Redis構成ファイルのbind
設定を反映していることを示しています。 その列に別のIPアドレス(0.0.0.0
など)が表示されている場合は、正しい行のコメントを解除したことを再確認して、Redisサービスを再起動する必要があります。
Redisインストールがlocalhostでのみリッスンしているため、悪意のある攻撃者がサーバーにリクエストを送信したり、サーバーにアクセスしたりすることがより困難になります。 ただし、Redisは現在、構成または保持するデータを変更する前にユーザーが自分自身を認証することを要求するように設定されていません。 これを解決するために、Redisでは、Redisクライアント(redis-cli
)を介して変更を加える前に、ユーザーにパスワードによる認証を要求することができます。
ステップ4—Redisパスワードの設定
Redisパスワードを設定すると、2つの組み込みセキュリティ機能の1つであるauth
コマンドが有効になります。このコマンドでは、クライアントがデータベースにアクセスするために認証する必要があります。 パスワードはRedisの構成ファイル/etc/redis/redis.conf
で直接構成されているため、お好みのエディターでそのファイルを再度開きます。
- sudo nano /etc/redis/redis.conf
SECURITY
セクションまでスクロールし、次のようなコメント付きディレクティブを探します。
# requirepass foobared
#
を削除してコメントを解除し、foobared
を安全なパスワードに変更します。
注: redis.conf
ファイルのrequirepass
ディレクティブの上に、コメント付きの警告があります。
# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
#
したがって、パスワードとして非常に強力で非常に長い値を指定することが重要です。 次の例のように、自分でパスワードを作成するのではなく、openssl
コマンドを使用してランダムなパスワードを生成できます。 ここに示すように、最初のコマンドの出力を2番目のopenssl
コマンドにパイプすることにより、最初のコマンドによって生成された改行をすべて削除します。
- openssl rand 60 | openssl base64 -A
出力は次のようになります。
OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
そのコマンドの出力をrequirepass
の新しい値としてコピーして貼り付けた後、次のようになります。
/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
パスワードを設定したら、ファイルを保存して閉じ、Redisを再起動します。
- sudo systemctl restart redis.service
パスワードが機能することをテストするには、Redisコマンドラインにアクセスします。
- redis-cli
以下に、Redisパスワードが機能するかどうかをテストするために使用される一連のコマンドを示します。 最初のコマンドは、認証前にキーを値に設定しようとします。
- set key1 10
認証しなかったため、これは機能しません。そのため、Redisはエラーを返します。
Output(error) NOAUTH Authentication required.
次のコマンドは、Redis構成ファイルで指定されたパスワードで認証します。
- auth your_redis_password
Redisは次のことを認めています。
OutputOK
その後、前のコマンドを再度実行すると成功します。
- set key1 10
OutputOK
get key1
はRedisに新しいキーの値を問い合わせます。
- get key1
Output"10"
認証後にRedisクライアントでコマンドを実行できることを確認したら、redis-cli
を終了できます。
- quit
次に、誤って入力したり、悪意のある攻撃者が入力したりすると、マシンに重大な損傷を与える可能性のあるRedisコマンドの名前を変更する方法について説明します。
ステップ5—危険なコマンドの名前を変更する
Redisに組み込まれている他のセキュリティ機能には、危険と見なされる特定のコマンドの名前を変更するか、完全に無効にすることが含まれます。
許可されていないユーザーが実行した場合、このようなコマンドを使用して、データを再構成、破棄、またはその他の方法でワイプすることができます。 認証パスワードと同様に、コマンドの名前変更または無効化は、/etc/redis/redis.conf
ファイルの同じSECURITY
セクションで構成されます。
危険と見なされるコマンドには、 FLUSHDB 、 FLUSHALL 、 KEYS 、 PEXPIRE 、 DEL 、 CONFIG 、 SHUTDOWN 、 BGREWRITEAOF 、 BGSAVE 、 SAVE 、 SPOP 、[X252X ] SREM