6.3 KiB
| title | description | weight | keywords | owner | test | |||||
|---|---|---|---|---|---|---|---|---|---|---|
| Explicit Deny | Shows how to set up access control to deny traffic explicitly. | 40 |
|
istio/wg-security-maintainers | yes |
This task shows you how to set up Istio authorization policy of DENY action to explicitly deny traffic in an Istio
mesh. This is different from the ALLOW action because the DENY action has higher priority and will not be
bypassed by any ALLOW actions.
Before you begin
Before you begin this task, do the following:
-
Read the Istio authorization concepts.
-
Follow the Istio installation guide to install Istio.
-
Deploy workloads:
This task uses two workloads,
httpbinandcurl, deployed on one namespace,foo. Both workloads run with an Envoy proxy in front of each. Deploy the example namespace and workloads with the following command:{{< 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 >}}
-
Verify that
curltalks tohttpbinwith the following command:{{< 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 >}} If you don’t see the expected output as you follow the task, retry after a few seconds. Caching and propagation overhead can cause some delay. {{< /warning >}}
Explicitly deny a request
-
The following command creates the
deny-method-getauthorization policy for thehttpbinworkload in thefoonamespace. The policy sets theactiontoDENYto deny requests that satisfy the conditions set in therulessection. This type of policy is better known as a deny policy. In this case, the policy denies requests if their method isGET.{{< 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:
-
Verify that
GETrequests are denied:{{< 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 >}} -
Verify that
POSTrequests are allowed:{{< 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 >}} -
Update the
deny-method-getauthorization policy to denyGETrequests only if thex-tokenvalue of the HTTP header is notadmin. The following example policy sets the value of thenotValuesfield to["admin"]to deny requests with a header value that is notadmin:{{< 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:
-
Verify that
GETrequests with the HTTP headerx-token: adminare allowed:{{< 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 >}} -
Verify that GET requests with the HTTP header
x-token: guestare denied:{{< 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 >}} -
The following command creates the
allow-path-ipauthorization policy to allow requests at the/ippath to thehttpbinworkload. This authorization policy sets theactionfield toALLOW. This type of policy is better known as an allow policy.{{< 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:
-
Verify that
GETrequests with the HTTP headerx-token: guestat path/ipare denied by thedeny-method-getpolicy. Deny policies takes precedence over the allow policies:{{< 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 >}} -
Verify that
GETrequests with the HTTP headerx-token: adminat path/ipare allowed by theallow-path-ippolicy:{{< 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 >}} -
Verify that
GETrequests with the HTTP headerx-token: adminat path/getare denied because they don’t match theallow-path-ippolicy:{{< 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 >}}
Clean up
Remove the namespace foo from your configuration:
{{< text bash >}} $ kubectl delete namespace foo {{< /text >}}