目次

多くのコンピュータにポリシーを割り当てる(BashおよびPowerShell)

このレシピは、多くのコンピュータにポリシーを割り当てるスクリプトを作成します。スクリプトは、変更するコンピュータを検索し、ポリシーを各コンピュータに割り当てます。

多くのコンピュータでタスクを実行する必要がある場合 (数百台または数千台)、では、作業を小規模なバッチで実行します。

  1. 小さなバッチのコンピュータを取得します。

  2. バッチ内の各コンピュータにポリシーを割り当てます。

  3. すべてのコンピュータにポリシーが割り当てられるまで、この手順を繰り返します。

小規模なバッチは、 Workload Security リソースをより効率的に使用します。このレシピは、ポリシーをすべてのコンピュータに小規模なバッチで割り当てます。

始める前に

BashまたはPowerShellを使用してAPIを使用するように環境が設定されていることを確認しておく必要があります。

Bashのjq

Bashスクリプトは、 jq を使用してJSONデータを解析します。インストールされているかどうかを確認するには、ターミナルまたは任意のコマンドラインツールを開き、次のコマンドを入力します。

jq --version

jq が見つからない場合は、jq website にアクセスしてインストールしてください。

必要な情報

このレシピを完了するために必要な次の情報を収集します。

  • Workload SecurityのURL

  • APIキーの秘密鍵

  • 割り当てるポリシーのID。

ポリシーのIDがわからない場合は、ポリシーの検索 レシピを使用して取得できます。

Bash

  1. ターミナルまたは使用しているコマンドラインツールを開きます。

  2. 次のコマンドを入力して、 <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=

  3. 次のコマンドを入力してポリシーのIDを保存し、 <YOUR POLCIY ID> をコンピュータのIDに置き換えます。

    policyId=<YOUR POLICY ID>

    例: policyId=1

  4. 次のコードをコピーして貼り付けて、コンピュータを検索し、ポリシーを割り当てます。

    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&lt;$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&lt;$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

  1. PowerShellを起動します。

  2. TLS 1.2を使用するには、次のコマンドを入力します.TLS 1.2は、セキュリティで保護された接続を確立するためにManagerで必要となります。

    [Net.ServicePointManager]::SecurityProtocol += [Net.SecurityProtocolType]::Tls12

  3. 次のコマンドを入力して、 <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"}

  4. 次のコマンドを入力してポリシーのIDを保存し、 <YOUR POLCIY ID> をコンピュータのIDに置き換えます。

    $policyId = <YOUR POLICY ID>

    例: $policyId = 1

  5. 次のコードをコピーして貼り付けて、コンピュータを検索し、ポリシーを割り当てます。

    $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
        }
    }

エラーメッセージ The underlying connection was closed: An unexpected error occurred on a sendが表示されたら、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 の値は、通常、保存可能なバッチサイズです。

関連リソース