AnsibleでCheck Pointを操作する
AnsibleからAPI経由で、Check Pointの情報取得や設定変更した時のメモです。
用意した環境
Check Point
AWS上のCloudGuard IaaS All-In-Oneを使いました。
バージョンは最新のR80.10を利用しています。 30日の無料トライアルがあり、この期間はソフトウェアの利用料はかかりません。 ※ただし、AWSのEC2(m4.xlarge)利用料はかかるのでご注意を。
All-In-Oneと書いてある通り、Firewall、IPS、Application Control、IPsec VPN、Antivirus、Anti-Bot、Data Loss Prevention等のセキュリティ機能に対応しています。 さらに、機器のステータス、ポリシー(ACL/NAT)設定変更、ログ閲覧・監視などをGUIで行える、管理サーバとしての機能も備えています。
複数拠点に導入する場合は、セキュリティ機能と管理サーバは個別に構築すべきですが、今回は簡易的に、1つの仮想マシン上で両機能を有効化しました。
Ansible
AnsibleのCheck Pointモジュールは2.8でリリースされています。今回は2.8.0で試しています。
Check Pointモジュール
Check Pointは管理サーバ経由のGUI設定、CLI設定、API経由での設定をサポートしていますが、AnsibleモジュールはすべてAPI経由で動作します。
2019年7月時点でサポートしているモジュールは以下の通りです。
- checkpoint_access_layer_facts – Get access layer facts on Check Point over Web Services API
- checkpoint_access_rule – Manages access rules on Checkpoint over Web Services API
- checkpoint_access_rule_facts – Get access rules objects facts on Checkpoint over Web Services API
- checkpoint_host – Manages host objects on Checkpoint over Web Services API
- checkpoint_host_facts – Get host objects facts on Checkpoint over Web Services API
- checkpoint_object_facts – Get object facts on Check Point over Web Services API
- checkpoint_run_script – Run scripts on Checkpoint devices over Web Services API
- checkpoint_session – Manages session objects on Check Point over Web Services API
- checkpoint_task_facts – Get task objects facts on Checkpoint over Web Services API
Check Pointでポリシーを設定する際は、IPアドレスではなく、ネットワークオブジェクトを指定する必要があります。 具体的には、あらかじめホスト(IPアドレス)と、それに紐付くNATアドレスをセットにしてオブジェクト名を付けたり、ネットワークセグメントとNATにオブジェクト名を付けたりしておいて、それをポリシー設定時に指定するイメージです。
上記モジュールの内、checkpoint_host
でホストのオブジェクト設定、checkpoint_host_facts
で設定したオブジェクトを閲覧できます。
また、checkpoint_access_rule
でポリシー設定、checkpoint_access_rule_facts
で設定したポリシーを閲覧できます。
Ansible2.9からは ネットワークのオブジェクト設定ができるcp_network
モジュールもリリースされる予定です。
セットアップ
AWS R77.30 セットアップガイドを参考にしました。
加えて、AnsibleからAPIを叩けるよう、管理サーバにSSHログインの上、Expertモードで以下コマンドを実行しています。 詳細はこちら
[Expert@xxxx:0]# mgmt_cli -r true set api-settings accepted-api-calls-from "All IP addresses" --domain 'System Data' [Expert@xxxx:0]# api restart
今回は全アドレスからのAPIコールを許可していますが、 本番環境で使う場合は制限すべきですね。
Ansible Inventory
以下の通り作成しました。
- inventory_cp
[checkpoint] smart1 ansible_host=<管理サーバのIPアドレス> [checkpoint:vars] ansible_network_os=checkpoint ansible_user=<管理サーバのユーザ名> ansible_password=<管理サーバのパスワード> ansible_httpapi_use_ssl=yes ansible_httpapi_validate_certs=no
Ansible Playbook
ホストオブジェクトとアクセスルールの設定、確認、削除を行うPlaybookを作成しました。
- playbook_cp.yml
--- - hosts: checkpoint gather_facts: no connection: httpapi tasks: # ホストオブジェクトの設定 - name: Create host object checkpoint_host: name: test_sv # ホストオブジェクト名 ip_address: 192.168.0.15 # IP address # ホストオブジェクトの確認 - name: Get host object facts checkpoint_host_facts: name: test_sv # ホストオブジェクト名 register: result_host - name: debug debug: msg: "{{ result_host }}" # アクセスルールの設定 - name: Create access rule checkpoint_access_rule: layer: Network name: "acl_test" # アクセスルール名 position: top # ルールの挿入位置 source: any # オブジェクト名 or any destination: test_sv # オブジェクト名 or any action: accept # acceptで許可、dropで拒否 # アクセスルールの確認 - name: Get access rule facts checkpoint_access_rule_facts: layer: Network name: "acl_test" # アクセスルール名 register: result_access_rule - name: debug debug: msg: "{{ result_access_rule }}" # 設定したアクセスルールの削除 - name: Delete access rule checkpoint_access_rule: layer: Network name: "acl_test" # アクセスルール名 state: absent # 設定したホストの削除 - name: Delete host object checkpoint_host: name: test_sv # ホストオブジェクト名 state: absent
実行結果
だいぶ長いですが、ご参考までに載せておきます。
$ ansible-playbook -i inventory_cp playbook1_cp.yml PLAY [checkpoint] ******************************************************************************************************* TASK [Create host object] *********************************************************************************************** changed: [smart1] TASK [Get host object facts] ******************************************************************************************** ok: [smart1] TASK [debug] ************************************************************************************************************ ok: [smart1] => { "msg": { "ansible_facts": { "checkpoint_hosts": { "color": "black", "comments": "", "domain": { "domain-type": "domain", "name": "SMC User", "uid": "xxx" }, "groups": [], "icon": "Objects/host", "interfaces": [], "ipv4-address": "192.168.0.15", "meta-info": { "creation-time": { "iso-8601": "2019-07-29T22:29+0900", "posix": xxx }, "creator": "admin", "last-modifier": "admin", "last-modify-time": { "iso-8601": "2019-07-29T22:29+0900", "posix": xxx }, "lock": "unlocked", "validation-state": "ok" }, "name": "test_sv", "nat-settings": { "auto-rule": false }, "read-only": false, "tags": [], "type": "host", "uid": "xxx" } }, "changed": false, "failed": false } } TASK [Create access rule] *********************************************************************************************** changed: [smart1] TASK [Get access rule facts] ******************************************************************************************** ok: [smart1] TASK [debug] ************************************************************************************************************ ok: [smart1] => { "msg": { "ansible_facts": { "checkpoint_access_rules": { "action": { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "xxx" }, "name": "Accept", "type": "RulebaseAction", "uid": "xxx" }, "action-settings": { "enable-identity-captive-portal": false }, "comments": "", "content": [ { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "xxx" }, "name": "Any", "type": "CpmiAnyObject", "uid": "xxx" } ], "content-direction": "any", "content-negate": false, "custom-fields": { "field-1": "", "field-2": "", "field-3": "" }, "destination": [ { "domain": { "domain-type": "domain", "name": "SMC User", "uid": "xxx" }, "ipv4-address": "192.168.0.15", "name": "test_sv", "type": "host", "uid": "xxx" } ], "destination-negate": false, "domain": { "domain-type": "domain", "name": "SMC User", "uid": "xxx" }, "enabled": true, "install-on": [ { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "xxx" }, "name": "Policy Targets", "type": "Global", "uid": "xxx" } ], "layer": "xxx", "meta-info": { "creation-time": { "iso-8601": "2019-07-29T22:29+0900", "posix": xxx }, "creator": "admin", "last-modifier": "admin", "last-modify-time": { "iso-8601": "2019-07-29T22:29+0900", "posix": xxx }, "lock": "unlocked", "validation-state": "ok" }, "name": "acl_test", "service": [ { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "xxx" }, "name": "Any", "type": "CpmiAnyObject", "uid": "xxx" } ], "service-negate": false, "source": [ { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "xxx" }, "name": "Any", "type": "CpmiAnyObject", "uid": "xxx" } ], "source-negate": false, "time": [ { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "xxx" }, "name": "Any", "type": "CpmiAnyObject", "uid": "xxx" } ], "track": { "accounting": false, "alert": "none", "per-connection": false, "per-session": false, "type": { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "xxx" }, "name": "None", "type": "Track", "uid": "xxx" } }, "type": "access-rule", "uid": "xxx", "vpn": [ { "domain": { "domain-type": "data domain", "name": "Check Point Data", "uid": "xxx" }, "name": "Any", "type": "CpmiAnyObject", "uid": "xxx" } ] } }, "changed": false, "failed": false } } TASK [Delete access rule] *********************************************************************************************** changed: [smart1] TASK [Delete host object] *********************************************************************************************** changed: [smart1] PLAY RECAP ************************************************************************************************************** smart1 : ok=8 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
(参考) GUI画面
管理サーバにHTTPSアクセスすると、専用のクライアントソフト「スマートコンソール」をダウンロードできます。
これをインストールし、管理サーバへアクセスしました。
以下は、Ansibleで最後に削除を行う前の結果です。いずれも設定内容が問題なく反映されている事が分かります。
ホストオブジェクトの設定画面
アクセスルールの設定画面