このチュートリアルの以前のバージョンは、KathleenJuellによって作成されました。

序章

Memcachedなどのメモリオブジェクトキャッシングシステムは、情報をメモリに一時的に保存し、頻繁にまたは最近要求されたレコードを保持することで、バックエンドデータベースのパフォーマンスを最適化できます。 このようにして、データベースへの直接リクエストの数を減らします。

このガイドでは、Memcachedサーバーをインストールして構成する方法を学習します。 また、Simple Authentication and Security Layer(SASL)を使用してMemcachedを保護するために認証を追加する方法についても学習します。 最後に、Memcachedをローカルまたはプライベートネットワークインターフェイスにバインドして、認証されたユーザーが信頼できるネットワークでのみアクセスできるようにする方法を学習します。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • sudo非rootユーザーとファイアウォールが有効になっている1台のUbuntu20.04サーバー。 これを設定するには、 Ubuntu20.04を使用したサーバーの初期設定チュートリアルに従うことができます。

これらの前提条件が整っていると、Memcachedサーバーをインストールして保護する準備が整います。

または、インタラクティブ端末を使用してブラウザにMemcachedをインストールして設定する実験を行う場合は、下のインタラクティブ端末の起動!ボタンをクリックして開始してください。

ステップ1—Memcachedをインストールする

サーバーにMemcachedをまだインストールしていない場合は、公式のUbuntuリポジトリからインストールできます。 まず、次のコマンドを使用して、ローカルパッケージインデックスが更新されていることを確認します。

  1. sudo apt update

次に、公式パッケージを次のようにインストールします。

  1. sudo apt install memcached

libmemcached-toolsをインストールすることもできます。これは、Memcachedサーバーの調査、テスト、および管理に使用できるさまざまなツールを含むパッケージです。 次のコマンドを使用して、パッケージをサーバーに追加します。

  1. sudo apt install libmemcached-tools

これで、Memcachedが、接続をテストできるツールとともに、サーバーにサービスとしてインストールされます。

Memcachedを起動するには、次のsystemctlコマンドを実行します。

  1. sudo systemctl start memcached

これで、構成設定の保護に進むことができます。

手順2— Memcachedネットワーク設定の構成(オプション)

MemcachedサーバーがTCPを使用したローカルIPv4接続のみをサポートする必要がある場合は、このセクションをスキップして、このチュートリアルのステップ3に進むことができます。 それ以外の場合、UDPソケット、Unixドメインソケットを使用するようにMemcachedを構成するか、IPv6接続のサポートを追加する場合は、チュートリアルのこのセクションの関連する手順に進みます。

まず、MemcachedインスタンスがローカルIPv4ループバックインターフェイス127.0.0.1でリッスンしていることを確認します。 UbuntuとDebianに同梱されている現在のバージョンのMemcachedでは、-l構成パラメーターがローカルインターフェイスに設定されています。つまり、Memcachedが実行されているサーバーからの接続のみを受け入れるように構成されています。

ssコマンドを使用して、Memcachedが現在ローカルIPv4 127.0.0.1インターフェイスにバインドされており、TCP接続のみをリッスンしていることを確認します。

  1. sudo ss -plunt

さまざまなフラグにより、ssの出力が次のように変更されます。

  • -pは、ソケットを使用しているプロセスの名前を追加します
  • -lは、他のシステムに接続されたソケットも含めるのではなく、出力をリスニングソケットのみに制限します
  • -uは、出力にUDPベースのソケットを含みます
  • -nは、人間が読める形式の名前と値の代わりに、出力に数値を表示します
  • -tは、出力にTCPベースのソケットを含みます

次のような出力を受け取るはずです。

Output
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . tcp LISTEN 0 1024 127.0.0.1:11211 0.0.0.0:* users:(("memcached",pid=8889,fd=26)) . . .

この出力は、memcachedがTCPプロトコルのみを使用してIPv4ループバック127.0.0.1アドレスにバインドされていることを確認します。

