iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
0
DevOps

Hashicorp 0 到 0.003系列 第 5

Day 5. Consul ACL

  • 分享至 

  • twitterImage
  •  

在前幾天的文章裡,透過瀏覽器可以直接看到Consul的內容等等,安全上有很大的問題,今天要來啟動ACL來限制管理相關資訊的存取。

Access Control Lists

Consul 使用ACL來管理保護Web UI, HTTP API, CLI, service communications 與Consul agent .communications. ACL組成最小單位是rule, rule再集合成ACL policy, 在create token時,可以賦予該token要擁有那些policy.
從下圖來看會比較清楚明瞭。

圖片來源: https://learn.hashicorp.com/tutorials/consul/access-control-setup?in=consul/day-0

ACL Rules

<resource> "<name>" {
  policy = "<policy disposition>"
}

resource: 在Consul有很多種,如: 提供K/V的 key,key_prefix; 提供service的 service, service_prefix等等。
name: resource name, 如果你的resource是service, 這邊就是service name。
policy: Policy 裡有幾個control level, 分別是 read, write, list deny, 需要多個使用逗號分開”,” ,
優先順序是 deny > write > read >list

以service為範例說明:

service_prefix "web" {
  policy = "list"
}
service "web-api" {
  policy = "list,read"
}

假設我們有數個service名稱為web, web-front, web-back, web-api.
第一個rule使用prefix前綴表示 service name開頭為web的都有權限可以list.
第二個rule使用完全匹配規則,service name要完全符合”web-api”才有權限可以list,read.

啟用ACL

  1. 在conf資料夾下新增acl.hcl, 內容如下。
# acl.hcl

acl = {
  enabled = true
  default_policy = "deny"
  enable_token_persistence = true
}

enable: 啟用ACL
default_policy: 設定default值為全部拒絕。
enable_token_persistence: 將token的資料持久化於disk上。

  1. 重啟Consul, 重啟後再打開Web UI, 會發現全部的項目都需要登入才能查看。

啟用第一個token

登入需要輸入token, 那我們來創建一個。
如同大多數的系統,初始化後一定會有一個最高的帳號權限,Consul也是相同,現在我們來初始化取得最高權限的token.

$ consul acl bootstrap
AccessorID:       b7938c8c-e397-fd02-b8d9-9c4c49e9f87f
SecretID:         72ee0d8a-39bd-d412-854a-84c7b66a5d3f
Description:      Bootstrap Token (Global Management)
Local:            false
Create Time:      2020-09-05 01:57:04.794102805 +0000 UTC
Policies:
   00000000-0000-0000-0000-000000000001 - global-management

AccessorID: 這一組token的一個編號,之後如果忘記了token可以透過AccessorID來找回。
SecretID: 即產生的token.
Create Time: 可以看到這裡只有Create Time, 沒有Expiration Time, 所以不會過期。
Policies: 可以看到Policies的內容為global-management, 是不受任何ACL限制的,使用管理上須注意。

現在可以透過這組SecretID來登入Web UI了。

手動設定Policy與Token

剛剛創建的bootstrap token除了可以查看整體相關資源,也可以看到在Key, ACL等功能裡可以create, 權限太高了,而且以上的教學都沒有包含設定Policy, 接下來會完整的說明從設定Policy到創建Token.

以建立Consul UI token為例:

  1. 在conf的資料夾下新增檔案consul-ui.hcl, 只讓service, key, node可以讀,其他的不允許。
# consul-ui.hcl
service_prefix "" {
  policy = "read"
}
key_prefix "" {
  policy = "read"
}
node_prefix "" {
  policy = "read"
}
  1. Create policy
$ consul acl policy create -name "consul-ui" -description="Consul UI read only"  -rules @consul-ui.hcl
ID:           7649b60e-af85-5365-7513-c6cae981a828
Name:         consul-ui
Description:  Consul UI read only
Datacenters:
Rules:
service_prefix "" {
  policy = "read"
}
key_prefix "" {
  policy = "read"
}
node_prefix "" {
  policy = "read"
}

-name: 給定policy名稱
-description: 加入描述說明
-rules: import policy rules.
ID: 為policy ID, 之後要創建token可以使用policy ID 或是 policy name.
Datacenters: 目前只有一座Consul server, 所以沒有指定datacenter.

  1. 有了policy後,創建token並給予該policy的權限
$ consul acl token create -description "Token for Consul UI" -policy-name consul-ui -expires-ttl 3h
AccessorID:       80684e6d-022e-848b-218e-6c111e8d5907
SecretID:         25619c34-f703-390d-08b0-f3a55a7682df
Description:      Token for Consul UI
Local:            false
Create Time:      2020-09-05 02:38:24.745334397 +0000 UTC
Expiration Time:  2020-09-05 05:38:24.745334397 +0000 UTC
Policies:
   7649b60e-af85-5365-7513-c6cae981a828 - consul-ui

-name: 給定要賦予policy的名稱可以多個。
-description: 加入描述說明。
-expires-ttl: 設定TTL,若沒有則不會有Expiration Time.
Expiration Time: token 到期的時間。
Policies: 這組token擁有的policy name為"consul-ui", policy id 為"7649b60e-af85-5365-7513-c6cae981a828", 可以對照我們剛剛匯入後,產生的policy id是相同的。

  1. 接下來可以拿這組token到web ui去驗證是否只有service,key,node可以瀏覽了呢?

上一篇
Day 4. Consul server 參數設定與啟動
下一篇
Day 6. Consul client 參數設定與啟動
系列文
Hashicorp 0 到 0.00330
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言