Copy the following code into a text or code editor, such as Visual Studio Code, and
save as
a terraform (.TF) file.
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "=3.112.0"
}
}
}
locals {
issuer_url = "https://cloudaccounts-us.xdr.trendmicro.com"
subject_urn = "urn:visionone:identity:us:{your_v1_business_id}:account/{your_v1_business_id}"
subscription_id = {your_subscription_id}
cloud_account_name = {your_cloud_account_name}
cloud_account_description = ""
v1_account_id = {your_v1_business_id}
api_key = {your_api_key}
endpoint = "https://api.xdr.trendmicro.com/public/v2/direct/cam/public/cam/api/v1"
connected_security_services_json = {your_connected_security_services_json}
}
#Configure the Microsoft Azure Provider
provider "azurerm" {
features {}
subscription_id = local.subscription_id
skip_provider_registration = true
}
# static variables
locals {
custom-role-name = "v1-custom-role-${local.subscription_id}"
service-principal-id = {first_deploy_output_service_principal_id}
app-registration-id = {first_deploy_output_app_registration_id}
}
resource "azurerm_role_definition" "custom-role-definition" {
name = local.custom-role-name
scope = "/subscriptions/${local.subscription_id}"
description = "This is a custom role created via Terraform"
permissions {
#start of role replace
actions = ["Microsoft.ContainerService/managedClusters/listClusterUserCredential/action","Microsoft.ContainerService/managedClusters/read","Microsoft.Resources/subscriptions/resourceGroups/read","Microsoft.Authorization/roleAssignments/read","Microsoft.Authorization/roleDefinitions/read","*/read","Microsoft.AppConfiguration/configurationStores/ListKeyValue/action","Microsoft.Network/networkWatchers/queryFlowLogStatus/action","Microsoft.Web/sites/config/list/Action"]
#end of role replace
}
}
resource "azurerm_role_assignment" "role-assignment" {
scope = "/subscriptions/${local.subscription_id}"
role_definition_id = azurerm_role_definition.custom-role-definition.role_definition_resource_id
principal_id = local.service-principal-id
}
resource "null_resource" "vision-one-cloud-account-sync" {
provisioner "local-exec" {
when = create
command = <<-EOT
#!/bin/bash
echo "Setting parameters..."
auth="${local.api_key}"
subscription_id="${local.subscription_id}"
v1_account_id="${local.v1_account_id}"
http_endpoint="${local.endpoint}"
list_accounts_url="$http_endpoint/azureSubscriptions/$subscription_id"
add_account_url="$http_endpoint/azureSubscriptions"
modify_account_url="$http_endpoint/azureSubscriptions/$subscription_id"
x_task_id="$(uuidgen)"
x_trace_id="$(uuidgen)"
echo "Getting Azure account information..."
list_response=$(curl -s -w "%%{http_code}" -X GET "$list_accounts_url" -H "Authorization: Bearer $auth" -H "Content-Type: application/json" -H "x-user-role: Master Administrator" -H "x-customer-id: $v1_account_id" -H "x-task-id: $x_task_id" -H "x-trace-id: $x_trace_id")
status_code=$${list_response: -3}
cloud_accountpayload=$${list_response:0:$(($${#list_response}-3))}
application_id=$(echo "$cloud_accountpayload" | jq -r '.applicationId // empty')
echo "status code is $status_code"
echo "application ID is $application_id"
if [ "$status_code" -eq 200 ] && [ -n "$application_id" ]; then
echo "Common cloud account found, updating Azure account..."
json_body='{
"name": "${local.cloud_account_name}",
"description": "${local.cloud_account_description}"
}'
# Make HTTP request using cURL
status_code=$(curl -i -o /dev/null -X PATCH \
-H "Authorization: Bearer $auth" \
-H "Content-Type: application/json" \
-H "x-user-role: Master Administrator" \
-H "x-customer-id: $v1_account_id" \
-H "x-task-id: $x_task_id" \
-H "x-trace-id: $x_trace_id" \
-d "$json_body" \
-w "%%{http_code}" \
"$modify_account_url"
)
# Check the status_code status
if [[ "$status_code" == "204" ]]; then
echo "Calling cloud account API success status=$status_code"
else
echo "Response status: $status_code"
echo "Error: Could not call cloud account API. Please see the logs attached."
exit 1
fi
elif [ "$status_code" -eq 404 ] || [ -z "$application_id" ]; then
echo "No common cloud account found, connecting Azure account..."
json_body='{
"tenantId": "${data.azurerm_client_config.current.tenant_id}",
"applicationId": "${local.app-registration-id}",
"subscriptionId": "${local.subscription_id}",
"name": "${local.cloud_account_name}",
"description": "${local.cloud_account_description}",
"connectedSecurityServices": ${local.connected_security_services_json}
}'
# Make HTTP request using cURL
status_code=$(curl -i -o /dev/null -X POST \
-H "Authorization: Bearer $auth" \
-H "Content-Type: application/json" \
-H "x-user-role: Master Administrator" \
-H "x-customer-id: $v1_account_id" \
-H "x-task-id: $x_task_id" \
-H "x-trace-id: $x_trace_id" \
-d "$json_body" \
-w "%%{http_code}" \
"$add_account_url"
)
# Check the status_code status
if [[ "$status_code" == "201" ]]; then
echo "Calling cloud account API success status=$status_code"
else
echo "status_code status: $status_code"
echo "Error: Could not call cloud account API. Please see the logs attached."
exit 1
fi
else
echo "Unexpected error when getting Azure account information..."
exit 1
fi
EOT
}
triggers = {
always_run = "${timestamp()}"
}
depends_on = [azurerm_role_definition.custom-role-definition, azurerm_role_assignment.role-assignment]
}
resource "null_resource" "grant_admin_consent_debug_info" {
triggers = {
service_principal_objectid = local.service-principal-id
tenant_id = data.azurerm_client_config.current.tenant_id
app_registration_id = local.app-registration-id
}
provisioner "local-exec" {
command = <<-GRANTCONSENTCMD
echo "service_principal_objectid=${self.triggers.service_principal_objectid}"
echo "tenant_id=${self.triggers.tenant_id}"
echo "app_registration_id=${self.triggers.app_registration_id}"
GRANTCONSENTCMD
}
depends_on = [null_resource.vision-one-cloud-account-sync]
}
data "azurerm_client_config" "current" {
}
output "tenant-id" {
value = data.azurerm_client_config.current.tenant_id
}
output "app-registration-id" {
value = local.app-registration-id
}
output "service-principal-object-id" {
value = local.service-principal-id
}