MemcachedがTCP接続のみでIPv4をサポートするように構成されていることを確認したので、/etc/memcached.confを編集して、UDP、Unixドメインソケット、またはIPv6接続のサポートを追加できます。

IPv6の構成

MemcachedへのIPv6接続を有効にするには、/etc/memcached.confファイルをnanoまたはお好みのエディターで開きます。

  1. sudo nano /etc/memcached.conf

まず、ファイル内で次の行を見つけます。

/etc/memcached.conf
. . .
-l 127.0.0.1

この行は、MemcachedがローカルIPv4インターフェイスでリッスンするように構成されている場所です。 IPv6サポートを追加するには、次のようにIPv6ローカルループバックアドレス( :: 1 )を含む行を追加します。

/etc/memcached.conf
. . .
-l 127.0.0.1
-l ::1

CTRL+OENTERの順に押して保存し、CTRL+Xを押してnanoを終了して、ファイルを保存して閉じます。 次に、systemctlコマンドを使用してMemcachedを再起動します。

  1. sudo systemctl restart memcached

これで、前のセクションのssコマンドを繰り返すことで、MemcachedがIPv6接続もリッスンしていることを確認できます。

  1. sudo ss -plunt

次のような出力を受け取るはずです。

Output
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . tcp LISTEN 0 1024 127.0.0.1:11211 0.0.0.0:* users:(("memcached",pid=8889,fd=26)) . . . tcp LISTEN 0 1024 [::1]:11211 [::]:* users:(("memcached",pid=8889,fd=27))

出力の強調表示された部分は、MemcachedがローカルIPv6インターフェイスでTCP接続をリッスンしていることを示しています。

IPv4サポートを無効にし、IPv6接続のみをリッスンする場合は、/etc/memcached.confから-l 127.0.0.1行を削除し、systemctlコマンドを使用してサービスを再起動できます。

UDPの構成

UDPソケットでMemcachedを使用する場合は、/etc/memcached.conf構成ファイルを編集してUDPサポートを有効にできます。

nanoまたはお好みのエディタを使用して/etc/memcached.confを開き、ファイルの最後に次の行を追加します。

/etc/memcached.conf
. . .
-U 11211

TCPサポートが必要ない場合は、-p 11211行を見つけて-p 0に変更し、TCP接続を無効にします。

ファイルの編集が終わったら、CTRL+Oと入力して保存し、CTRL+Xと入力してファイルを閉じます。

次に、systemctlコマンドを使用してMemcachedサービスを再起動し、変更を適用します。

  1. sudo systemctl restart memcached

ss -pluntコマンドを再度使用して、MemcachedがUDP接続をリッスンしていることを確認します。

  1. sudo ss -plunt

TCPサポートを無効にし、IPv6接続を有効にしている場合は、次のような出力を受け取る必要があります。

[secondary_label Output] 
Netid      State       Recv-Q      Send-Q           Local Address:Port             Peer Address:Port      Process                                         
. . .
udp        UNCONN      0           0                    127.0.0.1:11211                 0.0.0.0:*          users:(("memcached",pid=8889,fd=28))
udp        UNCONN      0           0                        [::1]:11211                    [::]:*          users:(("memcached",pid=8889,fd=29))
. . .

IPv4接続のみを有効にしている場合、およびTCP接続を有効のままにしている場合は、出力が異なる場合があることに注意してください。

Unixドメインソケットの構成

UnixドメインソケットでMemcachedを使用する場合は、/etc/memcached.conf構成ファイルを編集してこのサポートを有効にできます。 Unixドメインソケットを使用するようにMemcachedを構成する場合、MemcachedはTCPおよびUDPサポートを無効にするため、ソケットサポートを有効にする前に、アプリケーションがこれらのプロトコルを使用して接続する必要がないことを確認してください。

nanoまたはお好みのエディターを使用して/etc/memcached.confを開き、ファイルの最後に次の行を追加します。

/etc/memcached.conf
. . .
-s /var/run/memcached/memcached.sock
-a 660

