Taniumは極めて強力なプラットフォームであり、多くのユーザーは独自のツールを使用してTaniumからデータを抽出する必要が生じるかもしれません。 Tanium Connect では、常にデータをエクスポートして、それぞれ製品、サーバー、またはファイルに送信することができますが、場合によっては、データを受け取るのではなく、手動でデータを取得する必要があることもあります。 Taniumの新しいAPIゲートウェイを使えば、このプロセスを非常に簡単に行うことができます。 このブログ記事では、Python を使って Tanium にログインし、マシンデータを照会する方法をご紹介します。
要件
- 最新のAPI GatewayソリューションがインポートされたTanium環境です。 このブログはバージョン 1.3.64.0000で動作確認を行いました。
- Python 3 with “requests” and “JSON” libraries
認証
Taniumからデータの取得を開始する前に、ログインできることを確認する必要があります。 ログインには、Taniumのユーザー名とパスワードを使用する方法と、APIトークンを使用する方法の2つの方法があります。 SSO 経由でログインする場合や、 Tanium Cloud を使用する場合は、ユーザー名とパスワードによるログインはできません。そのため、お使いの Tanium 環境でこのような状況にある場合は、API トークンを使用する必要があります。
APIトークンの作成
APIトークンを作成するには、通常通りTaniumサーバーにログインし、「管理」メニュー内の「APIトークン」オプションを選択してください。
[注:APIトークンの作成には特定の権限が必要です。詳細については、こちらのTaniumのAPIトークンに関するドキュメントをご確認ください。] (新しいタブで開きます)

「APIトークン」ページにアクセスしたら、画面右側にある「新しいAPIトークン」ボタンをクリックしてください。 これにより、トークンを作成し、その有効期間や、このAPIトークンの使用が許可されるAPIアドレスを指定することができます。 モーダルへの入力が完了すると、トークンが表示されたポップアップが、一定時間だけ表示されます。 ポップアップが閉じるとこのトークンは表示されなくなりますので、必ずメモしておいてください。
ユーザー名とパスワードを使用してTaniumにログインする
Tanium環境でSSOによるログインを使用していない場合は、ユーザー名とパスワードを使用して認証を行い、TaniumのAPIを利用することができます。 以下の関数は、ユーザー名とパスワードを使用してTaniumサーバーにログインし、セッショントークンを取得する方法の例です。
[注:このセッショントークンは、一定時間操作がないと有効期限が切れますので、必要に応じて再認証が必要になる場合があります。]
コードブロック 1:ユーザー名とパスワードによるセッショントークンの取得
def loginUsernamePassword(ts: str, username: str, password: str) -> str:
"""
ユーザー名とパスワードの組み合わせを使用して、
経由で Tanium サーバーにログインする方法の例となる関数です。 これにより、
のセッショントークンが返されます。
のパラメータ「ts」は、使用するTaniumサーバーを示します。
のパラメータ「username」は、ログイン時に使用するユーザー名です。
のパラメータ「password」は、ログイン時に使用するパスワードです。
"""
payload = {}
payload["username"] = username
payload["password"] = password
r = requests.post(f"{ts}/api/v2/session/login",
json=payload
)
session_token = r.json()['data']['session']
print(f"ログイン時に受け取ったステータスコード: {r.status_code}")
return session_token
認証のテスト
APIトークンを作成したら、認証のテストを開始できます。 TaniumサーバーへのすべてのHTTPSリクエストにおいて、APIトークンをヘッダーとして追加する必要があります。 Taniumコンソールの「APIトークン」ページ、またはユーザー名とパスワードの組み合わせによるログインのいずれかからセッショントークンを受け取った後、そのトークンが正しく機能するかどうかを確認いたします。 これは、Taniumサーバーの /api/v2/session/validate ルートにリクエストを送信することで実行できます。 以下のファンクションブロックには、これを実現する方法の例が示されています。
コードブロック 2:API/セッショントークンの有効性を確認する
def validateToken(ts: str, token: str):
"""
APIトークンがTaniumサーバーにアクセスし、 200 レスポンスを取得できるかどうかを検証する方法の例です。
パラメータ「ts」は、使用するTaniumサーバーを示します。
例:'https://MyTaniumServer.com'
パラメータ「token」は、TS GUIから生成されたAPIトークンの文字列です。
"""
r = requests.post(f"{ts}/api/v2/session/validate",
json={'session': token},
headers={'session': token}
)
# トークンの検証に成功した場合は、status_code は 200 になるはずです。
print(f"トークン検証の結果のステータスコード: {r.status_code}.")
API Gateway と GraphQL の使用
Tanium Serverへのログインとトークンの検証が正常に完了しましたので、API Gatewayへのクエリを開始し、環境に関する情報を取得することができます。 これまでGraphQLを使ったことがない場合は、GraphQLとは何か、またそのクエリ言語がどのように機能するのかについて、公式ドキュメントをざっと目を通しておくことをお勧めします。 ウェブサイトはこちらです: https://graphql.org/learn/ (新しいタブで開きます)。
Tanium API を使って作業を自動化する前に、Tanium コンソールの API Gateway にアクセスし、クエリを実行できるデータフィールドを確認してみましょう。 写真 2 は、TaniumコンソールのAPI Gatewayエリアにアクセスできる場所を示しています。

このページにアクセスすると、インタラクティブなGraphQL IDEが表示され、さまざまなクエリを試したり、実際のデータを取得したりすることができます。 写真 3 をご覧ください。ここでは、サーバーから報告された現在の時刻を確認するための初期クエリを実行することができます。

