Installing Policy Workbench on PPC in Amazon Elastic Kubernetes Service (EKS)
Before installing Policy Workbench, ensure that the prerequisites are met. For more information about the prerequisites, refer to the section Prerequisites.
To install Policy Workbench, first provision the AWS resources using the policy-workbench OpenTofu module and then deploy the Policy Workbench using Helm. The policy-workbench OpenTofu module is published to the Protegrity Container Registry and must be consumed from a root module. A root module is the working directory for executing the OpenTofu commands.
For more information about OpenTofu modules and the root module, refer to the section Modules in the OpenTofu documentation.
The Policy Workbench is installed depending on one of the following scenarios:
- Root module is not available.
- Root module is available.
Prerequisites
Ensure that the jumpbox can connect to the required registries. If not already authenticated, then log in to the required registry.
- For connecting and deploying from the Protegrity Container Registry (PCR), use the following command and the credentials obtained from the My.Protegrity portal during account creation:
helm registry login registry.protegrity.com:9443
- For connecting and deploying to the local registry, use your local credentials and local registry endpoint as required.
Ensure that the PPC Cluster is installed and accessible, before installing Policy Workbench on PPC.
For more information about installing PPC, refer to the section Installing PPC.
Required Tools
Ensure that the following tools are available on the jump box on which Policy Workbench is installed.
| Tool | Version | Description |
|---|---|---|
| OpenTofu | >=1.10.0 | Used to run the installer. |
| AWS CLI | Any version | Must be configured with credentials that have EKS and IAM permissions. The default region must also be set using either the AWS_DEFAULT_REGION or the AWS_REGION environment variables or the ~/.aws/config configuration file. |
| kubectl | Any version | Required for validating the deployment. It must be configured for the target PPC cluster where Policy Workbench is deployed. |
IAM Permissions
The following IAM permissions are automatically created by the OpenTofu script.
| Permission | Purpose |
|---|---|
iam:CreatePolicy / iam:DeletePolicy / iam:GetPolicy | Create and manage the AWS KMS access policy. |
iam:CreateRole / iam:DeleteRole / iam:GetRole / iam:UpdateAssumeRolePolicy | Create and manage the AWS KMS pod identity role. |
iam:AttachRolePolicy / iam:DetachRolePolicy | Attach the AWS KMS policy to the role. |
EKS Permissions
The following EKS permissions are automatically created by the OpenTofu script.
| Permission | Purpose |
|---|---|
eks:DescribeCluster | Read the cluster endpoint and the certificate authority data for the Helm provider in OpenTofu. The Helm provider requires this information to connect to the PPC. |
eks:DescribeAddon | Verify that the eks-podidentity-agent is installed. |
eks:CreatePodIdentityAssociation /eks:DeletePodIdentityAssociation /eks:DescribePodIdentityAssociation | Associate the AWS KMS role with the Policy Workbench service account. |
Configuring Credentials for the Policy Workbench
Perform the following steps to configure the credentials to access the Policy Workbench from the OCI registry.
Run the following command to create the configuration directory.
mkdir -p ~/.config/containersObtain the username and access token from the My.Protegrity portal. For more information about obtaining the credentials from the My.Protegrity portal, refer to the section Configuring Authentication for Protegrity AI Team Edition.
Generate base64 encoded string with padding for
username:accesstokenobtained from the My.Protegrity portal.Ensure that you specify the username and access token within single quotes when generating the base64 encoded value. For example,
'username:accesstoken'.Create a file named
~/.config/containers/auth.jsonwith the following content.
{
"auths": {
"registry.protegrity.com:9443": {
"auth": "<base64 generated string from step-3>"
}
}
}
Installing Policy Workbench when root module is not available
Install the Policy Workbench using the following commands:
- Run the following command to create the deployment directory.
# must install from an empty directory
mkdir policy-workbench && cd policy-workbench
- Create a root module with a single
main.tffile.
terraform {
required_version = "~> 1.10"
required_providers {
aws = {
source = "registry.opentofu.org/hashicorp/aws"
version = "~> 6.0"
}
kubernetes = {
source = "registry.opentofu.org/hashicorp/kubernetes"
version = "~> 2.35"
}
}
}
variable "cluster_name" {
type = string
description = "EKS cluster name."
nullable = false
validation {
condition = length(trimspace(var.cluster_name)) > 0
error_message = "cluster_name must be provided and cannot be empty."
}
}
variable "fips" {
type = bool
description = "Use FIPS Bottlerocket AMI for Karpenter nodes."
default = true
}
variable "ami_id" {
type = string
description = "Explicit AMI ID for Karpenter nodes. When set, overrides ami_family/fips-based AMI selection."
default = ""
}
data "aws_eks_cluster" "this" {
name = var.cluster_name
}
data "aws_eks_cluster_auth" "this" {
name = var.cluster_name
}
provider "kubernetes" {
host = data.aws_eks_cluster.this.endpoint
cluster_ca_certificate = base64decode(data.aws_eks_cluster.this.certificate_authority[0].data)
token = data.aws_eks_cluster_auth.this.token
}
module "policy_workbench" {
source = "oci://<Container_Registry_Path>/policy-workbench/opentofu/modules/policy-workbench/aws?tag=<version>"
cluster_name = var.cluster_name
oci_host = "<Container_Registry_Hostname>"
fips = var.fips
ami_id = var.ami_id
}
output "helm_install" {
value = module.policy_workbench.helm_install
}
In the main.tf file, specify the values of the following variables.
| Variable Name | Description | Value |
|---|---|---|
<Container_Registry_Path> | Location of the Protegrity Container Registry or the local registry where the policy-workbench OpenTofu module is published. |
|
<Container_Registry_Hostname> | OCI registry hostname used for oci_host. | registry.protegrity.com |
<version> | Tag version of the Protegrity Policy Manager, as specified in the product part number. Obtain the product part number from the Policy Manager Readme. | 1.12.0 |
Ensure that the credentials to install the Policy Workbench from the Protegrity Container Registry have been configured.
For more information about configuring the credentials, refer to the section Configuring Credentials for the Policy Workbench.
Run the following command to navigate to the deployment directory.
cd policy-workbenchRun the following commands to plan and install the Policy Workbench OpenTofu module.
# init, plan, and install
tofu init
tofu plan -var="cluster_name=<PPC-cluster-name>"
tofu apply -var="cluster_name=<PPC-cluster-name>"
To use a non-FIPS AMI, run the following tofu apply command:
tofu apply -var="cluster_name=<your-cluster-name>" -var="fips=false"
In this command, specify the value of the fips variable as false to use a non-FIPS AMI for Karpenter nodes.
To use a specific AMI, run the following tofu apply command:
tofu apply -var="cluster_name=<your-cluster-name>" -var="ami_id=<your AMI id>"
In this command, specify the value of the ami_id variable as the specific ID of the AMI for Karpenter nodes. If you specify this value, then it overrides the default FIPS-based AMI selection.
In the cluster_name field, specify the name of the PPC cluster that you have specified in step 1 while deploying the PPC.
For more information about deploying the PPC, refer to the section Deploying PPC.
OpenTofu prints the plan and prompts for confirmation. Enter yes to proceed. To skip the prompt, add the -auto-approve option to the commands.
- Run the following command to complete the installation of the Policy Workbench using Helm.
helm upgrade --install policy-workbench \
oci://<Container_Registry_Path>/policy-workbench/helm/policy-workbench \
--version <version> \
--namespace policy-workbench \
--create-namespace \
--values policy-workbench-values.yaml
In the command, specify the values of the following variables.
| Variable Name | Description | Value |
|---|---|---|
<Container_Registry_Path> | Location of the Protegrity Container Registry or the local registry where the policy-workbench OpenTofu module is published. |
|
<version> | Tag version of the Protegrity Policy Manager, as specified in the product part number. Obtain the product part number from the Policy Manager Readme. | 1.12.0 |
The OpenTofu module writes a policy-workbench-values.yaml file in your working directory with cloud-specific keystore settings. Pass it to Helm with the --values parameter.
Note: The
tofu output -raw helm_installcommand prints a ready-to-run Helm command with the correct version and namespace values already filled in.
Important: You need to pass the
<ami-id>in the command only if you are deploying the feature in regions other than us-east-1.
Option A (Recommended): Run the following AWS CLI command to retrieve the AMI ID dynamically.
aws ssm get-parameter \
--name /aws/service/bottlerocket/aws-k8s-1.34/x86_64/latest/image_id \
--region <region> \
--query "Parameter.Value" \
--output text
Alternatively, refer to these example AMI IDs.
Option B: The following table provides the list of AMI IDs.
| Region | AMI ID |
|---|---|
| ap-south-1 | ami-07959c05dcdb79a72 |
| eu-north-1 | ami-0268b0bfff0f25d31 |
| eu-west-3 | ami-0ea9454aef60045a2 |
| eu-west-2 | ami-0d5eee57a6a1398a3 |
| eu-west-1 | ami-00a8d14029b60a028 |
| ap-northeast-3 | ami-0e495c3ffd416c65e |
| ap-northeast-2 | ami-0fc18a24aec719c1c |
| ap-northeast-1 | ami-00ec85b83bf713aac |
| ca-central-1 | ami-03891f0d8b41eb296 |
| sa-east-1 | ami-0a30f044a5781b4e0 |
| ap-southeast-1 | ami-0ae51324bf2e89725 |
| ap-southeast-2 | ami-0ef7e8095b163dc42 |
| eu-central-1 | ami-00e36131a0343c374 |
| us-east-2 | ami-0e486911b2d0a5f7e |
| us-west-1 | ami-01183e1261529749e |
| us-west-2 | ami-04f850c412625dfe6 |
- Run the following command to view the pods created in the
policy-workbenchnamespace.
kubectl get pods -n policy-workbench
The following output appears.
NAME READY STATUS RESTARTS AGE
bootstrap-bffb4b5d9-v6ww4 1/1 Running 0 13m
cert-7b88dcd84-zx7cv 1/1 Running 0 13m
devops-75755d87d4-qw9n6 1/1 Running 0 13m
hubcontroller-0 1/1 Running 0 13m
kmgw-0 1/1 Running 0 13m
mbs-6b7dc765dd-brrfk 1/1 Running 0 13m
repository-0 1/1 Running 0 13m
rpproxy-79fc498d8-qp4fz 1/1 Running 0 13m
rpproxy-79fc498d8-s9k5p 1/1 Running 0 13m
rpproxy-79fc498d8-tbdtb 1/1 Running 0 13m
rps-8d79b7d98-svhdw 1/1 Running 0 13m
Installing Policy Workbench when root module is available
Install the Policy Workbench using the following commands:
- Add the
policy-workbenchOpenTofu module by adding the following code block to an existing root module.
module "policy_workbench" {
source = "oci://<Container_Registry_Path>/policy-workbench/opentofu/modules/policy-workbench/aws?tag=<version>"
cluster_name = "<PPC-cluster-name>"
oci_host = "<Container_Registry_Hostname>"
# fips = true # set to false for non-FIPS AMI
# ami_id = "<your AMI id>" # explicit AMI override
}
For more information about adding a module to an existing root module, refer to the section Module Blocks in the OpenTofu documentation.
In the root module, specify the values of the following variables.
| Variable Name | Description | Value |
|---|---|---|
<Container_Registry_Path> | Location of the Protegrity Container Registry or the local registry where the policy-workbench OpenTofu module is published. |
|
<Container_Registry_Hostname> | OCI registry hostname used for oci_host. | registry.protegrity.com |
<version> | Tag version of the Protegrity Policy Manager, as specified in the product part number. Obtain the product part number from the Policy Manager Readme. | 1.12.0 |
fips | Use FIPS Bottlerocket AMI for Karpenter nodes. | The default value is true. Set the value to false for non-FIPS. |
ami_id | Explicit AMI ID for Karpenter nodes. When this value is set, it overrides the ami_family or FIPS-based AMI selection. |
In the cluster_name field, specify the name of the PPC cluster that you have specified in step 1 while deploying the PPC.
For more information about deploying the PPC, refer to the section Deploying PPC.
- If the root module does not include the
hashicorp/awsprovider version>= 6.0andhashicorp/kubernetesprovider version>= 2.35, then add the following code block to theterraform {}block. Else navigate to the next step.
required_providers {
aws = {
source = "registry.opentofu.org/hashicorp/aws"
version = "~> 6.0"
}
kubernetes = {
source = "registry.opentofu.org/hashicorp/kubernetes"
version = "~> 2.35"
}
}
The kubernetes provider must be configured to connect to the target EKS cluster:
data "aws_eks_cluster" "this" {
name = "<PPC-cluster-name>"
}
data "aws_eks_cluster_auth" "this" {
name = "<PPC-cluster-name>"
}
provider "kubernetes" {
host = data.aws_eks_cluster.this.endpoint
cluster_ca_certificate = base64decode(data.aws_eks_cluster.this.certificate_authority[0].data)
token = data.aws_eks_cluster_auth.this.token
}
For more information about including the hashicorp/aws provider in the root module, refer to the OpenTofu Registry documentation.
For more information about including the hashicorp/kubernetes provider in the root module, refer to the OpenTofu Registry documentation.
Ensure that the credentials to install the Policy Workbench from the Protegrity Container Registry have been configured.
For more information about configuring the credentials, refer to the section Configuring Credentials for the Policy Workbench.
Navigate to the directory containing the root module.
Run the following commands to plan and install the Policy Workbench OpenTofu module.
# init, plan, and install
tofu init
tofu plan -var="cluster_name=<PPC-cluster-name>"
tofu apply -var="cluster_name=<PPC-cluster-name>"
OpenTofu prints the plan and prompts for confirmation. Enter yes to proceed. To skip the prompt, add the -auto-approve option to the commands.
In the cluster_name field, specify the name of the PPC cluster that you have specified in step 1 while deploying the PPC.
For more information about deploying the PPC, refer to the section Deploying PPC.
- Run the following command to complete the installation of the Policy Workbench using Helm.
helm upgrade --install policy-workbench \
oci://<Container_Registry_Path>/policy-workbench/helm/policy-workbench \
--version <version> \
--namespace policy-workbench \
--create-namespace \
--values policy-workbench-values.yaml
In the command, specify the values of the following variables.
| Variable Name | Description | Value |
|---|---|---|
<Container_Registry_Path> | Location of the Protegrity Container Registry or the local registry where the policy-workbench OpenTofu module is published. |
|
<version> | Tag version of the Protegrity Policy Manager, as specified in the product part number. Obtain the product part number from the Policy Manager Readme. | 1.12.0 |
The OpenTofu module writes a policy-workbench-values.yaml file in your working directory with cloud-specific keystore settings. Pass it to Helm with the --values parameter.
Note: The
tofu output -raw helm_installcommand prints a ready-to-run Helm command with the correct version and namespace values already filled in.
Important: You need to pass the
<ami-id>in the command only if you are deploying the feature in regions other than us-east-1.
Option A (Recommended): Run the following AWS CLI command to retrieve the AMI ID dynamically.
aws ssm get-parameter \
--name /aws/service/bottlerocket/aws-k8s-1.34/x86_64/latest/image_id \
--region <region> \
--query "Parameter.Value" \
--output text
Alternatively, refer to these example AMI IDs.
Option B: The following table provides the list of AMI IDs.
| Region | AMI ID |
|---|---|
| ap-south-1 | ami-07959c05dcdb79a72 |
| eu-north-1 | ami-0268b0bfff0f25d31 |
| eu-west-3 | ami-0ea9454aef60045a2 |
| eu-west-2 | ami-0d5eee57a6a1398a3 |
| eu-west-1 | ami-00a8d14029b60a028 |
| ap-northeast-3 | ami-0e495c3ffd416c65e |
| ap-northeast-2 | ami-0fc18a24aec719c1c |
| ap-northeast-1 | ami-00ec85b83bf713aac |
| ca-central-1 | ami-03891f0d8b41eb296 |
| sa-east-1 | ami-0a30f044a5781b4e0 |
| ap-southeast-1 | ami-0ae51324bf2e89725 |
| ap-southeast-2 | ami-0ef7e8095b163dc42 |
| eu-central-1 | ami-00e36131a0343c374 |
| us-east-2 | ami-0e486911b2d0a5f7e |
| us-west-1 | ami-01183e1261529749e |
| us-west-2 | ami-04f850c412625dfe6 |
- Run the following command to view the pods created in the
policy-workbenchnamespace.
kubectl get pods -n policy-workbench
The following output appears.
NAME READY STATUS RESTARTS AGE
bootstrap-bffb4b5d9-v6ww4 1/1 Running 0 13m
cert-7b88dcd84-zx7cv 1/1 Running 0 13m
devops-75755d87d4-qw9n6 1/1 Running 0 13m
hubcontroller-0 1/1 Running 0 13m
kmgw-0 1/1 Running 0 13m
mbs-6b7dc765dd-brrfk 1/1 Running 0 13m
repository-0 1/1 Running 0 13m
rpproxy-79fc498d8-qp4fz 1/1 Running 0 13m
rpproxy-79fc498d8-s9k5p 1/1 Running 0 13m
rpproxy-79fc498d8-tbdtb 1/1 Running 0 13m
rps-8d79b7d98-svhdw 1/1 Running 0 13m
Validating the deployment
Note: Before validating the deployment of the Policy Workbench, ensure that the
kubectlcontext is set to the target PPC cluster. Runkubectl config current-contextto verify the current context. Runkubectl config use-context <context-name>to switch the context.
After installation, validate the Policy Workbench deployment using the following steps. The desired outcome of these steps is to get a [] response from the datastores API call using a dedicated workbench user.
- Run the following command to retrieve the gateway host details.
export GW_HOST="$(kubectl get gateway pty-main -n api-gateway -o jsonpath='{.status.addresses[0].value}')"
- Run the following command to generate the JWT token.
TOKEN=$(curl -k -s "https://$GW_HOST/api/v1/auth/login/token" \
-X POST \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d "loginname=admin" \
-d "password=Protegrity123!" \
-D - -o /dev/null 2>&1 \
| grep -i 'pty_access_jwt_token:' \
| sed 's/pty_access_jwt_token: //' \
| tr -d '\r') && echo "${TOKEN:0:10}"
- Create a workbench user using the following command. Due to separation of duties, the datastores API requires a user with workbench roles.
curl -sk -X POST "https://$GW_HOST/pty/v1/auth/users" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"username": "workbench",
"password": "<Password>",
"roles": [
"workbench_administrator"
]
}'
Note: The password policy requires a minimum of 14 characters, including at least one digit, one uppercase letter, one lowercase letter, and one special character.
The following output appears.
{"user_id":"397beecc-87bb-404e-85bb-f8a6d83984d6","username":"workbench"}
Use the JWT token generated in step 2.
- Ensure that the user with the
workbench_administratorroles has the following permissions:
- workbench_management_policy_write
- workbench_deployment_immutablepackage_export
- workbench_deployment_certificate_export
- cli_access
- can_create_token
To ensure the required permissions, run the following command:
curl -sk -X PUT "https://$GW_HOST/pty/v1/auth/roles" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "workbench_administrator",
"permissions": [
"workbench_management_policy_write",
"workbench_deployment_immutablepackage_export",
"workbench_deployment_certificate_export",
"cli_access",
"can_create_token"
]
}'
The following output appears.
{"role_name":"workbench_administrator","status":"updated"}
For more information about the workbench_administrator permissions, refer to the section Workbench Roles and Permissions.
For more information about the cli_access and can_create_token permissions, refer to the section Roles and Permissions.
- Run the following command to get a token for the workbench user.
export TOKEN=$(curl -k -s https://$GW_HOST/pty/v1/auth/login/token \
-X POST \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'loginname=workbench' \
-d 'password=<Password>' \
-D - -o /dev/null 2>&1 | grep -i 'pty_access_jwt_token:' | sed 's/pty_access_jwt_token: //' | tr -d '\r')
- Run the Policy Management REST API to get datastores. Use the JWT token generated in step 4.
curl -k -v https://$GW_HOST/pty/v2/pim/datastores -H "Authorization: Bearer $TOKEN"
The expected output is []. This indicates that the Policy Workbench is initialized but the datastore is not yet created.
Post-Installation steps
After installing PPW, rotate the certificates to ensure that the certificates on the PPW and PPC are sychronized.
Perform the following steps to rotate the certificates.
- Run the following command to rotate all the certificates.
# Renew all certificates using eclipse-issuer
kubectl get certificates --all-namespaces -o json | \
jq -r '.items[] | select(.spec.issuerRef.name=="eclipse-issuer") | "\(.metadata.namespace) \(.metadata.name)"' | \
while read -r ns cert_name; do
echo "Renewing certificate: $cert_name in namespace: $ns"
cmctl renew "$cert_name" -n "$ns"
done
- Run the following command to verify that the certificates have been rotated.
kubectl get certificates --all-namespaces
The following output appears.
NAMESPACE NAME READY SECRET AGE
api-gateway ingress-certificate-secret True ingress-certificate-secret 5h46m
cert-manager eclipse-ca True eclipse-ca 5h46m
policy-workbench bootstrap-certificate True bootstrap-certificate-secret 17m
policy-workbench cert-certificate True cert-certificate-secret 17m
policy-workbench devops-certificate True devops-certificate-secret 17m
policy-workbench hubcontroller-certificate True hubcontroller-certificate-secret 17m
policy-workbench kmgw-certificate True kmgw-certificate-secret 17m
policy-workbench mbs-certificate True mbs-certificate-secret 17m
policy-workbench protector-certificate True protector-certificate-secret 17m
policy-workbench pty-main-backend-client-cert True pty-main-backend-client-certificate 17m
policy-workbench repository-certificate True repository-certificate-secret 17m
policy-workbench rpproxy-certificate True rpproxy-certificate-secret 17m
policy-workbench rps-certificate True rps-certificate-secret 17m
pty-insight hubcontoller-client-secret True hubcontoller-client-secret 5h46m
pty-insight tls-for-insight True tls-for-insight-key-pair 5h46m
pty-loginui ingress-certificate-secret True ingress-certificate-secret 5h46m
The Ready column displays the value True for all the certificates indicating that they have been rotated.
Feedback
Was this page helpful?