-aフラグは、ソケットのファイルに対するアクセス許可を決定します。 Memcachedに接続する必要のあるユーザーが、サーバーのmemcacheグループの一部であることを確認してください。そうでない場合、ソケットにアクセスしようとしたときにアクセス許可拒否メッセージが表示されます。

次に、systemctlコマンドを使用してMemcachedサービスを再起動し、変更を適用します。

  1. sudo systemctl restart memcached

ss -lnxコマンドを使用して、MemcachedがUnixドメインソケット接続をリッスンしていることを確認します。

  1. sudo ss -lnx | grep memcached

-xフラグは、ssの出力を制限してソケットファイルを表示します。 次のような出力を受け取るはずです。

Output
u_str LISTEN 0 1024 /var/run/memcached/memcached.sock 20234658 * 0

Memcachedのネットワーク設定を構成したので、このチュートリアルの次のステップに進むことができます。これは、認証用のSASLをMemcachedに追加することです。

ステップ3—許可ユーザーの追加

認証されたユーザーをMemcachedサービスに追加するには、認証手順をアプリケーションプロトコルから切り離すフレームワークであるSimple Authentication and Security Layer(SASL)を使用できます。 最初にサーバーにSASLのサポートを追加し、次に認証資格情報を使用してユーザーを構成します。 すべてが整ったら、Memcachedの構成ファイル内でSASLを有効にして、すべてが正しく機能していることを確認できます。

認証されたユーザーの追加

SASLサポートの追加を開始するには、SASLユーザーデータベースの管理プログラムを含むsasl2-binパッケージをインストールする必要があります。 このツールを使用すると、認証された1人または複数のユーザーを作成できます。 次のコマンドを実行してインストールします。

  1. sudo apt install sasl2-bin

次に、mkdirコマンドを使用して、MemcachedがSASL構成設定を確認するディレクトリとファイルを作成します。

  1. sudo mkdir -p /etc/sasl2

次に、nanoまたはお好みのエディターを使用してSASL構成ファイルを作成します。

  1. sudo nano /etc/sasl2/memcached.conf

次の行を追加します。

/etc/sasl2/memcached.conf
log_level: 5
mech_list: plain
sasldb_path: /etc/sasl2/memcached-sasldb2

ログレベルの指定に加えて、mech_listplainに設定され、Memcachedに独自のパスワードファイルを使用してプレーンテキストのパスワードを確認するように指示します。 追加した最後の行は、次に作成するユーザーデータベースファイルへのパスを指定します。 終了したら、ファイルを保存して閉じます。

次に、ユーザー資格情報を使用してSASLデータベースを作成します。 saslpasswd2コマンドを-cフラグとともに使用して、SASLデータベースに新しいユーザーエントリを作成します。 ここでのユーザーはsammyになりますが、この名前を自分のユーザーに置き換えることができます。 -fフラグは、データベースへのパスを指定します。これは、/etc/sasl2/memcached.confで設定したパスになります。

  1. sudo saslpasswd2 -a memcached -c -f /etc/sasl2/memcached-sasldb2 sammy

最後に、次のchownコマンドを使用して、SASLデータベースに対するmemcacheユーザーとグループの所有権を付与します。

  1. sudo chown memcache:memcache /etc/sasl2/memcached-sasldb2

これで、Memcachedが認証に使用できるSASL構成が設定されました。 次のセクションでは、最初にMemcachedがデフォルト設定で実行されていることを確認してから、再構成してSASL認証で機能していることを確認します。

SASLサポートの構成

最初に、memcstatコマンドを使用してMemcachedインスタンスの接続をテストできます。 このチェックは、SASLとユーザー認証を有効にする前に、Memcachedが実行され、正しく構成されていることを確認するのに役立ちます。 構成ファイルに変更を加えた後、コマンドを再度実行して、別の出力を確認します。

memcstatコマンドを使用してMemcachedが稼働していることを確認するには、次のように入力します。

  1. memcstat --servers="127.0.0.1"

IPv6を使用している場合は、IPv4127.0.0.1アドレスの代わりに::1を使用してください。 Unixドメインソケットを使用している場合は、IPアドレスの代わりにソケットへのパスを使用します(例:--servers=/var/run/memcached/memached.sock)。

