背景:
因為postgresql或者mysql目前通過docker安裝,只需要輸入主機IP、用戶名、密碼即可訪問成功,這樣其實是不安全的,可能會通過一些手段獲取到用戶名密碼導致數據被竊取。而ES、kafka等也是通過用戶名/密碼方式連接,但是這些數據重要性相比較于數據庫要低一些,畢竟都是一些日志以及消息而已。
解決方案:
通過開啟SSL證書認證的方式加強防護,配合使用防火墻策略白名單方式、增加密碼復雜度。本文檔主要是介紹開啟SSL認證方式。
具體實施步驟:
一、創建目錄存儲配置信息
1、mkdir /postgre
2、進入 文件夾
cd postgre
3、創建目錄
mkdir certs
4、創建目錄
mkdir data
二、創建Openssl配置文件
1、進入cd /postgre/certs 目錄
2、執行 touch openssl.cnf
3、修改文件vim openssl.cnf
4、將下面信息粘貼至文件中
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no[ req_distinguished_name ]
C = CN
ST = Beijing
L = Beijing
O = MyOrg
OU = IT
CN = postgres
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
IP.1 = 192.168.2.1 #數據庫主機地址
DNS.1 = postgres #數據庫用戶名
如下圖:
三、創建SSL證書生成腳本generate_certs.sh
1、進入 cd /postgre/certs 目錄
2、touch generate_certs.sh
3、vim generate_certs.sh
4、將下面信息粘貼至文件中
#!/bin/bash
ROOT_KEY="root.key"
ROOT_CRT="root.crt"
SERVER_KEY="server.key"
SERVER_CSR="server.csr"
SERVER_CRT="server.crt"
DAYS=365
BITS=2048echo "生成根私鑰..."
openssl genpkey -algorithm RSA -out "$ROOT_KEY"echo "生成根證書..."
openssl req -x509 -new -nodes -key "$ROOT_KEY" -sha256 -days "$DAYS" -out "$ROOT_CRT" -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Root CA/OU=IT Department/CN=postgres"echo "生成服務器私鑰..."
openssl genpkey -algorithm RSA -out "$SERVER_KEY"echo "生成證書簽名請求 (CSR)..."
openssl req -new -key "$SERVER_KEY" -out "$SERVER_CSR" -config openssl.cnfecho "使用根證書簽署服務器證書..."
openssl x509 -req -in "$SERVER_CSR" -CA "$ROOT_CRT" -CAkey "$ROOT_KEY" -CAcreateserial -out "$SERVER_CRT" -days 365 -extfile openssl.cnfecho "驗證服務器證書..."
openssl verify -CAfile "$ROOT_CRT" "$SERVER_CRT"echo "生成完成!以下是生成的文件:"
ls -l "$ROOT_KEY" "$ROOT_CRT" "$SERVER_KEY" "$SERVER_CSR" "$SERVER_CRT"
如圖:
四、創建配置證書目錄以及生成證書
1、執行cd /postgre/certs
2、執行sh generate_certs.sh 運行該腳本
3、如下圖代表生成成功
4、查看生成的證書
五、為證書目錄賦權限,以便postgre容器可以訪問執行這些證書
1、cd /postgre
2、chmod 777 certs
3、chmod 777 data
2、chown 999:999 certs/* 之所以所屬用戶/組設置為999 是因為postgre默認進程所屬就是999。
3、chmod 600 certs/* 為證書目錄設置為所屬用戶可讀可寫,如果權限過大會在連接數據庫時報錯!
六、創建配置文件postgresql.conf
1、進入 cd /postgre
2、執行 touch postgresql.conf 命令
3、執行 vim postgresql.conf 命令
4、復制如下配置信息到文件中
ssl = on #開啟SSL認證
ssl_cert_file = '/var/lib/postgresql/certs/server.crt' #服務器證書路徑
ssl_key_file = '/var/lib/postgresql/certs/server.key' #密鑰路徑
ssl_ca_file = '/var/lib/postgresql/certs/root.crt' #根證書路徑
listen_addresses = '*' #監聽所有
ssl_min_protocol_version = 'TLSv1.2' #SSL等級最小為1.2
logging_collector = on # 開啟日志
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d # 日志文件保留一天后輪換
log_rotation_size = 10MB # 當日志文件達到10MB時輪換
log_min_messages = debug # 記錄警告級別及以上的消息
log_connections = on # 記錄連接嘗試
log_disconnections = on # 記錄斷開連接
如下圖
七、創建配置文件pg_hba.conf
1、cd /postgre
1、執行 touch pg_hba.conf 命令
2、執行 vim pg_hba.conf 命令
3、復制如下配置信息到文件中
hostssl all all 0.0.0.0/0 cert clientcert=1
如下圖
八、安裝并啟動PostgreSQl
1、安裝postgreSQL 13.3版本
鏡像會提供給運維。
2、啟動postgreSQL容器
docker run -d --name my-postgres-ssl -p 5432:5432 -e POSTGRES_PASSWORD=xxxx -v /postgre/postgresql.conf:/etc/postgresql/postgresql.conf -v /postgre/certs:/var/lib/postgresql/certs -v /postgre/data:/var/lib/postgresql/data b2fcd079c1d4 -c 'config_file=/etc/postgresql/postgresql.conf'其中 -e POSTGRES_PASSWORD=password 為數據庫設置密碼為 “password” 默認用戶名為 “postgres”其中 -v /postgre/postgresql.conf:/etc/postgresql/postgresql.conf 將宿主機的配置文件掛載到容器中。其中 -v /postgre/certs:/var/lib/postgresql/certs 為數據庫映射證書目錄 將宿主機中的證書目錄掛載到容器中 前面為宿主機目錄 后面為容器中目錄。可固定寫死。其中 -v /postgre/data:/var/lib/postgresql/data 為數據庫映射數據存儲目錄。
其中 -c 'config_file=/etc/postgresql/postgresql.conf' 強制數據庫使用自定義的配置文件,忽略系統內置的配置信息 后面會介紹如何編寫postgresql.conf文件。
九、替換容器中的pg_hba.conf配置文件
1、查詢 容器id 執行
docker ps --filter "name=my-postgres-ssl" --format "{{.ID}}"
2、將配置文件復制容器中
docker cp /postgre/pg_hba.conf 容器ID:/var/lib/postgresql/data
3、重啟docker容器
docker restart 容器ID
4、查看運行日志
docker logs -f --tail 200 容器ID
5、如圖則運行成功
十、使用客戶端連接數據庫 此處使用Navicat
其中SSL配置中 客戶端密鑰 上傳 server.key客戶端證書 上傳 server.crt根證書 上傳 root.crt
點擊【測試鏈接】