本任务向您展示如何使用授权策略对Istio ingress网关实施访问控制。

Istio授权策略支持基于ip的允许列表或拒绝列表,以及之前由混合策略提供的基于属性的允许列表或拒绝列表。混合器策略在1.5中是不推荐的,不建议在生产中使用。

1. 准备工作

  • 部署一个工作负载,在名称空间中的httpbin,例如foo,并通过Istio ingress网关使用以下命令公开它:
  1. $ kubectl create ns foo
  2. $ kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo
  3. $ kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin-gateway.yaml) -n foo
  • 有关更多信息,请参见带有Type=NodePort的服务的源IP。更新ingress gateway以设置externalTrafficPolicy: local来保存ingress gateway上的原始客户端源IP,使用以下命令:
  1. $ kubectl patch svc istio-ingressgateway -n istio-system -p '{"spec":{"externalTrafficPolicy":"Local"}}'
  • 使用以下命令检查httpbin工作负载和ingress网关是否按预期工作:
  1. $ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
  2. $ curl $INGRESS_HOST/headers -s -o /dev/null -w "%{http_code}\n"

2. 基于IP的访问列表和拒绝列表

  1. 下面的命令为Istio ingress网关创建授权策略ingress-policy。以下策略设置action字段,以允许在ipBlocks中指定的IP地址访问ingress网关。不在列表中的IP地址将被拒绝。ipBlocks同时支持单IP地址和CIDR符号。创建授权策略
  1. $ kubectl apply -f - <<EOF
  2. apiVersion: security.istio.io/v1beta1
  3. kind: AuthorizationPolicy
  4. metadata:
  5. name: ingress-policy
  6. namespace: istio-system
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: istio-ingressgateway
  11. action: ALLOW
  12. rules:
  13. - from:
  14. - source:
  15. ipBlocks: ["1.2.3.4", "5.6.7.0/24"]
  16. EOF
  1. 校验到ingress gateway的请求是拒绝的
  1. curl $INGRESS_HOST/headers -s -o /dev/null -w "%{http_code}\n"
  1. 更新ingress-policy以包含您的客户端IP地址
  1. $ kubectl apply -f - <<EOF
  2. apiVersion: security.istio.io/v1beta1
  3. kind: AuthorizationPolicy
  4. metadata:
  5. name: ingress-policy
  6. namespace: istio-system
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: istio-ingressgateway
  11. action: ALLOW
  12. rules:
  13. - from:
  14. - source:
  15. ipBlocks: ["1.2.3.4", "5.6.7.0/24", "10.1.0.2"]
  16. EOF
  1. 校验到ingress gateway的请求是允许的
  1. $ curl $INGRESS_HOST/headers -s -o /dev/null -w "%{http_code}\n"
  1. 更新ingress-policy授权策略,设置要拒绝的操作键,以便不允许ipBlocks中指定的IP地址访问ingress网关
  1. $ kubectl apply -f - <<EOF
  2. apiVersion: security.istio.io/v1beta1
  3. kind: AuthorizationPolicy
  4. metadata:
  5. name: ingress-policy
  6. namespace: istio-system
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: istio-ingressgateway
  11. action: DENY
  12. rules:
  13. - from:
  14. - source:
  15. ipBlocks: ["10.1.0.2"]
  16. EOF
  1. 验证对入口网关的请求被拒绝
  1. $ curl $INGRESS_HOST/headers -s -o /dev/null -w "%{http_code}\n"
  1. 您可以使用在线代理服务来访问入口网关,使用不同的客户端IP来验证请求是否被允许

3. 清空本次实验

  1. 移除名称空间foo
  1. $ kubectl delete namespace foo
  1. 移除授权的策略
  1. $ kubectl delete authorizationpolicy ingress-policy -n istio-system