Deep Instinctの端末管理をREST APIで効率化する

Pocket

はじめに

本稿では、「Deep Instinct」を運用するにあたって、REST APIにより端末管理を効率化するテクニックを紹介します。

Deep Instinctとは

「Deep Instinct」は、ディープラーニングを活用したエンドポイントセキュリティのソリューションです。既知の脅威だけではなく、未知の脅威も99%以上の高い検知率で予防することができます。脅威の検知、隔離というプロセスが全て自動化されているため、運用管理の工数を削減することができます。

下図が「Deep Instinct」の概要イメージですが、クラウド上の「D-Appliance」と接続することが前提となっています。また、管理コンソールと呼ばれる設定や検知された情報の参照も、「D-Appliance」へのアクセスが必要です。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

そのため、どの端末にエージェントが導入されたか、また、検知された情報を確認するには、このクラウド上のサービスへ都度アクセスする必要があります。

また、端末情報の管理もこちらで行うため、追加で情報を付与したり、人事異動や使用者変更等に伴う付与情報の一斉変更をしたり、といったことが必要となってきます。

ところが、現状の「D-Appliance」の管理コンソール上では、端末へユーザーが付与出来る情報はコメント欄のみとなっており、更新は1台ずつしか実施出来ない仕様となっております。

 

REST APIを使うことのメリット

こういった課題への対応として、「Deep Instinct」にはAPIコネクターとしてREST APIでの連携が実装されており、これを利用して、端末情報の取得、更新といった運用を効率的に行うことが出来るようになっております。

「Deep Instinct」の詳細については、下記の弊社サイトにて案内しています。

ディープラーニングを活用したサイバー攻撃対策「Deep Instinct」

 

REST APIを使うための設定手順

まずは、REST APIを使うために設定を行います。

管理コンソールにログインし、「Settings」―「Integration & Notification」―「API Connectors」を選択します。

 

 

 

 

 

 

 

 

 

「API Connectors」画面が表示されますので、「Add Connector」をクリックします。

 

 

 

 

 

 

 

 

「Add API Connector」画面が表示されますので、それぞれ以下の情報を入力し、「Create」をクリックします。

「Name」:TEST(任意のコネクター名)

「Tenants」:All Tenants

「Permission」:Read and Remendiation

 

 

 

 

 

 

 

 

 

 

以下のようにConectorが作成されれば準備は完了です。

ここで作成された「API Key」は次の作業で使用するため、値をコピーしておきます。

 

 

 

 

 

 

 

 

 

REST APIを使ってみる

さっそくREST APIを使ってみましょう。

Deep Instinctでは、REST APIの実行サイトも用意されており、まずはこちらで試してみましょう。

接続している管理コンソールのサイトの「/api/v1/」にアクセスすることでAPIサイトへアクセス出来ます。

 例)https://xxxx.deepinstinctweb.com/api/v1/

画面上部の「Authorize」をクリックします。

「Available authorizations」画面が表示されますので、「Value」欄に先程コピーした「API Key」を入力し、「Authorize」をクリックします。

 

 

 

 

 

 

 

 

認証が成功すれば、以下のような画面が表示されますので、「Close」をクリックします。

 

 

 

 

 

 

 

では、端末に関する操作をしてみましょう。Deep Instinctでは「Devices」がそれにあたります。

まずは端末情報の取得を行います。

端末情報の取得は一番上の「GET /devices/」をクリックします。

 

 

 

 

 

 

 

 

 

 

 

 

 

「Try it out」をクリックします。

 

 

 

 

 

 

 

 

 

 

 

 

 

「Execute」をクリックします。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

実行結果として、「Response body」に取得した端末情報が表示されます。また、「Download」をクリックすることで、ファイルをダウンロードすることが出来ます。

次に、コメント欄の更新を行います。コメント欄への操作は一番下の「PUT  /devices/{device_id}/comment」をクリックします。

 

 

 

 

 

 

 

 

 

 

 

 

 

「Try it out」をクリックします。

 

 

 

 

 

 

 

 

 

 

 

コメントの内容、端末の情報(DeepInstinctで管理されているID)を入力し、「Execute」をクリックします。

 

 

 

 

 

 

 

 

 

 

 

実行した内容と実行結果が表示されます。

レスポンスコードが「204」であることから、コメントのアップデートが成功したことが確認出来ます。

 

 

 

 

 

 

 

 

 

 

 

実際に更新された内容を管理コンソールから確認した結果です。

 

 

 

 

 

 

 

このようにREST APIを利用して、コメントを更新することが出来ました。

上記で紹介したWeb画面からでは1台ずつしか更新出来ませんが、こういった情報をもとに、複数端末の情報を更新するバッチの作成が容易に行うことが出来、Deep Instinctでの端末管理を効率的に行うことが可能です。

以下にCSVファイルを読み込んで複数端末のコメント欄を更新するバッチファイルのサンプルソースを提示しますので参考にしてみて下さい。

また、それ以外にも検知されたイベントの取得など、Deep InstinctにREST APIを連携することでより運用しやすくなります。この機会に利用してみてはいかがでしょうか。

 

REST APIを利用した複数端末のコメント情報を更新するバッチファイルのサンプルソース

※「# プロパティ」以下にある「$Url」と「$ApiKey」は、正しい情報を記載ください。

# 例外(try catch)を捕まえるために「stop」にする
$ErrorActionPreference = “stop”

