Trend Micro Deep SecurityのAPIを試してみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、藤本です。

Trend Micro Deep SecurityのAPI、SDKを触ってみたのでご紹介します。

概要

Trend Micro Deep Securityはバージョン9系からSOAP APIを提供しています。(現在はREST APIも実装中)Deep SecurityのAPI実装により、ポリシー設定、コンピュータ管理などの初期構築を自動化したり、侵入検知のログからアクセス元IPアドレスを取得して、Firewallルールでブロックといった運用を自動化したりできます。今まで何かと手間がかかる印象が強かったセキュリティ製品の運用負荷低減・迅速なセキュリティ対策できるのではないかと期待しています。先日のAWS SummitのセッションでもDevOpsツールの充実によりAgilityが高まってきましたが、それによりセキュリティが置いてけぼりになっている実情があることが伝えられていました。そういった意味でもセキュリティ対策の自動化はDevSecOpsには必須となっています。

deep-security-py

SOAP APIのドキュメントはWebで配布されています。

SOAP API。。Deep SecurityはManagerがWSDLを提供していますので、SOAPが得意な方はWSDLからSDK作ってー、みたいなことができるのでしょう。私も以前そんなことをやった覚えがありますが、記憶が、、、

そこでTrend MicroのエンジニアがPythonのSDKを開発していて、Githubでソースコードを公開しています。弊社のブログでもいくつかご紹介しているGithubのDeep SecurityのリポジトリでOSSとして提供しています。

Python SDKを利用することで、HTTPリクエストやオブジェクトからXMLの組み立て、逆にXMLのパース、それらのエラーハンドリングを実装する必要がなくなります。

SDKの実装状況はGithubのREADMEによると現在60%ぐらいのAPIに対応しているようです。ただし、ドキュメントのPDFに記載がありますが、SOAP API自体がDeep Securityが提供する全ての機能を網羅しているわけではありませんのでご注意ください。

やってみた

環境

今回はDSaaSを利用して検証しています。

  • Deep Seecurity Manager : 10.0.2192
  • Python : 2.7.11 (Python 3系は未対応)

APIの有効化

APIを利用する場合、APIを有効化したRoleを持つユーザーを用意する必要があります。

Role設定

Roleの設定にて、APIを有効化します。

設定変更する場合は左メニューの[役割] - [対象となるRole] - [プロパティ]の順に、新規作成する場合は左メニューの[役割] - [新規]の順に選択します。

「WebサービスAPIへのアクセスを許可」を有効化します。

screenshot_2016-07-01_19_34_40

また今回はポリシー操作を行うため、ポリシーの全権限を割り当てます。

screenshot_2016-07-02_10_52_09

ユーザ設定

ユーザにAPIを有効化したロールを割り当てます。

左メニュー[ユーザ] - [対象となるユーザ] - [プロパティ]の順に選択します。

役割にRoleを選択します。

screenshot_2016-07-01_19_45_36

以上でDeepSecurity側の準備が完了です。

SDKダウンロード

PyPIでは配布されていないようなので、GithubリポジトリからCloneします。

# git clone https://github.com/deep-security/deep-security-py.git
Cloning into 'deep-security-py'...
remote: Counting objects: 685, done.
remote: Total 685 (delta 0), reused 0 (delta 0), pack-reused 685
Receiving objects: 100% (685/685), 4.74 MiB | 1.70 MiB/s, done.
Resolving deltas: 100% (408/408), done.
Checking connectivity... done.

# cd deep-security-py

Python SDKを利用したログイン

対話式で動作を確認します。まずはログインしてみます。
Webコンソール同様、ログイン画面で入力するAccount Name(tenant)、Username、Passwordを指定し、sign_inメソッドを実行します。Trueが返れば成功です。

# python
Python 2.7.11 (default, Mar 17 2016, 18:31:58)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> TENANT = XXXXXXXXXXX
>>> USERNAME = 'apiuser'
>>> PASSWORD = XXXXXXXXXXXXX
>>> import deepsecurity
>>> mgr = deepsecurity.dsm.Manager(tenant=TENANT, username=USERNAME, password=PASSWORD)
>>> mgr.sign_in()
True

失敗するとエラーメッセージとFalseが返ります。

>>> mgr = deepsecurity.dsm.Manager(tenant='tenant', username='username', password='password')
>>> mgr.sign_in()
[2016-07-01 20:15:58]   Failed to make SOAP POST call [authenticateTenant] Threw exception:
    HTTP Error 500: Internal Server Error
[2016-07-01 20:16:00]   Failed to make REST POST call [authentication/login] Threw exception:
    HTTP Error 403: Forbidden
False

今回はDSaaSを利用するため、Tenant(Account Name)を指定していますが、個別にManagerを構築している環境ではTenantの指定は必要ありません。代わりにデフォルトのDSMホスト名がDSaaSのFQDN(app.deepsecurity.trendmicro.com)を指定しているため、hostnameで自身のDeepSecurity ManagerのFQDNをご指定ください。以下のようになります。

>>> mgr = deepsecurity.dsm.Manager(hostname=HOSTNAME_or_IPADDRESS, username=USERNAME, password=PASSWORD)

ログアウトはsign_outメソッドを実行するだけです。

>>> mgr.sign_out()
False

ポリシー操作

ポリシー情報取得

まずはDeepSecurityのセッションを利用して、ポリシー一覧を取得します。

>>> mgr.policies.get()
20

ポリシー数が返ります。Managerインスタンスのpoliciesにポリシー情報がセットされています。

