Skip to main content

AWS reference

Facts to look up while deploying and running Polaris on AWS. For why AWS works the way it does, see Polaris on AWS.

What Polaris offers on AWS today​

CapabilityOn AWS
AMD SEV-SNP on shared tenancy, in us-east-2 and eu-west-1Available
Attestation of image, runtime and kernel, with key grants withdrawn when a layer you enforce failsAvailable
Status routes and incident records readable through the endpointAvailable
A client checking the hardware report with the Polaris SDKAvailable on shared tenancy, with an SDK that includes polaris-sdk#3. Not yet on a Dedicated Host
Deployment from the AWS Marketplace imageAvailable, with ami_id set by hand
SEV-SNP on Dedicated Hosts, in every commercial regionPreview
A route for the workload to use its attestation-gated keyAvailable
Ending the key grant when the Policy Manager stops or hangsAvailable
License enforcementNot yet enforced
Checking the 2048-bit signature on the instance identity documentAvailable
More than one workload VM, a load balancer or a fixed public addressNot yet available
Limiting inbound traffic to chosen address ranges, or a private subnet for the workload VMNot yet available
Serving your own TLS certificate from the proxyNot yet available
Outbound connections to other VPCs or to ports other than 443Not yet available
Shipping logs, metrics or verdicts to CloudWatch or a SIEM from the VMsNot yet available
Remote Terraform state, running deploy from CI, a permissions boundary on the created rolesNot yet available

Regions and tenancy​

AWS runs Polaris on AMD SEV-SNP, a CPU feature that encrypts a VM's memory and lets the VM prove what it is running. Where SEV-SNP is available depends on tenancy.

TenancyRegionsReport signed byPolaris
SharedUS East (Ohio) us-east-2, Europe (Ireland) eu-west-1VLEK, a key AMD issues to AWSSupported
Dedicated HostAny commercial regionVCEK, a key unique to the physical chipPreview

Shared tenancy is the normal case, where VMs from many AWS customers share servers, while a Dedicated Host is a physical server rented whole by one customer. Both facts come from AWS's SEV-SNP requirements.

The deployment config accepts the two shared-tenancy regions on its own, and any commercial region together with cloud.aws.dedicated_host_id. The tooling carries AWS's instance identity certificates for us-east-2, eu-west-1, us-west-1 and us-west-2, and Run on a Dedicated Host shows how to add another region's.

Choose a region from this table rather than from the EC2 instance-type catalogue. The catalogue describes instance types, and it lists SEV-SNP-capable types in regions where AWS then refuses an SEV-SNP launch.

Instance sizes​

SEV-SNP is offered on part of three instance families.

FamilySizes with SEV-SNP
m6alarge to 8xlarge
c6alarge to 16xlarge
r6alarge to 4xlarge

The deployment config accepts these sizes and refuses the larger ones in each family.

VMConfig keyDefault
Workload VMcompute.cvm_machine_typem6a.xlarge
Policy Manager VMcompute.pm_machine_typem6a.large

Changing the Policy Manager's size changes its launch measurement, so capture a pinned measurement again after the change.

What a deployment creates​

Everything below is created in your account and removed by destroy, except where noted.

Network

  • A VPC, 10.0.0.0/16, with a public subnet 10.0.1.0/24 for the workload VM and a private subnet 10.0.2.0/24 for the Policy Manager. On a Dedicated Host both subnets are in the host's Availability Zone. On shared tenancy AWS chooses each subnet's zone.
  • An internet gateway, and a NAT gateway with an Elastic IP for the Policy Manager's outbound traffic.
  • Interface endpoints for EC2, ECR (ecr.api and ecr.dkr), KMS, Secrets Manager, SSM and STS, and a gateway endpoint for S3, which let the VMs reach those services with no internet access. The SSM endpoint carries the Policy Manager's heartbeat, and the EC2 endpoint its check that a Marketplace instance is running. Any other AWS service needs its address ranges in network.allowed_egress_cidrs.
  • Three security groups:
    • The workload VM accepts HTTPS on port 443 from any address. Its outbound traffic goes to the VPC, to S3, and to the ranges in network.allowed_egress_cidrs on port 443.
    • The Policy Manager accepts traffic from the workload VM, and SSH from the cloud.aws.ssh_allowed_cidrs ranges when that is set. Its outbound traffic goes through the NAT gateway to any address.
    • The endpoints accept HTTPS from the two VMs.
  • SSH on port 22 to the workload VM, when cloud.aws.ssh_allowed_cidrs is set.

