OSS編~オーケストレーションツール Consul 07 ACLs編~

前回は『 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

いかがでしたでしょうか?

次回もお楽しみに!!!

この記事を書いた人

aws-recipe-user