Deep Security API to automate tasks を使ってみた


Deep Security の new RESTful API を試してみたメモです。
APIサンプルをもとに、実際試していて気になったことの補足を入れています。

[Deep Security API Reference](https://automation.deepsecurity.trendmicro.com/article/12_0/api-reference)

## 前提

- Deep Security の環境がある (ここでは Deep Security as a Service を利用)
- API Key が発行済みである
    - [Administration]-[UserManagement]-[Contacts] から発行できます。
- Python を利用
    - API reference に java, java script のサンプルもあるので適宜

## 接続準備

### Package の import

sdk を 以下よりダウンロードします。
[sdk ダウンロードページ](https://automation.deepsecurity.trendmicro.com/article/12_0/python?platform=dsaas)

以下のようにpackageをimportします。

```bash
sudo pip install (ダウンロードしたzipファイル)
```

### 接続設定の作成

以下で接続できます。

```python
import deepsecurity
from deepsecurity.rest import ApiException
import sys, warnings

# HTTPSの警告抑止
if not sys.warnoptions:
    warnings.simplefilter("ignore")

# 接続設定
self.configuration = deepsecurity.Configuration()

# URL を指定。自前の場合は 'https://ホスト名:4119/api' など
self.configuration.host = 'https://app.deepsecurity.trendmicro.com/api'

# API Key
self.configuration.api_key['api-secret-key'] = '(発行したAPIkey)'

# proxy環境の場合は、proxyのurlも追加
# self.configuration.proxy = 'http://proxyサーバのアドレス:ポート'
```

## 情報の取得、更新

### システム設定の取得

```python
api_instance = deepsecurity.SystemSettingsApi(deepsecurity.ApiClient(configuration))
api_version = 'v1'

try:
    api_response = api_instance.list_system_settings(api_version)

    # 戻りは、　{(プロパティ名): {"value": (値)}} 形式
    # dictで扱いたい場合は変換
    api_response_dict = api_response.to_dict()

except ApiException as e:
    print("An exception occurred when calling SystemSettingsApi.list_system_settings: %s\n" % e)
```

ポリシーなども、 list_policies など対応するものを使用すれば一覧取得できます。

### システム設定の更新

```python
# 設定用オブジェクトを作成
system_settings = deepsecurity.SystemSettings()

# 更新したいパラメータを指定する。
# 前述 list_~ で取得した結果を元に指定。
# ここでは、Agentが更新されない場合の警告日数を更新。 default 7days --> 6days。
system_settings.platform_setting_alert_agent_update_pending_threshold = {'value': '6 Days'}

try:
    # 戻りは、更新後の設定一覧
    api_response = api_instance.modify_system_settings(system_settings, api_version)

except ApiException as e:
    print("An exception occurred when calling SystemSettingsApi.modify_system_settings: %s\n" % e)
```

設定用オブジェクト作成のタイミングでdictをパラメータに渡すこともできます。
ただし、 list_~ で取得した dict をそのまま渡すことはできません。
(IDなど、更新できない値が含まれるため。updateに不適切な key を削除する必要があります)

```python
update_dict = {
  "platform_setting_alert_agent_update_pending_threshold" : 
    {'value': '6 Days'}
}
system_settings = deepsecurity.SystemSettings(**update_dict)
```

ポリシーなども、 modify_policy など対応するものを使用すれば更新できます。
なお、 create_policy や modify_policy では ルール情報の登録は行われません。
以下メソッドなどを用いて、個別に登録する必要があります。
- set_firewall_rule_ids_on_policy
- set_integrity_monitoring_rule_ids_on_policy
- set_intrusion_prevention_rule_ids_on_policy

### 条件に合うポリシーの検索

search_~ の使い方については、以下に例とともに記載してあります。
[Search for Resources](https://automation.deepsecurity.trendmicro.com/article/12_0/how-to-search)

PolicyCriteria で検索条件を作成、PolicyFilter に配列で渡し、検索します。

```python
# 検索条件 
# 評価パターンは前述のリンク参照 (string_test, numeric_test などに記載)
search_dict = {'fileld_name': 'name', 'string_test': 'equal', 'string_value': 'Windows%'}
search_criteria = deepsecurity.SearchCriteria(**search_dict)

# 第1引数は応答数(max_items)。 Noneの場合、デフォルト値の 5000(最大値)。
# 配列に複数の SearchCriteria を渡すことで、複合条件を設定可能。
search_filter = deepsecurity.SearchFilter(None, [search_criteria])

# windows関連のポリシー一覧を取得
api_response = api_instance.search_policies(api_version='v1', search_filter=search_filter, overrides=False)
```

field_name に指定する名称は、それぞれの describe~ の応答を参考にしてください。
※ Camel表記です。 pythonの場合、実際の応答と異なるので注意。(policy_id --> policyID)

なお、応答に含まれるオブジェクト内の値は検索条件に指定できません。
(search_computer での azure, ec2, esx 情報、 search_policy での　ルール情報など)

※ 2019/3/31 追記
version 12系では、search_computers に限り、一部オブジェクト内の値の検索もできるようになったようです。
[検索できる例]
* `'field_name': 'ec2VirtualMachineSummary/instanceID'`
* `'field_name': 'field_name': 'interfaces/name'`
[検索できない例]
* `'field_name': 'ec2VirtualMachineSummary/state'`
* `'field_name': 'computer_status/agent_status'`

## 最後に

API Reference のサンプルほぼそのままで、簡単に APIを使った操作ができました。
使う方の参考になればと思います。