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

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

AnsibleでCheck Pointを操作する

AnsibleからAPI経由で、Check Pointの情報取得や設定変更した時のメモです。

用意した環境

Check Point

AWS上のCloudGuard IaaS All-In-Oneを使いました。

f:id:tsukino_netwkr:20190729232317p:plain
f:id:tsukino_netwkr:20190729232337p:plain

バージョンは最新の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月時点でサポートしているモジュールは以下の通りです。

Network modules -Checkpoint

  1. checkpoint_access_layer_facts – Get access layer facts on Check Point over Web Services API
  2. checkpoint_access_rule – Manages access rules on Checkpoint over Web Services API
  3. checkpoint_access_rule_facts – Get access rules objects facts on Checkpoint over Web Services API
  4. checkpoint_host – Manages host objects on Checkpoint over Web Services API
  5. checkpoint_host_facts – Get host objects facts on Checkpoint over Web Services API
  6. checkpoint_object_facts – Get object facts on Check Point over Web Services API
  7. checkpoint_run_script – Run scripts on Checkpoint devices over Web Services API
  8. checkpoint_session – Manages session objects on Check Point over Web Services API
  9. 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で最後に削除を行う前の結果です。いずれも設定内容が問題なく反映されている事が分かります。

  • ホストオブジェクトの設定画面 f:id:tsukino_netwkr:20190729225611p:plain

  • アクセスルールの設定画面 f:id:tsukino_netwkr:20190729225508p:plain