社内のネットワークにおける未知のノードは手動ではなかなか発見できません。場合によっては大きなセキュリティリスクとなる可能性があるため、発見しだい迅速に対応することが重要です。そのため、社内のネットワーク構成情報の管理は、セキュリティに関する大きな課題の一つと言えます。
フィックスポイントでは Kompira Sonar という、オンプレ、クラウド問わずにサーバやネットワーク機器の構成情報収集が可能なサービスを提供しております。本記事では Kompira Enterprise のジョブフローから Kompira Sonar のスキャンを実行し、その結果を取得する手順を紹介します。
※ 本記事ではスキャンが行える状態の Kompira Sonar が準備されていることを前提としています。Kompira Sonar の初期設定に関しては、「Kompira Sonar 基本マニュアル」を参照してください。
動作確認環境
ソフトウェア | バージョン |
---|---|
Kompira Enterprise | 1.5.5.post11 |
OS | CentOS 7.8.2003 |
または
ソフトウェア | バージョン |
---|---|
Kompira Enterprise | 1.6.2.post7 |
OS | CentOS 7.8.2003 |
または
ソフトウェア | バージョン |
---|---|
Kompira Enterprise | 1.6.8 |
OS | CentOS Stream 8 |
用語定義
本記事では以下の用語を使用します。
用語 | 説明 |
---|---|
スキャン | 構成情報を探索し取得すること |
ネットワーク | Kompira Sonar 内でスキャンされた構成情報一覧の単位 |
Ksocket | スキャンを行うために使用するソフトウェア |
スナップショット | スキャンで取得した特定の時点での構成情報 |
ノード | スナップショットで得られた機器の情報を集約したもの |
スキャン起点アドレス | スキャンを開始する IP アドレスのリスト |
許可アドレス・ネットワーク | スキャンを許可する IP アドレスのリスト |
除外アドレス・ネットワーク | スキャンから除外する IP アドレスのリスト |
各種 ID の確認
まず、Kompira cloud の URL から スペース ID を確認してください。こちらは “.cloud.kompira.jp” の前の文字列であり、例えば URL が https://shibuya.cloud.kompira.jp/ の場合、スペース ID は “shibuya” になります。
次に、スキャンに使用するネットワークを Kompira Sonar で開いて、ネットワーク ID を確認してください。ネットワーク ID は以下の画像の赤枠部分に記載されている文字列で、クリックすることでコピーできます。
次に、KsocketID を確認します。画面右上のユーザーアイコンから「設定」を開いてください。
「Ksocket」をクリックして Ksocket 一覧が表示されたら、今回のスキャンに使用する Ksocket を選択して、画面下部に表示される KsocketID を確認してください。こちらもクリックすることでコピーできます。
※ Ksocket 作成時に発行される「Ksocket トークン」とは異なります。
また、Kompira Sonar を Kompira Enterprise から呼び出すためには、Kompira cloud の API トークンが必要になります。詳しい手順に関しては「Kompira Pigeon を利用した通知電話の利用」の「ID の取得」を参照してください。
スキャンを行うジョブフローの作成
それでは、 Kompira Sonar の API を呼び出して、スキャンを行うジョブフローを作成していきます。
今回のジョブフローでは、以下の Kompira Sonar API のエンドポイントを使用します。
スキャン実行のエンドポイント
POST /api/tasks
スキャン結果取得のエンドポイント
GET /api/apps/sonar/networks/(ネットワーク ID)/snapshots/(スナップショット ID)/addresses
以下のように「Sonarスキャン」という名前のジョブフローを作成します。今回はスナップショット ID とノード数と各ノードの IP アドレスを表示します。
ジョブフロー「Sonarスキャン」
| token = "(API トークン)" | | space = "(スぺース ID)" | | network = "(ネットワーク ID)" | | ksocket = "(KsocketID)" | | wait_time = 15 | # スキャン結果取得待機間隔 [ head = { "X-Authorization": "Token ${token}", "Content-Type": "application/json" }, data = { "namespace": "sonar", "method": "scan", "params": { "networkId": network, "configuration": { ksocket: { "queries": [], "includes": ["10.20.29.0/24"], "excludes": ["192.168.1.2", "192.168.1.3"], "allowPublicIPs": false } } } } ] -> # スキャン実行 urlopen( url="https://${space}.cloud.kompira.jp/api/tasks", http_method="POST", headers=head, data=data, encode="json", quiet=true ) -> [ res = json_parse($RESULT.content), snapshotId = res.reference.snapshotId ] -> # 結果取得処理 # スキャンが完了するまでポーリングを行う [items = [], result = {}] -> { while items == [] | print("${wait_time}秒待機します") -> sleep(wait_time) -> urlopen( url="https://${space}.cloud.kompira.jp/api/apps/sonar/networks/${network}/snapshots/${snapshotId}/addresses", headers=head, quiet=true ) -> [result = json_parse($RESULT.content)] -> [items = result.items] } -> # 結果出力 print("スナップショットID: ", snapshotId) -> print("ノード数: ", result.total) -> print("IPアドレス一覧: ") -> { for node in result.items | print(node.addr) }
上記ジョブフローにおける (API トークン) 、(スペース ID) 、(ネットワーク ID) 、(KsocketID) は、「各種 ID の確認」で確認したお使いの環境のものに、カッコを含めて置き換えてください。
※ ネットワーク ID、KsocketID は大文字と小文字を区別しません。
また、 “params” の (KsocketID) 以下の項目はそれぞれ Kompira Sonar のスキャン実行画面におけるオプションに以下表のように対応しています。設定に応じて適宜変更してください。
項目 | Kompira Sonar 上でのオプション |
---|---|
queries | スキャン起点アドレス |
includes | 許可アドレス・ネットワーク |
excludes | 禁止アドレス・ネットワーク |
allowPublicIPs | パブリック (グローバル) アドレスを許可する |
例えば今回のジョブフロー上での設定でスキャンを行うと、Kompira Sonar 上で以下のように記入した場合と同様の挙動になります。
このジョブフローを実行すると以下のように、スナップショット ID とノード数と各ノードの IP アドレスが出力されます。
※ スキャンにかかる時間は環境やスキャンする数によって異なります。
実際に Kompira Sonar 側でスナップショットを確認してみましょう。ネットワークの「スナップショット」をクリックすると、以下のように新しいスナップショットが生成されています。
こちらのスナップショットをクリックすると詳細を見ることができます。以下の赤枠部分に先ほどのスナップショット ID と同じ ID が表示されているはずです。
※ スナップショット ID は大文字と小文字を区別しません。
今回はスナップショット ID とノード数と IP アドレスのみを表示しましたが 、他にも MAC アドレスやホスト名等様々な情報が取得可能です。詳細は Kompira cloud の「API ドキュメント」を参照してください。
以上のようにして、Kompira Enterprise から Kompira Sonar のスキャンを実行し、その結果を取得することができます。
これを利用することで、特定の状況下でのみスキャンを行ったり、スキャン結果に応じて処理を分岐させ、カスタマイズした処理を実行することが可能です。