Compute

  • Two EC2 instances, the workload VM and the Policy Manager, both launched with SEV-SNP enabled. The workload VM takes a public address from AWS at launch.
  • Encrypted root volumes of 100 GB for the workload VM and 50 GB for the Policy Manager, deleted with their instances.
  • The instance metadata service set to require session tokens (IMDSv2) on both. On the workload VM it answers the VM itself and no container.
  • A separate encrypted EBS volume, 20 GB gp3, holding the Policy Manager's state, so that the state survives the instance being replaced.

Identity

Secrets and keys

  • Two Secrets Manager secrets, <name>-management-token and <name>-readonly-token.
  • A KMS key for the Policy Manager's identity, with the alias alias/<name>-pm-identity. Later deployments under the same name reuse it, and destroy schedules it for deletion after seven days, the shortest wait AWS allows.
  • Grants on your KMS key, which the Policy Manager creates and retires as the verdict changes and which destroy revokes.

Grant retirer

  • An SSM parameter, /polaris/<name>/pm-heartbeat, which the Policy Manager rewrites every 60 seconds.
  • A Lambda function, <name>-grant-retirer, with its own IAM role and a CloudWatch log group. It retires this deployment's grants on your key when the Policy Manager instance stops, or when the heartbeat is more than 300 seconds old.
  • Two EventBridge rules that run it: one on the Policy Manager instance stopping, and one every 5 minutes.
  • CloudWatch alarms for the Policy Manager's status check, the retirer's errors and each time it retires grants. They notify nobody until you add a target, such as an SNS topic, in CloudWatch.

Created, and kept by destroy

  • ECR repositories under polaris.docker_repo, by default polaris-docker/, one each for the proxy, the Policy Manager and the Sentinel, and one for your workload when deploy builds it. deploy copies the Polaris images into them, and later deployments with the same prefix reuse them, so the default prefix is shared by every deployment in the account and region that keeps it.

Supplied by you

  • Your KMS key, which you create once and keep because your data is encrypted under it.
  • The EC2 key pair.

The roles the deployment creates​

RoleCanOn
<name>-cvm-role, the workload VMsecretsmanager:GetSecretValueThe deployment's two token secrets
ecr:GetAuthorizationToken*
ecr:BatchGetImage, ecr:GetDownloadUrlForLayer, ecr:BatchCheckLayerAvailabilityECR repositories in your account
Use of your KMS keyThrough the grant alone, held until a layer you enforce fails
<name>-pm-role, the Policy Managerkms:CreateGrant, kms:RetireGrant, kms:ListGrantsYour KMS key
kms:DecryptIts own identity key, with the encryption context purpose=polaris-pm-identity-v1 and deployment=<name>
ssm:PutParameterIts heartbeat parameter
ec2:DescribeInstances*, to check that the instance a Marketplace identity document names is running with the listing's product code
The same secret and ECR access as the workload VMAs above
<name>-grant-retirer, the Lambda functionkms:ListGrants, kms:RetireGrantYour KMS key
ssm:GetParameterThe heartbeat parameter
ec2:DescribeInstancesTo read the Policy Manager instance's state

The grant the Policy Manager creates names <name>-cvm-role as the grantee, allows Decrypt and GenerateDataKey, names the Policy Manager's role session as the retiring principal, and is limited to the encryption context purpose=polaris-workload-data-v1 and deployment=<name>. KMS refuses a call under the grant that carries no context or another deployment's. The retirer retires only grants named polaris- whose grantee is this deployment's <name>-cvm-role.

