Cisco Japan Blog
Share

Tetration OpenAPIで何ができる?? ~Policy作成編~


2020年4月16日


API経由でポリシーを作成する「Policy作成編」

前回に引き続きTetration OpenAPIのご紹介です。今回はAPI経由でポリシーを作成する「Policy作成編」になります。

API経由でのポリシーの作成にはまずTetrationにおけるポリシー管理とセグメンテーションの概念を理解する必要があります。Tetrationにおけるポリシーの定義は全て以下の様式で行います。

Allow or Deny, From:送信元セグメント, To:宛先セグメント, L4ポート番号(TCP/UDPポート番号)

全てのポリシーは例外なくこの様式で各application毎に定義されています。
Tetrationにおける「セグメント」とは、scopeでありclusterでありfilterです。

scope, cluster, filterについては機会があればまた詳しくお話ししますが、今回はこれら3つはいずれもセグメントを表現するものであるとご理解いただければと思います。

API経由での操作は前回までのブログでもお伝えした通り設定に必要な要素は基本’id’をベースに表現しますので、ポリシー定義の事前準備として

1. ポリシーを定義するapplicationの’id’
2. 送信元のセグメントの’id’
3. 宛先のセグメントの’id’

以上の3つが必要になります。

1.のapplicationの’id’は前回までのブログでご紹介した方法で取得可能です。

2.と3.については scope, cluster, filter のいずれかのidを取得する必要があります。

scopeは

GET /app_scopes

clusterは

GET /applications/{application_id}/clusters

filterは

GET /filters/inventories

でそれぞれ一覧を取得可能ですので対象のscope/cluster/filterの’id’をkeyとしてparseしvalueを抽出して当該の’id’の値を得られます。clusterが{application_id}を指定しなければならないのはclusterがapplicationの中にのみ存在するセグメントだからです。

必要な’id’を取得できたら次はいよいよポリシーの作成です。
ポリシーの作成には2ステップ必要で、APIエンドポイントも2つあります。

流れとしてはまず

POST /applications/{application_id}/policies

このエンドポイントでFromとToのセグメント、ポリシーの種別(AbsoluteかDefaultかCatch allか)、allowかdenyか、などを定義します。以下がサンプルです。

---------------------------------------------------------------------------
req_payload = {
  "version": "v1",
  "rank" : "DEFAULT",
  "policy_action" : "ALLOW",
  "priority" : 100,
  "consumer_filter_id" : "123456789",
  "provider_filter_id" : "987654321",
}
rc.post('/applications/{application_id}/policies', json_body=json.dumps(req_payload))
---------------------------------------------------------------------------

実はこれだけで”ポリシー”の定義は終わっています。API用語的にはポリシーとはFromとToのセグメントを定義することなのです。つまりこの時点で既にポリシーは1つ生成されていて、次はこのポリシーに対してL4ポート番号の設定を入れていくことになります。ポリシーに対しL4ポート番号を設定するには対象ポリシーの’id’が必要になります。

GET /applications/{application_id}/policies

このAPIエンドポイントでポリシーの一覧を取得し、“consumer_filter_id”(送信元セグメント)が”123456789″、”provider_filter_id”(宛先セグメント)が”987654321″となっているポリシーを探します。見つかればそれが先ほど作成したポリシーですのでその’id’を取得します。

POST /openapi/v1/policies/{policy_id}/l4_params

ポリシーの’id’が分かればあとはこのAPIエンドポイントでそのポリシーにL4ポートの設定を入れればポリシーの定義は完了になります。以下がサンプルです。

-------------------------------------------------------------------------
req_payload = {
  "version": "v1",
  "start_port" : 8080,
  "end_port" : 8080,
  "proto" : 6,
}

rc.post('/policies/%s/l4_params' % policy_id, json_body=json.dumps(req_payload))
-------------------------------------------------------------------------

いかがでしたか?ポリシーの作成は複数の要素をidで記述する必要がありますのでコールするAPIエンドポイントも多く少し難しく感じたかもしれませんが、踏むべきステップとそれぞれのAPIコールで得られるアウトプットのデータ構造さえ理解すればAPI経由でのポリシー作成は非常に簡単です。

最後に、ホワイトリストポリシーの作成をAPI経由でインタラクティブに行うpython codeをサンプルとしてご紹介いたします。ポリシーを作成したいapplicationの選択、送信元clusterの選択、宛先scopeの選択、TCP/UDPの選択、ポート番号の選択、以上をインタラクティブに行うサンプルcodeになります。code作成の際の参考になれば幸いです。

https://github.com/micchan2005/Tet-policy-creationpopup_icon

 

Tags:
コメントを書く