当您需要精细控制服务间的TCP流量访问时,可以为TCP流量设置授权策略,管理服务之间的交互权限,确保只有经过授权的请求才能访问特定服务,提高服务的安全性和可靠性。
前提条件
已定义Istio资源。具体操作,请参见使用Istio资源实现版本流量路由。
步骤一:部署示例应用
部署tcp-echo作为被请求的TCP服务,sleep作为发起请求的TCP服务。
部署被请求的TCP服务。
使用以下内容,创建tcp-echo.yaml文件。
当tcp-echo收到请求后,将在请求内容新增
hello
前缀,作为返回结果。例如,向tcp-echo发送world
,将返回hello world
。使用kubectl连接到集群,执行以下命令,将tcp-echo服务部署到foo命名空间,作为被请求的TCP服务。
关于如何使用kubectl连接到集群,请参见获取集群KubeConfig并通过kubectl工具连接集群。
kubectl apply -f tcp-echo.yaml -n foo
部署发起请求的TCP服务。
使用以下内容,创建sleep.yaml文件。
执行以下命令,将sleep服务部署到foo命名空间,用于发起TCP请求。
kubectl apply -f sleep.yaml -n foo
步骤二:验证授权前,请求是否成功
执行以下命令,验证sleep请求服务能否访问TCP服务的9000端口。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9000" | nc tcp-echo 9000' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'
预期输出:
hello port 9000 connection succeeded
预期输出表明sleep请求服务访问TCP服务的9000端口成功。
执行以下命令,验证sleep请求服务能否访问TCP服务的9001端口。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9001" | nc tcp-echo 9001' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'
预期输出:
hello port 9001 connection succeeded
预期输出表明sleep请求服务访问TCP服务的9001端口成功。
步骤三:配置授权策略
配置可以访问TCP服务的9000端口的授权策略,具体操作步骤如下。
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
任选以下方式创建授权策略。
重要配置TCP授权策略时,不能打开HTTP方法(Methods)开关。这种配置仅限于HTTP请求使用,不符合TCP的ALLOW规则,为无效配置。服务网格将忽略无效的ALLOW规则,导致请求被拒绝,返回
connection rejected
。方式一:使用YAML创建授权策略
在授权策略页面,单击使用YAML创建。
在创建页面,选择命名空间为foo,选择任意场景模版,将以下YAML模板粘贴到YAML区域,然后单击创建。
kind: AuthorizationPolicy apiVersion: security.istio.io/v1beta1 metadata: name: demo namespace: foo spec: action: ALLOW rules: - to: - operation: ports: - '9000'
方式二:通过图形化界面创建授权策略
在授权策略页面,单击创建。
在创建页面,配置相关信息,然后单击创建。
配置项
说明
名称
本示例为demo。
策略类型
选择允许。
命名空间
在工作负载生效页签,选择foo命名空间。
生效范围
选择命名空间生效。
请求匹配规则
在添加请求目标区域,打开端口(Ports)开关,设置值为9000。
步骤四:验证授权后,请求是否成功
执行以下命令,验证sleep请求服务能否访问TCP服务的9001端口。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9001" | nc tcp-echo 9001' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'
预期输出:
connection rejected
预期输出表明sleep请求服务访问TCP服务的9001端口失败。
执行以下命令,验证sleep请求服务能否访问TCP服务的9000端口。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9000" | nc tcp-echo 9000' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'
预期输出:
hello port 9000 connection succeeded
预期输出表明sleep请求服务访问TCP服务的9000端口成功。
相关文档
对授权策略配置失误可能会引起非预期的访问被拒绝或放行,您可以使用ASM授权策略试运行模式,通过日志判断对应策略的执行结果是否符合预期,确认无误后关闭试运行模式,使授权策略真正生效。具体操作,请参见使用ASM授权策略试运行模式。
如果您需要精细控制服务间的HTTP流量访问,请参见为HTTP流量设置授权策略。
如果您需要对网格外服务进行授权控制,请参见对网格内服务访问外部网站进行授权控制和对网格内服务访问外部数据库进行授权控制。
您可以自定义ASM网关访问日志的内容,及时发现潜在的安全问题。具体操作,请参见生成和采集ASM网关访问日志。
您可以启用网格审计功能,记录或追溯不同用户的日常操作,也可以为网格资源操作配置审计告警,在重要资源变动时及时发出告警通知到告警联系人。具体操作,请参见使用KubeAPI操作审计和为网格资源操作配置审计告警。