前回は『 OSS編~オーケストレーションツール Consul 06 WEB UI編~ 』と題して、オーケストレーションのConsulでWEB UIを試してみました。
今回は『OSS編~オーケストレーションツール Consul 07 ACLs編~』と題して、オーケストレーションのConsulでACLsを試してみたいと思います。
ACLsとは
Access Control List (ACL) systemはConsulでデータ及びAPIへのアクセス制御機能です。
ConsulのACLsはトークンを利用したCapability-based system でAWSのIAMと類似しています。
試してみる
1.AClsで起動
ConsulのコンフィグでACLsの項目を指定して起動してみます。
項目は以下になります。
・acl_datacenter
・acldefaultpolicy
・acldownpolicy
・aclmastertoken
・acl_token
・acl_ttl
コンフィグファイルを準備します。
1$ sudo mkdir /etc/consul.d2$ sudo vim /etc/consul.d/consul.json3{4 "acl_datacenter": "dc1",5 "acl_default_policy": "allow",6 "acl_down_policy": "extend-cache",7 "acl_master_token": "master_token_test",8 "acl_token": "anonymous",9 "acl_ttl": "30s"10}コンフィグを指定して起動します。
1$ consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=agent-one -config-dir /etc/consul.d2==> WARNING: BootstrapExpect Mode is specified as 1; this is the same as Bootstrap mode.3==> WARNING: Bootstrap mode enabled! Do not enable unless necessary4==> WARNING: It is highly recommended to set GOMAXPROCS higher than 15==> Starting Consul agent...6==> Starting Consul agent RPC...7==> Consul agent running!8 Node name: 'agent-one'9 Datacenter: 'dc1'10 Server: true (bootstrap: true)11 Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)12 Cluster Addr: 10.0.1.86 (LAN: 8301, WAN: 8302)13 Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false14 Atlas: <disabled>ACLのAPIから取得してみます。
「master_token」を使用すると取得出来る事がわかります。
1$ curl http://localhost:8500/v1/acl/list2Permission denied3$ curl http://localhost:8500/v1/acl/list?token=anonymous4Permission denied5$ curl http://localhost:8500/v1/acl/list?token=master_token_dev6ACL not found7$ curl http://localhost:8500/v1/acl/list?token=master_token_test89[{"CreateIndex":3,"ModifyIndex":3,"ID":"anonymous","Name":"Anonymous Token","Type":"client","Rules":""},{"CreateIndex":4,"ModifyIndex":4,"ID":"master_token_test","Name":"Master Token","Type":"management","Rules":""}]2.ACLのRuleを登録してみる
ACLを登録して挙動を確認してみます。
ACLのRuleのポリシーのフォーマットはHashiCorp Configuration Language (HCL)かjsonを利用して記述します。
1$ vim rules.json2{3 "Name": "test_token",4 "Type": "client",5 "Rules": "6 key \"\" {7 policy = \"read\"8 }9 key \"foo/\" {10 policy = \"write\"11 }12 key \"foo/private/\" {13 policy = \"deny\"14 }1516 service \"\" {17 policy = \"write\"18 }19 service \"secure\" {20 policy = \"read\"21 }22 "23}HTTP APIから登録します。
1$ curl -X PUT http://localhost:8500/v1/acl/create?token=master_token_test -d @rules.json2{"ID":"2c5c415a-53ca-9003-2dd7-a908e9958c25"}ACL APIから確認してみます。
1$ curl http://localhost:8500/v1/acl/list?token=master_token_test2[{"CreateIndex":8,"ModifyIndex":8,"ID":"2c5c415a-53ca-9003-2dd7-a908e9958c25","Name":"test_token","Type":"client","Rules":" key \"\" { policy = \"read\" } key \"foo/\" { policy = \"write\" } key \"foo/private/\" { policy = \"deny\" } service \"\" { policy = \"write\" } service \"secure\" { policy = \"read\" } "},{"CreateIndex":3,"ModifyIndex":3,"ID":"anonymous","Name":"Anonymous Token","Type":"client","Rules":""},{"CreateIndex":4,"ModifyIndex":4,"ID":"master_token_test","Name":"Master Token","Type":"management","Rules":""}]3.作成したトークンで確認
作成したトークンで確認してみます。
read権限の「key ””」でデータを登録してみるとPermissionのエラーが出力されます。
1$ curl -X PUT -d hello http://localhost:8500/v1/kv/value?token=2c5c415a-53ca-9003-2dd7-a908e9958c252Permission denied次にwrite権限の「key “foo/”」でデータを登録してみるとtrueとなっております。
1$ curl -X PUT -d hello http://localhost:8500/v1/kv/foo/value?token=2c5c415a-53ca-9003-2dd7-a908e9958c252true最後にdenyの「key “foo/private/”」 でデータを登録してみるとPermissionのエラーが出力されます。
1$ curl -X PUT -d hello http://localhost:8500/v1/kv/foo/private/value?token=2c5c415a-53ca-9003-2dd7-a908e9958c252Permission denied続いてデータの取得をしてみます。
確認の為にマスタートークンでデータを登録しておきます。
1$ curl -X PUT -d hello http://localhost:8500/v1/kv/foo/private/value?token=master_token_test2true3$ curl -X PUT -d hello http://localhost:8500/v1/kv/e?token=master_token_test4true取得してみます。
read権限の「key ””」ではデータを取得出来ます。
1$ curl http://localhost:8500/v1/kv/value?token=2c5c415a-53ca-9003-2dd7-a908e9958c252[{"CreateIndex":20,"ModifyIndex":20,"LockIndex":0,"Key":"value","Flags":0,"Value":"aGVsbG8="}]次にwrite権限の「key “foo/”」でもデータを取得出来ます。
1$ curl http://localhost:8500/v1/kv/foo/value?token=2c5c415a-53ca-9003-2dd7-a908e9958c252[{"CreateIndex":10,"ModifyIndex":10,"LockIndex":0,"Key":"foo/value","Flags":0,"Value":"aGVsbG8="}]最後にdenyの「key “foo/private/”」 でデータを取得してみると取得出来ないのがわかります。
1$ curl http://localhost:8500/v1/kv/foo/private/value?token=2c5c415a-53ca-9003-2dd7-a908e9958c25いかがでしたでしょうか?
次回もお楽しみに!!!