前書き
Redisは、柔軟性、パフォーマンス、幅広い言語サポートで知られているメモリ内のキーと値のストアです。 このチュートリアルでは、RedisをDebian 9サーバーにインストール、構成、および保護する方法を示します。
前提条件
このガイドを完了するには、 `+ sudo +`特権を持つ非rootユーザーと基本的なファイアウォールが設定されたDebian 9サーバーにアクセスする必要があります。 これは、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9 [初期サーバー設定ガイド]に従って設定できます。
開始する準備ができたら、sudo対応ユーザーとしてサーバーにログインし、以下に進みます。
ステップ1-Redisのインストールと設定
Redisの最新バージョンを入手するために、 `+ apt +`を使用して公式のDebianリポジトリからインストールします。
ローカルの `+ apt +`パッケージキャッシュを更新し、次のように入力してRedisをインストールします。
sudo apt update
sudo apt install redis-server
これにより、Redisとその依存関係がダウンロードおよびインストールされます。 これに続いて、Redis構成ファイルで行う重要な構成変更が1つあります。これは、インストール中に自動的に生成されました。
任意のテキストエディターでこのファイルを開きます。
sudo nano /etc/redis/redis.conf
ファイル内で、 `+ supervised `ディレクティブを見つけます。 このディレクティブを使用すると、Redisをサービスとして管理するinitシステムを宣言でき、その操作をより詳細に制御できます。 ` supervised `ディレクティブはデフォルトで ` no `に設定されています。 systemd initシステムを使用するDebianを実行しているため、これを ` systemd +`に変更します。
/etc/redis/redis.conf
. . .
# 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
. . .
この時点でRedis構成ファイルに加える必要があるのはこれだけなので、完了したら保存して閉じます。 次に、Redisサービスファイルをリロードして、構成ファイルに加えた変更を反映します。
sudo systemctl restart redis
これで、Redisをインストールして設定し、マシンで実行しています。 ただし、使用を開始する前に、Redisが正しく機能しているかどうかを最初に確認することをお勧めします。
ステップ2-Redisのテスト
新しくインストールされたソフトウェアの場合と同様に、Redisが構成をさらに変更する前に、Redisが期待どおりに機能していることを確認することをお勧めします。 このステップでRedisが正常に動作していることを確認する方法をいくつか見ていきます。
Redisサービスが実行されていることを確認することから始めます。
sudo systemctl status redis
エラーなしで実行されている場合、このコマンドは次のような出力を生成します。
Output● redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; ; vendor preset: enabled)
Active: since Wed 2018-09-05 20:19:44 UTC; 41s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Process: 10829 ExecStopPost=/bin/run-parts --verbose /etc/redis/redis-server.post-down.d (code=exited, status=0/SUCCESS)
Process: 10825 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
Process: 10823 ExecStop=/bin/run-parts --verbose /etc/redis/redis-server.pre-down.d (code=exited, status=0/SUCCESS)
Process: 10842 ExecStartPost=/bin/run-parts --verbose /etc/redis/redis-server.post-up.d (code=exited, status=0/SUCCESS)
Process: 10838 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
Process: 10834 ExecStartPre=/bin/run-parts --verbose /etc/redis/redis-server.pre-up.d (code=exited, status=0/SUCCESS)
Main PID: 10841 (redis-server)
Tasks: 3 (limit: 4915)
CGroup: /system.slice/redis-server.service
└─10841 /usr/bin/redis-server 127.0.0.1:6379
. . .
ここでは、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インストールが完全に機能し、使用できる状態になります。 ただし、デフォルトの構成設定の一部は安全ではないため、悪意のあるアクターがサーバーとそのデータに攻撃してアクセスする機会を提供します。 このチュートリアルの残りの手順では、http://redis.io/topics/security [Redisの公式Webサイト]で規定されているこれらの脆弱性を軽減する方法について説明します。 これらの手順はオプションであり、従わないことを選択した場合でもRedisは引き続き機能しますが、システムのセキュリティを強化するためにこれらを完了することを強くお勧めします。
ステップ3-ローカルホストへのバインド
デフォルトでは、Redisは* localhost からのみアクセス可能です。 ただし、これとは異なるチュートリアルに従ってRedisをインストールおよび構成した場合は、どこからでも接続できるように構成ファイルを更新した可能性があります。 これは、 localhost *へのバインドほど安全ではありません。
これを修正するには、Redis構成ファイルを開いて編集します。
sudo nano /etc/redis/redis.conf
この行を見つけて、コメントが解除されていることを確認します(存在する場合は「#」を削除します)。
/etc/redis/redis.conf
bind 127.0.0.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 10959/redis-server
この出力は、 + redis-server +`プログラムが* localhost *( `+ 127.0.0.1 +
)にバインドされていることを示しており、設定ファイルに加えた変更を反映しています。 その列に別の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 +`セクションまでスクロールして、コメント付きのディレクティブを探します:
/etc/redis/redis.conf
# requirepass foobared
`#`を削除してコメント解除し、 `+ foobared +`を安全なパスワードに変更します。
パスワードを設定したら、ファイルを保存して閉じ、Redisを再起動します。
sudo systemctl restart redis.service
パスワードが機能することをテストするには、Redisコマンドラインにアクセスします。
redis-cli
以下は、Redisパスワードが機能するかどうかをテストするために使用される一連のコマンドを示しています。 最初のコマンドは、認証前にキーを値に設定しようとします。
set key1 10
認証されなかったため機能しません。そのため、Redisはエラーを返します。
Output(error) NOAUTH Authentication required.
次のコマンドは、Redis構成ファイルで指定されたパスワードで認証します。
auth
Redisは次のことを認めます:
OutputOK
その後、前のコマンドを再度実行すると成功します:
set key1 10
OutputOK
`+ get key1 +`はRedisに新しいキーの値を問い合わせます。
get key1
Output"10"
認証後にRedisクライアントでコマンドを実行できることを確認したら、 `+ redis-cli +`を終了できます。
quit
次に、Redisコマンドの名前の変更について説明します。Redisコマンドは、誤って入力した場合や悪意のあるアクターによって入力された場合、マシンに重大な損傷を与える可能性があります。
ステップ5-危険なコマンドの名前変更
Redisに組み込まれている他のセキュリティ機能には、危険と見なされる特定のコマンドの名前変更または完全な無効化が含まれます。
権限のないユーザーが実行すると、そのようなコマンドを使用してデータを再構成、破棄、または消去することができます。 認証パスワードと同様に、コマンドの名前変更または無効化は、 `+ / etc / redis / redis.conf `ファイルの同じ ` SECURITY +`セクションで設定されます。
危険と見なされるコマンドには、* FLUSHDB 、 FLUSHALL 、 KEYS 、 PEXPIRE 、 DEL 、 CONFIG 、 SHUTDOWN 、 BGREWRITEAOF 、 BGSAVE 、 SAVE 、 * SPOP *、 SREM 、 RENAME 、および DEBUG *。 これは包括的なリストではありませんが、そのリスト内のすべてのコマンドの名前を変更または無効にすることは、Redisサーバーのセキュリティを強化するための良い出発点です。
コマンドを無効にするか名前を変更するかは、特定のニーズまたはサイトのニーズによって異なります。 悪用される可能性のあるコマンドを使用しないことがわかっている場合は、無効にすることができます。 それ以外の場合は、名前を変更することをお勧めします。
Redisコマンドを有効または無効にするには、構成ファイルをもう一度開きます。
sudo nano /etc/redis/redis.conf
コマンドを無効にするには、以下に示すように、空の文字列(間に文字を含まない引用符のペアで指定)に名前を変更するだけです。
/etc/redis/redis.conf
. . .
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
. . .
コマンドの名前を変更するには、次の例に示すように別の名前を付けます。 名前が変更されたコマンドは、他の人が推測するのは難しいはずですが、覚えやすくする必要があります。
/etc/redis/redis.conf
. . .
# rename-command CONFIG ""
. . .
変更を保存してファイルを閉じます。
コマンドの名前を変更した後、Redisを再起動して変更を適用します。
sudo systemctl restart redis
新しいコマンドをテストするには、Redisコマンドラインを入力します。
redis-cli
次に、認証します。
auth
OutputOK
前の例のように、 `+ CONFIG `コマンドの名前を ` ASC12_CONFIG `に変更したと仮定します。 最初に、オリジナルの ` CONFIG +`コマンドを使用してみてください。 名前を変更したため、失敗するはずです。
config get requirepass
Output(error) ERR unknown command 'config'
ただし、名前を変更したコマンドの呼び出しは成功します。 大文字と小文字は区別されません。
asc12_config get requirepass
Output1) "requirepass"
2) ""
最後に、 `+ redis-cli`を終了できます:
exit
既にRedisコマンドラインを使用していて、Redisを再起動する場合は、再認証する必要があることに注意してください。 それ以外の場合、コマンドを入力するとこのエラーが発生します。
OutputNOAUTH Authentication required.
結論
このチュートリアルでは、Redisをインストールして構成し、Redisインストールが正しく機能していることを検証し、組み込みのセキュリティ機能を使用して悪意のある攻撃者からの攻撃に対する脆弱性を減らしました。
サーバーに誰かがログインすると、導入したRedis固有のセキュリティ機能を簡単に回避できることに注意してください。 したがって、Redisサーバーの最も重要なセキュリティ機能はファイアウォールです(前提条件https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9#stepを実行した場合に設定したファイアウォール) -four-%E2%80%94-setting-up-a-basic-firewall [Initial Server Setup]チュートリアル)。これにより、悪意のあるアクターがそのフェンスを飛び越えることが非常に難しくなります。