6.1 KiB
| title | description | weight | keywords | owner | test | |||||
|---|---|---|---|---|---|---|---|---|---|---|
| 明确拒绝 | 如何设置访问控制以明确地拒绝流量。 | 40 |
|
istio/wg-security-maintainers | yes |
此任务介绍如何设置 DENY 动作中的 Istio 授权策略,以明确拒绝 Istio 网格中的流量。
这与 ALLOW 动作不同,因为 DENY 动作具有更高的优先级,不会被任何 ALLOW 动作绕过。
开始之前
在您开始之前,请执行以下操作:
-
阅读 Istio 授权概念。
-
根据 Istio 安装指南安装 Istio。
-
部署工作负载:
该任务使用
httpbin和curl这两个工作负载,部署在一个命名空间foo中。 这两个工作负载之前都运行了一个 Envoy 代理。使用以下命令部署示例命名空间和工作负载:{{< text bash >}} $ kubectl create ns foo $ kubectl apply -f <(istioctl kube-inject -f @samples/httpbin/httpbin.yaml@) -n foo $ kubectl apply -f <(istioctl kube-inject -f @samples/curl/curl.yaml@) -n foo {{< /text >}}
-
使用以下命令校验
curl任务与httpbin的对话。{{< text bash >}}
kubectl exec "(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl http://httpbin.foo:8000/ip -sS -o /dev/null -w "%{http_code}\n" 200 {{< /text >}}
{{< warning >}} 如果您在执行此任务时,没有看见到预期的输出,请您在几秒后重试。 缓存和传播成本可能会导致一些延迟。 {{< /warning >}}
明确拒绝请求
-
以下命令为
foo命名空间中的httpbin工作负载创建deny-method-get授权策略。 该授权将action设置为DENY,以拒绝满足rules部分设置的条件的请求。 该类型策略被称为“拒绝策略”。在这种情况下,如果请求方式是GET,策略会拒绝请求。{{< text bash >}} $ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: deny-method-get namespace: foo spec: selector: matchLabels: app: httpbin action: DENY rules:
- to:
- operation: methods: ["GET"] EOF {{< /text >}}
- to:
-
检查
GET请求是否被拒绝:{{< text bash >}}
kubectl exec "(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/get" -X GET -sS -o /dev/null -w "%{http_code}\n" 403 {{< /text >}} -
检查是否允许
POST请求:{{< text bash >}}
kubectl exec "(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/post" -X POST -sS -o /dev/null -w "%{http_code}\n" 200 {{< /text >}} -
更新
deny-method-get授权策略,只有当 HTTP 头中x-token值不是admin时才会拒绝GET请求。以下的策略示例将notValues字段的值设置为["admin"],以拒绝 HTTP 头中x-token值为非admin的请求:{{< text bash >}} $ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: deny-method-get namespace: foo spec: selector: matchLabels: app: httpbin action: DENY rules:
- to:
- operation: methods: ["GET"] when:
- key: request.headers[x-token] notValues: ["admin"] EOF {{< /text >}}
- to:
-
检查是否允许 HTTP 头
x-token: admin的GET请求:{{< text bash >}}
kubectl exec "(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/get" -X GET -H "x-token: admin" -sS -o /dev/null -w "%{http_code}\n" 200 {{< /text >}} -
检查 HTTP 头
x-token: guest的 GET 请求是否被拒绝:{{< text bash >}}
kubectl exec "(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/get" -X GET -H "x-token: guest" -sS -o /dev/null -w "%{http_code}\n" 403 {{< /text >}} -
以下命令创建
allow-path-ip授权策略,允许以/ip路径向httpbin工作负载发出请求。此授权策略设置action字段为ALLOW,此类型的策略被称为“允许策略”。{{< text bash >}} $ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: allow-path-ip namespace: foo spec: selector: matchLabels: app: httpbin action: ALLOW rules:
- to:
- operation: paths: ["/ip"] EOF {{< /text >}}
- to:
-
检查
/ip中 HTTP 头中x-token: guest的GET请求会否被deny-method-get策略拒绝。“拒绝策略”优先级高于“允许策略”:{{< text bash >}}
kubectl exec "(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/ip" -X GET -H "x-token: guest" -s -o /dev/null -w "%{http_code}\n" 403 {{< /text >}} -
检查
/ip路径中 HTTP 头x-token: admin的GET请求是否被allow-path-ip策略允许:{{< text bash >}}
kubectl exec "(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/ip" -X GET -H "x-token: admin" -s -o /dev/null -w "%{http_code}\n" 200 {{< /text >}} -
检查
/get路径的 HTTP 头x-token: admin的GET请求是否被拒绝, 因为它们与allow-path-ip策略不匹配:{{< text bash >}}
kubectl exec "(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/get" -X GET -H "x-token: admin" -s -o /dev/null -w "%{http_code}\n" 403 {{< /text >}}
清理
从配置中删除命名空间 foo:
{{< text bash >}} $ kubectl delete namespace foo {{< /text >}}