【问题标题】:Hide error message on Policy failure in Istio在 Istio 中隐藏有关策略失败的错误消息
【发布时间】:2020-02-28 19:45:22
【问题描述】:

如果我在 Istio 中定义了一个 AuthorizationPolicy 被违反,错误信息会返回给我,例如:

INTERNAL:performing check operation failed: 1 error occurred:%0A%09* rpc error: code = PermissionDenied desc = RBAC: access denied%0A%0A

有什么方法可以隐藏消息吗?

Istio 版本:1.4.5

【问题讨论】:

  • 你能告诉我你是怎么得到这个错误的吗?当您访问站点/卷曲时出现?我使用基于此tutorial 的 bookinfo-productpage 示例对其进行了检查,它仅显示RBAC: access denied
  • 我正在使用这个项目:github.com/ibm-cloud-security/app-identity-and-access-adapter - 它发生在各种情况下,例如当策略阻止混音器连接到进程外适配器时,我猜混音器看到RBAC: access denied 并提高它 - 无论哪种方式,我都想控制返回消息,即使它只是RBAC: access denied,因为它可能会放弃实现信息
  • 当我尝试在浏览器中访问受保护的服务时看到它
  • 我发现的关于您显示的错误的唯一信息是there。因此,就我而言,您实际上会更改 istio 代码以实现您所需要的。
  • 是的,听起来不错

标签: istio envoyproxy


【解决方案1】:

基于以下istio github code

// CheckRBACRequest checks if a request is successful under RBAC policies.
// Under RBAC policies, a request is consider successful if:
// * If the policy is allow:
// *** Response code is 200
// * If the policy is deny:
// *** For HTTP: response code is 403.
// *** For TCP: EOF error
func (tc TestCase) CheckRBACRequest() error {
    req := tc.Request

    headers := make(http.Header)
    if len(tc.Jwt) > 0 {
        headers.Add("Authorization", "Bearer "+tc.Jwt)
    }
    for k, v := range tc.Headers {
        headers.Add(k, v)
    }
    tc.Request.Options.Headers = headers

    resp, err := req.From.Call(tc.Request.Options)

    if tc.ExpectAllowed {
        if err == nil {
            err = resp.CheckOK()
        }
        if err != nil {
            return getError(req, "allow with code 200", fmt.Sprintf("error: %v", err))
        }
    } else {
        if req.Options.PortName == "tcp" || req.Options.PortName == "grpc" {
            expectedErrMsg := "EOF" // TCP deny message.
            if req.Options.PortName == "grpc" {
                expectedErrMsg = "rpc error: code = PermissionDenied desc = RBAC: access denied"
            }
            if err == nil || !strings.Contains(err.Error(), expectedErrMsg) {
                expect := fmt.Sprintf("deny with %s error", expectedErrMsg)
                actual := fmt.Sprintf("error: %v", err)
                return getError(req, expect, actual)
            }
        } else {
            if err != nil {
                return getError(req, "deny with code 403", fmt.Sprintf("error: %v", err))
            }
            var result string
            if len(resp) == 0 {
                result = "no response"
            } else if resp[0].Code != response.StatusCodeForbidden {
                result = resp[0].Code
            }
            if result != "" {
                return getError(req, "deny with code 403", result)
            }
        }
    }
    return nil
}

就我而言,基于上述代码,您必须实际更改 istio 代码才能实现您的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    相关资源
    最近更新 更多