搭建consul-1.5.3集羣,配置TLS、ACl和Gossip Encryption

內容基於大量官網資料,請耐心閱讀html

系統及軟件版本:consul-1.5.3+CentOS7node

docker-compose搭建consul-1.5.3集羣

只有一臺服務器,我就用docker-compose搭建了
docker-compose.yml配置以下web

version: '3.0'
services:
  consul1:
    image: consul:1.5.3
    restart: always
    container_name: consul_1
#-server:表示當前使用的server模式,-node:指定當前節點在集羣中的名稱,
#-config-dir:指定配置文件路徑,定義服務的,缺省值爲:/consul/config
#-data-dir: consul存儲數據的目錄;缺省值爲:/consul/data
#-datacenter:數據中心名稱,缺省值爲dc1
#-ui:使用consul自帶的web UI界面 
#-bind: 綁定服務器的ip地址
#-client: 客戶端可訪問ip,缺省值爲:「127.0.0.1」,即僅容許環回鏈接
#-bootstrap-expect:在一個datacenter中指望的server節點數目,consul啓動時會一直等待直到達到這個數目的server纔會引導整個集羣.這個參數的值在同一個datacenter的全部server節點上必須保持一致
    command: agent -server -client=0.0.0.0 -node=consul_1 -bootstrap-expect=3
    volumes:
      - /usr/local/docker_app/consul/consul_1/config:/consul/config 
      - /usr/local/docker_app/consul/consul_1/data/key:/consul/data/key
  consul2:
    image: consul:1.5.3
    restart: always
    container_name: consul_2
    command: agent -server -client=0.0.0.0 -retry-join=consul_1 -node=consul_2
    volumes:
      - /usr/local/docker_app/consul/consul_2/config:/consul/config
      - /usr/local/docker_app/consul/consul_2/data/key:/consul/data/key 
  consul3:
    image: consul:1.5.3
    restart: always 
    container_name: consul_3
    command: agent -server -client=0.0.0.0 -retry-join=consul_1 -node=consul_3
    volumes:
      - /usr/local/docker_app/consul/consul_3/config:/consul/config 
#證書路徑
      - /usr/local/docker_app/consul/consul_3/data/key:/consul/data/key
  consul4: 
    image: consul:1.5.3
    container_name: consul_4
    restart: always 
    ports:
      - 8500:8500
    command: agent -client=0.0.0.0 -retry-join=consul_1 -ui -node=client
    volumes:
      - /usr/local/docker_app/consul/consul_4/config:/consul/config 
      - /usr/local/docker_app/consul/consul_4/data/key:/consul/data/key

docker-compse的語法就不介紹了,consul用的參數都寫了註釋,consul是C/S結構,配置三臺server,一臺client,數據卷配置了consul的配置文件,consul數據目錄中的證書目錄docker

若是出現下面報錯json

