天天看点

ASM安全加固与访问控制

在云原生领域,安全是绕不开的话题。我们在希望产品快速迭代,业务告诉发展的同时,也希望应用运行在一个相对安全的环境,所谓的应用环境安全,是指应用的访问受限,可控,可审计。

ASM安全加固与访问控制
在过去,我们想要实现一个应用的访问受限,需要对业务代码做大量改造。 接入servicemesh后,我们不需要任何改造,可以实现业务对接。

前置条件

  1. 一个ASM实例
  2. 创建好的ACK Kubernetes集群,添加到ASM实例中

环境搭建

Demo应用使用的是一个10个微服务组成的商城应用,架构如图所示。

ASM安全加固与访问控制
ASM安全加固与访问控制

我们创建两个外部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加密连接,防止中间人攻击。

ASM安全加固与访问控制
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中可以通过下发授权规则,显示某个服务的访问,并且支持灵活的授权策略

ASM安全加固与访问控制

给productcatalogservice 配置访问限制, 不允许其他服务访问

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
 name: "productcatalogservice"
 namespace: default
spec:
 selector:
   matchLabels:
     app: productcatalogservice
 rules:
 - from:
   - source:           

此时访问电商平台可以看到访问拒绝,因为电商平台中相关服务没有访问权限。

ASM安全加固与访问控制

增加访问授权

ASM安全加固与访问控制

给 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           

总结

通过服务网格,我们无需一行代码修改,通过配置的方式即可实现应用的访问链路加密和访问授权。

ASM安全加固与访问控制
上一篇: OSS Python SDK
下一篇: OSS 回源功能