露出を減らすことでMemcachedを保護する方法

前書き

2018年2月27日、Cloudflare posted a story about a severe increase in the volume of memcached amplification attacks。 人気のあるオブジェクトキャッシングシステムであるMemcachedは、デプロイメント全体の応答時間とコンポーネントの負荷を軽減するために頻繁に使用されます。 増幅攻撃は、UDPを使用してパブリックネットワーク上で公開されるMemcached展開を標的にします。

攻撃を軽減するための最良のオプションは、Memcachedをローカルインターフェイスにバインドし、UDPを無効にし、従来のネットワークセキュリティのベストプラクティスでサーバーを保護することです。 このガイドでは、これを行う方法と、選択した外部クライアントにサービスを公開する方法について説明します。

[。警告]##

Note:ネットワークの安定性に対するこの増幅攻撃の潜在的な影響のため、DigitalOceanは、2018年3月1日の時点で、ポート11211へのパブリックインターフェイスでUDPトラフィックとTCPトラフィックの両方を無効にしました。 これは、データセンター外からのドロップレットへのアクセスに影響しますが、データセンター内からの接続は引き続き許可されます。

セキュリティを強化するために、同じデータセンター内のドロップレット間でMemcachedアクセスが必要な場合は、ドロップレットのプライベートネットワークインターフェースにバインドし、ファイアウォールルールを使用して許可される送信元アドレスを制限すると、不正なリクエストを防ぐのに役立ちます。

UbuntuおよびDebianサーバーでのMemcachedの保護

UbuntuまたはDebianサーバーで実行されているMemcachedサービスの場合、/etc/memcached.confファイルをnanoで編集することにより、サービスパラメーターを調整できます。次に例を示します。

sudo nano /etc/memcached.conf

デフォルトでは、UbuntuとDebianはMemcachedをローカルインターフェース127.0.0.1にバインドします。 127.0.0.1にバインドされたインストールは、ネットワークからの増幅攻撃に対して脆弱ではありません。 動作を確認するには、-lオプションがこのアドレスに設定されていることを確認してください。

/etc/memcached.conf

. . .
-l 127.0.0.1
. . .

リスニングアドレスが将来よりオープンになるように修正された場合、UDPを無効にすることもお勧めします。UDPは、この特定の攻撃によって悪用される可能性がはるかに高くなります。 UDPを無効にするには(TCPは期待どおりに機能します)、下部またはファイルに次のオプションを追加します。

/etc/memcached.conf

. . .
-U 0

終了したら、ファイルを保存して閉じます。

Memcachedサービスを再起動して、変更を適用します。

sudo service memcached restart

次のように入力して、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
. . .

TCPのみを使用して127.0.0.1アドレスにバインドされたmemcachedが表示されます。

CentOSおよびFedoraサーバーでのMemcachedの保護

CentOSおよびFedoraサーバーで実行されているMemcachedサービスの場合、/etc/sysconfig/memcachedファイルをviで編集することにより、サービスパラメーターを調整できます。次に例を示します。

sudo vi /etc/sysconfig/memcached

内部では、-l 127.0.0.1オプションを使用して、ローカルネットワークインターフェイスにバインドし、同じマシン上のクライアントへのトラフィックを制限する必要があります。 これは一部の環境では制限が厳しすぎる可能性がありますが、出発点として適しています。

また、UDPリスナーを無効にするために-U 0を設定します。 プロトコルとしてのUDPは増幅攻撃に対してはるかに効果的であるため、後日バインディングポートを変更することにした場合、それを無効にすると一部の攻撃の強度が制限されます。

OPTIONS変数内にこれらのパラメーターの両方を追加します。

/etc/sysconfig/memcached

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1 -U 0"

完了したら、ファイルを保存して閉じます。

変更を適用するには、Memcachedサービスを再起動します。

sudo service memcached restart

次のように入力して、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
. . .

TCPのみを使用して127.0.0.1アドレスにバインドされたmemcachedが表示されます。

プライベートネットワーク経由のアクセスを許可する

上記の手順は、Memcachedにローカルインターフェイスのみでリッスンするように指示します。 これにより、Memcachedインターフェイスが外部に公開されないため、増幅攻撃が防止されます。 他のサーバーからのアクセスを許可する必要がある場合は、構成を調整する必要があります。

アクセスを拡張する最も安全なオプションは、Memcachedをプライベートネットワークインターフェイスにバインドすることです。

ファイアウォールでIPアクセスを制限する

その前に、Memcachedサーバーに接続できるマシンを制限するファイアウォールルールを設定することをお勧めします。 ファイアウォールルールを構成するには、client servers private IP addressesを知る必要があります。

UFWファイアウォールを使用している場合は、次のように入力して、Memcachedインスタンスへのアクセスを制限できます。

sudo ufw allow OpenSSH
sudo ufw allow from client_servers_private_IP/32 to any port 11211
sudo ufw enable

essentials guideを読むと、UFWファイアウォールの詳細を確認できます。

Iptablesを使用している場合、次のように入力して基本的なファイアウォールを確立できます。

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp -s client_servers_private_IP/32 --dport 11211 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -P INPUT DROP

ディストリビューションが提供するメカニズムを使用して、Iptablesファイアウォールルールを保存してください。 essentials guideを見ると、Iptablesの詳細を知ることができます。

その後、Memcachedサービスを調整して、サーバーのプライベートネットワークインターフェースにバインドできます。

Memcachedをプライベートネットワークインターフェイスにバインドする

ファイアウォールが設置されたので、127.0.0.1の代わりにサーバーのプライベートネットワークインターフェースにバインドするようにMemcached構成を調整できます。

UbuntuまたはDebianサーバーの場合は、/etc/memcached.confファイルを再度開きます。

sudo nano /etc/memcached.conf

内部で、-l 127.0.0.1行を見つけ、サーバーのプライベートネットワークインターフェイスに一致するようにアドレスを変更します。

/etc/memcached.conf

. . .
-l memcached_servers_private_IP
. . .

完了したら、ファイルを保存して閉じます。

CentOSおよびFedoraサーバーの場合は、/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"

完了したら、ファイルを保存して閉じます。

次に、Memcachedサービスを再度再起動します。

sudo service memcached restart

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増幅攻撃は、ネットワークの健全性とサービスの安定性に深刻な影響を与える可能性があります。 ただし、ネットワークサービスを実行するためのベストプラクティスに従うことにより、攻撃を効果的に軽減できます。 このガイドの変更を適用した後、適切な機能と接続が維持されていることを確認するためにサービスを監視し続けることをお勧めします。