CentOS7にMemcachedをインストールして保護する方法
序章
Memcachedなどのメモリオブジェクトキャッシングシステムは、情報をメモリに一時的に保存し、頻繁にまたは最近要求されたレコードを保持することで、バックエンドデータベースのパフォーマンスを最適化できます。 このようにして、データベースへの直接リクエストの数を減らします。
Memcachedのようなシステムは、不適切に構成されている場合、サービス拒否攻撃の原因となる可能性があるため、Memcachedサーバーを保護することが重要です。 このガイドでは、インストールをローカルまたはプライベートネットワークインターフェースにバインドし、Memcachedインスタンスの承認済みユーザーを作成することにより、Memcachedサーバーを保護する方法について説明します。
前提条件
このチュートリアルでは、root以外のsudoユーザーと基本的なファイアウォールがサーバーに設定されていることを前提としています。 そうでない場合は、以下を設定してインストールします。
- 1台のCentOS7サーバー。CentOS7チュートリアルを使用したサーバーの初期設定に従ってセットアップします。
- FirewallD、CentOS7でのFirewallDの使用に関するガイドの「ファイアウォールをインストールして起動時に起動できるようにする」セクションに従って構成されます。
これらの前提条件が整っていると、Memcachedサーバーをインストールして保護する準備が整います。
公式リポジトリからのMemcachedのインストール
サーバーにMemcachedをまだインストールしていない場合は、公式のCentOSリポジトリからインストールできます。 まず、ローカルパッケージインデックスが更新されていることを確認します。
sudo yum update
次に、公式パッケージを次のようにインストールします。
sudo yum install memcached
libmemcached
をインストールすることもできます。これは、Memcachedサーバーと連携するためのいくつかのツールを提供するライブラリです。
sudo yum install libmemcached
これで、Memcachedが、接続をテストできるツールとともに、サーバーにサービスとしてインストールされます。 これで、構成設定の保護に進むことができます。
Memcached構成設定の保護
Memcachedインスタンスがローカルインターフェイス127.0.0.1
でリッスンしていることを確認するために、/etc/sysconfig/memcached
にある構成ファイルのOPTIONS
変数を変更します。 また、UDPリスナーを無効にします。 これらのアクションは両方とも、サービス拒否攻撃からサーバーを保護します。
/etc/sysconfig/memcached
はvi
で開くことができます。
sudo vi /etc/sysconfig/memcached
OPTIONS
変数を見つけます。これは、最初は次のようになります。
/ etc / sysconfig / memcached
. . . OPTIONS=""
ローカルネットワークインターフェイスにバインドすると、同じマシン上のクライアントへのトラフィックが制限されます。 これを行うには、-l 127.0.0.1
をOPTIONS
変数に追加します。 これは特定の環境では制限が厳しすぎる可能性がありますが、セキュリティ対策として適切な出発点となる可能性があります。
UDPプロトコルはTCPよりもサービス拒否攻撃に対してはるかに効果的であるため、UDPリスナーを無効にすることもできます。 これを行うには、-U 0
パラメーターをOPTIONS
変数に追加します。 完全なファイルは次のようになります。
/ etc / sysconfig / memcached
PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-l 127.0.0.1 -U 0"
完了したら、ファイルを保存して閉じます。
Memcachedサービスを再起動して、変更を適用します。
sudo systemctl restart memcached
次のように入力して、Memcachedが現在ローカルインターフェースにバインドされており、TCP接続のみをリッスンしていることを確認します。
sudo netstat -plunt
次の出力が表示されます。
OutputActive Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name . . . tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN 2383/memcached . . .
これにより、memcached
がTCPのみを使用して127.0.0.1
アドレスにバインドされていることが確認されます。
許可ユーザーの追加
認証されたユーザーをMemcachedサービスに追加するには、認証手順をアプリケーションプロトコルから切り離すフレームワークであるSimple Authentication and Security Layer(SASL)を使用できます。 Memcached構成ファイル内でSASLを有効にしてから、認証資格情報を持つユーザーの追加に進みます。
SASLサポートの構成
最初に、memstat
コマンドを使用してMemcachedインスタンスの接続をテストできます。 これは、構成ファイルに変更を加えた後、SASLとユーザー認証が有効になっていることを確認するのに役立ちます。
Memcachedが稼働していることを確認するには、次のように入力します。
memstat --servers="127.0.0.1"
次のような出力が表示されます。
OutputServer: 127.0.0.1 (11211) pid: 3831 uptime: 9 time: 1520028517 version: 1.4.25 . . .
これで、SASLの有効化に進むことができます。 まず、-S
パラメーターを/etc/sysconfig/memcached
のOPTIONS
変数に追加して、SASLを有効にします。 ファイルを再度開きます。
sudo vi /etc/sysconfig/memcached
-S
パラメーターと-vv
パラメーターの両方をOPTIONS
変数に追加します。 -vv
オプションは、/var/log/memcached
に詳細な出力を提供します。これは、デバッグ時に役立ちます。 次のように、これらのオプションをOPTIONS
変数に追加します。
/ etc / sysconfig / memcached
. . . OPTIONS="-l 127.0.0.1 -U 0 -S -vv"
ファイルを保存して閉じます。
Memcachedサービスを再起動します。
sudo systemctl restart memcached
次に、ログを調べて、SASLサポートが有効になっていることを確認できます。
sudo journalctl -u memcached
SASLサポートが初期化されたことを示す次の行が表示されます。
Output. . . Mar 05 18:16:11 memcached-server memcached[3846]: Initialized SASL. . . .
接続を再度確認できますが、SASLが初期化されているため、このコマンドは認証なしで失敗するはずです。
memstat --servers="127.0.0.1"
このコマンドは出力を生成しません。 次のように入力して、ステータスを確認できます。
echo $?
$?
は、最後に終了したコマンドの終了コードを常に返します。 通常、0
以外は、プロセスの失敗を示します。 この場合、1
の終了ステータスが表示されます。これは、memstat
コマンドが失敗したことを示しています。
認証されたユーザーの追加
これで、 PLAIN 認証スキームをサポートするプラグインを含む、CyrusSASLライブラリとその認証メカニズムを操作できるようにする2つのパッケージをダウンロードできます。 これらのパッケージcyrus-sasl-devel
およびcyrus-sasl-plain
を使用すると、ユーザーを作成して認証できます。 次のように入力してパッケージをインストールします。
sudo yum install cyrus-sasl-devel cyrus-sasl-plain
次に、MemcachedがSASL構成設定を確認するディレクトリとファイルを作成します。
sudo mkdir -p /etc/sasl2 sudo vi /etc/sasl2/memcached.conf
SASL構成ファイルに以下を追加します。
/etc/sasl2/memcached.conf
mech_list: plain log_level: 5 sasldb_path: /etc/sasl2/memcached-sasldb2
ログレベルを指定することに加えて、mech_list
をplain
に設定します。これにより、Memcachedは独自のパスワードファイルを使用し、プレーンテキストのパスワードを確認する必要があります。 次に作成するユーザーデータベースファイルへのパスも指定します。 終了したら、ファイルを保存して閉じます。
次に、ユーザー資格情報を使用してSASLデータベースを作成します。 saslpasswd2
コマンドを使用して、-c
オプションを使用してデータベースにユーザーの新しいエントリを作成します。 ここでのユーザーはsammyになりますが、この名前を自分のユーザーに置き換えることができます。 -f
オプションを使用して、データベースへのパスを指定します。これは、/etc/sasl2/memcached.conf
で設定したパスになります。
sudo saslpasswd2 -a memcached -c -f /etc/sasl2/memcached-sasldb2 sammy
最後に、SASLデータベースに対するmemcached
ユーザーの所有権を付与します。
sudo chown memcached:memcached /etc/sasl2/memcached-sasldb2
Memcachedサービスを再起動します。
sudo systemctl restart memcached
memstat
を再度実行すると、認証プロセスが機能したかどうかが確認されます。 今回は、認証資格情報を使用して実行します。
memstat --servers="127.0.0.1" --username=sammy --password=your_password
次のような出力が表示されます。
OutputServer: 127.0.0.1 (11211) pid: 3831 uptime: 9 time: 1520028517 version: 1.4.25 . . .
Memcachedサービスは、SASLサポートとユーザー認証で正常に実行されています。
プライベートネットワーク経由のアクセスを許可する
ローカルインターフェースでリッスンするようにMemcachedを構成する方法について説明しました。これにより、Memcachedインターフェースを外部の第三者にさらされることから保護することで、サービス拒否攻撃を防ぐことができます。 ただし、他のサーバーからのアクセスを許可する必要がある場合があります。 この場合、Memcachedをプライベートネットワークインターフェースにバインドするように構成設定を調整できます。
注:このセクションでは、 FirewallD を使用してファイアウォール設定を構成する方法について説明しますが、DigitalOceanクラウドファイアウォールを使用してこれらの設定を作成することもできます。 DigitalOceanクラウドファイアウォールの設定の詳細については、DigitalOceanCloudファイアウォールの概要を参照してください。 特定のマシンへの着信トラフィックを制限する方法の詳細については、タグとサーバー名を使用したファイアウォールルールの適用に関するこのチュートリアルのセクションと、ファイアウォールタグの説明を確認してください。
ファイアウォールによるIPアクセスの制限
構成設定を調整する前に、ファイアウォールルールを設定して、Memcachedサーバーに接続できるマシンを制限することをお勧めします。 前提条件に従い、サーバーにFirewallDをインストールし、別のホストからMemcachedに接続する計画をしないする場合は、ファイアウォールルールを調整する必要はありません。 スタンドアロンのMemcachedインスタンスは、前に定義したOPTIONS
変数のおかげで、127.0.0.1
をリッスンする必要があります。したがって、着信トラフィックについて心配する必要はありません。 ただし、他のホストからMemcachedサーバーへのアクセスを許可する場合は、firewall-cmd
コマンドを使用してファイアウォール設定を変更する必要があります。
専用のMemcachedゾーンをfirewalld
ポリシーに追加することから始めます。
sudo firewall-cmd --permanent --new-zone=memcached
次に、開いたままにするポートを指定します。 Memcachedはデフォルトでポート11211
を使用します。
sudo firewall-cmd --permanent --zone=memcached --add-port=11211/tcp
次に、Memcachedへのアクセスを許可するプライベートIPアドレスを指定します。 このためには、クライアントサーバーのプライベートIPアドレスを知っている必要があります。
sudo firewall-cmd --permanent --zone=memcached --add-source=client_server_private_IP
ファイアウォールをリロードして、新しいルールが有効になるようにします。
sudo firewall-cmd --reload
これで、クライアントのIPアドレスからのパケットは、専用のMemcachedゾーンのルールに従って処理されるはずです。 他のすべての接続は、デフォルトのpublic
ゾーンで処理されます。
これらの変更が適切に行われると、Memcachedサービスに必要な構成変更を加えて、サーバーのプライベートネットワークインターフェイスにバインドすることができます。
Memcachedをプライベートネットワークインターフェイスにバインドする
サーバーのプライベートネットワークインターフェイスにバインドする最初のステップは、前に設定したOPTIONS
変数を変更することです。
次のように入力すると、/etc/sysconfig/memcached
を再度開くことができます。
sudo vi /etc/sysconfig/memcached
内部で、OPTIONS
変数を見つけます。 -l 127.0.0.1
を変更して、MemcachedサーバーのプライベートIPを反映できるようになりました。
/ etc / sysconfig / memcached
. . . OPTIONS="-l memcached_servers_private_IP -U 0 -S -vv"
終了したら、ファイルを保存して閉じます。
Memcachedサービスを再起動します。
sudo systemctl restart memcached
netstat
で新しい設定を確認して、変更を確認します。
sudo netstat -plunt
OutputActive Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name . . . tcp 0 0 memcached_servers_private_IP:11211 0.0.0.0:* LISTEN 2383/memcached . . .
外部クライアントからの接続をテストして、引き続きサービスにアクセスできることを確認します。 許可されていないクライアントからのアクセスもチェックして、ファイアウォールルールが有効であることを確認することをお勧めします。
結論
このチュートリアルでは、Memcachedサーバーをローカルまたはプライベートネットワークインターフェイスにバインドするように構成し、SASL認証を有効にすることでサーバーを保護する方法について説明しました。
Memcachedの詳細については、プロジェクトのドキュメントをご覧ください。 Memcachedの操作方法の詳細については、 Ubuntu14.04にMemcacheをインストールして使用する方法に関するチュートリアルを参照してください。