The Policy Manager role's IAM policy allows kms:CreateGrant only for that grant. The grantee must be <name>-cvm-role, the operations at most Decrypt and GenerateDataKey, and the constraint EncryptionContextEquals with exactly that context. On the HMAC key it allows only GenerateMac and VerifyMac to the same grantee. On both keys the retiring principal must be one of the role's own sessions, arn:aws:sts::<account>:assumed-role/<name>-pm-role/*. That refuses a grant with no retiring principal, or with the role itself as the retiring principal. It does not stop the role's credentials from creating a grant under a name other than polaris-<cvm_id>, and neither the Policy Manager nor the retirer removes such a grant yet. The key policy statements in Your KMS key's policy add the same limits on your side, and they hold even if the role's policy is changed.

Where a deployment connects​

FromToFor
The machine that runs deployAWS APIs in your accountCreating and checking the deployment
The machine that runs deployghcr.io, Fr0ntierX's container registryCopying the Polaris images into your ECR, pinned by digest
Workload VMThe VPC endpoints for ECR, KMS, Secrets Manager, STS and S3Pulling images, reading its token, and AWS calls
Workload VMThe instance metadata service and the Amazon Time Sync Service, both local to the VMIdentity, credentials and time
Workload VMThe ranges in network.allowed_egress_cidrs, on port 443Your workload's outbound traffic
Policy ManagerThe internet, through the NAT gatewayAMD's Key Distribution Service, for certificates
Policy ManagerThe VPC endpoint for SSMIts heartbeat
The grant retirer, in LambdaAWS APIs in your accountReading the heartbeat and the Policy Manager's state, and retiring grants

The Polaris images on ghcr.io are private, so Docker on the machine that runs deploy needs a login with read access that Fr0ntierX grants.

The deployment creates no cross-account role and no support access for Fr0ntierX, and the Session Manager agent is switched off on the VMs. Neither VM sends telemetry or usage metering.

DNS lookups from both VMs go to the VPC's AWS resolver. Security groups do not filter that traffic, so it is not limited by network.allowed_egress_cidrs.

IAM permissions​

The identity that deploys​

The identity that runs deploy and destroy needs the actions below. The AWS managed policy AdministratorAccess covers all of them, and PowerUserAccess covers all but the IAM actions, which you then add from the IAM row.

ServiceActionsUsed for
EC2ec2:Describe*, ec2:CreateVpc, ec2:DeleteVpc, ec2:ModifyVpcAttribute, ec2:CreateSubnet, ec2:DeleteSubnet, ec2:ModifySubnetAttribute, ec2:CreateInternetGateway, ec2:AttachInternetGateway, ec2:DetachInternetGateway, ec2:DeleteInternetGateway, ec2:AllocateAddress, ec2:ReleaseAddress, ec2:DisassociateAddress, ec2:CreateNatGateway, ec2:DeleteNatGateway, ec2:CreateRouteTable, ec2:DeleteRouteTable, ec2:CreateRoute, ec2:DeleteRoute, ec2:AssociateRouteTable, ec2:DisassociateRouteTable, ec2:CreateSecurityGroup, ec2:DeleteSecurityGroup, ec2:AuthorizeSecurityGroupIngress, ec2:AuthorizeSecurityGroupEgress, ec2:RevokeSecurityGroupIngress, ec2:RevokeSecurityGroupEgress, ec2:CreateVpcEndpoint, ec2:DeleteVpcEndpoints, ec2:ModifyVpcEndpoint, ec2:RunInstances, ec2:TerminateInstances, ec2:StopInstances, ec2:StartInstances, ec2:ModifyInstanceAttribute, ec2:ModifyInstanceMetadataOptions, ec2:CreateVolume, ec2:DeleteVolume, ec2:AttachVolume, ec2:CreateTags, ec2:DeleteTags, ec2:GetConsoleOutputThe network, the instances and the state volume. Terraform can use StopInstances and StartInstances to change an instance's size in place, and GetConsoleOutput reads each VM's SSH host keys from its serial console
Route 53route53:AssociateVPCWithHostedZonePrivate DNS names for the interface endpoints
IAMiam:CreateRole, iam:DeleteRole, iam:GetRole, iam:UpdateAssumeRolePolicy, iam:PutRolePolicy, iam:GetRolePolicy, iam:DeleteRolePolicy, iam:ListRolePolicies, iam:ListAttachedRolePolicies, iam:CreateInstanceProfile, iam:DeleteInstanceProfile, iam:GetInstanceProfile, iam:AddRoleToInstanceProfile, iam:RemoveRoleFromInstanceProfile, iam:ListInstanceProfilesForRole, iam:PassRoleThe two instance roles, and the condition on the Policy Manager role's trust policy
Secrets Managersecretsmanager:CreateSecret, secretsmanager:DeleteSecret, secretsmanager:DescribeSecret, secretsmanager:PutSecretValue, secretsmanager:GetSecretValue, secretsmanager:GetResourcePolicy, secretsmanager:TagResourceThe two token secrets
KMS, on your keykms:DescribeKey, kms:ListGrants, kms:RevokeGrantChecking the key before deploying, and revoking the deployment's grants on destroy
KMS, for the identity keykms:CreateKey, kms:TagResource, kms:PutKeyPolicy, kms:DescribeKey, kms:Encrypt, kms:CreateAlias, kms:DeleteAlias, kms:ScheduleKeyDeletionCreating the Policy Manager's identity key, finding it again on later runs, and removing it on destroy
Grant retirerCreate, read, tag and delete for Lambda functions and their invoke permissions, EventBridge rules and targets, SSM parameters, CloudWatch log groups, metric filters and alarms, plus iam:AttachRolePolicy and iam:DetachRolePolicy for its roleThe Lambda function, its triggers, the heartbeat parameter and the alarms. PowerUserAccess covers all but the IAM actions
ECRecr:GetAuthorizationToken, ecr:DescribeRepositories, ecr:CreateRepository, ecr:BatchGetImage, ecr:GetDownloadUrlForLayer, ecr:BatchCheckLayerAvailability, ecr:InitiateLayerUpload, ecr:UploadLayerPart, ecr:CompleteLayerUpload, ecr:PutImageCopying the Polaris images into your registry on every deploy, pushing your workload image when deploy builds it, and pinning images by digest

To narrow the scope:

  • Scope iam:PassRole to <name>-cvm-role, <name>-pm-role and <name>-grant-retirer, and the other IAM actions to role/<name>-* and instance-profile/<name>-*.
  • Scope the identity key's actions to arn:aws:kms:<region>:<account>:key/*, since its ID is unknown in advance, while kms:CreateKey takes no resource and needs *. kms:CreateAlias and kms:DeleteAlias also need the alias, arn:aws:kms:<region>:<account>:alias/<name>-pm-identity. Without it, deploy fails after it has created the key. AWS checks kms:PutKeyPolicy when the key is created as well as on later runs.
  • Scope the ECR actions other than ecr:GetAuthorizationToken to repositories under the deployment's polaris.docker_repo prefix, polaris-docker/ by default.

An identity that can create roles, write their policies and pass them to an instance it launches can give that instance any permission in the account, so treat the deploying identity as an administrator of the account it deploys into, however narrowly it is scoped. This is one more reason to give each deployment a dedicated account.

Without kms:RevokeGrant, destroy still removes the deployment and prints the commands to revoke its grants by hand.

On a Dedicated Host, the identity that allocates and releases the host needs ec2:AllocateHosts and ec2:ReleaseHosts. The tooling itself reads the host with ec2:DescribeHosts, which ec2:Describe* covers.

Two settings outside this list can also affect a deployment:

  • If your account encrypts new EBS volumes by default with a customer-managed key, the deploying identity also needs kms:CreateGrant, kms:GenerateDataKeyWithoutPlaintext, kms:Decrypt, kms:DescribeKey and kms:ReEncrypt* on that key. The AWS-managed default key needs nothing extra.
  • Service control policies in your AWS organization, and permission boundaries on the deploying identity, can deny actions this list allows. The error message names the kind of policy that denied the call.

Your KMS key's policy​

The Policy Manager's role reaches your key through an IAM policy, which takes effect when your key's policy lets IAM policies in your account grant access to the key, as the default key policy does. If your key policy names its principals directly, it also needs to allow these:

  • The Policy Manager's role, <name>-pm-role: kms:CreateGrant, kms:ListGrants and kms:RetireGrant.
  • The grant retirer's role, <name>-grant-retirer: kms:ListGrants and kms:RetireGrant.
  • The identity that deploys: kms:DescribeKey, kms:ListGrants and kms:RevokeGrant.

KMS checks that every principal a key policy names exists when you save the policy, so add these after the first deploy has created the roles.

The key must also be customer-managed, enabled, symmetric (SYMMETRIC_DEFAULT), for ENCRYPT_DECRYPT, and in the same region as the deployment, and the config must name it by its full ARN rather than an alias. deploy checks all of these before it creates anything.

To limit the grants the Policy Manager can make on your side as well, add these three statements. They match the role by its ARN in a condition, so you can add them before the role exists.

They were tested against a live key on 28 October 2026. With them in place, the Policy Manager still got its grant, and KMS refused a grant to another grantee, one with other operations, and one with no retiring principal or with the role in place of its session. They do not limit the encryption context. The Policy Manager role's own policy does that.

[
{
"Sid": "PolarisGrantsNameOnlyTheWorkloadRole",
"Effect": "Deny",
"Principal": "*",
"Action": "kms:CreateGrant",
"Resource": "*",
"Condition": {
"ArnEquals": { "aws:PrincipalArn": "arn:aws:iam::<account>:role/<name>-pm-role" },
"StringNotEquals": { "kms:GranteePrincipal": "arn:aws:iam::<account>:role/<name>-cvm-role" }
}
},
{
"Sid": "PolarisGrantsAllowOnlyDecryptAndGenerateDataKey",
"Effect": "Deny",
"Principal": "*",
"Action": "kms:CreateGrant",
"Resource": "*",
"Condition": {
"ArnEquals": { "aws:PrincipalArn": "arn:aws:iam::<account>:role/<name>-pm-role" },
"ForAnyValue:StringNotEquals": { "kms:GrantOperations": ["Decrypt", "GenerateDataKey"] }
}
},
{
"Sid": "PolarisGrantsRetiredByThePolicyManager",
"Effect": "Deny",
"Principal": "*",
"Action": "kms:CreateGrant",
"Resource": "*",
"Condition": {
"ArnEquals": { "aws:PrincipalArn": "arn:aws:iam::<account>:role/<name>-pm-role" },
"StringNotLike": { "kms:RetiringPrincipal": "arn:aws:sts::<account>:assumed-role/<name>-pm-role/*" }
}
}
]

The retiring principal is the Policy Manager's role session, which is why the last statement matches the assumed-role form of the ARN.

To keep the workload role's calls inside the deployment's VPC, add one more statement. The workload VM's proxy calls KMS with the role's credentials, through the VPC's KMS endpoint, so a copy of those credentials used anywhere else is refused:

{
"Sid": "DenyPolarisRoleOutsideTheVpc",
"Effect": "Deny",
"Principal": { "AWS": "<cvm_role_arn>" },
"Action": "kms:*",
"Resource": "*",
"Condition": { "StringNotEquals": { "aws:SourceVpc": "<vpc_id>" } }
}

It was tested against a live key on 28 October 2026. Within ten seconds of adding it, the role's credentials copied to a laptop were refused, and the workload's own calls through the endpoint kept working.

Both values are Terraform outputs of the module, cvm_role_arn and vpc_id. The statement only denies, so it cannot lock you out of the key. A redeploy that recreates the VPC changes vpc_id, so update the statement then. With hmac_key_arn set, put the same statement on the HMAC key's policy too, since copied credentials could otherwise sign from anywhere while the MAC grant stands.

Deployment config keys​

The keys specific to AWS, under cloud.aws:

KeyRequiredDefaultMeaning
regionNous-east-2us-east-2 or eu-west-1 on shared tenancy, or any commercial region with dedicated_host_id
dedicated_host_idNounsetA Dedicated Host allocated with SEV-SNP enabled, such as h-0123456789abcdef0. Both VMs run on it, and both machine types must belong to its family. Unset keeps shared tenancy. In preview
kms_key_arnYesThe full ARN of your KMS key, not an alias or key ID
hmac_key_arnNounsetThe full ARN of the deployment's own HMAC_256 KMS key, for the MAC routes. See Sign and check an HMAC. Never the data key, and never shared between deployments
key_pair_nameYesName of an EC2 key pair in the region
ssh_private_keyNo~/.ssh/<key_pair_name>.pemPrivate key for that key pair, on the machine that runs deploy
ssh_allowed_cidrsNoemptyAddress ranges allowed to SSH to the workload VM. While it is empty, SSH opens to nobody. promote, the measurement check in deploy and the pinning of SSH host keys all need your address in it. Changing it takes a deploy, which replaces both VMs
ami_idFor a Marketplace imagethe newest Polaris image your account ownsThe machine image both VMs boot from. A Marketplace image always needs it, and setting it pins an exact image
pm_private_ipNo10.0.2.10The Policy Manager's address in the private subnet
pm_measurement_hexNounsetThe Policy Manager's launch measurement, 96 hex characters. While it is unset, the workload VM learns it on first contact, and deploy prints the value to pin
pm_required_vmplNo0The privilege level the Policy Manager's report must carry, read when pm_measurement_hex is set

Keys shared with the other clouds that apply on AWS:

KeyDefaultMeaning on AWS
metadata.nameThe deployment name, used in every resource name. A lowercase letter, then 1 to 24 lowercase letters, digits or hyphens
compute.cvm_machine_typem6a.xlargeWorkload VM size. See Instance sizes
compute.pm_machine_typem6a.largePolicy Manager VM size
network.allowed_egress_cidrsemptyRanges the workload may reach over HTTPS on port 443. An image in a registry outside the deployment's region needs its range here
features.attestation_modefullhardware, workload or full. See Deploying Polaris
features.ebpffalseRuns the Sentinel agent, which collects runtime and kernel evidence. On AWS it runs when this is true, so set it for full attestation
features.imafalseHas no effect on AWS. The Sentinel collects the kernel's measurements of every executable whenever features.ebpf is true
workload.imageA prebuilt workload image. An image in ECR in the deployment's own account and region needs nothing else
workload.dirIn place of workload.image, a folder with a Dockerfile, relative to the top folder of the Polaris tooling. deploy builds it for linux/amd64 and pushes it to ECR in your account
workload.port3000The port your workload listens on, over plain HTTP
workload.envemptyEnvironment variables for the workload, as KEY: value pairs. They are readable by anyone who can describe the instance, so keep secrets out
workload.resources.cpus, workload.resources.memory_mbno limitHard limits for the workload container
workload.security.read_onlyfalseRuns the workload with a read-only filesystem
workload.security.capabilitiesemptyExtra Linux capabilities the workload needs, as a list
license.fileA license file for a direct contract. Licensing is not enforced yet. See Licensing
polaris.docker_repopolaris-dockerThe prefix of the deployment's ECR repositories. Deployments that share a prefix share the repositories, so set the deployment's name in an account that runs more than one
attestation.report_interval30Seconds between evidence reports
attestation.deadman_interval120Seconds of silence from the workload VM before the Policy Manager withdraws access
attestation.grant_ttl3600Lifetime of a key grant in seconds, enforced by the Policy Manager

attestation.autolearn_window has no effect on AWS yet, and deploy warns when it is set.

Commands​

All but watch take --config <file>.

CommandWhat it does
watchShows each layer's status and how far learning has got, through the deployment's endpoint. Takes --endpoint https://<address> and --token <token>, and works with the read-only token
deployCreates the deployment, or updates it. Each run replaces both VMs, because each run issues the Policy Manager a new identity key. --promotion-window <duration>, such as 12h or 0, sets how long a layer must be clean under advise before it may enforce. The default is a day
statusLists the deployment's instances and its endpoint. Like every command, it writes a new random token file when one is missing, including after destroy. That token is not the one the running deployment uses, so status cannot recover a lost token
promoteMoves enforcement layers between advise, enforce and off, in place. --layers takes a comma-separated list of l2, l3, l31, ima_boot, l3_syscalls, l3_binaries and l3_network, and defaults to l31. --mode defaults to enforce. The Policy Manager refuses enforce for a layer that has not been clean under advise for the promotion window, and promote prints its reasons
destroyRevokes the deployment's grants on your key, then removes everything in What a deployment creates

The AWS deployment leaves ima_boot unset, so it follows l2, and promote checks its allowlist only when --layers names it.

The Policy Manager keeps the settings promote makes, and everything it learned, across a restart. A deploy that changes the deployment's baseline returns the settings to their deployed values and starts learning again.

Routes on the endpoint​

RouteTokenReturns
/polaris-container/healthnone{"status":"ok"} while the proxy runs
/polaris-container/readynoneWhether the proxy is serving workload traffic, and the state of its gate
/polaris-container/attestationnoneThe hardware report and its certificates, for a client to check, as the SDK does
/polaris-container/tls-infononeThe hash of the proxy's TLS public key, which the hardware report is bound to
/polaris-container/attestation-statusnoneThe latest verdict, with a status for each layer and when it was checked
/polaris-container/attestation-statusread-onlyThe same, with the reason for a failure and the alerts
/management/statusread-onlyThe Policy Manager's status for each workload VM, including its cvm_id and each layer's promotion_readiness
/management/profiles/learn, /management/ima/learn and /management/kernel/learnread-onlyEach learner's progress, with a status of learning until it converges and applied once its allowlist is in use
/management/incidents/<cvm_id> and /management/incidents/<cvm_id>/reportread-onlyThe VM's recent incidents, as JSON or as a plain-text report
/management/checks/<cvm_id>read-onlyThe latest checks, one by one
/management/history/<cvm_id>read-onlyThe last 100 verdicts

Your workload also has two routes on the proxy's internal listener, which only the workload's network reaches: POST http://polaris-proxy:3000/polaris-container/key/encrypt and /polaris-container/key/decrypt. Use the gated key from your workload shows them. With hmac_key_arn set there are two more, /polaris-container/key/mac and /polaris-container/key/verify-mac.

Files the tooling keeps​

deploy keeps these files for each deployment next to the AWS Terraform module in the tooling, so run every command from the copy of the tooling that holds them. The state and config files carry the deployment's tokens in plain text, so keep the folder encrypted and access-controlled.

FileHoldsRemoved by destroy
terraform-<name>.tfstateThe Terraform stateNo
terraform-<name>.tfstate.backupTerraform's copy of the state before its last change, with the same contentsNo
terraform-<name>.tfvarsThe deployment's resolved configurationNo
terraform-<name>.tokenThe management token, used by promoteYes, though any later command writes a new, unrelated one
terraform-<name>.readonly.tokenThe read-only token, used by watch and the management routesYes, though any later command writes a new, unrelated one
terraform-<name>.known_hostsThe pinned SSH host keys of both VMsYes
pm-identity-<name>.jsonThe record Polaris Desktop checks the Policy Manager againstNo
pm-snp-baseline-<name>.yamlAn audit copy of the Policy Manager's captured launch measurementNo

What a deployment costs​

A deployment in the default shape runs these AWS items for as long as it exists, at the rates in your region:

  • Two EC2 instances, m6a.xlarge and m6a.large by default, plus AWS's SEV-SNP charge of 10 percent of the instances' on-demand rate. See the pricing section of AWS's SEV-SNP page.
  • One NAT gateway, charged by the hour and by the data it processes.
  • Seven interface endpoints in one Availability Zone, charged by the hour and by data. The S3 gateway endpoint is free.
  • The grant retirer: a Lambda function that runs every 5 minutes, two EventBridge rules, three CloudWatch alarms and a log group, all small next to the instances.
  • Three EBS gp3 volumes, 100 GB, 50 GB and 20 GB.
  • Two Secrets Manager secrets, and the Policy Manager's identity key in KMS.
  • Your own KMS key and its requests, and the ECR storage for the Polaris images.

On a Dedicated Host, AWS bills the whole host by the hour from allocation until you release it, in place of the per-instance charges, and the SEV-SNP charge does not apply. A host that is still being prepared is billed as well.

The AWS Pricing Calculator gives the monthly total for your region. The Polaris license is priced separately, under your Marketplace offer or contract.