Memcachedの外部接続を許可する方法【Pythonで接続確認】

Memcachedの外部接続を許可する方法【Pythonで接続確認】 サーバー

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機能・役割
サーバーA192.168.33.60Memcached
サーバーBtelnet/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への外部接続確認について説明しました。

タイトルとURLをコピーしました