在云原生领域,安全是绕不开的话题。我们在希望产品快速迭代,业务告诉发展的同时,也希望应用运行在一个相对安全的环境,所谓的应用环境安全,是指应用的访问受限,可控,可审计。
在过去,我们想要实现一个应用的访问受限,需要对业务代码做大量改造。 接入servicemesh后,我们不需要任何改造,可以实现业务对接。前置条件
- 一个ASM实例
- 创建好的ACK Kubernetes集群,添加到ASM实例中
环境搭建
Demo应用使用的是一个10个微服务组成的商城应用,架构如图所示。
我们创建两个外部Pod,分别在default namespace和一个新的namespace。 新的namespace不开启服务网格注入。
# 在default命名空间中创建应用, 开启ISTIO注入
kubectl apply -f client.yaml -n default
# 创建命名空间 不开启服务网格注入
kubectl create ns ns-1
# 创建应用
kubectl apply -f client.yaml -n ns-1
在Demo中,我们以
productcatalog
这个服务作为目标服务,给他加上安全加固和访问限制。
开启安全认证
ASM中支持通过配置设置服务的安全认证,开启目标服务只允许TLS加密连接,防止中间人攻击。
apiVersion: "authentication.istio.io/v1alpha1"
kind: "Policy"
metadata:
name: "mtls"
namespace: "default"
spec:
targets:
- name: productcatalogservice
peers:
- mtls:
mode: STRICT
给Istio中访问 productcatalog 的连接做TLS升级
apiVersion: "networking.istio.io/v1alpha3"
kind: "DestinationRule"
metadata:
name: "productcatalogservice"
spec:
host: "productcatalogservice"
trafficPolicy:
tls:
mode: "ISTIO_MUTUAL"
subsets:
- name: v3
labels:
version: v3
此时我们从 ns-1 中的client 容器访问 productcatalogservice , 会出现连接失败
# kubectl -n ns-1 exec -it client-79dd6fbd87-ghl2d sh
/ # curl productcatalogservice.default:3550
curl: (56) Recv failure: Connection reset by peer
开启访问限制
在ASM中可以通过下发授权规则,显示某个服务的访问,并且支持灵活的授权策略
给productcatalogservice 配置访问限制, 不允许其他服务访问
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "productcatalogservice"
namespace: default
spec:
selector:
matchLabels:
app: productcatalogservice
rules:
- from:
- source:
此时访问电商平台可以看到访问拒绝,因为电商平台中相关服务没有访问权限。
增加访问授权
给 productcatalogservice 增加授权, 允许部分服务访问
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "productcatalogservice"
namespace: default
spec:
selector:
matchLabels:
app: productcatalogservice
rules:
- from:
- source:
principals:
- cluster.local/ns/default/sa/frontend
- cluster.local/ns/default/sa/recommendationservice
- cluster.local/ns/default/sa/checkoutservice
to:
- operation:
methods:
- "*"
此时电商平台恢复正常。
我们通过default namespace中的client 访问, 因为不在授权中国呢,会提示权限不足。 符合预期
kubectl exec -it client-79dd6fbd87-4nj7t sh
/ # curl productcatalogservice.default:3550
RBAC: access denied
总结
通过服务网格,我们无需一行代码修改,通过配置的方式即可实现应用的访问链路加密和访问授权。