Memcachedの外部接続は、設定自体は簡単です。
ただし、注意しないとDDoS攻撃に利用されかねません。
この記事では、そのあたりに注意した設定方法を解説しています。
本記事の内容
- Memcached設定ファイルの変更
- Memcached設定ファイルの反映
- ファイアウォールでポート開放
- Memcachedへの外部接続確認
それでは、上記に沿って解説していきます。
Memcached設定ファイルの変更
大前提として、Memcachedはインストールしておいてください。
次の記事でUbuntuへのインストールを解説しています。
aptコマンドでインストールした場合、設定ファイルは次の場所にあります。
/etc/memcached.conf
まずは、バックアップを取っておきます。
$ sudo cp /etc/memcached.conf /etc/memcached.conf.org
では、設定ファイルを変更します。
今回は、外部接続を許可することが目的です。
そのための設定に絞って対応します。
この場合に注目するべき値は、次の2つです。
- -p
- -l
それぞれを以下で説明します。
-p
Memcachedが利用するポートの設定です。
デフォルトは、次の設定となります。
# Default connection port is 11211 -p 11211
変更したければ、変更しましょう。
デフォルトのポートを変更することも、セキュリティ対策の一つと言えます。
ただ、個人的にはデフォルトポートは変更しません。
-l
外部接続を許可するホストのIPを設定します。
デフォルトは、次の設定となります。
# Specify which IP address to listen on. The default is to listen on all IP addresses # This parameter is one of the only security measures that memcached has, so make sure # it's listening on a firewalled interface. -l 127.0.0.1
デフォルトは「127.0.0.1」であり、ローカルホストのみからアクセス可能です。
このままでは、同一マシン上でないとMemcachedにアクセスできません。
外部接続を許可するためには、設定変更を行う必要があります。
すべてのIPアドレス(すべてのインターフェース)を許可する場合は、次のように指定します。
-l 0.0.0.0
まとめ
求めるセキュリティのレベルで設定内容は、変わってくるでしょう。
基本的には、上記の値を触ることで対応可能です。
今回は、次の設定を行います。
各自で設定は変更してください。
-p 11211 -l 0.0.0.0
全ホストへの開放は危険に見えるかもしれません。
実際、危険になりえます。
ただし、他でセキュリティを確保すればいいだけです。
ファイアウォールやhosts.allowで制限すれば、危険ではなくなります。
結局、どこでホスト制限を行うかだけの話になります。
個人的には、各ソフトウェアレベルではホスト制限は不要と考えています。
それ以外のところで一括で管理すべきだということです。
各ソフトウェアで制限していたら、管理がバラバラになってしまいます。
以上、Memcached設定ファイルの変更についての説明でした。
次は、Memcached設定ファイルの変更を反映させていきます。
Memcached設定ファイルの反映
Memcached設定ファイルの変更を反映するには、Memcachedを再起動する必要があります。
Memcachedの再起動は、次のコマンドで行います。
$ sudo systemctl restart memcached
念のため、起動状況を確認しておきます。
$ sudo systemctl status memcached ● memcached.service - memcached daemon Loaded: loaded (/lib/systemd/system/memcached.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2021-06-04 06:25:39 JST; 5h 30min ago Docs: man:memcached(1) Main PID: 4595 (memcached) Tasks: 10 (limit: 9513) Memory: 2.5M CGroup: /system.slice/memcached.service └─4595 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 0.0.0.0 -P /var/run/memcached/memcached.pid 6月 04 06:25:39 ubuntu-focal systemd[1]: Started memcached daemon.
上記の「CGroup」に注目です。
上記の「CGroup」に注目です。 CGroup: /system.slice/memcached.service └─4595 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 0.0.0.0 -P /var/run/memcached/memcached.pid
「-p 11211」、「-l 0.0.0.0」というオプション付きでの起動を確認できます。
以上、Memcached設定ファイルの反映について説明しました。
次は、ファイアウォールの開放を行います。
ファイアウォールでポート開放
Memcachedの初期ポートを変更していないなら、次のコマンドで状況を確認可能です。
$ sudo ufw status | grep '11211'
何も表示されないなら、「11211」は未開放という状況になります。
なお、「ufw」コマンドが動かない場合は、次の記事をご覧ください。
「ファイアウォールの設定」の箇所に、「ufw」のインストールについて説明があります。
「ufw」コマンドが動くなら、次のコマンドを実行します。
$ sudo ufw allow 11211 ルールを追加しました ルールを追加しました (v6)
では、再度ポートの状況確認です。
$ sudo ufw status | grep '11211' 11211 ALLOW Anywhere 11211 (v6) ALLOW Anywhere (v6)
ポートが、開放されています。
これで、外部から接続が可能となります。
以上、ファイアウォールの開放について説明しました。
最後に、外部接続の動作確認を行います。
Memcachedへの外部接続確認
Memcachedへの接続確認は、次の二つの方法で行うことができます。
- telnetによる接続
- Pythonによる接続
それぞれを下記で説明します。
説明においては、以下を条件とします。
名称 | IP | 機能・役割 |
サーバーA | 192.168.33.60 | Memcached |
サーバーB | - | telnet/Python |
telnetによる接続
サーバーBからサーバーAにtelnetで接続します。
接続から、SET・GETまで一気に行います。
$ telnet 192.168.33.60 11211 Trying 192.168.33.60... Connected to 192.168.33.60. Escape character is '^]'. set ex_key 0 0 3 con STORED get ex_key VALUE ex_key 0 3 con END
接続できています。
そして、値の保存・取得も問題なくできています。
Pythonによる接続
基本的には、上記の記事を参考にしてください。
今回の外部接続確認用のサンプルコードは、以下。
from pymemcache.client.base import Client client = Client(('192.168.33.60', 11211)) # SET client.set('some_key', 'some_value') #GET result = client.get('some_key') print(result) client.close()
サーバーAを指定しているのが、以下の箇所です。
client = Client(('192.168.33.60', 11211))
上記を実行して、次の結果が表示されればOK。
b'some_value'
また、上記のtelnetで利用したキーから値を取ってみましょう。
機能としては、GETだけとなります。
from pymemcache.client.base import Client client = Client(('192.168.33.60', 11211)) #GET result = client.get('ex_key') print(result) client.close()
実行結果は、もちろん以下。
b'con'
Python経由でもMemcachedに外部接続できています。
問題ありません。
以上、Memcachedへの外部接続確認について説明しました。