HAProxy

解決問題 SSL/TLS (3)

教學目標

主要解決如何在 Linux 作業系統中,將 SSL 憑證和金鑰檔設定至 HAProxy 負載平衡伺服器,讓我們可以針對不同的服務模擬進行安全連線的問題。

重點概念

首先閱讀本篇之前,請先完成 HAProxy 的設定,請參考「問題解決 HAProxy (1)」 教學文章。

接著只要將 SSL 憑證和金鑰檔設定至 HAProxy 負載平衡伺服器中,就能夠讓我們針對不同的服務進行安全連線,其實只要簡單三個步驟就能夠完成初步實作,分別為;

  1. 建立 SSL 憑證和金鑰檔。
  2. 設定 HAProxy 伺服器。
  3. 測試與驗證。

建立 SSL 憑證和金鑰檔

建立 HAProxy 專屬 SSL 憑證的目錄 /etc/haproxy/ssl/ 中。

1
$ sudo mkdir /etc/haproxy/ssl/

產生一組沒有加密的 2048 bits 私密金鑰和憑證簽署請求。

  • Country 國別
  • State 州
  • Location 地區
  • Organization 組織
  • Organizational Unit 組織部門單位
  • Common Name 網域名稱
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/haproxy/ssl/server.key -out /etc/haproxy/ssl/server.crt
Generating a 2048 bit RSA private key
....+++
........+++
writing new private key to '/etc/haproxy/ssl/server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:TW
State or Province Name (full name) [Some-State]:Taiwan
Locality Name (eg, city) []:Taipei
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.myserver.com
Email Address []:

指令詳細說明:

  • openssl:主要是用於建立和管理憑證、金鑰、簽章請求、…等應用的工具。
  • req:主要是建立新的 X.509 憑證簽章請求,SSL 是使用 X.509 公開金鑰架構標準進行金鑰和憑證管理。
  • -x509:主要是設定我們自主簽署的憑證檔案取代一般憑證請求。
  • -nodes:主要是設定密碼保護金鑰檔的安全。
  • -days 365:主要是設定憑證有效期間為一年
  • -newkey rsa:2048:主要是同時建立憑證請求和新的私密金鑰,採用 2048 bits 的 RSA 金鑰。
  • -keyout:主要是設定私密金鑰檔的名稱。
  • -out:主要是憑證請求檔的名稱

產生 PEM 格式的憑證和金鑰合併檔案。

1
$ sudo cat /etc/haproxy/ssl/server.crt /etc/haproxy/ssl/server.key > /etc/haproxy/ssl/server.pem

設定 HAProxy 伺服器

開啟 HAProxy 伺服器的設定檔。

1
$ vi website.cfg

設定臨時產生 Diffie-Hellman 私密金鑰,主要會取決於 RSA 金鑰的加密大小,預設為 1024,因為我們是採用採用 2048 bits 的 RSA 金鑰,所以要設定為 2048。

1
2
3
4
global
daemon
maxconn 256
tune.ssl.default-dh-param 2048

設定 PEM 格式的憑證和金鑰合併檔案至 HAProxy 伺服器中,同時設定為 8443 網站連接埠和 https 協定。

1
2
3
4
5
listen http-in
bind *:8443 ssl crt /etc/haproxy/ssl/server.pem
reqadd X-Forwarded-Proto:\ https
server server1 127.0.0.1:8080 maxconn 32
server server2 127.0.0.1:8080 maxconn 32

測試與驗證

停止 HAProxy。

1
2
$ ps aux|grep haproxy
$ sudo kill -9 <PID>

執行 HAProxy。

1
$ haproxy -f website.cfg

開啟瀏覽器輸入以下網址進行測試與驗證。

1
$ firefox https://127.0.0.1:8443

總結在問題解決 HAProxy (1) 教學文章中讓我們透過 HAProxy 解決方案快速將能夠讓我們在三分鐘內啟用高可用性、負載平衡和代理網路應用程式的解決方案,接著只要再來透過本篇教學文章的簡單三步驟,就能夠完成 SSL/TLS 安全機制的連線直接應用至任何服務,同時概念性證明任何服務若其主要的負載平衡伺服器已經設定 SSL/TLS 安全機制的連線,則任何服務皆不用在設定 SSL/TLS 安全機制就已經能夠進行安全連線。

相關資源

解決問題 HAProxy (1)

教學目標

初步了解如何透過 HAProxy 解決方案快速在三分鐘內啟用高可用性、負載平衡和代理網路應用程式的解決方案,以利進行系統的驗證與測試。

重點概念

基本介紹

HAProxy 是免費、快速和可靠的高可用性、負載平衡和代理網路應用程式的解決方案,它非常適合高流量的網站,像是 Airbnb、Alibaba、DISQUS、GitHub、Instagram、Stack Overflow、Twitter、… 等網路公司皆使用 HAProxy 的解決方案。

事前準備

目前 HAProxy 支援 Linux 作業系統,但卻不支援 Windows 作業系統,所以若要使用 HAProxy 解決方案則必須準備 Linux 作業系統,像是 Ubuntu 16.04 LTS。

安裝 HAProxy

透過 apt 指令安裝 HAProxy 解決方案。

1
2
3
$ sudo apt update
$ sudo apt show haproxy
$ sudo apt install -y haproxy

當安裝完成之後,請確認 HAProxy 版本。

1
$ haproxy -v

設定 HAProxy

建立 HAProxy 專屬資料夾,新增 website.cfg 設定檔案。

1
2
3
$ mkdir haproxy
$ cd haproxy
$ vi website.cfg

輸入 website.cfg 設定檔案內容,主要是指定 127.0.0.1:8888 網路連接埠轉向 127.0.0.1:8080 網路連接埠,並且新增兩台伺服器,同時指定 HAProxy 管理介面為 127.0.0.1:9999。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
global
daemon
maxconn 256

defaults
mode http
timeout connect 3000ms
timeout client 3000ms
timeout server 3000ms

listen http-in
bind *:8888
server server1 127.0.0.1:8080 maxconn 32
server server2 127.0.0.1:8080 maxconn 32

listen admin_stats
bind 0.0.0.0:9999
stats refresh 30s
stats uri /
stats realm Haproxy Manager
stats auth admin:admin
#stats hide-version

執行 HAProxy

透過 website.cfg 執行 HAProxy 解決方案,不會有訊息是正常情況。

1
$ haproxy -f website.cfg

此時我們可以嘗試開啟 127.0.0.1:8888 就會導至 127.0.0.1:8080 的網站,接著嘗試開啟 127.0.0.1:9999 登入 admin 帳密就可以瀏覽 HAProxy 管理介面查看二台伺服器的狀態。

停止 HAProxy

若我們要停止 HAProxy ,請先透過 ps aux|grep haproxy 指令查詢 HAProxy 解決方案的 PID,接著再透過 kill 指令進行刪除。

1
2
$ ps aux|grep haproxy
$ sudo kill -9 <PID>

總結透過 HAProxy 解決方案快速將能夠讓我們在三分鐘內啟用高可用性、負載平衡和代理網路應用程式的解決方案,以利進行系統的驗證與測試,尤其在進行高可用性的系統架構功能驗證與測試時非常實用。

相關資源