外部密码故障排除
对 OpenShift 上的 Automation Suite 中的 External Secrets Operator 进行故障排除。
概述
本节提供故障排除步骤,用于解决与 Automation Suite 中的外部 Secrets Orchestrator 和密码存储配置相关的问题。
要识别并解决集群和外部密码提供程序之间的同步或身份验证问题,请按照本节中描述的步骤操作。
验证“外部密码”Pod 状态和日志
首先检查外部密码运算符 Pod 是否正常运行。
如果 Pod 未处于“正在运行”状态或显示重复重新启动,请查看其日志是否存在任何与身份验证、权限或错误配置相关的错误。
要检查 “外部密码”Pod 的状态并查看其日志,请运行:
kubectl get pods -A | grep external-secrets
kubectl logs -f <pod-name> -n <namespace>
kubectl get pods -A | grep external-secrets
kubectl logs -f <pod-name> -n <namespace>
例如,要查看来自特定 Pod 的日志,请运行:
kubectl logs -f external-secrets-7d8c9b5f9f-abc12 -n external-secrets
kubectl logs -f external-secrets-7d8c9b5f9f-abc12 -n external-secrets
检查密码存储库和外部密码对象
如果 Pod 运行正确,请验证 SecretStore 和 ExternalSecret 资源是否已正确配置和同步。
这些资源定义了如何检索和存储外部密码,因此任何错误配置都可能阻止成功同步。
-
检查“外部密码”资源首先查看集群中的“外部密码”对象。这有助于确认资源已正确链接到其密码存储,并且同步状态为有效。
- 要显示并检查“外部密码”资源,请运行以下命令:
kubectl get externalsecrets -A kubectl describe externalsecret <externalsecret-name> -n <namespace>kubectl get externalsecrets -A kubectl describe externalsecret <externalsecret-name> -n <namespace> - 例如,要查看
uipath命名空间中的特定“外部密码”,请执行以下操作:kubectl describe externalsecret azure-secret-store -n uipathkubectl describe externalsecret azure-secret-store -n uipath
- 要显示并检查“外部密码”资源,请运行以下命令:
-
检查密码存储资源检查关联的密码存储配置。此资源定义密码提供程序(例如 Azure 密钥保险库)的连接详细信息,此处的错误可能会阻止密码同步。
- 要查看密码存储库定义,请使用以下命令:
kubectl get secretstores -A kubectl describe secretstore <secretstore-name> -n <namespace>kubectl get secretstores -A kubectl describe secretstore <secretstore-name> -n <namespace> - 例如,要检查
uipath命名空间中的密码存储配置,请执行以下操作:kubectl describe secretstore azure-secretstore -n uipathkubectl describe secretstore azure-secretstore -n uipath
- 要查看密码存储库定义,请使用以下命令:
-
检查与外部密码相关的事件审核与外部密码运算符相关的 Kubernetes 事件。这些事件可以揭示同步失败、权限问题或提供程序配置错误。
- 要查看相关事件,请运行以下命令:
kubectl get events -A | grep external-secretskubectl get events -A | grep external-secrets
在查看事件输出时,请查找:
- “状态”部分中的错误消息
- 指明是否为
Ready: True条件 - “事件”部分中显示警告或同步失败
- 要查看相关事件,请运行以下命令:
验证密码存储库凭据
如果您使用 Azure 密钥保险库作为密码提供程序,请确保凭据和配置有效且最新。
凭据不正确或权限缺失是同步失败的常见原因。
-
身份验证凭据
- 确认
clientId、clientSecret和tenantId值正确无误。 - 确保服务主体具有密钥保险库所需的权限。
- 确认
-
密钥保险库访问策略
- 验证密码的
Get和List权限。 - 确保密钥保险库防火墙设置允许从集群进行访问。
- 验证密码的
-
工作负载身份配置(如果适用)
- 检查联合凭据是否配置正确。
- 确保关联的服务帐户具有必要的注释。
-
密钥保管库 Uri
- 验证密码存储库配置中的
vaultUrl是否正确。
示例格式:
https://<key-vault-name>.vault.azure.net/https://<key-vault-name>.vault.azure.net/ - 验证密码存储库配置中的
验证 Azure 密钥保险库服务主体权限
如果您的部署使用服务主体,请确认其有权从 Azure 密钥保险库(只读)检索密码。
要列出服务主体可访问的密码,请运行:
az keyvault secret list --vault-name <key-vault-name>
az keyvault secret list --vault-name <key-vault-name>
验证 HashiCorp 保险库连接和身份验证
如果您使用 HashiCorp 保险库作为密码提供程序,请验证以下内容:
-
测试保险库服务器的可访问性确认可以从对集群具有网络访问权限的节点或 Jumphost 访问密码存储配置中的保险库服务器 URL:
curl -sk https://<vault-server>:8200/v1/sys/healthcurl -sk https://<vault-server>:8200/v1/sys/health运行状况良好的保险库会返回包含
"initialized": true和"sealed": falseJSON 响应。如果命令超时或返回connection refused,请检查集群和保险库服务器之间的网络策略和防火墙规则。 -
验证保险库封条状态
curl -sk https://<vault-server>:8200/v1/sys/seal-statuscurl -sk https://<vault-server>:8200/v1/sys/seal-status如果
"sealed": true,则必须先解封保险库服务器,然后 ESO 才能检索密码。 -
测试 Kubernetes Auth 登录如果使用
auth_type: kubernetes,请验证服务帐户令牌是否可以对保险库进行身份验证。首先,从 ESO Pod 中提取令牌:ESO_POD=$(kubectl get pods -n uipath -l app.kubernetes.io/name=external-secrets -o jsonpath='{.items[0].metadata.name}') JWT=$(kubectl exec -n uipath $ESO_POD -- cat /var/run/secrets/kubernetes.io/serviceaccount/token)ESO_POD=$(kubectl get pods -n uipath -l app.kubernetes.io/name=external-secrets -o jsonpath='{.items[0].metadata.name}') JWT=$(kubectl exec -n uipath $ESO_POD -- cat /var/run/secrets/kubernetes.io/serviceaccount/token)然后测试登录:
curl -sk --request POST \ --data "{\"jwt\": \"$JWT\", \"role\": \"<vault-role>\"}" \ https://<vault-server>:8200/v1/auth/<mount-path>/logincurl -sk --request POST \ --data "{\"jwt\": \"$JWT\", \"role\": \"<vault-role>\"}" \ https://<vault-server>:8200/v1/auth/<mount-path>/login成功的响应包含
client_token。permission denied错误表示保险库角色不允许使用该服务帐户,或者 Kubernetes 身份验证方法配置错误。 -
测试 AppRole Auth 登录如果使用
auth_type: approle,请验证 AppRole 凭据:curl -sk --request POST \ --data '{"role_id": "<role-id>", "secret_id": "<secret-id>"}' \ https://<vault-server>:8200/v1/auth/<mount-path>/logincurl -sk --request POST \ --data '{"role_id": "<role-id>", "secret_id": "<secret-id>"}' \ https://<vault-server>:8200/v1/auth/<mount-path>/login如果失败,请检查 AppRole
secret-id是否未过期 (secret_id_ttl)。 -
验证 AppRole 凭据密码是否存在
kubectl get secret <credentials-secret-name> -n uipath -o json | jq '.data | keys'kubectl get secret <credentials-secret-name> -n uipath -o json | jq '.data | keys'密码必须同时包含
role-id和secret-id键。 -
使用从上述身份验证步骤获得的保险库令牌测试读取保险库 KV v2 中的密码:
curl -sk -H "X-Vault-Token: <vault-token>" \ https://<vault-server>:8200/v1/<kv-path>/data/<secret-path>curl -sk -H "X-Vault-Token: <vault-token>" \ https://<vault-server>:8200/v1/<kv-path>/data/<secret-path>对于 KV v1,请从路径中删除
/data/。如果响应为no value found at path,请验证hashicorp_kv.version是否与实际引擎版本匹配。 -
验证 KV 引擎版本确保配置中的
hashicorp_kv.version与保险库中启用的实际 KV 引擎版本(v1或v2)匹配。不匹配会产生no value found at path错误,因为 v1 和 v2 使用不同的 API 路径。 -
验证 Kubernetes Auth 配置确保已启用保险库 Kubernetes Auth 方法,并使用正确的
kubernetes_host配置。验证 Vault 角色是否允许 ESO 服务帐户(或自定义service_account_name)。
验证 AWS Secrets Manager 连接和权限
如果您使用 AWS Secrets Manager 作为密码提供程序,请验证以下内容:
-
验证访问密钥凭据密码是否存在
kubectl get secret <credentials-secret-name> -n uipath -o json | jq '.data | keys'kubectl get secret <credentials-secret-name> -n uipath -o json | jq '.data | keys'密码必须同时包含
access-key-id和secret-access-key键。 -
测试 AWS Secrets Manager 访问权限使用访问密钥凭据,验证是否可以检索密码:
aws secretsmanager get-secret-value \ --secret-id <secret-name> --region <region>aws secretsmanager get-secret-value \ --secret-id <secret-name> --region <region>AccessDeniedException- IAM 用户没有secretsmanager:GetSecretValue权限。ResourceNotFoundException- 密码在指定的区域中不存在。验证aws_kv.region值。
-
检查区域配置验证
aws_kv.region值与存储密码的区域匹配。区域不匹配会产生ResourceNotFoundException错误。
TLS 和 CA 证书问题
当保险库或 AWS 端点将 HTTPS 与私有 CA 证书一起使用时,请验证以下内容:
-
检查是否存在其他 CA 证书密码
kubectl get secret additional-ca-certificates -n uipathkubectl get secret additional-ca-certificates -n uipath -
验证 CA 证书内容
kubectl get secret additional-ca-certificates -n uipath -o jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -text -nooutkubectl get secret additional-ca-certificates -n uipath -o jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -text -noout检查证书未过期,以及颁发者是否与您的保险库或 AWS 端点使用的 CA 匹配。
-
测试 TLS 握手
curl -v https://<vault-server>:8200/v1/sys/healthcurl -v https://<vault-server>:8200/v1/sys/health如果看到
SSL certificate problem: unable to get local issuer certificate,则表示该 CA 证书不受信任。验证在input.json中是否配置了additional_ca_certs。要使用特定 CA 证书文件进行测试,请执行以下操作:curl -v --cacert /path/to/ca.crt https://<vault-server>:8200/v1/sys/healthcurl -v --cacert /path/to/ca.crt https://<vault-server>:8200/v1/sys/health
常见配置问题
查看以下常见问题和相应的错误消息,以帮助诊断问题。
| 问题 | 可能的原因 | 示例/错误输出 |
|---|---|---|
| 在集群中找不到密码 | 缺少 Kubernetes 密码 | Warning InvalidProviderConfig 3s (x4 over 8s) secret-store cannot get Kubernetes secret "azure-service-principal-secret" from namespace "uipath": secrets "azure-service-principal-secret" not found |
| 凭据无效 | 客户端 ID、客户端密码或租户 ID 不正确 | error processing spec.data[0] (key: external-object-storage-account-key-10176524), err: azure.BearerAuthorizer#WithAuthorization: Failed to refresh the Token for request ... StatusCode=400 |
| 缺少密钥保险库对象 | Azure 密钥保险库中没有密钥 | external-secrets error processing spec.data[0] (key: external-object-storage-account-key), err: Secret does not exist |
| 无法访问 HashiCorp 保险库(只读) | 错误的服务器 URL 或阻止访问的网络策略 | connection refused 或者 context deadline exceeded |
| 保险库身份验证失败 | Kubernetes 服务帐户未绑定到保险库角色,或 AppRole 已过期 secret-id | permission denied |
| KV 版本不匹配 | hashicorp_kv.version 设置为v2 ,但引擎为v1 (反之亦然) | no value found at path |
| AWS 凭据无效 | 访问密钥 ID 或秘密访问密钥不正确 | InvalidClientTokenId 或者 SignatureDoesNotMatch |
| 未找到 AWS 密码 | 密码在配置的区域中不存在,或者区域不匹配 | ResourceNotFoundException |
要进一步调查这些问题,请查看控制器日志或描述相关资源:
kubectl describe externalsecret <name> -n <namespace>
kubectl describe secretstore <name> -n <namespace>
kubectl describe externalsecret <name> -n <namespace>
kubectl describe secretstore <name> -n <namespace>