Taniumコンソールの対話型GraphQLクエリを使用することで、クエリを調査・作成し、それをPythonスクリプトに取り込んで自動化することができます。 たとえば、以下に示すように、同じ「{now}」クエリを実行する、非常にシンプルなPython関数を作成することができます。
コードブロック 3:Python を使用して「now」クエリを実行する
def graphQLQueryNow(ts: str, token: str):
"""
graphQLQueryNow は、この関数に渡された Tanium サーバーに対して、「now」という GraphQL クエリ(
)を実行します。
パラメータ「ts」は、使用するTaniumサーバーを示します。
パラメータ「token」は、ts GUIから生成されたAPIトークンの文字列です。
"""
jsonObj = {'query': "{now}"}
r = requests.post(ts + "/plugin/products/gateway/graphql",
json=jsonObj,
headers={'session': token},
)
print(f"'now' クエリから受け取ったステータスコード: {r.status_code}")
print(f"'now' クエリの JSON レスポンス: {r.json()}")
Python を使って最初の Tanium クエリを実行する上で、これは素晴らしい第一歩ですが、ここでは Tanium コンソールのインタラクティブな GraphQL エクスプローラーからエンドポイントデータを取得してみましょう。 下の写真は、すべてのエンドポイントとそのオペレーティングシステムを照会する方法を示しています。

これでようやくエンドポイントのデータが得られるようになりましたが、まだ一つだけ足りない部分があります。 お使いの環境にあるマシンが 20 台以下の場合を除き、このデータでは環境全体の情報が把握できないことがお分かりいただけるでしょう。 GraphQLではデフォルトでページネーションが有効になっているため、環境全体のデータセットをすべて取得するには、複数のリクエストを行う必要があります。 クエリを拡張してページネーション情報を表示できるようにしましょう。そうすれば、Pythonスクリプトを使って自動化を行う際に、これをどのように解析すればよいかがわかります。

この「pageInfo」データが有効になっている場合、「hasNextPage」フィールドを通じて、サーバー上で解析すべきデータがまだ残っているかどうかを確認することができます。 さらに、「startCursor」および「endCursor」フィールドを確認することで、データセット内の現在位置を把握することができます。 次のデータセットを取得したい場合は、以下に示すように、エンドポイントのクエリに「(after: “lastcursor”)」を追加するだけで済みます。

この「after」引数をエンドポイントのクエリに追加すると、結果として得られるデータは、次の 20 台のマシンであることがわかります。 データのページネーションの方法がわかったところで、いよいよ、自動クエリを実行してくれるPythonスクリプトにすべてをまとめましょう。
コードブロック 4:すべてを組み合わせてデータセット全体をクエリする
def graphQL_pagination(ts: str, token: str):
"""
graphQL_pagination は、
の GraphQL およびページネーション機能を使用して、各エンドポイントの名前と OS を取得します。
パラメータ「ts」は、使用するTaniumサーバーを示します。
パラメータ「token」は、ts GUIから生成されたAPIトークンの文字列です。
"""
init_query = '''
{
endpoints {
pageInfo {
startCursor
endCursor
hasNextPage
}
edges {
node {
name
os {
name
}
}
}
}
}
'''
def do_request(ts: str, token: str, queryString: str) -> requests.Response:
r = requests.post(ts + "/plugin/products/gateway/graphql",
json={'query': queryString},
headers={'session': token},
)
return r
endpoint_data = []
next_query = init_query
while True:
# リクエストを実行し、レスポンスをJSON形式に変換します
r = do_request(ts, token, next_query)
resp_obj = r.json()
# JSONオブジェクトからページ情報を抽出します
has_next_page = resp_obj["data"]["endpoints"]["pageInfo"]["hasNextPage"]
end_cursor = resp_obj["data"]["endpoints"]["pageInfo"]["endCursor"]
start_cursor = resp_obj["data"]["endpoints"]["pageInfo"]["startCursor"]
# カーソルがどの位置にあるかをユーザーに知らせます。
print(
f"start: {start_cursor} と end: {end_cursor} の間のエンドポイントに関するデータを受信しました。")
# エンドポイントデータをリストオブジェクトに追加します
endpoint_data.extend(resp_obj["data"]["endpoints"]["edges"])
# もし次のページが「False」であれば、データセットの末尾に到達したということです!
if not has_next_page:
break
# 「after」引数を元のクエリに挿入します
next_query = init_query[:25] + \
f"(after: \"{end_cursor}\") " + init_query[25:]
この記事が、Tanium以外でのAPI Gatewayの活用方法について、皆様の第一歩となることを願っております。 Tanium Connectが提供するネイティブコネクタを使用するだけで、多くのユースケースを実現できることをお忘れなく。 カスタマイズされた統合機能を構築する必要がある場合、API Gatewayは非常に役立つリソースであり、モジュール対応を含め、毎週新たな機能が追加されています。 ロードマップに関する詳細情報や、API Gatewayの導入・運用に関するさらなるサポートが必要な場合は、Taniumの担当者までお問い合わせください。
の「Tanium Integrations Gallery」( )(新しいタブで開きます) を活用して、Taniumプラットフォームの潜在能力を最大限に引き出す方法をご確認ください。これは、すべての統合機能に対するリアルタイムの可視性を提供し、お客様が簡単に統合機能を発見、設定、展開できるようにする一元化されたコンソールです。 Tanium Integrations Galleryは、MicrosoftやServiceNowなどの主要なテクノロジーパートナーとのTaniumプラットフォームの統合を簡素化・迅速化することで、テクノロジー投資の価値を最大化すると同時に、リスクや運用上の非効率性を低減します。




