1. 程式人生 > >基於滴滴雲搭建安全穩定的 Memcached 伺服器

基於滴滴雲搭建安全穩定的 Memcached 伺服器

介紹

Memcached 是一種記憶體 cache 系統,通過將一些高頻使用和最近經常訪問的資訊儲存在記憶體中,可以明顯地優化訪問後端資料庫的效能。

直觀上來看,藉助於 Memcached 元件,可以大量減少訪問資料庫的請求數量。但是,如果不合理地配置 Memcached Server,有可能會使得系統受到大量的攻擊。基於此,有必要建立安全穩定的 Memcached 伺服器,加固 Memcached 配置。

本文將為您提供一種將 Memcached 例項繫結到本地或者私有網路的方法,來提升 Memcached Server 的穩定性。相應地,訪問 Memcached Server 也需要建立授權使用者。

先決條件

準備工作:

1 臺滴滴雲 DC2 伺服器

作業系統:Linux CentOS7.4

規格:2CPU 4GB記憶體 40GB SSD系統盤

防火牆配置:配置系統開機啟動 firewalld 服務

安裝 Memcached

首先安裝 Memcached 元件包:

sudo yum install memcached

為了方便管理 Memcached Servers,我們還可以安裝 Libmemcached,它提供了一系列 Memcached 管理工具:

sudo yum install libmemcached

安裝好 Memcached 基本環境以後,我們可以著手開始加固配置的工作。

加固 Memcached 配置

我們需要配置 Memcached 例項監聽本地的 127.0.0.1 地址,修改配置檔案 /etc/sysconfig/memcached 。為了保證避免大量攻擊,也需要禁用 UDP Listener。

開啟 /etc/sysconfig/memcached

sudo vi /etc/sysconfig/memcached

將該配置檔案修改成如下所示:

/etc/sysconfig/memcached

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

接下來重啟服務使配置生效:

sudo systemctl restart memcached

為了驗證配置的正確性,比如 Memcached Servers 只繫結到了本地埠,而且只監聽 TCP 連線,可以通過如下命令檢視:

sudo netstat -plunt

可以看到輸出結果:

Active 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      121465/memcached

新增使用者認證

給 Memcached 服務新增認證使用者,可以使用 Simple Authentication 和 Security Layer (SASL)。

SASL 是一個用於將認證過程與應用解耦的協議。通過在 Memcached 配置檔案中加入 SASL 配置項,可以使使用者具備認證功能。

配置 SASL

首先我們可以通過 memstat 命令來驗證 Memcached 例項的網路連通性,此後在配置 SASL 和使用者認證完成時,我們都可以通過該命令來驗證配置的可用性:

