前回は『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
・acl_default_policy
・acl_down_policy
・acl_master_token
・acl_token
・acl_ttl
コンフィグファイルを準備します。
1 2 3 4 5 6 7 8 9 10 |
$ sudo mkdir /etc/consul.d $ sudo vim /etc/consul.d/consul.json { "acl_datacenter": "dc1", "acl_default_policy": "allow", "acl_down_policy": "extend-cache", "acl_master_token": "master_token_test", "acl_token": "anonymous", "acl_ttl": "30s" } |
コンフィグを指定して起動します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=agent-one -config-dir /etc/consul.d ==> WARNING: BootstrapExpect Mode is specified as 1; this is the same as Bootstrap mode. ==> WARNING: Bootstrap mode enabled! Do not enable unless necessary ==> WARNING: It is highly recommended to set GOMAXPROCS higher than 1 ==> Starting Consul agent... ==> Starting Consul agent RPC... ==> Consul agent running! Node name: 'agent-one' Datacenter: 'dc1' Server: true (bootstrap: true) Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400) Cluster Addr: 10.0.1.86 (LAN: 8301, WAN: 8302) Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false Atlas: <disabled> |
ACLのAPIから取得してみます。
「master_token」を使用すると取得出来る事がわかります。
1 2 3 4 5 6 7 8 |
$ curl http://localhost:8500/v1/acl/list Permission denied $ curl http://localhost:8500/v1/acl/list?token=anonymous Permission denied $ curl http://localhost:8500/v1/acl/list?token=master_token_dev ACL not found $ curl http://localhost:8500/v1/acl/list?token=master_token_test [{"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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ vim rules.json { "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\" } " } |
HTTP APIから登録します。
1 2 |
$ curl -X PUT http://localhost:8500/v1/acl/create?token=master_token_test -d @rules.json {"ID":"2c5c415a-53ca-9003-2dd7-a908e9958c25"} |
ACL APIから確認してみます。
1 2 |
$ curl http://localhost:8500/v1/acl/list?token=master_token_test [{"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 2 |
$ curl -X PUT -d hello http://localhost:8500/v1/kv/value?token=2c5c415a-53ca-9003-2dd7-a908e9958c25 Permission denied |
次にwrite権限の「key “foo/”」でデータを登録してみるとtrueとなっております。
1 2 |
$ curl -X PUT -d hello http://localhost:8500/v1/kv/foo/value?token=2c5c415a-53ca-9003-2dd7-a908e9958c25 true |
最後にdenyの「key “foo/private/”」 でデータを登録してみるとPermissionのエラーが出力されます。
1 2 |
$ curl -X PUT -d hello http://localhost:8500/v1/kv/foo/private/value?token=2c5c415a-53ca-9003-2dd7-a908e9958c25 Permission denied |
続いてデータの取得をしてみます。
確認の為にマスタートークンでデータを登録しておきます。
1 2 3 4 |
$ curl -X PUT -d hello http://localhost:8500/v1/kv/foo/private/value?token=master_token_test true $ curl -X PUT -d hello http://localhost:8500/v1/kv/e?token=master_token_test true |
取得してみます。
read権限の「key ””」ではデータを取得出来ます。
1 2 |
$ curl http://localhost:8500/v1/kv/value?token=2c5c415a-53ca-9003-2dd7-a908e9958c25 [{"CreateIndex":20,"ModifyIndex":20,"LockIndex":0,"Key":"value","Flags":0,"Value":"aGVsbG8="}] |
次にwrite権限の「key “foo/”」でもデータを取得出来ます。
1 2 |
$ curl http://localhost:8500/v1/kv/foo/value?token=2c5c415a-53ca-9003-2dd7-a908e9958c25 [{"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 |
いかがでしたでしょうか?
次回もお楽しみに!!!