本任务向您展示如何使用授权策略对Istio ingress网关实施访问控制。
Istio授权策略支持基于ip的允许列表或拒绝列表,以及之前由混合策略提供的基于属性的允许列表或拒绝列表。混合器策略在1.5中是不推荐的,不建议在生产中使用。
1. 准备工作
- 部署一个工作负载,在名称空间中的httpbin,例如foo,并通过Istio ingress网关使用以下命令公开它:
$ 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/httpbin/httpbin-gateway.yaml) -n foo
- 有关更多信息,请参见带有Type=NodePort的服务的源IP。更新ingress gateway以设置externalTrafficPolicy: local来保存ingress gateway上的原始客户端源IP,使用以下命令:
$ kubectl patch svc istio-ingressgateway -n istio-system -p '{"spec":{"externalTrafficPolicy":"Local"}}'
- 使用以下命令检查httpbin工作负载和ingress网关是否按预期工作:
$ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
$ curl $INGRESS_HOST/headers -s -o /dev/null -w "%{http_code}\n"
2. 基于IP的访问列表和拒绝列表
- 下面的命令为Istio ingress网关创建授权策略ingress-policy。以下策略设置action字段,以允许在ipBlocks中指定的IP地址访问ingress网关。不在列表中的IP地址将被拒绝。ipBlocks同时支持单IP地址和CIDR符号。创建授权策略
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: ingress-policy
namespace: istio-system
spec:
selector:
matchLabels:
app: istio-ingressgateway
action: ALLOW
rules:
- from:
- source:
ipBlocks: ["1.2.3.4", "5.6.7.0/24"]
EOF
- 校验到ingress gateway的请求是拒绝的
curl $INGRESS_HOST/headers -s -o /dev/null -w "%{http_code}\n"
- 更新ingress-policy以包含您的客户端IP地址
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: ingress-policy
namespace: istio-system
spec:
selector:
matchLabels:
app: istio-ingressgateway
action: ALLOW
rules:
- from:
- source:
ipBlocks: ["1.2.3.4", "5.6.7.0/24", "10.1.0.2"]
EOF
- 校验到ingress gateway的请求是允许的
$ curl $INGRESS_HOST/headers -s -o /dev/null -w "%{http_code}\n"
- 更新ingress-policy授权策略,设置要拒绝的操作键,以便不允许ipBlocks中指定的IP地址访问ingress网关
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: ingress-policy
namespace: istio-system
spec:
selector:
matchLabels:
app: istio-ingressgateway
action: DENY
rules:
- from:
- source:
ipBlocks: ["10.1.0.2"]
EOF
- 验证对入口网关的请求被拒绝
$ curl $INGRESS_HOST/headers -s -o /dev/null -w "%{http_code}\n"
- 您可以使用在线代理服务来访问入口网关,使用不同的客户端IP来验证请求是否被允许
3. 清空本次实验
- 移除名称空间foo
$ kubectl delete namespace foo
- 移除授权的策略
$ kubectl delete authorizationpolicy ingress-policy -n istio-system