[root@coen ~]# docker-compose -f /consul-compose.yml up -d
Pulling consul1 (consul:1.5.3)...
ERROR: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)`

編輯/etc/docker/daemon.json,添加

{
  "registry-mirrors": ["https://registry.docker-cn.com",「http://hub-mirror.c.163.com"]
}

安裝完畢,運行docker exec -i consul_1 consul members,見到下面三臺server,一臺client就搭建起來了bootstrap

Node      Address          Status  Type    Build  Protocol  DC   Segment
consul_1  172.19.0.4:8301  alive   server  1.5.3  2         dc1  <all>
consul_2  172.19.0.2:8301  alive   server  1.5.3  2         dc1  <all>
consul_3  172.19.0.5:8301  alive   server  1.5.3  2         dc1  <all>
client    172.19.0.3:8301  alive   client  1.5.3  2         dc1  <default>

訪問http://192.168.28.128:8500能夠訪問client的UI界面windows

圖片描述
看上面,「dcl」數據中心(consul能多數據中心,官方推薦通常3-5臺性能佳)安全

「Services」服務列表(默認有consul)
「Ndes」節點列表
「Key / Value」分佈式KV
「ACL」Consul用來控制訪問API與數據

配置consul的TLS、ACl和Gossip Encryption

consul有三方面的安全保護機制服務器

  • Gossip Encryption:Consul使用Gossip協議來管理集羣中的成員關係,以及把消息廣播到集羣中,經過UDP完成
  • TLS:使用https加密consul的API、GRPC
  • ACl:控制Services、Nodes、KV的讀寫權限

先配置最簡單的Gossip Encryption

先生成Encryptionapp

[root@coen docker_app]# docker exec -t consul_1 consul keygen
RAo6b8QwxOTDd8Z0b4/Hiw==

「RAo6b8QwxOTDd8Z0b4/Hiw==」就是Encryption
在數據卷(/usr/local/docker_app/consul/consul_1/config/)下建立encrypt.json,寫入Encryption

[root@coen docker_app]# cd /usr/local/docker_app/consul/consul_1/config/

[root@coen config]# echo '{"encrypt": "gf/aeGk4Ok7Lcpz7p6gCZg=="}' > encrypt.json

[root@coen config]# cp encrypt.json ../../consul_2/config/

[root@coen config]# cp encrypt.json ../../consul_3/config/

注意:每一個server都得寫入同樣的值,值不同server怎麼交流?client做用是轉發,不須要配置Gossip Encryption

配置consul的TLS

consul是基於CA驗證的,能夠選擇官網那種一鍵生成,可是證書有效期有點短,我選擇本身生成
須要安裝openssl,這就不演示了,我在windows10上生成

#生成根證書key
openssl genrsa -out ca.key 2048
#生成根證書密鑰
openssl req -new -x509 -days 7200 -key ca.key -subj "/CN=consul.com" -out ca.pem

#生成服務端私鑰
openssl genrsa -out server.key 2048
#生成客戶端私鑰
openssl genrsa -out client.key 2048

#生成的服務端的CSR
#CSR 主要做用是 CA 會利用 CSR 文件進行簽名使得攻擊者沒法假裝或篡改原有證書
openssl req -new -key server.key -subj "/CN=consul.com" -out server.csr
 #生成的客戶端的CSR
openssl req -new -key client.key -subj "/CN=consul.com" -out client.csr

#服務端自簽名的證書
openssl x509 -req -sha256 -CA ca.pem -CAkey ca.key -CAcreateserial -days 3650 -in server.csr -out server.pem
#客戶端自簽名的證書
openssl x509 -req -sha256 -CA ca.pem -CAkey ca.key -CAcreateserial -days 3650 -in client.csr -out client.pem

能夠看到CA有效期7200天!私鑰和證書有效期3650天!能夠設置小一點,按期更換,更安全;「CN」是隻容許某個IP或者域名訪問,我這設置成域名「consul.com」,靈活點
整理下
圖片描述
由於是docker搭建的,只能找到docker內部的目錄,因此剛剛在docker-compose配置的數據捲上場
把這個目錄整到/usr/local/docker_app/consul/consul_3/data/key下,server拷server的,client拷client的
而後開始配置TLS

server端

在數據卷(/usr/local/docker_app/consul/consul_1/config/)下建立tls.json,寫入:

{
     "verify_incoming":true,
     "verify_outgoing": true,
     "ca_file": "/consul/data/key/ca.pem",
     "cert_file": "/consul/data/key/server/server.pem",
     "key_file": "/consul/data/key/server/server.key"
   }
  • verify_incoming:全部傳入鏈接都使用TLS
  • verify_outgoing:此代理的全部傳出鏈接都使用TLS
  • ca_file:CA的PEM編碼的證書頒發機構的文件路徑(docker容器內目錄)
  • cert_file:PEM編碼證書的文件路徑
  • key_file:PEM編碼私鑰的文件路徑

官網說可使用auto_encrypt自動將證書CA發到客戶端,我試了,沒成功,懷疑是docker容器的緣由,不行就老老實實的配置

#複製到其餘server
[root@coen config]# cp tls.json ../../consul_2/config/
[root@coen config]# cp tls.json ../../consul_3/config/
client端

在數據卷(/usr/local/docker_app/consul/consul_4/config/)下建立tls.json,寫入:

{
  "verify_incoming": false,
  "verify_incoming_rpc": true,
  "ports": {
    "http": -1,
    "https": 8500
  }, 
  "ca_file": "/consul/data/key/ca.pem",
  "cert_file": "/consul/data/key/client/client.pem",
  "key_file": "/consul/data/key/client/client.key"
}

verify_incoming配置成false,爲啥?官網說,verify_incoming爲true的話,在client UI頁面要提供有效證書,給不了,就訪問不了了,因此爲false;verify_incoming_rpc爲true,UI能不效驗TLS提供服務,但RPC仍是驗證的,https端口8500
如今搭建好了,咱們來試一試,先用http方式請求下數據

#先重啓下consul集羣
[root@coen docker_app]# docker-compose  down
[root@coen docker_app]# docker-compose  up -d
#http請求下
[root@coen docker_app]# curl http://127.0.0.1:8500/v1/internal/ui/services
Client sent an HTTP request to an HTTPS server.

報錯,說客戶端發送的是http請求https服務,已經成功!如今用https請求下UI頁面

[root@coen docker_app]# curl https://localhost:8500/ui/ -k -I
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Length: 6610
Content-Type: text/html; charset=utf-8
Last-Modified: Wed, 31 Jul 2019 01:42:30 GMT
Date: Wed, 31 Jul 2019 01:49:03 GMT

成功!能夠在遊覽器https://192.168.28.128:8500 來訪問Ul,遊覽器信任CA證書就行,「192.168.28.128」是我虛擬機內網地址,寫大家本身的
圖片描述

配置ACL

server端

在數據卷(/usr/local/docker_app/consul/consul_1/config/)下建立acl.json,寫入:

{
 "acl":{
   "enabled": true,
   "default_policy": "deny",
   "enable_token_persistence":true,
   "tokens":{
    "master":"saFKyW4CGQP+kv79dWYX6I/LK3iuHrVyuOfS+mxBNyg="
    }
  },
  "datacenter":"dc1",
  "primary_datacenter": "dc1"
}
  • acl-enabled:開啓acl
  • acl-default_policy:把本身設置成白名單
  • acl-enable_token_persistence:使用API設置將被保存到磁盤,而且當代理從新啓動從新加載
  • tokens-master:令牌密鑰ID來引導ACL系統,(能夠自定義,除了「master」還有不少種,能夠在UI界面設置)
  • datacenter:數據中心,默認「dc1」
  • primary_datacenter:權威性的數據中心,提供它才能啓用ACL,和tokens-master配合使用
#複製到其餘server
[root@coen config]# cp acl.json ../../consul_2/config/
[root@coen config]# cp acl.json ../../consul_3/config/
client端

在數據卷(/usr/local/docker_app/consul/consul_4/config/)下建立tls.json,寫入:

{
 "acl":{
   "enabled": true,
   "default_policy": "deny",
   "enable_token_persistence":false,
   "tokens":{
    "agent":"saFKyW4CGQP+kv79dWYX6I/LK3iuHrVyuOfS+mxBNyg="
    }
  },
  "datacenter":"dc1",
  "primary_datacenter": "dc1"
}

client端這裏要設置tokens-agent,agen做用於客戶端和服務器執行內部操做,我這爲了圖省事直接用sever的master了
線上不能這樣,「master」是最高權限,正常流程先配置server的「master」,而後去UI生成權限低的「agent」,配置client端,而後重啓client端,不重啓server端,數據所有存儲在server端,重啓就沒了
重啓consul集羣,訪問UI,到ACL那
圖片描述
輸入sever端配置的「token-agent」

圖片描述

能夠看到這樣的列表,初始有2個ACL,能夠設置其餘的,consul把ACL劃分紅「service_prefix」,「
key_prefix」,「node_prefix」三種"Policy"(策略),每一個都有讀寫權限,配合「role」(角色)能夠造成很是細的數據權限控制,查看官網瞭解
https://www.consul.io/docs/ac...

https://learn.hashicorp.com/c...至此,consul集羣搭完,這裏只是演示一個數據中心,consul是數據中心,要改多數據中心要改一些配置,不要照搬硬套

相關文章
相關標籤/搜索