このレシピは、多くのコンピュータにポリシーを割り当てるスクリプトを作成します。スクリプトは、変更するコンピュータを検索し、ポリシーを各コンピュータに割り当てます。
多くのコンピュータでタスクを実行する必要がある場合 (数百台または数千台)、では、作業を小規模なバッチで実行します。
手順
- 小さなバッチのコンピュータを取得します。
- バッチ内の各コンピュータにポリシーを割り当てます。
- すべてのコンピュータにポリシーが割り当てられるまで、この手順を繰り返します。小規模なバッチは、 Workload Security リソースをより効率的に使用します。このレシピは、ポリシーをすべてのコンピュータに小規模なバッチで割り当てます。
開始前の準備
お使いの環境がBashまたはPowerShellを使用してAPIを使用するように設定されていることを既に確認しているはずです。
Bashのjq
Bashスクリプトは
jq
を使用してJSONデータを解析します。インストールされているか確認するには、ターミナルまたはお好みのコマンドラインツールを開き、次のコマンドを入力してください:jq --version
jq
が見つからない場合は、jqのウェブサイトを訪れてインストールしてください。必要な情報
このレシピを完了するために必要な次の情報を収集します。
-
Workload SecurityのURL
-
APIキーの秘密鍵
-
割り当てるポリシーのID。
ポリシーのIDがわからない場合は、ポリシーの検索レシピを使用して取得できます。
Bash
手順
- ターミナルまたは使用しているコマンドラインツールを開きます。
- 次のコマンドを入力してリクエストの詳細を保存します。
<YOUR URL>
をWorkload SecurityのURLに、<YOUR SECRET KEY>
をAPIキーのシークレットに置き換えてください。url=<YOUR URL>
例えば、url=https://cloudone.trendmicro.com
secret=<YOUR SECRET KEY>
例えば、secret=5C58EADA-04BC-4ABC-45CF-B72925A0B674:aFBgpPV8eJQGaY2Dk0LmyQMD7nUGvyIDfIbIQo8Zgm8=
- 次のコマンドを入力してポリシーのIDを保存します。
<YOUR POLICY ID>
をコンピュータのIDに置き換えてください。policyId=<YOUR POLICY ID>
例えば、policyId=1
- 次のコードをコピーして貼り付けて、コンピュータを検索し、ポリシーを割り当てます。
pagesize=10; idOfLastFound=0 ; \ while [ $pagesize -gt 0 ]; do \ echo -e "\nGetting a batch of computers..." page=$(curl -X POST "$url/api/computers/search?expand=none" -H "api-secret-key: $secret" -H "api-version: v1" -H "Content-Type: application/json" -# \ -d "{ \ \"searchCriteria\": [{ \ \"idValue\": \"$idOfLastFound\", \ \"idTest\": \"greater-than\"}], \ \"maxItems\": \"$pagesize\" \ }" \ -k | jq '.[]'); \ pagesize=$(echo $page | jq length); \ for (( i=0; i<$pagesize; i++)); do \ computerId=$(echo $page | jq ".[$i][\"ID\"]"); \ echo "Assigning policy to computer with ID $computerId"; \ curl -X POST "$url/api/computers/${computerId}?expand=none" -H "api-secret-key: $secret" -H "api-version: v1" -H "Content-Type: application/json" -d "{ \"policyID\": \"$policyId\" }" -s -S -o /dev/null; \ done; \ idOfLastFound=$(echo $page | jq '.[-1]["ID"]'); \ done;
Bashスクリプトの詳細
このスクリプトは、他のレシピで実行したスクリプトよりも少し複雑です。
ほとんどのコードはループ内で実行され、ループを繰り返すたびにコンピュータのバッチが検索され、変更されます。検索で返されたコンピュータがなくなると、ループは終了します。最初に、バッチのサイズを定義し、最初の反復で検索の基準として使用するコンピュータIDを設定しました。
pagesize=10; idOfLastFound=0 ; \ while [ $pagesize -gt 0 ]; do \ ... done;
ループ内で、cURLを使用して一連のコンピュータを検索します。検索では、前の反復で見つかった最後のIDよりも大きいIDを持つ10台のコンピュータが見つかります。結果は
jq
にパイプされ、コンピュータの配列を取得します。page=$(curl -X POST "$url/api/computers/search?expand=none" -H "api-secret-key: $secret" -H "api-version: v1" -H "Content-Type: application/json" -# \ -d "{ \ \"searchCriteria\": [{ \ \"idValue\": \"$idOfLastFound\", \ \"idTest\": \"greater-than\"}], \ \"maxItems\": \"$pagesize\" \ }" \ -k | jq '.[]'); \
返されたコンピュータの数:
pagesize=$(echo $page | jq length); \
コンピュータごとに、cURLを使用してポリシーを割り当てます。
for (( i=0; i<$pagesize; i++)); do \ computerId=$(echo $page | jq ".[$i][\"ID\"]"); \ echo "Assigning policy to computer with ID $computerId"; \ curl -X POST "$url/api/computers/${computerId}?expand=none" -H "api-secret-key: $secret" -H "api-version: v1" -H "Content-Type: application/json" -d "{ \"policyID\": \"$policyId\" }" -k -s -S -o /dev/null; \ done; \
最後に、次の反復で検索の基準として使用するために最後に検出されたコンピュータのIDが見つかりました。
idOfLastFound=$(echo $page | jq '.[-1][\"ID\"]'); \
PowerShell
手順
- PowerShellを起動します。
- TLS 1.2を使用するには、次のコマンドを入力します.TLS 1.2は、セキュリティで保護された接続を確立するためにManagerで必要となります。
[Net.ServicePointManager]::SecurityProtocol += [Net.SecurityProtocolType]::Tls12
- 次のコマンドを入力してリクエストの詳細を保存します。
<YOUR URL>
をWorkload SecurityのURLに、<YOUR SECRET KEY>
をAPIキーのシークレットに置き換えてください。-
$url = "<YOUR URL>"
例えば、url=https://cloudone.trendmicro.com
-
$secret = "<YOUR API KEY SECRET>"
例えば、$secret="5C58EADA-04BC-4ABC-45CF-B72725A0B674:aFBgpPV8eJQGaY2Dk0LmyQMD7nUGvyIDfIbIQo8Zgm8="
-
$headers = @{‘api-version’ = “v1”; ‘api-secret-key’ = $secret; 'Content-Type' = "application/json"}
-
- 次のコマンドを入力してポリシーのIDを保存します。
<YOUR POLICY ID>
をコンピュータのIDに置き換えてください。$policyId = <YOUR POLICY ID>
例えば、$policyId = 1
- 次のコードをコピーして貼り付けて、コンピュータを検索し、ポリシーを割り当てます。
$pageSize = 10 $idOfLastFound = 0 while($pageSize -gt 0){ Write-Output "Getting batch of computers..." $page = Invoke-RestMethod -Method 'Post' -Uri "$url/api/computers/search?expand=none" -Headers $headers -Body @" {"searchCriteria": [ { "idTest": "greater-than", "idValue": $idOfLastFound } ], "maxItems": $pageSize} "@ $pageSize = $page.computers.Length for ($i=0; $i -lt $pageSize; $i++){ $id = $page.computers.Get($i).ID Write-Output "Setting policy for computer with ID $id" Invoke-RestMethod -Method 'Post' -Uri "$url/api/computers/${id}?expand=none" -Headers $headers -Body @" {"policyID": "$policyId"} "@ | Out-Null } if ($pageSize -gt 0 ) { $idOfLastFound = $page.computers.Get($pageSize - 1).ID } }
エラーメッセージ基礎となる接続が閉じられました: 送信中に予期しないエラーが発生しました
が表示された場合は、PowerShellを閉じて、再度PowerShellを開き、手順を繰り返してください。
PowerShellスクリプトの詳細
このスクリプトは、他のレシピで実行したスクリプトよりも少し複雑です。
ほとんどのコードはループ内で実行され、ループを繰り返すたびにコンピュータのバッチが検索され、変更されます。検索で返されたコンピュータがなくなると、ループは終了します。まず、バッチのサイズを定義し、最初の反復で検索の基準として使用するコンピュータIDを設定します。
$pageSize = 10 $idOfLastFound = 0 while($pageSize -gt 0){ ... }
ループ内で、
Invoke-RestMethod
が呼び出され、一連のコンピュータを検索しました。この検索では、前の反復で見つかった最後のIDよりも大きいIDを持つ10台のコンピュータが見つかります。page=$(curl -X POST "$url/api/computers/search?expand=none" -H "api-secret-key: $secret" -H "api-version: v1" -H "Content-Type: application/json" -# \ -d "{ \ \"searchCriteria\": [{ \ \"idValue\": \"$idOfLastFound\", \ \"idTest\": \"greater-than\"}], \ \"maxItems\": \"$pagesize\" \ }" \ -k | jq '.[]'); \
次に、返されたコンピュータの数を調べました。
$pageSize = $page.computers.Length
各コンピュータに対して、
Invoke-RestMethod
が呼び出され、ポリシーが割り当てられました。for ($i=0; $i -lt $pageSize; $i++){ $id = $page.computers.Get($i).ID Write-Output "Setting policy for computer with ID $id" Invoke-RestMethod -Method 'Post' -Uri "$url/api/computers/${id}?expand=none" -Headers $headers -Body @" {"policyID": "$policyId"}
最後に、次の反復で検索の基準として使用するために最後に検出されたコンピュータのIDが見つかりました。
$idOfLastFound = $page.computers.Get($pageSize - 1).ID
備考
- コンピュータのバッチ処理サイズを変更するには、
pagesize
(Bash) または$pageSize
(PowerShell) 変数を別の値に設定します。10
の値は通常、控えめなバッチサイズです。
関連リソース
-
コンピュータを変更する (APIレファレンス
-
ポリシーの作成と設定(ガイド)–コンピュータにポリシーを割り当てるセクション
-
リソースの検索 (ガイド) - 検索結果とページングの制限セクション