Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AnsibleでFortigateを操作してみた話

tatematsu_san
November 20, 2019

 AnsibleでFortigateを操作してみた話

tatematsu_san

November 20, 2019
Tweet

Other Decks in Technology

Transcript

  1. 自己紹介 - Name: tatematsu_san (たてまつ) - Twitter: @tk4_jj - Blog:

    https://tenko.hatenablog.jp/ - Job: インフラエンジニア - オンプレ中心、ネットワークに限らずなんでも屋 - 最近はセキュリティ系サービスの運用が中心 - Ansible歴: ちゃんと勉強し始めてからは2か月目 - 2019年2月頃から、リモートで Ansibleもくもく会に参加 - 2019年10月からやっと自宅で学習開始
  2. Fortigateの操作方法 - CLI - コンソール接続 - SSH - Telnet -

    WebUI - REST API - FortiOS 5.2くらいから使えた模様 - 公式リファレンスが一般には非公開   サブスクリプション型の FNDNで入手可能 - ブラウザでも確認可能  ログインした状態で以下のようにアクセス  https://<forti_ip>/api/v2/cmdb/firewall/address 【CLI】 【WebUI】 【REST API】 →2.8以降で大量に増えたモジュールはREST APIを利用
  3. どこまで自動化できそう? - 2.9で追加された分も含めると、かなりの部分はカバーできそう やりたいこと モジュール名 備考 ポリシーの設定 fortios_firewall_policy 46/64なども オブジェクトの設定

    fortios_firewall_address IPSの設定 fortios_ips_settings HAの設定 fortios_system_ha Syslogの設定 fortios_log_setting logfilterなども可能 ルーティング設定 fortios_router_setting SSL-VPNの設定 fortios_vpn_ssl_settings 他にもたくさん!!( NWモジュールの3割がFortios用)
  4. ポリシー追加をやってみた - 以下のようなPlaybookでポリシーの追加が可能 ▪成果物→ ▪注意点 ・同じ結果にはなるが、毎回 changed ・FortiOS 5.4系では動かない(5.6は未テスト)  →FortiOS

    6.0以降の利用を推奨 ・公式のモジュールリファレンスでは、  最低限どこまでの要素が必要か判別が難しい  (full-configレベルの要素が存在 ) ・WebUIやCLIと異なり、入力されるパラメータに対しての  チェックが甘い  →最低限どこまで書くべきかは都度動作確認が必要
  5. 抜けるものぜんぶ抜く - 要素をそぎ落としながらPlaybookを実行 そぎ落とした要素 処理結果 どうなるか? action changed DENYで定義される srcintf

    / dstintf / service failed Status Code :500 srcaddr / dstaddr changed 設定は可能だが通信不可 schedule changed 通信も可能 ※赤網掛けが欠けた場合、Fortigateを再起動するとエラーで削除される (FortiOS 6.0.6の結果であり、バージョン差異などで変わる可能性あり) 実行結果などはブログを参照 : https://tenko.hatenablog.jp/entry/2019/11/04/152625 ▪成果物→
  6. Fortigateの運用におけるAnsible活用例 - URIモジュールを利用して、ダイナミックな要素をJSON形式でGET - CSV形式にコンバートする際、テンプレート機能を活用 "name","rule-id","severity","location","action","date" {% for results in

    get_obj['json']['results'] %} "{{results['name'] }}","{{ results['rule-id'] }}","{{ results['severity'] }}","{{ results['location'] }}","{{ results['action'] }}","{{ results['date'] }}" {% endfor %} 【例】IPSシグネチャリストの作成 # get ips rule status をパースするよりも、とてもお手軽 uri template