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

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

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

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

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

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

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

始める前に

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

Bashのjq

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

jq --version

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

必要な情報

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

  • Workload SecurityのURL

  • APIキーの秘密鍵

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

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

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 の値は、通常、保存可能なバッチサイズです。

関連リソース