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
| Capability | On AWS |
|---|---|
AMD SEV-SNP on shared tenancy, in us-east-2 and eu-west-1 | Available |
| Attestation of image, runtime and kernel, with key grants withdrawn when a layer you enforce fails | Available |
| Status routes and incident records readable through the endpoint | Available |
| A client checking the hardware report with the Polaris SDK | Available on shared tenancy, with an SDK that includes polaris-sdk#3. Not yet on a Dedicated Host |
| Deployment from the AWS Marketplace image | Available, with ami_id set by hand |
| SEV-SNP on Dedicated Hosts, in every commercial region | Preview |
| A route for the workload to use its attestation-gated key | Available |
| Ending the key grant when the Policy Manager stops or hangs | Available |
| License enforcement | Not yet enforced |
| Checking the 2048-bit signature on the instance identity document | Available |
| More than one workload VM, a load balancer or a fixed public address | Not yet available |
| Limiting inbound traffic to chosen address ranges, or a private subnet for the workload VM | Not yet available |
| Serving your own TLS certificate from the proxy | Not yet available |
| Outbound connections to other VPCs or to ports other than 443 | Not yet available |
| Shipping logs, metrics or verdicts to CloudWatch or a SIEM from the VMs | Not yet available |
Remote Terraform state, running deploy from CI, a permissions boundary on the created roles | Not 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.
| Tenancy | Regions | Report signed by | Polaris |
|---|---|---|---|
| Shared | US East (Ohio) us-east-2, Europe (Ireland) eu-west-1 | VLEK, a key AMD issues to AWS | Supported |
| Dedicated Host | Any commercial region | VCEK, a key unique to the physical chip | Preview |
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.
| Family | Sizes with SEV-SNP |
|---|---|
m6a | large to 8xlarge |
c6a | large to 16xlarge |
r6a | large to 4xlarge |
The deployment config accepts these sizes and refuses the larger ones in each family.
| VM | Config key | Default |
|---|---|---|
| Workload VM | compute.cvm_machine_type | m6a.xlarge |
| Policy Manager VM | compute.pm_machine_type | m6a.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 subnet10.0.1.0/24for the workload VM and a private subnet10.0.2.0/24for 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.apiandecr.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 innetwork.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_cidrson port 443. - The Policy Manager accepts traffic from the workload VM, and SSH from the
cloud.aws.ssh_allowed_cidrsranges when that is set. Its outbound traffic goes through the NAT gateway to any address. - The endpoints accept HTTPS from the two VMs.
- 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
- SSH on port 22 to the workload VM, when
cloud.aws.ssh_allowed_cidrsis 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
- Two IAM roles with instance profiles,
<name>-cvm-roleand<name>-pm-role, where<name>is the deployment name. Their permissions are in The roles the deployment creates. - After each deploy, a condition on the Policy Manager role's trust policy that names the Policy Manager's instance. How the workload VM recognises its Policy Manager explains what it covers.
Secrets and keys
- Two Secrets Manager secrets,
<name>-management-tokenand<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, anddestroyschedules 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
destroyrevokes.
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 defaultpolaris-docker/, one each for the proxy, the Policy Manager and the Sentinel, and one for your workload whendeploybuilds it.deploycopies 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
| Role | Can | On |
|---|---|---|
<name>-cvm-role, the workload VM | secretsmanager:GetSecretValue | The deployment's two token secrets |
ecr:GetAuthorizationToken | * | |
ecr:BatchGetImage, ecr:GetDownloadUrlForLayer, ecr:BatchCheckLayerAvailability | ECR repositories in your account | |
| Use of your KMS key | Through the grant alone, held until a layer you enforce fails | |
<name>-pm-role, the Policy Manager | kms:CreateGrant, kms:RetireGrant, kms:ListGrants | Your KMS key |
kms:Decrypt | Its own identity key, with the encryption context purpose=polaris-pm-identity-v1 and deployment=<name> | |
ssm:PutParameter | Its 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 VM | As above | |
<name>-grant-retirer, the Lambda function | kms:ListGrants, kms:RetireGrant | Your KMS key |
ssm:GetParameter | The heartbeat parameter | |
ec2:DescribeInstances | To 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
| From | To | For |
|---|---|---|
The machine that runs deploy | AWS APIs in your account | Creating and checking the deployment |
The machine that runs deploy | ghcr.io, Fr0ntierX's container registry | Copying the Polaris images into your ECR, pinned by digest |
| Workload VM | The VPC endpoints for ECR, KMS, Secrets Manager, STS and S3 | Pulling images, reading its token, and AWS calls |
| Workload VM | The instance metadata service and the Amazon Time Sync Service, both local to the VM | Identity, credentials and time |
| Workload VM | The ranges in network.allowed_egress_cidrs, on port 443 | Your workload's outbound traffic |
| Policy Manager | The internet, through the NAT gateway | AMD's Key Distribution Service, for certificates |
| Policy Manager | The VPC endpoint for SSM | Its heartbeat |
| The grant retirer, in Lambda | AWS APIs in your account | Reading 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.
| Service | Actions | Used for |
|---|---|---|
| EC2 | ec2: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:GetConsoleOutput | The 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 53 | route53:AssociateVPCWithHostedZone | Private DNS names for the interface endpoints |
| IAM | iam: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:PassRole | The two instance roles, and the condition on the Policy Manager role's trust policy |
| Secrets Manager | secretsmanager:CreateSecret, secretsmanager:DeleteSecret, secretsmanager:DescribeSecret, secretsmanager:PutSecretValue, secretsmanager:GetSecretValue, secretsmanager:GetResourcePolicy, secretsmanager:TagResource | The two token secrets |
| KMS, on your key | kms:DescribeKey, kms:ListGrants, kms:RevokeGrant | Checking the key before deploying, and revoking the deployment's grants on destroy |
| KMS, for the identity key | kms:CreateKey, kms:TagResource, kms:PutKeyPolicy, kms:DescribeKey, kms:Encrypt, kms:CreateAlias, kms:DeleteAlias, kms:ScheduleKeyDeletion | Creating the Policy Manager's identity key, finding it again on later runs, and removing it on destroy |
| Grant retirer | Create, 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 role | The Lambda function, its triggers, the heartbeat parameter and the alarms. PowerUserAccess covers all but the IAM actions |
| ECR | ecr:GetAuthorizationToken, ecr:DescribeRepositories, ecr:CreateRepository, ecr:BatchGetImage, ecr:GetDownloadUrlForLayer, ecr:BatchCheckLayerAvailability, ecr:InitiateLayerUpload, ecr:UploadLayerPart, ecr:CompleteLayerUpload, ecr:PutImage | Copying 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:PassRoleto<name>-cvm-role,<name>-pm-roleand<name>-grant-retirer, and the other IAM actions torole/<name>-*andinstance-profile/<name>-*. - Scope the identity key's actions to
arn:aws:kms:<region>:<account>:key/*, since its ID is unknown in advance, whilekms:CreateKeytakes no resource and needs*.kms:CreateAliasandkms:DeleteAliasalso need the alias,arn:aws:kms:<region>:<account>:alias/<name>-pm-identity. Without it,deployfails after it has created the key. AWS checkskms:PutKeyPolicywhen the key is created as well as on later runs. - Scope the ECR actions other than
ecr:GetAuthorizationTokento repositories under the deployment'spolaris.docker_repoprefix,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:DescribeKeyandkms: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:ListGrantsandkms:RetireGrant. - The grant retirer's role,
<name>-grant-retirer:kms:ListGrantsandkms:RetireGrant. - The identity that deploys:
kms:DescribeKey,kms:ListGrantsandkms: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:
| Key | Required | Default | Meaning |
|---|---|---|---|
region | No | us-east-2 | us-east-2 or eu-west-1 on shared tenancy, or any commercial region with dedicated_host_id |
dedicated_host_id | No | unset | A 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_arn | Yes | The full ARN of your KMS key, not an alias or key ID | |
hmac_key_arn | No | unset | The 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_name | Yes | Name of an EC2 key pair in the region | |
ssh_private_key | No | ~/.ssh/<key_pair_name>.pem | Private key for that key pair, on the machine that runs deploy |
ssh_allowed_cidrs | No | empty | Address 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_id | For a Marketplace image | the newest Polaris image your account owns | The machine image both VMs boot from. A Marketplace image always needs it, and setting it pins an exact image |
pm_private_ip | No | 10.0.2.10 | The Policy Manager's address in the private subnet |
pm_measurement_hex | No | unset | The 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_vmpl | No | 0 | The 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:
| Key | Default | Meaning on AWS |
|---|---|---|
metadata.name | The deployment name, used in every resource name. A lowercase letter, then 1 to 24 lowercase letters, digits or hyphens | |
compute.cvm_machine_type | m6a.xlarge | Workload VM size. See Instance sizes |
compute.pm_machine_type | m6a.large | Policy Manager VM size |
network.allowed_egress_cidrs | empty | Ranges 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_mode | full | hardware, workload or full. See Deploying Polaris |
features.ebpf | false | Runs the Sentinel agent, which collects runtime and kernel evidence. On AWS it runs when this is true, so set it for full attestation |
features.ima | false | Has no effect on AWS. The Sentinel collects the kernel's measurements of every executable whenever features.ebpf is true |
workload.image | A prebuilt workload image. An image in ECR in the deployment's own account and region needs nothing else | |
workload.dir | In 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.port | 3000 | The port your workload listens on, over plain HTTP |
workload.env | empty | Environment 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_mb | no limit | Hard limits for the workload container |
workload.security.read_only | false | Runs the workload with a read-only filesystem |
workload.security.capabilities | empty | Extra Linux capabilities the workload needs, as a list |
license.file | A license file for a direct contract. Licensing is not enforced yet. See Licensing | |
polaris.docker_repo | polaris-docker | The 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_interval | 30 | Seconds between evidence reports |
attestation.deadman_interval | 120 | Seconds of silence from the workload VM before the Policy Manager withdraws access |
attestation.grant_ttl | 3600 | Lifetime 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>.
| Command | What it does |
|---|---|
watch | Shows 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 |
deploy | Creates 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 |
status | Lists 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 |
promote | Moves 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 |
destroy | Revokes 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
| Route | Token | Returns |
|---|---|---|
/polaris-container/health | none | {"status":"ok"} while the proxy runs |
/polaris-container/ready | none | Whether the proxy is serving workload traffic, and the state of its gate |
/polaris-container/attestation | none | The hardware report and its certificates, for a client to check, as the SDK does |
/polaris-container/tls-info | none | The hash of the proxy's TLS public key, which the hardware report is bound to |
/polaris-container/attestation-status | none | The latest verdict, with a status for each layer and when it was checked |
/polaris-container/attestation-status | read-only | The same, with the reason for a failure and the alerts |
/management/status | read-only | The 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/learn | read-only | Each 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>/report | read-only | The VM's recent incidents, as JSON or as a plain-text report |
/management/checks/<cvm_id> | read-only | The latest checks, one by one |
/management/history/<cvm_id> | read-only | The 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.
| File | Holds | Removed by destroy |
|---|---|---|
terraform-<name>.tfstate | The Terraform state | No |
terraform-<name>.tfstate.backup | Terraform's copy of the state before its last change, with the same contents | No |
terraform-<name>.tfvars | The deployment's resolved configuration | No |
terraform-<name>.token | The management token, used by promote | Yes, though any later command writes a new, unrelated one |
terraform-<name>.readonly.token | The read-only token, used by watch and the management routes | Yes, though any later command writes a new, unrelated one |
terraform-<name>.known_hosts | The pinned SSH host keys of both VMs | Yes |
pm-identity-<name>.json | The record Polaris Desktop checks the Policy Manager against | No |
pm-snp-baseline-<name>.yaml | An audit copy of the Policy Manager's captured launch measurement | No |
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.xlargeandm6a.largeby 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
gp3volumes, 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.