Tenable ブログ
ブログ通知を受信するTenable Python SDKを使用する際のヒント:内部スキャン、スキャンのインポートとエクスポートなどを実行する方法
Tenable Python SDKがビルドされたのは、 Tenable.io™のユーザーが独自のスクリプト、プログラム、およびモジュールを作成してTenable.ioプラットフォーム内のデータとシームレスにやり取りできるように、Tenable.io APIを活用する機能をユーザーに提供するためです。
Python SDKを初めて使用する場合は、私の過去のブログ投稿 を読むか、GitHubにあるこのプロジェクトのREADMEをご覧ください。
前提条件
この投稿で使用した例では、次の条件を想定しています。
- Python 2.7 または 3.4+ 以降がインストールされていること
- Tenable.ioの管理者アカウントと生成されたAPIキー
- Tenable.ioにリンクされたNessusスキャナー
内部スキャンを実行する
このセクションでは、Tenable.io Python SDKを使用して内部スキャンを実行する方法を説明します。
コード
from tenable_io.client import TenableIOClient
from tenable_io.api.scans import ScanCreateRequest
from tenable_io.api.models import ScanSettings
client = TenableIOClient(access_key='{YOUR ACCESS KEY}', secret_key='{YOUR SECRET KEY}')
scanners = {scanner.name: scanner.id for scanner in client.scanners_api.list().scanners}
template = client.scan_helper.template(name='basic')
scan_id = client.scans_api.create(
ScanCreateRequest(
template.uuid,
ScanSettings(
‘{YOUR SCAN NAME}’,
‘{YOUR SCAN TARGETS}’,
scanner_id=scanners['{YOUR SCANNER NAME}']
)
)
)
scan = client.scan_helper.id(scan_id)
scan.launch()
注:上のコードで中括弧で囲まれている変数には、ご自分の環境の情報を入れてください。
最初の数行では、Tenable.io SDKクライアントとスキャンを作成する対象のモデルをインポートしています。
次に、クライアントをAPIキーで初期化する必要があります。from tenable_io.client import TenableIOClient
from tenable_io.api.scans import ScanCreateRequest
from tenable_io.api.models import ScanSettings
client = TenableIOClient(access_key='{YOUR ACCESS KEY}', secret_key='{YOUR SECRET KEY}')
次の行では、すべてのスキャナー名をスキャナーIDとリンクするディクショナリーを作成します。
scanners = {scanner.name: scanner.id for scanner in client.scanners_api.list().scanners}
次の行では、実行するスキャンのポリシーID(内部的にはテンプレートIDとして知られる)を取得します。この例では、「Basic」スキャンテンプレートを使用しています。
template = client.scan_helper.template(name='basic')
最後に、これらのすべての詳細を使用して、スキャンを作成するためにAPIに渡すことができる「CreateScanRequest
」オブジェクトを作成します。
scan_id = client.scans_api.create(
ScanCreateRequest(
template.uuid,
ScanSettings(
‘{YOUR SCAN NAME}’,
‘{YOUR SCAN TARGETS}’,
scanner_id=scanners['{YOUR SCANNER NAME}']
)
)
)
注:スキャンのターゲットはユーザーインターフェイスで定義されているのと同じ方法で定義する必要があり、各ターゲットをコンマで区切ります。
スキャンを正常に作成されると、残っている「ScanRef
」をスキャンIDを使用して取得します。これを使用すると、すべてのスキャンコントロールにアクセスすることができます。最後の行に示されているとおり、スキャンの起動も可能です。
scan = client.scan_helper.id(scan_id)
scan.launch()
このスクリプトを実行した後に、Tenable.ioのスキャンページをチェックして、スクリプトが実行されたことを確認できます。このケースでは、スキャンの名前は「My Basic Scan」で、3つのIPをスキャンするように設定されています。
スキャンが完了すると、次のようになります。
名前を指定してスキャンレポートをエクスポートする
多くのユーザーにとって重要な別のユースケースは、以前に実行したスキャンをエクスポートして、その結果を経営陣やその他の利害関係者と共有できることです。これも、SDKを使用すれば簡単にできます。
コード
from tenable_io.client import TenableIOClient
client = TenableIOClient(access_key='{YOUR ACCESS KEY}', secret_key='{YOUR SECRET KEY}')
scans = {scan.name: scan.id for scan in client.scans_api.list().scans}
scan = client.scan_helper.id(scans['{YOUR SCAN NAME}'])
scan.download('{YOUR SCAN NAME}.pdf')
前述の例と同じように、最初にTenable.io SDKクライアントをインポートし、APIキーを使って初期化します。
from tenable_io.client import TenableIOClient
client = TenableIOClient(access_key='{YOUR ACCESS KEY}', secret_key='{YOUR SECRET KEY}')
次に、スキャン名とそれに関連付けられたIDのディクショナリーを生成します。
scans = {scan.name: scan.id for scan in client.scans_api.list().scans}
これについても、前述の例と同じように、スキャンの名前を指定して、必要なスキャンの「ScanRef」を作成します。
scan = client.scan_helper.id(scans['{YOUR SCAN NAME}'])
最後に、最終行でスキャンしたレポートをダウンロードします。デフォルトではPDFです。必要に応じて、「ScanExportRequest
」の追加パラメータを渡して、CSVやHTMLなどの別の形式でレポートをエクスポートすることもできます。
scan.download('{YOUR SCAN NAME}.pdf')
NessusスキャンをTenable.ioにインポートする
一部のユーザーには別のソリューションが役立つかもしれません。それは、NessusスキャンをリンクされていないスキャナからTenable.ioにインポートして、最新の サイバーエクスポージャーについてより完全なビューを得る機能です。
コード
import os
from tenable_io.client import TenableIOClient
client = TenableIOClient(access_key='{YOUR ACCESS KEY}', secret_key='{YOUR SECRET KEY}')
dir_path = os.path.dirname(os.path.realpath(__file__))
file = os.path.join(dir_path, '{YOUR NESSUS FILE}')
client.scan_helper.import_scan(file, True)
この例の最初の数行は前の例と同じですが、Pythonのosモジュールが追加されています。これは、アップロードするファイルを指定するために使用します。この例では、ファイルは、実行しているスクリプトと同じディレクトリーにある必要があります。
import os
from tenable_io.client import TenableIOClient
client = TenableIOClient(access_key='{YOUR ACCESS KEY}', secret_key='{YOUR SECRET KEY}')
次の行では、実行中のスクリプトのパスをosモジュールを使用して判別し、アップロードするスキャン結果ファイルのフルパスを取得します。
dir_path = os.path.dirname(os.path.realpath(__file__))
file = os.path.join(dir_path, '{YOUR NESSUS FILE}')
最後に、scan_helperの「import_scan」関数を使用してスキャン結果をアップロードします。
client.scan_helper.import_scan(file, True)
このスクリプトを実行した後、アップロードされたスキャンがないかTenable.ioのスキャンページをチェックすることで、動作を確認できます。この例では、スキャンの名前は「offlineScanResults.nessus
」です。
ヒント
複数のスクリプトを使用したり、スクリプトを他のマシンに展開したりする際に役立つヒントは、INIファイルまたは環境変数にAPIキーを設定して、Tenableクライアントがそれを使用できるようにするという方法です。
INIの例
「tenable_io.ini
」という名前のスクリプトを実行するのと同じディレクトリに新しいファイルを作成します。このファイルは、下の例のようにフォーマットします。この方法なら、ログ記録のレベルも簡単に設定できます。不明な理由で失敗するスクリプトがある場合は、これをINFOまたはDEBUGに設定するとよいかもしれません。
[tenable_io]
access_key = 1111d58e443e08e080790193e27ae151c16b0415270b738137e50eecbcc08d74
secret_key = 22220bf73a6bcb0cf4bcd9cf5839bff21357f2cd81884e4984e8ed4ecd4b6d83
logging_level = ERROR
環境変数
むしろINIファイルのルートに行かない場合は、TENABLEIO_ACCESS_KEY
およびTENABLEIO_SECRET_KEY
環境変数を設定して、クライアントにAPIキーを供給することもできます。
詳細情報
関連記事
- Tenable.io