memcstatコマンドを実行してMemcachedに正常に接続すると、次のような出力が表示されます。

Output
Server: 127.0.0.1 (11211) pid: 2299875 uptime: 2020 time: 1632404590 version: 1.5.22 . . .

:UDPをサポートするMemcachedを使用している場合、memcstatコマンドはUDPポートに接続できません。 次のnetcatコマンドを使用して、接続を確認できます。

  1. nc -u 127.0.0.1 11211 -vz

Memcachedが応答している場合は、次のような出力を受け取る必要があります。

Output
Connection to 127.0.0.1 11211 port [udp/*] succeeded!

IPv6およびUDPでMemcachedを使用している場合、コマンドは次のようになります。

  1. nc -6 -u ::1 11211 -vz

これで、SASLの有効化に進むことができます。 これを行うには、-Sパラメーターを/etc/memcached.confに追加します。 nanoまたはお好みのエディターでファイルを再度開きます。

  1. sudo nano /etc/memcached.conf

ファイルの最後に、以下を追加します。

/etc/memcached.conf
. . .
-S

次に、-vvオプションを見つけてコメントを外します。これにより、/var/log/memcachedに詳細な出力が提供されます。 コメントされていない行は次のようになります。

/etc/memcached.conf
. . .
-vv

ファイルを保存して閉じます。

次に、次のsystemctlコマンドを使用して、Memcachedサービスを再起動します。

  1. sudo systemctl restart memcached

次に、Memcachedのjournalctlログをチェックして、SASLサポートが有効になっていることを確認します。

  1. sudo journalctl -u memcached |grep SASL

SASLサポートが初期化されたことを示す次のような出力行を受け取るはずです。

Output
Sep 23 17:00:55 memcached systemd-memcached-wrapper[2303930]: Initialized SASL.

これで、Memcachedへの接続を再度確認できます。 SASLサポートが適切に設定され、初期化されている場合、次のmemcstatコマンドは、有効な認証クレデンシャルがないと失敗するはずです。

  1. memcstat --servers="127.0.0.1"

コマンドは出力を生成しないはずです。 次のシェルコマンドを入力して、ステータスを確認します。

  1. echo $?

$?は、最後に終了したコマンドの終了コードを常に返します。 通常、0以外は、プロセスの失敗を示します。 この場合、1の終了ステータスが表示されます。これは、memcstatコマンドが失敗したことを示します。

memcstatを再度実行すると、今回はユーザー名とパスワードを使用して、認証プロセスが機能したかどうかを確認します。 別のクレデンシャルを使用した場合は、sammyおよびyour_password`の値の代わりにクレデンシャルを使用して次のコマンドを実行します。

  1. memcstat --servers="127.0.0.1" --username=sammy --password=your_password

次のような出力を受け取るはずです。

Output
Server: 127.0.0.1 (11211) pid: 3831 uptime: 9 time: 1520028517 version: 1.4.25 . . .

これで、Memcachedサービスが構成され、SASLサポートとユーザー認証で実行されます。

ステップ4—プライベートネットワーク経由のアクセスを許可する(オプション)

デフォルトでは、Memcachedはローカルループバック(127.0.0.1)インターフェイスでのみリッスンするように構成されており、外部の関係者への露出からMemcachedインターフェイスを保護します。 ただし、他のサーバーからのアクセスを許可する必要がある場合があります。 この場合、構成設定を調整して、Memcachedをプライベートネットワークインターフェイスにバインドできます。

注:このセクションでは、 UFW を使用してファイアウォール設定を構成する方法について説明しますが、DigitalOceanクラウドファイアウォールを使用してこれらの設定を作成することもできます。 DigitalOceanクラウドファイアウォールの設定の詳細については、DigitalOceanCloudファイアウォールの概要を参照してください。 特定のマシンへの着信トラフィックを制限する方法の詳細については、タグとサーバー名を使用したファイアウォールルールの適用に関するこのチュートリアルのセクションと、ファイアウォールタグの説明を確認してください。

ファイアウォールによるIPアクセスの制限

構成設定を調整する前に、ファイアウォールルールを設定して、Memcachedサーバーに接続できるマシンを制限することをお勧めします。 まず、Memcachedへの接続に使用するマシンのプライベートIPアドレスを記録する必要があります。 プライベートIPアドレス(または複数のアドレス)を取得したら、マシンがMemcachedにアクセスできるようにする明示的なファイアウォールルールを追加します。

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

  1. sudo ufw allow from client_system_private_IP/32 to any port 11211

複数のシステムがプライベートネットワーク経由でMemcachedにアクセスしている場合は、上記のルールをテンプレートとして使用して、マシンごとにufwルールを追加してください。

ufwエッセンシャルガイドを読むと、UFWファイアウォールの詳細を確認できます。

これらの変更を適切に行うと、サーバーのプライベートネットワークインターフェイスにバインドするようにMemcachedサービスを調整できます。

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

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

まず、次のipコマンドを使用して、Memcachedサーバーのプライベートネットワークインターフェイスを見つけます

  1. ip -brief address show

サーバーのネットワーク構成によっては、出力が次の例と異なる場合があります。

Output
lo UNKNOWN 127.0.0.1/8 ::1/128 eth0 UP 203.0.113.1/20 10.10.0.5/16 2001:DB8::1/64 fe80::7ced:9ff:fe52:4695/64 eth1 UP 10.136.32.212/16 fe80::2cee:92ff:fe21:8bc4/64

この例では、ネットワークインターフェイスはeth0およびeth1の名前で識別されます。 eth0行で強調表示されているIPv4アドレスは、サーバーのパブリックIPアドレスです。

eth1行で強調表示されている10.136.32.212アドレスは、サーバーのプライベートIPv4アドレスであり、fe80::2cee:92ff:fe21:8bc4アドレスはIPv6プライベートアドレスです。 IPアドレスは異なりますが、 RFC 1918仕様)に基づいて、常に次の範囲内に収まります。

  • 10.0.0.0から10.255.255.255(10/8プレフィックス)
  • 172.16.0.0から172.31.255.255(172.16 / 12プレフィックス)
  • 192.168.0.0から192.168.255.255(192.168 / 16プレフィックス)

サーバーのプライベートIPアドレスを見つけたら、nanoまたはお好みのエディターを使用して、/etc/memcached.confファイルを再度開きます。

  1. sudo nano /etc/memcached.conf

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

/etc/memcached.conf
. . .
-l memcached_servers_private_IP
. . .

Memcachedで複数のアドレスをリッスンする場合は、-l memcached_servers_private_IP形式を使用して、アドレスごとにIPv4またはIPv6の同様の行をもう1つ追加します。

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

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

  1. sudo systemctl restart memcached

ssで新しい設定を確認して、変更を確認します。

  1. sudo ss -plunt
Output
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . tcp LISTEN 0 1024 10.137.0.2:11211 0.0.0.0:* users:(("memcached",pid=8991,fd=27)) . . .

外部クライアントからの接続をテストして、引き続きサービスにアクセスできることを確認します。 許可されていないクライアントからのアクセスもチェックして(ユーザーとパスワードなしで接続してみてください)、SASL認証が期待どおりに機能していることを確認することをお勧めします。 また、接続が許可されていない別のサーバーからMemcachedに接続して、作成したファイアウォールルールが有効であることを確認することもお勧めします。

結論

このチュートリアルでは、IPv4、IPv6、TCP、UDP、およびUnixドメインソケットを使用してMemcachedを構成する方法について説明しました。 また、SASL認証を有効にしてMemcachedサーバーを保護する方法も学びました。 最後に、Memcachedをローカルまたはプライベートネットワークインターフェイスにバインドする方法と、Memcachedへのアクセスを制限するようにファイアウォールルールを構成する方法を学習しました。

Memcachedの詳細については、プロジェクトのドキュメントをご覧ください。