次に取得したポリシー一覧から情報を取得します。

>>> mgr.policies
{1: <deepsecurity.policies.Policy at 0x1027cad90>,
 2: <deepsecurity.policies.Policy at 0x1027cab90>,
 3: <deepsecurity.policies.Policy at 0x102839890>,
:
 141: <deepsecurity.policies.Policy at 0x1027cac90>,
 161: <deepsecurity.policies.Policy at 0x102844a90>,
 162: <deepsecurity.policies.Policy at 0x1027ca8d0>}

>>> policy = mgr.policies[1]

>>> policy.name
u'Base Policy'

>>> policy.__dict__
{'anti_malware_manual_id': u'2',
 'anti_malware_manual_inherit': u'false',
 'anti_malware_real_time_id': u'1',
 'anti_malware_real_time_inherit': u'false',
 'anti_malware_real_time_schedule_id': u'4',
 'anti_malware_scheduled_id': u'3',
 'anti_malware_scheduled_inherit': u'false',
 'anti_malware_state': u'INHERITED',
 'application_type_ids': None,
 'computers': {},
 'description': u'A policy from which all other policies can inherit. Only the most general settings should be applied to this policy as they will apply to all policies that inherit from it, unless overridden. More specific settings and rules should be added to sub-policies that are assigned to computers.',
 'firewall_rule_ids': OrderedDict([(u'item', [u'28', u'23'])]),
 'firewall_state': u'INHERITED',
 'id': 1,
 'integrity_monitoring_rule_ids': None,
 'integrity_monitoring_state': u'INHERITED',
 'intrusion_prevention_rule_ids': None,
 'intrusion_prevention_state': u'INHERITED',
 'log_inspection_rule_ids': None,
 'log_inspection_state': u'INHERITED',
 'manager': <deepsecurity.dsm.Manager at 0x1029c8110>,
 'name': u'Base Policy',
 'parent_security_profile_id': None,
 'recommendation_state': u'ONGOING',
 'rules': {'firewall_-23': None, 'firewall_-28': None},
 'schedule_id': None,
 'stateful_configuration_id': u'1'}

Base Policyの設定情報を取得できました。IDや名前、ファイアウォールルール、侵入検知ルールなどがIDで取得されていることが分かります。

ポリシー作成

ポリシーを作成します。設定は全てデフォルト値となっています。

>>> from deepsecurity.policies import Policy
>>> new_policy = Policy(mgr)

>>> new_policy.name = 'API Policy'

>>> new_policy.save()
True

Policyインスタンス生成します。
必須項目の名前を設定します。
ポリシー設定をDeep Security ManagerへPushします。
簡単ですね。

Webコンソールのポリシー設定画面を確認し、API Policyがあることが確認できます。

screenshot_2016-07-02_10_53_54

ポリシー変更

次に作成したポリシーを変更します。上で作成したポリシーをBase Policyの子ポリシーとし、Web Serverのファイアウォールルールを適用します。

再度、ポリシー情報をDeepSecurity Managerより上で作成したAPI Policyのポリシー情報を取得します。
取得したポリシー一覧からAPI Policyの名前のポリシーIDを取得します。

>>> mgr.policies.get()
21

>>> [policy.id for policy in mgr.policies.values() if policy.name == 'API Policy']
[181]

>>> policy = mgr.policies[181]

API Policyの親ポリシーにBase PolicyのID「1」をセットします。

>>> policy.parent_security_profile_id = '1'

次に設定したいWeb ServerのルールのIDを確認します。

DeepSecurity Managerより各種ルール一覧を取得します。
ファイアウォールルールからWeb Serverの名前を持つルールのIDを取得します。

>>> mgr.rules.get()
[2016-07-02 10:33:14]   Calling DPIRuleRetrieveAll. This may take 15-30 seconds as the call returns a substantial amount of data
5
>>> mgr.rules.keys()
['firewall',
 'application_type',
 'integrity_monitoring',
 'log_inspection',
 'intrusion_prevention']
>>> [fw_rule.id for fw_rule in mgr.rules['firewall'].values() if fw_rule.name == 'Web Server']
[42]

API Policyが持つファイアウォールルールに確認したルールIDをセットします。

>>> policy.firewall_rule_ids = {'item': ['42']}

設定したポリシーをDeepSecurity Managerにプッシュします。

>>> policy.save()
True

Webコンソールのポリシー設定画面を確認し、API PolicyがBase Policy配下に移動していることを確認できます。

screenshot_2016-07-02_11_16_28

また、API PolicyのファイアウォールルールにWeb Serverも追加されています。

screenshot_2016-07-02_11_16_37

ポリシー削除

ポリシー削除はSOAP APIとしては用意されていますが、まだSDKには実装されていません。

まとめ

いかがでしたでしょうか?
今回はDeepSecurityのSOAP API、SDKを利用したログイン/アウト、ポリシーのCRUD操作方法をご紹介しました。SDKを利用することでPythonを触ったことがある方は簡単にAPIを利用いただけます。あとはより多くの機能のAPI拡充、より多くのAPIのSDK拡充に期待したいです。

あとSDKのドキュメントがないので使用方法はソースコードを読まなければいけないのが辛いです。

  • DeepSecurityはAPIを提供している
    • SOAP API
    • REST API(開発中)
    • APIは全ての機能を実装できているわけではない
  • APIを簡単に利用するSDKを提供している
    • SDKの実装状況は60%ぐらい