consul配置ACL

consul配置ACL

第0步,几点说明

  1. Consul和其他系统ACL的区别
  • 通常的ACL授权例如etcd使用用户名:密码对的方式来认证用户,用户名是可能是公开的,密码是保密的用户自己知道;但是consul没有使用用户名:密码对的方式,就使用一个token值;那么既然只有一个值,就必须注意保密,不能使用约定的名字字符串,例如root, tom, jerry等,因为别人很容易猜出来,现在consul使用的字符串时UUID,既唯一又随机,不能被猜出来。
  • consul的三类权限类型
    • read: 读
    • write: 读和写
    • deny: 不能访问,既不能读也不能写了。

第一步,激活ACL

consul的ACL激活需要在所有的consul节点上,办法是,创建一个json格式的配置文件:

$ cat consul-acl.json 
{
  "acl" : {
    "enabled" : true,
    "default_policy" : "deny",
    "down_policy" : "extend-cache",
    "tokens" :{
        "master": "245d0a09-7139-bbea-aadc-ff170a0562b1"
    }
  }
}

放置到consul agent通过参数-config-dir指定的目录下面,缺省目录是:/consul/config/
注意几点:

  1. 这个相同的文件需要部署到所有的consul节点上。
  2. 关于tokens.master值,这个就是Bootstrap Token
    2.1 Bootstrap Token相当于Unix系统中的root,具有所有的权限。
    2.2. 其名字可以是任意字符串,不一定是一个UUID值。(原因如前面说,使用UUID为了安全用户无法猜测。)
    2.3. tokens.master可以不需要配置,然后在clustor启动之后通过命令产生,如下:
$ consul acl bootstrap
AccessorID:   0274a9e3-1349-78d7-fc53-3dd6f7886626
SecretID:     245d0a09-7139-bbea-aadc-ff170a0562b1
Description:  Bootstrap Token (Global Management)
Local:        false
Create Time:  2019-01-15 06:21:17.335464249 +0000 UTC
Policies:
   00000000-0000-0000-0000-000000000001 - global-management

此时产生的bookstrap就是字符串SecretID: 245d0a09-7139-bbea-aadc-ff170a0562b1。
注意这个bootstrap token的安全不能外泄,不能丢失,后面的创建其他token都需要用到它。

第二步:token的三种类型

  1. management token: 具有root权限的token,前面介绍的master token就属于这类。也可以增加新的management token。
  2. client token: 针对客户端的token,ACL的权限管理主要是针对这类token;当创建client token时需要一个management toke。
  3. anonymous token : 这是系统内置的token。

第三步:创建一个management token

$ curl \
    -H "X-Consul-Token: secret" \
    -X PUT \
    -d '{"Name": "dc1", "Type": "management"}' \
    http://localhost:8500/v1/acl/create?token=245d0a09-7139-bbea-aadc-ff170a0562b1
{"ID":"7fa04e1d-1b75-81b0-52d3-e311ad3c28f7"}

参数token就是另一个management token,在这个例子中就是bootstrap token。这样7fa04e1d-1b75-81b0-52d3-e311ad3c28f7就是另外一个management token了,具有"root"的权限。

第四步:创建client token

client token才是真正需要对其授权的token。
创建一个client token需要两步,先创建client policy,然后才能创建client token。

4.1 创建client policy

$ cat client-policy.json 
{
  "Name": "client-read-policy",
  "Description": "Grants read access to all node information",
  "Rules": "node_prefix \"\" { policy = \"read\"}",
  "Datacenters": ["dc1"]
}

$ curl --request PUT --data @client-policy.json http://127.0.0.1:8500/v1/acl/policy?token=753cc134-36c5-e4ea-6abd-56f8b8b8aa7f
{
  "ID":"778192cf-5459-a6e0-99d6-74919ea61dfc",
  "Name":"client-read-policy",
  "Description":"Grants read access to all node information",
  "Rules":"key_prefix \"\" { policy = \"read\"}",
  "Datacenters":["dc1"],
  "Hash":"0lcW+0xrcZ6OxTwb3ND+7oA+FF8XhXj60J8KGFpEZI0=",
  "CreateIndex":105,
  "ModifyIndex":105
}

$ curl -X GET http://127.0.0.1:8500/v1/acl/policies?token=753cc134-36c5-e4ea-6abd-56f8b8b8aa7f
[
    {
        "CreateIndex": 4,
        "Datacenters": null,
        "Description": "Builtin Policy that grants unlimited access",
        "Hash": "swIQt6up+s0cV4kePfJ2aRdKCLaQyykF4Hl1Nfdeumk=",
        "ID": "00000000-0000-0000-0000-000000000001",
        "ModifyIndex": 4,
        "Name": "global-management"
    },
    {
        "CreateIndex": 105,
        "Datacenters": ["dc1" ],
        "Description": "Grants read access to all node information",
        "Hash": "0lcW+0xrcZ6OxTwb3ND+7oA+FF8XhXj60J8KGFpEZI0=",
        "ID": "778192cf-5459-a6e0-99d6-74919ea61dfc",
        "ModifyIndex": 105,
        "Name": "client-read-policy"
    }
]

