ふらふらエンジニアのメモ帳

セキュリティおべんきょちゅ( ˘ω˘ )スヤァ…

AnsibleでCheck Pointを操作する(2.9.0版) ②ポリシー設定変更編

前回に続き、Ansible2.9.0でリリースされたCheck Pointモジュールを使って、ポリシー設定変更を行っていきます。

f:id:tsukino_netwkr:20190729232317p:plain

設定変更内容

下図の、④User PCからL3SW(hqdist1A)へのSSH version2、ICMPアクセス許可設定を行ってみます。

f:id:tsukino_netwkr:20191110135021p:plain
テスト環境構成

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つのオブジェクトが表示されている事が分かります。

f:id:tsukino_netwkr:20191110153903p:plain
ホストオブジェクト作成後の画面

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画面でも、作成したポリシーが一番上に表示されている事が分かります。

f:id:tsukino_netwkr:20191110155742p:plain
ポリシー作成後の画面

ちなみに、同じ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   

f:id:tsukino_netwkr:20191110174608p:plain
ポリシー削除後の画面

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   

f:id:tsukino_netwkr:20191110175050p:plain
ホストオブジェクト削除後の画面

最後に

今回試した限りでは、Playbookを2回以上実行した場合や、削除時の動作に怪しい点がありました。コードを読んでみて、もし原因が分かったらアップデートしたいと思います。また、今後他のモジュールも試してみたいと思います。