深入浅出Istio 安全加固

概述

Istio 为运行于不可信环境内的服务网格提供了无须代码侵入的安全加固能力。微服务改造之后,在流量、监控等基本业务目标之外,安全问题也要引起重视。
原本在单体应用内通过进程内访问控制框架完成的任务,被分散到各个微服中;在容器集群中还可能出现不同命名空间及不同业务域的互访问题。
Istio中也提供了无侵入的安全解决方案,能够提供网格内部、网格和边缘之间的安全通信和访问控制能力。

  • Citadel 提供证书和认证管理功能;
  • Sidecar 建立加密通道,为其代理的应用进行协议升级,为客户端和服务端之间提供基于 mTLS 的加密通信;
  • Pilot 负责传播加密身份和认证策略。

实战

测试默认访问

# http http://httpbin:8000/get
HTTP/1.1 200 OK
access-control-allow-credentials: true
access-control-allow-origin: *
content-length: 423
content-type: application/json
date: Wed, 15 Jul 2020 07:19:59 GMT
server: envoy
x-envoy-upstream-service-time: 343
{
    "args": {},
    "headers": {
        "Accept": "*/*",
        "Accept-Encoding": "gzip, deflate",
        "Content-Length": "0",
        "Host": "httpbin:8000",
        "User-Agent": "HTTPie/2.1.0",
        "X-B3-Parentspanid": "18d852cdd8dd75f1",
        "X-B3-Sampled": "0",
        "X-B3-Spanid": "b15acfa72373229e",
        "X-B3-Traceid": "f3146b46ba6fc96f18d852cdd8dd75f1"
    },
    "origin": "127.0.0.1",
    "url": "http://httpbin:8000/get"
}

启用 mTLS

apiVersion: "authentication.istio.io/v1alpha1"
kind: "MeshPolicy"
metadata:
  name: "default"
spec:
  peers:
    - mtls: {}

测试默认访问

http http://httpbin:8000/get 
HTTP/1.1 503 Service Unavailable
content-length: 57
content-type: text/plain
date: Wed, 15 Jul 2020 07:32:51 GMT
server: envoy

upstream connect error or disconnect/reset before headers

所有的服务端 Sidecar 都只接受 mTLS 客户端的接人,客户端 DestinationRule 对象来显式声明这个接人要求:

apiVersion: "networking.istio.io/v1alpha3"
kind: "DestinationRule"
metadata:
  name: "httpbin"
spec:
  host: "httpbin.default.svc.cluster.local"
  trafficPolicy:
   tls:
     mode: ISTIO_MUTUAL

接入dr客户端测试结果:


http http://httpbin:8000/get
HTTP/1.1 200 OK
access-control-allow-credentials: true
access-control-allow-origin: *
content-length: 708
content-type: application/json
date: Wed, 15 Jul 2020 08:28:36 GMT
server: envoy
x-envoy-upstream-service-time: 37

{
    "args": {},
    "headers": {
        "Accept": "*/*",
        "Accept-Encoding": "gzip, deflate",
        "Content-Length": "0",
        "Host": "httpbin:8000",
        "User-Agent": "HTTPie/2.1.0",
        "X-B3-Parentspanid": "4ac341b2375f5855",
        "X-B3-Sampled": "0",
        "X-B3-Spanid": "ed42d2b48f4873b0",
        "X-B3-Traceid": "e7f321984fc7b4524ac341b2375f5855",
        "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/27a89b94b77f459e81a6010905c33a1e-book2mesh/sa/default;Hash=0861af59ac9db940e67ed01281692b0862568ba08368dd7381ca9f89e532053c;Subject=\"\";URI=spiffe://cluster.local/ns/27a89b94b77f459e81a6010905c33a1e-book2mesh/sa/default"
    },
    "origin": "127.0.0.1",
    "url": "http://httpbin:8000/get"
}

设置 RBAC

为所有default 命名空间中的服务都启动 RBAC 策略:

apiVersion: "rbac.istio.io/v1alpha1"
kind: RbacConfig
metadata:
  name: default
spec:
  mode: "ON_WITH_INCLUSION"
  inclusion:
    namespaces: ["default"]

再次启动测试:

HTTP/1.1 403 Forbidden
content-length: 19
content-type: text/plain
date: Wed, 15 Jul 2020 08:55:57 GMT
server: envoy
x-envoy-upstream-service-time: 25

RBAC: access denied

RBAC 启动之 后,在默认情况下,所有服务的调用都会被拒绝。

一般来 说, RBAC 系统中的授权过程都是通过以下几步进行设置的:
-( 1)在系统中定义原子粒度的权限;
-( 2)将一个或者多个权限组合为角色
-( 3)将角色和用户进行绑定 ,从而让用 户具备绑定的角色所 拥有的权限

设置service role:

定义service-viewer 角色,在 rules 字段中进行授权,允许该角色使用 GET 方法访问所有服务。

apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
  name: service-viewer
spec:
  rules:
  - services:
    - "*"
    methods:
    - "GET"

将上面的角色绑到所有 default 命名空间的ServiceAccount 上:

apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
  name: bind-service-viewer
spec:
  subjects:
    - properties:
        source.namespace: "default"
  roleRef:
    kind: ServiceRole
    name: "service-viewer"

subject 用了一个属性限制来指定绑定目标:所有来自 default 命名空间的调用者的用 户都被绑定 service viewer 这个角色上。
测试结果:

http http://httpbin:8000/ip
HTTP/1.1 200 OK
access-control-allow-credentials: true
access-control-allow-origin: *
content-length: 28
content-type: application/json
date: Wed, 15 Jul 2020 09:45:14 GMT
server: envoy
x-envoy-upstream-service-time: 6

{
    "origin": "127.0.0.1"
}

测试有没有授权的 POST 方法:

http -f POST http http://httpbin:8000/post name=vincent
HTTP/1.1 404 Not Found
connection: close
content-length: 0
date: Wed, 15 Jul 2020 09:47:43 GMT
server: envoy
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,699评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,124评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,127评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,342评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,356评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,057评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,654评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,572评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,095评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,205评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,343评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,015评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,704评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,196评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,320评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,690评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,348评论 2 358