Consul ACL集羣配置說明以及ACL Token的用法

在上一篇文章裏面,咱們講了如何搭建帶有Acl控制的Consul集羣。
這一篇文章主要講述一下上一篇文章那一大串配置文件的含義。html

1.配置說明

1.1 勘誤

上一篇文章關於機器規劃方面,consul client agent的端口寫的有誤。這裏再貼一下正確的機器規劃。
在這裏插入圖片描述node

1.2 咱們先來看一下consul server agent的配置。

上一節中,提供了三個配置文件,consul-server1.json, consul-server2.json以及consul-server3.json。
其中consul-server1.json參數最多,這裏就以它來講明各個配置的含義:web

{
    "datacenter":"dc1",
    "primary_datacenter":"dc1",
    "bootstrap_expect":1,
    "start_join":[
        "10.211.55.25",
        "10.211.55.26"
    ],
    "retry_join":[
        "10.211.55.25",
        "10.211.55.26"
    ],
    "advertise_addr": "10.211.55.28",
    "bind_addr": "10.211.55.28",
    "server":true,
    "connect":{
        "enabled":true
    },
    "node_name":"consul-server1",
    "data_dir":"/opt/consul/data/",
    "enable_script_checks":false,
    "enable_local_script_checks":true,
    "log_file":"/opt/consul/log/",
    "log_level":"info",
    "log_rotate_bytes":100000000,
    "log_rotate_duration":"24h",
    "encrypt":"krCysDJnrQ8dtA7AbJav8g==",
    "acl":{
        "enabled":true,
        "default_policy":"deny",
        "enable_token_persistence":true,
        "tokens":{
            "master":"cd76a0f7-5535-40cc-8696-073462acc6c7",
        "agent":"deaa315d-98c5-b9f6-6519-4c8f6574a551"
        }
    }
}
  • datacenter 此標誌表示代理運行的數據中心。若是未提供,則默認爲「dc1」。 Consul擁有對多個數據中心的一流支持,但它依賴於正確的配置。同一數據中心中的節點應在同一個局域網內。
  • primary_datacenter: 這指定了對ACL信息具備權威性的數據中心。必須提供它才能啓用ACL。
  • bootstrap_expect: Consul將等待指定數量的服務器可用,而後纔會引導羣集。這容許自動選擇初始領導者。
  • start_join: 一個字符串數組,指定是其餘的consul server agent的地址。這裏這樣配置,會在啓動時,嘗試將consul-server2,consul-server3這兩個節點加進來,造成一個集羣。
  • retry_join: 容許start_join時失敗時,繼續從新鏈接。重試的時間間隔,能夠用retry_interval設置,默認是30s;重試的最大次數,能夠用retry_max設置,默認是0,也就是無限次重試。關於retry_interval和retry_max,這裏都是用的默認值。
  • bind_addr: 內部羣集通訊綁定的地址。這是羣集中全部其餘節點都應該能夠訪問的IP地址。默認狀況下,這是「0.0.0.0」,這意味着Consul將綁定到本地計算機上的全部地址,並將第一個可用的私有IPv4地址通告給羣集的其他部分。若是有多個私有IPv4地址可用,Consul將在啓動時退出並顯示錯誤。若是指定「[::]」,Consul將通告第一個可用的公共IPv6地址。若是有多個可用的公共IPv6地址,Consul將在啓動時退出並顯示錯誤。 Consul同時使用TCP和UDP,而且二者使用相同的端口。若是您有防火牆,請務必同時容許這兩種協議。
  • advertise_addr: 更改咱們向羣集中其餘節點通告的地址。默認狀況下,會使用-bind參數指定的地址.
  • server: 是不是server agent節點。
  • connect.enabled: 是否啓動Consul Connect,這裏是啓用的。
  • node_name:節點名稱。
  • data_dir: agent存儲狀態的目錄。
  • enable_script_checks: 是否在此代理上啓用執行腳本的健康檢查。有安全漏洞,默認值就是false,這裏單獨提示下。
  • enable_local_script_checks: 與enable_script_checks相似,但只有在本地配置文件中定義它們時才啓用它們。仍然不容許在HTTP API註冊中定義的腳本檢查。
  • log-file: 將全部Consul Agent日誌消息重定向到文件。這裏指定的是/opt/consul/log/目錄。
  • log_rotate_bytes:指定在須要輪換以前應寫入日誌的字節數。除非指定,不然能夠寫入日誌文件的字節數沒有限制
  • log_rotate_duration:指定在須要旋轉日誌以前應寫入日誌的最長持續時間。除非另有說明,不然日誌會天天輪換(24小時。單位能夠是"ns", "us" (or "µs"), "ms", "s", "m", "h", 好比設置值爲24h
  • encrypt:用於加密Consul Gossip 協議交換的數據。在啓動各個server以前,配置成同一個UUID值就行,或者你用命令行consul keygen 命令來生成也能夠。
  • acl.enabled: 是否啓用acl.
  • acl.default_policy: 「allow」或「deny」; 默認爲「allow」,但這將在將來的主要版本中更改。當沒有匹配規則時,默認策略控制令牌的行爲。在「allow」模式下,ACL是黑名單:容許任何未明確禁止的操做。在「deny」模式下,ACL是白名單:阻止任何未明確容許的操做.
  • acl.enable_token_persistence: 可能值爲true或者false。值爲true時,API使用的令牌集合將被保存到磁盤,而且當代理從新啓動時會從新加載。
  • acl.tokens.master: 具備全局管理的權限,也就是最大的權限。它容許操做員使用衆所周知的令牌密鑰ID來引導ACL系統。須要在全部的server agent上設置同一個值,能夠設置爲一個隨機的UUID。這個值權限最大,注意保管好。
  • acl.tokens.agent: 用於客戶端和服務器執行內部操做.好比catalog api的更新,反熵同步等。

1.3 再來講下consul-client1的相關配置。

我再貼一下配置信息。json

{
    "datacenter":"dc1",
    "primary_datacenter":"dc1",
    "advertise_addr": "10.211.55.27",
    "start_join":[
         "10.211.55.25",
        "10.211.55.26",
        "10.211.55.28"
    ],
    "retry_join":[
         "10.211.55.25",
        "10.211.55.26",
        "10.211.55.28"
    ],
    "bind_addr":"10.211.55.27",
    "node_name":"consul-client1",
    "client_addr":"0.0.0.0",
    "connect":{
        "enabled":true
    },
    "data_dir":"/opt/consul/data/",
    "log_file":"/opt/consul/log/",
    "log_level":"info",
    "log_rotate_bytes":100000000,
    "log_rotate_duration":"24h",
    "encrypt":"krCysDJnrQ8dtA7AbJav8g==",
    "ui":true,
    "enable_script_checks":false,
    "enable_local_script_checks":true,
    "disable_remote_exec":true,
    "ports":{
        "http":7110
    },
    "acl":{
        "enabled":true,
        "default_policy":"deny",
        "enable_token_persistence":true,
        "tokens":{
        "agent":"deaa315d-98c5-b9f6-6519-4c8f6574a551"
        }
    }
}

這裏,start_join, retry_join都是指定的server agent的地址。
另外尚未提過的配置就是client_addr, ui, ports.http .
下面依次說明:bootstrap

  • client_addr: Consul將綁定客戶端接口的地址,包括HTTP和DNS服務器
  • ui: 啓用內置Web UI服務器和對應所需的HTTP路由
  • ports.http: 更改默認的http端口。

2. ACL Token的用法

2.1 ACL Token 有什麼用呢?

能夠有人會說,你上面讓我又是搭建環境,又是看配置說明,我建好了一個這麼一個帶ACL控制的Consul集羣有什麼用呢?api

ACL 全稱 Access Control List,也就是訪問控制列表的意思,如今咱們生成了帶有ACL控制的集羣,就意味不是誰都能來向我註冊的,也不是誰都能像我獲取服務列表-- 也就是你想對Consul執行任何操做,你得對應的令牌,也就是ACL Token。數組

2.2 不帶Token行不行?

爲了模擬通常的Http請求,我這裏下載一個Postman, 是的這裏沒有用命令行curl。
咱們如今postman輸入
http://127.0.0.1:7110/v1/catalog/nodes
會發現一個節點都拿不到:瀏覽器

 without token
此時若是加上master token, 也就是訪問
http://127.0.0.1:7110/v1/catalog/nodes?token=cd76a0f7-5535-40cc-8696-073462acc6c7
會發現能夠拿到全部節點的數據(下圖只截取一部分)
with token安全

2.3 不帶token是不行,那能不能帶權限小點的token呢?

前面說過master token是權限最大的token,假如這樣給出去,各個部分都拿來用。若是兩個不一樣的部分註冊名稱同樣的服務該怎麼辦,取消註冊了其餘部門的服務又該怎麼辦。總之,權限能不能給小點,答案是能夠的。
首先說一下目標:
1.不一樣部門的服務必需要有本身的前綴,好比deptA表示部門A,好比deptB表示部門B
2.不一樣部門只能更改本身的服務。服務器

2.3.1 先給兩個部門各註冊一個服務

註冊服務deptA-pingbaidu1, 注意這裏選擇的PUT方法。

PUT http://127.0.0.1:7110/v1/agent/service/register?token=cd76a0f7-5535-40cc-8696-073462acc6c7
 {
    "ID": "deptA-pingbaidu1",
    "Name": "deptA-pingbaidu",
    "Tags": [
        "primary",
        "v1"
    ],
    "Address": "127.0.0.1",
    "Port": 8000,
    "Meta": {
        "my_version": "4.0"
    },
    "EnableTagOverride": false,
    "Check": {
        "DeregisterCriticalServiceAfter": "90m",
        "HTTP": "http://www.baidu.com/",
        "Interval": "10s"
    }
} 

在截個圖,當返回status爲200時,表示成功註冊
註冊成功
此時能夠在consul web ui中進行查看,打開consul-client1所在的機器,在瀏覽器中,輸入http://127.0.0.1:7110/ui/dc1/services,( 注意在此以前你須要先設置consul web ui的token,上一篇文章末尾已經說起),此時會看到
service-on-web-ui
相似地,在註冊個deptA-pingMe1的服務

PUT http://127.0.0.1:7110/v1/agent/service/register?token=cd76a0f7-5535-40cc-8696-073462acc6c7
{
    "ID": "deptB-pingMe1",
    "Name": "deptB-pingMe",
    "Tags": [
        "primary",
        "v1"
    ],
    "Address": "127.0.0.1",
    "Port": 7000,
    "Meta": {
        "my_version": "4.0"
    },
    "EnableTagOverride": false,
    "Check": {
        "DeregisterCriticalServiceAfter": "90m",
        "HTTP": "https://blog.csdn.net/yellowstar5",
        "Interval": "10s"
    }
} 

2.3.2. 生成兩個token,讓部門A,B各自管理本身的服務

首先咱們來生成部門A的policy, 意思度全部節點具備寫權限(寫權限包括讀),而且只能寫deptA開頭的服務。

2.3.2.1先生成部門A的token

node_prefix "" {
        policy = "write"
  }

service_prefix "deptA"{
        policy = "write"
  }

下面是具體的生成過程
1.新建policy並保存

在這裏插入圖片描述
2.生成token
在這裏插入圖片描述
在這裏插入圖片描述
3.查看token列表,並點擊deptA-policy那一項查看並複製token
在這裏插入圖片描述
在這裏插入圖片描述

2.3.2. 2.在生成部門B的token

只須要把policy稍做修改就能夠,其餘部門和部門A的相似,這裏就不貼圖了。

node_prefix "" {
        policy = "write"
  }

service_prefix "deptB"{
        policy = "write"
  }

2.3.用不一樣的token來獲取服務列表

最後咱們拿到部門A和部門B的token,以及master的token
我這裏deptA的token是:8764c083-0acb-e11e-433d-8d8803db9bd2
deptB的token是: 052f467f-9581-cc7c-a8a5-84d8df51dc9d
master token是: d76a0f7-5535-40cc-8696-073462acc6c7
下面用postman測試一下,看看不一樣token返回的服務列表

deptA-token
http://127.0.0.1:7110/v1/agent/services?token=8764c083-0acb-e11e-433d-8d8803db9bd2
在這裏插入圖片描述
deptB-token
http://127.0.0.1:7110/v1/agent/services?token=052f467f-9581-cc7c-a8a5-84d8df51dc9d
在這裏插入圖片描述
master-token
http://127.0.0.1:7110/v1/agent/services?token=cd76a0f7-5535-40cc-8696-073462acc6c7
在這裏插入圖片描述
能夠發現deptA-token只能看到部門A的服務,deptB-token只能看到部門B的服務,master-token能夠看到因此的。
另外取消註冊,註冊之類的驗證你們能夠本身試試,都與上面的方式差很少,只不過要使用不一樣的Http API
https://www.consul.io/api/age...,在這個地址你能夠看到consul 提供的關於服務相關的api。

參考:

https://www.consul.io/api/age...
https://www.consul.io/docs/ag...
文章以後會第一時間發於微信, 歡迎關注個人微信公衆號,你們一塊兒交流學習
在這裏插入圖片描述

相關文章
相關標籤/搜索