注意这里client-policy.json里面Rules可以为node_prefix, service_prefix,和key_prefix;在我这个例子中只使用了key_prefix因为我们只需要KV访问,没有service discover功能。

4.2 创建client token

$ cat client-token.json 
{
   "Description": "client read token",
   "Policies": [
      {
         "Name": "client-read-policy"
      }
   ],
   "Local": false
}

$ curl --request PUT --data @client-token.json http://127.0.0.1:8500/v1/acl/token?token=753cc134-36c5-e4ea-6abd-56f8b8b8aa7f
{
    "AccessorID": "25be308f-43c0-11c8-e620-117e6b91629d",
    "CreateIndex": 115,
    "CreateTime": "2019-01-15T08:00:04.241925426Z",
    "Description": "client read token",
    "Hash": "AZ2/M3PRNDcTULjWcpC8eb6EPVoGUHnCKa0nQghKN0I=",
    "Local": false,
    "ModifyIndex": 115,
    "Policies": [
        {
            "ID": "778192cf-5459-a6e0-99d6-74919ea61dfc",
            "Name": "client-read-policy"
        }
    ],
    "SecretID": "23fe12e4-ac0e-00af-db43-887589f87823"
}

$ curl -X GET http://127.0.0.1:8500/v1/acl/tokens?token=753cc134-36c5-e4ea-6abd-56f8b8b8aa7f
[
    {
        "AccessorID": "25be308f-43c0-11c8-e620-117e6b91629d",
        "CreateIndex": 115,
        "CreateTime": "2019-01-15T08:00:04.241925426Z",
        "Description": "client read token",
        "Hash": "AZ2/M3PRNDcTULjWcpC8eb6EPVoGUHnCKa0nQghKN0I=",
        "Local": false,
        "ModifyIndex": 115,
        "Policies": [
            {
                "ID": "778192cf-5459-a6e0-99d6-74919ea61dfc",
                "Name": "client-read-policy"
            }
        ]
    },
    ...
]

4.3 上述两步可以合并成一步执行

不过这个API已经被consul标记位Legacy Tokens了。

$ cat client-write-policy.json
{                      
  "Name": "client-write-policy",
  "Description": "Grants write access to foo key information",
  "Type": "client",
  "Rules": "key \"foo/test\" { policy = \"write\" }"
}

$ curl --request PUT --data @client-write-policy.json \
  http://127.0.0.1:8500/v1/acl/create?token=753cc134-36c5-e4ea-6abd-56f8b8b8aa7f
{"ID":"1c7c1ca0-d5ee-9d02-f7f4-89dc8759f0c6"}

$ curl -H "X-Consul-Token: 1c7c1ca0-d5ee-9d02-f7f4-89dc8759f0c6" http://127.0.0.1:8500/v1/acl/token/self
{
    "AccessorID": "808d69bf-c4fe-0c9f-9a57-aecd85e7f24e",
    "CreateIndex": 36,
    "CreateTime": "0001-01-01T00:00:00Z",
    "Description": "client-write-policy",
    "Hash": "mpZmxlI5Zi6HeMFQR0A7U77ZD9IKPDr9Nc9Hrqxz/b8=",
    "Local": false,
    "ModifyIndex": 37,
    "Policies": null,
    "Rules": "key \"foo/test\" { policy = \"write\" }",
    "SecretID": "1c7c1ca0-d5ee-9d02-f7f4-89dc8759f0c6"
}

第五步, 客户端访问测试

验证,创建一个KV,然后使用client token访问KV:

$ curl --request PUT --data 'hello consul' http://127.0.0.1:8500/v1/kv/foo?token=753cc134-36c5-e4ea-6abd-56f8b8b8aa7f

$ curl --request GET http://127.0.0.1:8500/v1/kv/foo?token=23fe12e4-ac0e-00af-db43-887589f87823
[{"LockIndex":0,"Key":"foo","Flags":0,"Value":"aGVsbG8gY29uc3Vs","CreateIndex":14,"ModifyIndex":14}]

# suppose another token does not have priviledge
$ curl --request GET http://127.0.0.1:8500/v1/kv/foo?token=477ef15e-79b3-8481-b7db-ed7c750b3bea
rpc error making call: rpc error making call: Permission denied
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • [TOCM] Consul版本 v0.9.2 1. 配置 1.1 CLI配置 Consul Agent有各种各样的...
    Liberalman阅读 7,734评论 18 3
  • 由于文章太长,简书放不下,完整文档见Consul文档。 一、安装 Consul Consul 的安装很简单,安装 ...
    FlySheep_ly阅读 9,875评论 1 13
  • 上一篇提到,项目用的分布式服务发现与注册组件是consul,这篇文章主要来讲下consul组件在项目中的应用以及相...
    aoho阅读 11,088评论 1 13
  • 立冬的前一天。今年第一次感到寒冷的温度。 没有辜负这低温的气候,在第一天就起床困难了。坐在办公室里更昏昏欲睡。室内...
    很闪很贵阅读 144评论 0 0
  • 下午2点45分,在等热饮时看到的,这个点大部分人已经吃完午饭,所以他们才有时间。
    小和稻米阅读 311评论 0 0