$ oc login --token=<your-token> --server=<your-server-url>
AWS Secrets 和配置提供程序 (ASCP) 提供了一种将 AWS Secrets 作为 Kubernetes 存储卷公开的方法。使用 ASCP,您可以将密钥存储在 Secrets Manager 中,然后通过在 AWS 上的 Red Hat OpenShift 服务 (ROSA) 上运行的工作负载检索它们。
在开始此过程之前,请确保您拥有以下资源和工具
使用 STS 部署的 ROSA 集群
Helm 3
aws
CLI
oc
CLI
jq
CLI
运行以下命令登录到您的 ROSA 集群
$ oc login --token=<your-token> --server=<your-server-url>
您可以通过访问 Red Hat OpenShift 集群管理器中的集群来查找您的登录令牌:从 Red Hat OpenShift 集群管理器获取拉取密钥。
运行以下命令验证您的集群是否具有 STS
$ oc get authentication.config.openshift.io cluster -o json \
| jq .spec.serviceAccountIssuer
"https://xxxxx.cloudfront.net/xxxxx"
如果您的输出不同,请不要继续。在继续此过程之前,请参阅创建 STS 集群的 Red Hat 文档。
运行以下命令设置SecurityContextConstraints
权限以允许 CSI 驱动程序运行
$ oc new-project csi-secrets-store
$ oc adm policy add-scc-to-user privileged \
system:serviceaccount:csi-secrets-store:secrets-store-csi-driver
$ oc adm policy add-scc-to-user privileged \
system:serviceaccount:csi-secrets-store:csi-secrets-store-provider-aws
运行以下命令创建环境变量以在此过程中稍后使用
$ export REGION=$(oc get infrastructure cluster -o=jsonpath="{.status.platformStatus.aws.region}")
$ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster \
-o jsonpath='{.spec.serviceAccountIssuer}' | sed 's|^https://||')
$ export AWS_ACCOUNT_ID=`aws sts get-caller-identity --query Account --output text`
$ export AWS_PAGER=""
使用 Helm 注册密钥存储 CSI 驱动程序,运行以下命令:
$ helm repo add secrets-store-csi-driver \
https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
运行以下命令更新您的 Helm 存储库:
$ helm repo update
运行以下命令安装密钥存储 CSI 驱动程序:
$ helm upgrade --install -n csi-secrets-store \
csi-secrets-store-driver secrets-store-csi-driver/secrets-store-csi-driver
运行以下命令部署 AWS 提供程序:
$ oc -n csi-secrets-store apply -f \
https://raw.githubusercontent.com/rh-mobb/documentation/main/content/misc/secrets-store-csi/aws-provider-installer.yaml
运行以下命令检查两个 Daemonset 是否正在运行:
$ oc -n csi-secrets-store get ds \
csi-secrets-store-provider-aws \
csi-secrets-store-driver-secrets-store-csi-driver
运行以下命令为密钥存储 CSI 驱动程序添加标签,以允许与受限 Pod 安全配置文件一起使用:
$ oc label csidriver.storage.k8s.io/secrets-store.csi.k8s.io security.openshift.io/csi-ephemeral-volume-profile=restricted
运行以下命令在 Secrets Manager 中创建一个密钥:
$ SECRET_ARN=$(aws --region "$REGION" secretsmanager create-secret \
--name MySecret --secret-string \
'{"username":"shadowman", "password":"hunter2"}' \
--query ARN --output text); echo $SECRET_ARN
运行以下命令创建一个 IAM 访问策略文档:
$ cat << EOF > policy.json
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue",
"secretsmanager:DescribeSecret"
],
"Resource": ["$SECRET_ARN"]
}]
}
EOF
运行以下命令创建一个 IAM 访问策略:
$ POLICY_ARN=$(aws --region "$REGION" --query Policy.Arn \
--output text iam create-policy \
--policy-name openshift-access-to-mysecret-policy \
--policy-document file://policy.json); echo $POLICY_ARN
运行以下命令创建一个 IAM 角色信任策略文档:
此信任策略锁定到您在此过程后面创建的命名空间的默认服务帐户。 |
$ cat <<EOF > trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Condition": {
"StringEquals" : {
"${OIDC_ENDPOINT}:sub": ["system:serviceaccount:my-application:default"]
}
},
"Principal": {
"Federated": "arn:aws:iam::$AWS_ACCOUNT_ID:oidc-provider/${OIDC_ENDPOINT}"
},
"Action": "sts:AssumeRoleWithWebIdentity"
}
]
}
EOF
运行以下命令创建一个 IAM 角色:
$ ROLE_ARN=$(aws iam create-role --role-name openshift-access-to-mysecret \
--assume-role-policy-document file://trust-policy.json \
--query Role.Arn --output text); echo $ROLE_ARN
运行以下命令将角色附加到策略:
$ aws iam attach-role-policy --role-name openshift-access-to-mysecret \
--policy-arn $POLICY_ARN
运行以下命令创建一个 OpenShift 项目:
$ oc new-project my-application
运行以下命令为默认服务帐户添加注释以使用 STS 角色:
$ oc annotate -n my-application serviceaccount default \
eks.amazonaws.com/role-arn=$ROLE_ARN
运行以下命令创建一个密钥提供程序类以访问我们的密钥:
$ cat << EOF | oc apply -f -
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: my-application-aws-secrets
spec:
provider: aws
parameters:
objects: |
- objectName: "MySecret"
objectType: "secretsmanager"
EOF
运行以下命令使用我们的密钥创建一个部署:
$ cat << EOF | oc apply -f -
apiVersion: v1
kind: Pod
metadata:
name: my-application
labels:
app: my-application
spec:
volumes:
- name: secrets-store-inline
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "my-application-aws-secrets"
containers:
- name: my-application-deployment
image: k8s.gcr.io/e2e-test-images/busybox:1.29
command:
- "/bin/sleep"
- "10000"
volumeMounts:
- name: secrets-store-inline
mountPath: "/mnt/secrets-store"
readOnly: true
EOF
运行以下命令验证 Pod 是否已挂载密钥:
$ oc exec -it my-application -- cat /mnt/secrets-store/MySecret
运行以下命令删除应用程序:
$ oc delete project my-application
运行以下命令删除密钥存储 CSI 驱动程序:
$ helm delete -n csi-secrets-store csi-secrets-store-driver
运行以下命令删除安全上下文约束:
$ oc adm policy remove-scc-from-user privileged \
system:serviceaccount:csi-secrets-store:secrets-store-csi-driver; oc adm policy remove-scc-from-user privileged \
system:serviceaccount:csi-secrets-store:csi-secrets-store-provider-aws
运行以下命令删除 AWS 提供程序:
$ oc -n csi-secrets-store delete -f \
https://raw.githubusercontent.com/rh-mobb/documentation/main/content/misc/secrets-store-csi/aws-provider-installer.yaml
运行以下命令删除 AWS 角色和策略:
$ aws iam detach-role-policy --role-name openshift-access-to-mysecret \
--policy-arn $POLICY_ARN; aws iam delete-role --role-name openshift-access-to-mysecret; aws iam delete-policy --policy-arn $POLICY_ARN
运行以下命令删除 Secrets Manager 密钥:
$ aws secretsmanager --region $REGION delete-secret --secret-id $SECRET_ARN