AnsibleでCheck Pointを操作する(2.9.0版) ②ポリシー設定変更編
前回に続き、Ansible2.9.0でリリースされたCheck Pointモジュールを使って、ポリシー設定変更を行っていきます。
設定変更内容
下図の、④User PCからL3SW(hqdist1A)へのSSH version2、ICMPアクセス許可設定を行ってみます。
Inventoryファイル
以下の通り作成しました。
- inventory_cp_vm
[checkpoint] smart1 ansible_host=192.168.100.70 [checkpoint:vars] ansible_network_os=checkpoint ansible_user=admin ansible_password=<管理サーバのパスワード> ansible_httpapi_use_ssl=yes ansible_httpapi_validate_certs=no
Playbook① ホストオブジェクトの作成
User_PCとhqdist1Aのホストオブジェクトを作成します。モジュールは「cp_mgmt_host」を使用します。設定後、モジュール「cp_mgmt_host_facts」で内容を確認します。
その後、モジュール「cp_mgmt_publish」でポリシーの公開、モジュール「cp_mgmt_install_policy」でポリシーのインストールを行います。 この時、インストール対象機器と内容(Access ControlとTheat Prevention)も指定可能です。
簡単のため、変数はすべてPlaybook内に記載していますが、可用性を考慮するとInventoryファイルや変数定義ファイルに記載すべきかと思います。
- playbook_cp_host_add.yml
--- - hosts: checkpoint gather_facts: no connection: httpapi tasks: - name: Create host object1 cp_mgmt_host: name: User_PC # ホストオブジェクト名1 ip_address: 10.1.1.100 - name: Get host object facts1 cp_mgmt_host_facts: name: User_PC register: result_host1 - name: debug1 debug: msg: "{{ result_host1 }}" - name: Create host object2 cp_mgmt_host: name: hqdist1A # ホストオブジェクト名2 ip_address: 192.168.100.24 - name: Get host object facts2 cp_mgmt_host_facts: name: hqdist1A register: result_host2 - name: debug2 debug: msg: "{{ result_host2 }}" - name: Publish policy cp_mgmt_publish: - name: Install policy cp_mgmt_install_policy: access: true threat_prevention: true policy_package: standard targets: - gw-2fd599
実行結果① ホストオブジェクトの作成
2つとも問題なく作成されました。
$ ansible-playbook -i inventory_cp_vm playbook_cp_host_add.yml PLAY [checkpoint] *************************************************************************************************************************** TASK [Create host object1] ****************************************************************************************************************** changed: [smart1] TASK [Get host object facts1] *************************************************************************************************************** ok: [smart1] TASK [debug1] ******************************************************************************************************************************* ok: [smart1] => { "msg": { "ansible_facts": { "host": { "color": "black", "comments": "", "domain": { "domain-type": "domain", "name": "SMC User", "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde" }, "groups": [], "icon": "Objects/host", "interfaces": [], "ipv4-address": "10.1.1.100", "meta-info": { "creation-time": { "iso-8601": "2019-11-10T15:31+0900", "posix": 1573367516326 }, "creator": "admin", "last-modifier": "admin", "last-modify-time": { "iso-8601": "2019-11-10T15:31+0900", "posix": 1573367516326 }, "lock": "locked by current session", "validation-state": "ok" }, "name": "User_PC", "nat-settings": { "auto-rule": false }, "read-only": false, "tags": [], "type": "host", "uid": "9c5afc3c-aa27-4714-871f-ea6b012b8ec4" } }, "changed": false, "failed": false } } TASK [Create host object2] ****************************************************************************************************************** changed: [smart1] TASK [Get host object facts2] *************************************************************************************************************** ok: [smart1] TASK [debug2] ******************************************************************************************************************************* ok: [smart1] => { "msg": { "ansible_facts": { "host": { "color": "black", "comments": "", "domain": { "domain-type": "domain", "name": "SMC User", "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde" }, "groups": [], "icon": "Objects/host", "interfaces": [], "ipv4-address": "192.168.100.24", "meta-info": { "creation-time": { "iso-8601": "2019-11-10T15:32+0900", "posix": 1573367524244 }, "creator": "admin", "last-modifier": "admin", "last-modify-time": { "iso-8601": "2019-11-10T15:32+0900", "posix": 1573367524244 }, "lock": "locked by current session", "validation-state": "ok" }, "name": "hqdist1A", "nat-settings": { "auto-rule": false }, "read-only": false, "tags": [], "type": "host", "uid": "77c34958-751e-425f-9e57-d78a5407c635" } }, "changed": false, "failed": false } } TASK [Publish policy] *********************************************************************************************************************** changed: [smart1] TASK [Install policy] *********************************************************************************************************************** changed: [smart1] PLAY RECAP ********************************************************************************************************************************** smart1 : ok=8 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Smart Console画面右のObjects barにも、2つのオブジェクトが表示されている事が分かります。
Playbook② ポリシーの作成
User_PCからhqdist1A向けのSSH version2およびICMP通信を許可する設定を行います。モジュールは「cp_mgmt_access_rule」を使用します。アクセスルール名は「Switch_access」とし、一番上にルールを挿入します。今回はオプション「position」で「1(文字列)」を指定していますが、「top」でも同じ結果になりました。またtrackオプションで、通信のログ取得を行うようにしています。
設定後、モジュール「cp_mgmt_access_rule_facts」で内容を確認しています。その後、先ほどと同様、ポリシーの公開とインストールを行っています。
- playbook_cp_policy_add.yml
--- - hosts: checkpoint gather_facts: no connection: httpapi tasks: - name: Create access rule cp_mgmt_access_rule: layer: Network name: Switch_access # アクセスルール名 position: "1" # ルールの挿入位置 source: User_PC # オブジェクト名 or any destination: hqdist1A # オブジェクト名 or any service: - ssh_version_2 - echo-request action: accept # acceptで許可、dropで拒否 track: type: Log - name: Get access rule facts cp_mgmt_access_rule_facts: layer: Network name: Switch_access # アクセスルール名 register: result_access_rule - name: debug debug: msg: "{{ result_access_rule }}" - name: Publish policy cp_mgmt_publish: - name: Install policy cp_mgmt_install_policy: access: true threat_prevention: true policy_package: standard targets: - gw-2fd599
実行結果② ポリシーの作成
こちらも問題なく作成されました。
$ ansible-playbook -i inventory_cp_vm playbook_cp_policy_add.yml PLAY [checkpoint] *************************************************************************************************************************** TASK [Create access rule] ******************************************************************************************************************* changed: [smart1] TASK [Get access rule facts] **************************************************************************************************************** ok: [smart1] TASK [debug] ******************************************************************************************************************************** ok: [smart1] => { "msg": { "ansible_facts": { "access-rule": { "action": { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "a0bbbc99-adef-4ef8-bb6d-defdefdefdef" }, "name": "Accept", "type": "RulebaseAction", "uid": "6c488338-8eec-4103-ad21-cd461ac2c472" }, "action-settings": { "enable-identity-captive-portal": false }, "comments": "", "content": [ { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "a0bbbc99-adef-4ef8-bb6d-defdefdefdef" }, "name": "Any", "type": "CpmiAnyObject", "uid": "97aeb369-9aea-11d5-bd16-0090272ccb30" } ], "content-direction": "any", "content-negate": false, "custom-fields": { "field-1": "", "field-2": "", "field-3": "" }, "destination": [ { "domain": { "domain-type": "domain", "name": "SMC User", "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde" }, "ipv4-address": "192.168.100.24", "name": "hqdist1A", "type": "host", "uid": "77c34958-751e-425f-9e57-d78a5407c635" } ], "destination-negate": false, "domain": { "domain-type": "domain", "name": "SMC User", "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde" }, "enabled": true, "install-on": [ { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "a0bbbc99-adef-4ef8-bb6d-defdefdefdef" }, "name": "Policy Targets", "type": "Global", "uid": "6c488338-8eec-4103-ad21-cd461ac2c476" } ], "layer": "8a5e96fb-c793-457f-b78f-c667074223a5", "meta-info": { "creation-time": { "iso-8601": "2019-11-10T15:48+0900", "posix": 1573368497300 }, "creator": "admin", "last-modifier": "admin", "last-modify-time": { "iso-8601": "2019-11-10T15:48+0900", "posix": 1573368498132 }, "lock": "locked by current session", "validation-state": "ok" }, "name": "Switch_access", "service": [ { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "a0bbbc99-adef-4ef8-bb6d-defdefdefdef" }, "name": "ssh_version_2", "port": "22", "type": "service-tcp", "uid": "cd082d9a-44a6-4cef-a17d-5541029adfb3" }, { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "a0bbbc99-adef-4ef8-bb6d-defdefdefdef" }, "name": "echo-request", "type": "service-icmp", "uid": "97aeb40a-9aea-11d5-bd16-0090272ccb30" } ], "service-negate": false, "source": [ { "domain": { "domain-type": "domain", "name": "SMC User", "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde" }, "ipv4-address": "10.1.1.100", "name": "User_PC", "type": "host", "uid": "9c5afc3c-aa27-4714-871f-ea6b012b8ec4" } ], "source-negate": false, "time": [ { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "a0bbbc99-adef-4ef8-bb6d-defdefdefdef" }, "name": "Any", "type": "CpmiAnyObject", "uid": "97aeb369-9aea-11d5-bd16-0090272ccb30" } ], "track": { "accounting": false, "alert": "none", "per-connection": true, "per-session": false, "type": { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "a0bbbc99-adef-4ef8-bb6d-defdefdefdef" }, "name": "Log", "type": "Track", "uid": "598ead32-aa42-4615-90ed-f51a5928d41d" } }, "type": "access-rule", "uid": "7ef33013-15ba-4fa6-94c5-08c4a17bc890", "vpn": [ { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "a0bbbc99-adef-4ef8-bb6d-defdefdefdef" }, "name": "Any", "type": "CpmiAnyObject", "uid": "97aeb369-9aea-11d5-bd16-0090272ccb30" } ] } }, "changed": false, "failed": false } } TASK [Publish policy] *********************************************************************************************************************** changed: [smart1] TASK [Install policy] *********************************************************************************************************************** changed: [smart1] PLAY RECAP ********************************************************************************************************************************** smart1 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Smart Console画面でも、作成したポリシーが一番上に表示されている事が分かります。
ちなみに、同じPlaybookをもう1回実行すると、エラーメッセージが表示されFailとなってしまいます。(ホストオブジェクトの場合も同じ。)設定済みの場合、「ok=1、changed=0」で次のタスクに進んでくれることを期待していたのですが、ここは改善の余地ありかもしれません。
$ ansible-playbook -i inventory_cp_vm playbook_cp_policy_add.yml PLAY [checkpoint] *************************************************************************************************************************** TASK [Create access rule] ******************************************************************************************************************* fatal: [smart1]: FAILED! => {"changed": false, "msg": {"code": "generic_internal_error", "message": "Internal error. For more info search for incident [f50b84fa-f190-41bf-88f6-1b31bb0f5f52] in log file"}} PLAY RECAP ********************************************************************************************************************************** smart1 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
Playbook③ ポリシーの削除
作成したポリシー「Switch_access」を削除します。以下のURLのExamplesを見る限り、モジュール「cp_mgmt_access_rule」のオプション「layer」と「name」で削除したいものを指定し、「state」を「absent」とすれば削除できるはずですが、なぜかオプション「destination」に適当な文字列「dummy」を入れないと削除できませんでした。 docs.ansible.com
- playbook_cp_policy_del.yml
--- - hosts: checkpoint gather_facts: no connection: httpapi tasks: - name: Delete access rule cp_mgmt_access_rule: layer: Network name: Switch_access # アクセスルール名 destination: dummy # オブジェクト名 or any state: absent - name: Publish cp_mgmt_publish: - name: Install policy cp_mgmt_install_policy: access: true threat_prevention: true policy_package: standard targets: - gw-2fd599
実行結果③ ポリシーの削除
$ ansible-playbook -i inventory_cp_vm playbook_cp_policy_del.yml PLAY [checkpoint] *************************************************************************************************************************** TASK [Delete access rule] ******************************************************************************************************************* changed: [smart1] TASK [Publish] ****************************************************************************************************************************** changed: [smart1] TASK [Install policy] *********************************************************************************************************************** changed: [smart1] PLAY RECAP ********************************************************************************************************************************** smart1 : ok=3 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Playbook④ ホストオブジェクトの削除
最後に、作成したホストオブジェクト「User_PC」と「hqdist1A」を削除します。以下のURLのExamplesを見る限り、モジュール「cp_mgmt_host」のオプション「name」で削除したいものを指定し、「state」を「absent」とすれば削除できるはずですが、こちらもなぜかオプション「ip_address」に適当な文字列「dummy」を入れないと削除できませんでした。 docs.ansible.com
- playbook_cp_host_del.yml
--- - hosts: checkpoint gather_facts: no connection: httpapi tasks: - name: Delete host object1 cp_mgmt_host: name: User_PC # ホストオブジェクト名 ip_address: dummy state: absent - name: Delete host object2 cp_mgmt_host: name: hqdist1A # ホストオブジェクト名 ip_address: dummy state: absent - name: Publish cp_mgmt_publish: - name: Install policy cp_mgmt_install_policy: access: true threat_prevention: true policy_package: standard targets: - gw-2fd599
実行結果④ ホストオブジェクトの削除
$ ansible-playbook -i inventory_cp_vm playbook_cp_host_del.yml PLAY [checkpoint] *************************************************************************************************************************** TASK [Delete host object1] ****************************************************************************************************************** changed: [smart1] TASK [Delete host object2] ****************************************************************************************************************** changed: [smart1] TASK [Publish] ****************************************************************************************************************************** changed: [smart1] TASK [Install policy] *********************************************************************************************************************** changed: [smart1] PLAY RECAP ********************************************************************************************************************************** smart1 : ok=4 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
最後に
今回試した限りでは、Playbookを2回以上実行した場合や、削除時の動作に怪しい点がありました。コードを読んでみて、もし原因が分かったらアップデートしたいと思います。また、今後他のモジュールも試してみたいと思います。