# モジュール(自身)が存在するフォルダーに移動する
Set-Location $PSScriptRoot

function Main() {
$RestAPI = New-Object RestAPI

# ———+———+———+———+
# csvファイルを読み込んで、デバイスのコメントの更新を行う。
Write-Host “———+———+———+———+rncsvファイルを読み込んで、デバイスのコメントの更新を行う”
[PSCustomObject]$Datas = Import-Csv .\RestAPIUpdate.csv -Encoding OEM
Write-Host $(Write-Output $Datas | Format-Table -AutoSize | Out-String)
$RestAPI = New-Object RestAPI($ApiKeyTenant1)
foreach ($Data in $Datas) {
# Write-Host “id =” $Data.id “, comment =” $Data.comment
$RestAPI.Body = Convertto-Json @{“comment” = $Data.comment; }
$rc = $RestAPI.Exec(“devices/” + $Data.id + “/comment”, “Put”)
$RestAPI.ToString()
Write-Host “$(Get-Date -Format “yyyy/MM/dd HH:mm”) Code = $rc”
}
$RestAPI = $null

return $rc
}

# RestAPI呼び出し
class RestAPI {
# ———+———+———+———+
# プロパティ
[String]$Url = “https://xxxx.xxxx.deepinstinctweb.com”
[String]$Uri = “/api/v1/”
[string]$Api = “”
[string]$Method = “”
hidden [string]$ApiKey = “***********************************************”

[object]$Headers = $null
[object]$Body = $null
[object]$Response = $null
[int]$StatusCode = 0
[string]$StatusDescription = “”

# ———+———+———+———+
# コンストラクタ
RestAPI([String]$Url_, [String]$Uri_, [String]$Api_, [String]$Method_, [string]$ApiKey_) {
$this.Url = $Url_
$this.Uri = $Uri_
$this.Api = $Api_
$this.Method = $Method_
$this.ApiKey = $ApiKey_
$this.SetApiKey()
}

RestAPI([String]$Api_, [String]$Method_, [string]$ApiKey_) {
$this.Api = $Api_
$this.Method = $Method_
$this.ApiKey = $ApiKey_
$this.SetApiKey()
}

RestAPI([String]$Api_, [String]$Method_) {
$this.Api = $Api_
$this.Method = $Method_
$this.SetApiKey()
}

RestAPI([string]$ApiKey_) {
$this.ApiKey = $ApiKey_
$this.SetApiKey()
}

RestAPI() {
$this.SetApiKey()
}

SetApiKey() {
# Headersの作成
$this.Headers = @{“accept” = “application/json”; “Authorization” = $this.ApiKey; “Content-Type” = “application/json”; }
}

# ———+———+———+———+
[void]ToString() {
Write-Host “Uri =” $($this.Url + $this.Uri + $this.Api)
Write-Host “Method =” $this.Method
Write-Host “Headers =” $(Write-Output $this.Headers | Format-Table -AutoSize | Out-String)
Write-Host “Body =” $this.Body
Write-Host “StatuCode =” $this.StatusCode # $(if ($this.StatusCode -eq 200) { “正常” } else { “異常” })
Write-Host “StatusDescription =” $this.StatusDescription
if (-not ([string]::IsNullOrEmpty($this.Response))) {
Write-Host “Response =” $(Write-Output $this.Response.Content | ConvertFrom-Json | Format-Table -AutoSize | Out-String)
}
}

# ———+———+———+———+
# 実行
[int]Exec([string]$Api_, [string]$Method_) {
$this.Api = $Api_
$this.Method = $Method_
return $this.Exec()
}

[int]Exec() {
# Uri
$AppUri = $this.Url + $this.Uri + $this.Api

# Body
$Body_ = $null
if (-not ([string]::IsNullOrEmpty($this.Body))) {
$Body_ = [System.Text.Encoding]::UTF8.GetBytes($this.Body)
# $Body_ = $this.Body
}

$this.StatusCode = 0
$this.StatusDescription = “”
$this.Response = $null
try {
# $Response = Invoke-RestMethod -Method Get -Uri $AppUri -Headers $Headers -ContentType ‘application/json’
# Write-Host “Invoke-WebRequest -Method $this.Method -Uri $AppUri -Headers $this.Headers -Body $Body_ -ContentType ‘application/json'”
$this.Response = Invoke-WebRequest -Uri $AppUri -Method $this.Method -Headers $this.Headers -Body $Body_ -ContentType “application/json”
$this.StatusCode = $this.Response.StatusCode
$this.StatusDescription = $this.Response.StatusDescription
}
catch [System.Net.WebException] {
$this.StatusCode = $_.Exception.Response.StatusCode.value__
$this.StatusDescription = $_.Exception.Response.StatusDescription
throw $_
}

return $this.StatusCode
}
}

$rc = Main
exit $rc

CSVファイルとしては、以下のようにデバイスIDと更新するコメントの内容を記載したものを用意します。

id,comment
1111,”コメント更新1”
1112,”コメント更新2”
お問い合わせ先

執筆者プロフィール

Fujimura Naoki
Fujimura Naokitdi iDC&セキュリティ推進部
入社以来、インフラの技術支援などを担当。その後、客先常駐業務がほとんどでようやく社内での業務に復帰。
新しい業務の担当にもなり、いろいろなことにチャレンジしたいと考えています。
Pocket

関連記事