sudo memstat --servers="127.0.0.1"`

Server: 127.0.0.1 (11211)
pid: 121465
uptime: 1120
time: 1546180153
version: 1.4.15
libevent: 2.0.21-stable
pointer_size: 64
rusage_user: 0.035928
rusage_system: 0.051700
curr_connections: 1
total_connections: 2
connection_structures: 2
......省略部分顯示

開啟 /etc/sysconfig/memcached 配置檔案,加入 -S 和-vv 配置項。-S 目的是開啟 SASL 功能,-vv 作用是提供更詳細的日誌,在 Debug Memcached 時會得到較大方便。修改後配置為:

OPTIONS="-l 127.0.0.1 -U 0 -S -vv"

重啟服務使配置生效:

sudo systemctl restart memcached

通過檢視 log 可以看到 SASL 是否啟用:

sudo journalctl -u memcached

可以看到:

12月 30 22:10:35 10-255-20-131 systemd[1]: Started Memcached.
12月 30 22:10:35 10-255-20-131 systemd[1]: Starting Memcached...
12月 30 22:36:36 10-255-20-131 systemd[1]: Stopping Memcached...
12月 30 22:36:36 10-255-20-131 systemd[1]: Started Memcached.
12月 30 22:36:36 10-255-20-131 systemd[1]: Starting Memcached...
12月 30 22:36:36 10-255-20-131 memcached[122283]: Initialized SASL.

新增一位認證使用者

首先需要安裝 Cyrus SASL 庫,藉助於 cyrus-sasl-devel 和 cyrus-sasl-plain 包我們可以實現認證機制:

sudo yum install cyrus-sasl-devel cyrus-sasl-plain

接下來,我們來建立一個目錄,編輯 SASL 的配置檔案,如下所示:

sudo mkdir -p /etc/sasl2
sudo vi /etc/sasl2/memcached.conf

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

將 mech_list 設定為 plain,目的是使 Memcached 使用自己的密碼認證檔案,並且驗證一個明碼文字。

接下來,我們使用使用者認證的方式來建立一個 SASL 資料庫。

使用 saslpasswd2 命令來生成一個使用者登入准入入口。這裡,我們選用 didi 作為 user,當然 user 的名稱可以自由設定:

sudo saslpasswd2 -a memcached -c -f /etc/sasl2/memcached-sasldb2 didi

最後我們設定 SASL 資料庫為 Memcached 使用者和使用者組:

sudo chown memcached:memcached /etc/sasl2/memcached-sasldb2

重啟服務後,使用上面提到過的 memstat 命令來驗證認證機制是否生效:

memstat --servers="127.0.0.1" --username=didi --password=your_password

如果認證成功,你將看到如下的顯示:

Server: 127.0.0.1 (11211)
pid: 122283
uptime: 2785
time: 1546183379
version: 1.4.15
libevent: 2.0.21-stable
pointer_size: 64
rusage_user: 0.107040
rusage_system: 0.113777
......省略部分顯示

這樣,我們就成功將 Memcached 服務配置為支援 SASL 協議與使用者認證功能。

通過私有網路訪問 Memcached 服務

在上面的安裝配置完成後,我們將 Memcached 服務繫結到本地的介面,這樣就避免了大量的外部攻擊。

實際使用中,我們還需要接受一些其他 Server 的訪問。所以在下面我們將配置 Memcached 服務,將其繫結到特定的私有網路,接受一些外部伺服器的訪問。

通過 Firewall 限制 IP 許可權

在應用配置前,最好為連線到 Memcached 服務的 Server 設定一些 firewall 規則。我們將通過 firewall-cmd 命令來修改 firewall 的預設配置,以達到放開對特定 IP 的訪問許可權。

新增一個 Memcached zone 到 firewalld policy 檔案中:

sudo firewall-cmd --permanent --new-zone=memcached

放開11211埠的訪問許可權,同樣是先定在 Memcached zone內部:

sudo firewall-cmd --permanent --zone=memcached --add-port=11211/tcp

接下來,新增客戶端私有 IP 地址,即設定哪些機器可以訪問 Memcached 服務:

sudo firewall-cmd --permanent --zone=memcached --add-source=client_server_private_IP

Reload firewall 服務使上述配置生效:

sudo firewall-cmd --reload

通過上述配置工作,可以做到你自己客戶端的 IP 地址能夠訪問 Memcached 服務,其他的 IP 連線將會被預設的 public zone 阻止訪問。

將 Memcached 服務繫結到私有網路

修改/etc/sysconfig/memcached 配置檔案。

將 127.0.0.1 替換為我們 Memcached Server 的私有 IP:

OPTIONS="-l memcached_servers_private_IP -U 0 -S -vv"

重啟服務後驗證:

sudo netstat -plunt

	Active Internet connections (only servers)
	Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
	tcp        0      0 10.255.20.131:11211     0.0.0.0:*               LISTEN      124612/memcached

接下來,可以驗證在防火牆配置的 Client IP 能否訪問到 Memcached 服務,作為比對,也可以驗證其他未開放許可權的 IP 能否訪問到 Memcached 服務。

總結

本文主要包括如何配置將本地或者私有網路繫結到 Memcached 服務,以及如何在 Memcached 服務中啟用 SASL 認證機制。

有興趣瞭解更多技術細節,請關注滴滴雲部落格。