Microsoft Azure: AI assistant (LLM)¶
If you are deploying with an AI coding assistant (Claude, Codex, and similar),
copy the prompt below and paste it into your assistant. It drives the same
az CLI flow as the CLI (az) guide, but written for the assistant to
follow step by step, pausing for your confirmation and for the values only you can
supply.
Before you paste
Give the assistant a session that already has the Azure CLI (az) logged in
(an agentic tool with shell access, or paste the commands it returns into your
own terminal), with azcopy installed. Have your engagement lead's values
ready: the VHD read SAS URL (the shared image reference), a target resource
group and region, your VNet/subnet (the full subnet resource ID), an
admin username you choose (azureuser works), and your SSH public key.
The assistant will ask for anything it is missing.
Deployment prompt¶
You are helping me deploy the Sophos Remote Testing Appliance (RTA) as a virtual
machine in my Microsoft Azure subscription, using the Azure CLI (az). Work through
the steps below in order. Before any command that changes state, tell me what it
will do and wait for my confirmation.
CONTEXT:
- The appliance is a prebuilt image my engagement lead shared with me as a
time-limited, read-only SAS URL. It is a Gen2 / UEFI Linux VHD with no engagement
identity baked in, so on first boot it shows an "Appliance Registration" screen
with a one-time activation code that I send back to Sophos. There is no software
to install and no inbound access.
WHAT I WILL PROVIDE (ask me for any you do not have; never guess these):
- <SAS_URL>: the VHD read SAS URL my engagement lead sent (quote it). It is
time-limited; if it has expired I will request a fresh one.
- <RESOURCE_GROUP>: the resource group to create or use for these resources.
- <LOCATION>: the Azure region for the resources (for example eastus). Use the same
region as my subnet's VNet.
- <SUBNET_ID>: the FULL subnet resource ID (starts /subscriptions/...). Get it with:
az network vnet subnet show -g <rg> --vnet-name <vnet> -n <subnet> --query id -o tsv
- <SSH_KEY_PATH>: the path to my SSH PUBLIC key (for example ~/.ssh/id_rsa.pub).
- <ADMIN_USERNAME> (optional): an admin username I choose. Azure requires one, but it
is arbitrary and only for break-glass SSH. If I do not give one, use azureuser.
STEPS:
1. Confirm the CLI is logged in to the right subscription:
az account show --query '[name,id]' --output tsv
If this errors, stop and tell me to run "az login".
2. Create the resource group (skip if <RESOURCE_GROUP> already exists):
az group create -n <RESOURCE_GROUP> -l <LOCATION>
3. Create an empty Gen2 "upload" disk sized to the exact VHD byte length. The disk
MUST be Gen2 (--hyper-v-generation V2); a Gen1 disk boots to a black screen. Do
NOT enable Trusted Launch / Secure Boot; leave the security type default.
az disk create -g <RESOURCE_GROUP> -n rta-disk -l <LOCATION> \
--os-type Linux --hyper-v-generation V2 \
--upload-type Upload --upload-size-bytes 42949673472 --sku Standard_LRS
The value 42949673472 is the exact byte length of the 40 GiB VHD and must be used
verbatim; an upload disk created at the wrong size makes the copy fail.
4. Get a temporary WRITE SAS for the disk (grep pulls the URL out of the JSON, which
avoids the accessSAS/accessSas field-name difference between az versions):
DISK_SAS=$(az disk grant-access -g <RESOURCE_GROUP> -n rta-disk \
--access-level Write --duration-in-seconds 86400 -o json | grep -o 'https[^"]*')
5. Server-side copy our VHD straight into the disk (minutes, not a full download):
azcopy copy "<SAS_URL>" "$DISK_SAS" --blob-type PageBlob
6. Revoke the disk write SAS:
az disk revoke-access -g <RESOURCE_GROUP> -n rta-disk
7. Create a generalized Gen2 managed image from the disk:
az image create -g <RESOURCE_GROUP> -n rta-image --os-type linux --hyper-v-generation V2 \
--source "$(az disk show -g <RESOURCE_GROUP> -n rta-disk --query id -o tsv)"
8. Create the VM. Standard_D2s_v3 is the recommended size (Gen2-capable). Supply MY
public key. No public IP and no network security group; the appliance only needs
outbound access. Pass the FULL subnet ID with --subnet and do NOT also pass
--vnet-name.
az vm create -g <RESOURCE_GROUP> -n Sophos-RTA \
--image "$(az image show -g <RESOURCE_GROUP> -n rta-image --query id -o tsv)" \
--size Standard_D2s_v3 \
--admin-username <ADMIN_USERNAME> \
--ssh-key-values <SSH_KEY_PATH> \
--subnet <SUBNET_ID> \
--public-ip-address "" --nsg ""
VERIFY:
9. Confirm the VM is running with a private IP and no public IP:
az vm show -g <RESOURCE_GROUP> -n Sophos-RTA -d \
--query '[powerState, privateIps, publicIps]' --output tsv
Expect "VM running", a private IP populated, and an empty public IP.
10. A minute or two after the VM starts, read the one-time activation code off the
console. Azure renders the "Appliance Registration" screen on the boot-diagnostics
screenshot: open the VM in the portal and use Help > Boot diagnostics > Screenshot
(or Serial console), or from the CLI read the serial log with:
az vm boot-diagnostics get-boot-log -g <RESOURCE_GROUP> -n Sophos-RTA
The screen shows a short code (for example "4 5 D C V Y"). Read that code back to
me exactly. Do NOT send it anywhere yourself: I give it to my Sophos engagement
lead, who activates the appliance. After activation the console switches to a live
status dashboard. (Azure downscales the screenshot, so the text can look blurry;
that is cosmetic.)
RULES YOU MUST FOLLOW:
- These steps are authoritative. If a command fails, returns something unexpected,
or reality does not match what is written here, STOP and show me the exact output.
Do not improvise, invent flags, or try alternative commands on your own.
- The appliance needs exactly ONE connection: an outbound tunnel on TCP/443 to
connect.remotetesting.secureworks.com. Never open, forward, or allow any INBOUND
port to it. If connectivity fails, the problem is on the outbound path, never a
missing inbound rule.
- Never enable Secure Boot and never change the firmware or boot type away from what
these steps specify (UEFI / Generation 2). The appliance will not boot otherwise.
- Do not SSH into, log in to, or reconfigure the appliance. Once it boots it
provisions itself; there is nothing to set up inside it.
- Every value in angle brackets (<LIKE_THIS>) must come from me. Never guess, invent,
or reuse one. Ask me for any you do not have before running the step that needs it.
- Do not weaken security to force the connection (do not disable TLS inspection, and
do not turn off a firewall). If something is blocked, tell me what and let me decide.
- Do only what these steps describe: deploy this one appliance. Do not create extra
resources, install extra software, or take any action beyond that.
Network access¶
The appliance makes one connection to do its job: an outbound tunnel to the Sophos headend. Nothing inbound is ever required: you never open or forward any ports to the appliance.
Allow this outbound destination
| Destination | connect.remotetesting.secureworks.com |
| IP addresses | 3.33.194.251 and 15.197.255.2 (static; these do not change) |
| Port / protocol | TCP 443, carrying OpenVPN (not HTTPS) |
| Direction | Outbound only |
Allow egress on TCP/443 to that destination from the appliance's network. On a next-generation firewall or NAC-controlled network, an L3 "allow 443" rule is often not enough: Layer-7 application control, TLS/SSL decryption, or NAC can still drop the tunnel even when the port is open. See Connectivity troubleshooting for the exact firewall and NAC exceptions to request.
Troubleshooting¶
Deployed but something isn't right?
See this platform's troubleshooting guide for the most common issues here and how to fix them.