tnblog
首页
视频
资源
登录

Dapr mTLS 安全

5501人阅读 2021/12/28 22:03 总访问:3258953 评论:0 收藏:0 手机
分类: 容器编排

Dapr mTLS 安全


这是讲什么呢?在我们开发应用的时候有些地方需要注意安全的访问,比如通过TLS加密的访问,这就让开发人员觉得很麻烦。dapr通过mTLS正是解决这个问题的。
它通过每个应用所对应的dapr边车与其他dapr边车通信时将进行加密通信,通信时使用的证书可以不用开发人员管,将会由一个dapr Sentry服务进行管理。

mTLS工作原理


TLS:客户端根据服务端证书验证其身份
mTLS:客户端、服务端彼此都验证对方身份

mTLS自托管


关于mTLS自托管是由下图所示,由运营商提供或由 Sentry 服务生成的根/颁发者证书为应用程序颁发证书,这些证书存储在某个文件夹中。

服务配置


下面展示的是mTLS的配置,如果是使用的是Kubernetes将其部署到dapr-system命名空间中。在Dapr中默认是禁用状态需要将其启动。

  1. vim ~/config.yaml
  1. apiVersion: dapr.io/v1alpha1
  2. kind: Configuration
  3. metadata:
  4. name: daprsystem
  5. namespace: default
  6. spec:
  7. mtls:
  8. enabled: true

使用自己的证书


如果有证书的可以跳过这一步,或者使用的他自带的证书也是可以的。
安装证书相关工具:step与step-ca

  1. # https://github.com/smallstep/cli/releases/tag/v0.18.0
  2. wget -O step.tar.gz https://github.com/smallstep/cli/releases/download/v0.18.0/step_linux_0.18.0_amd64.tar.gz
  3. tar -xf step.tar.gz
  4. sudo cp step_0.18.0/bin/step /usr/bin
  5. # https://github.com/smallstep/certificates/releases/tag/v0.18.0
  6. wget -O step-ca.tar.gz https://github.com/smallstep/certificates/releases/download/v0.18.0/step-ca_linux_0.18.0_amd64.tar.gz
  7. tar -xf step-ca.tar.gz
  8. sudo cp step-ca_0.18.0/bin/step-ca /usr/bin

关于step与step-ca的使用大家可以参考:https://smallstep.com/docs/step-ca/installation


为 Sentry 服务创建一个目录以创建自签名根证书:

  1. mkdir -p $HOME/.dapr/certs


到该目录创建根证书:

  1. cd $HOME/.dapr/certs
  2. step certificate create cluster.local ca.crt ca.key --profile root-ca --no-password --insecure


创建颁发者证书:

  1. step certificate create cluster.local issuer.crt issuer.key --ca ca.crt --ca-key ca.key --profile intermediate-ca --not-after 8760h --no-password --insecure

运行Sentry服务


为了运行Sentry服务,首先我们需要安装Sentry服务。我们可以通过如下链接找到相关包。
https://github.com/dapr/dapr/releases


接着我们可通过如下命令进行安装(这里是Linux资源包,请选择合适的包进行下载)

  1. cd ~
  2. wget https://github.com/dapr/dapr/releases/download/v1.5.1/sentry_linux_amd64.tar.gz
  3. tar zxvf sentry_linux_amd64.tar.gz
  4. mv sentry /usr/bin


然后启动 Sentry:

  1. sentry --issuer-credentials $HOME/.dapr/certs --trust-domain cluster.local --config=~/config.yaml
参数 描述
--issuer-credentials 保存颁发者数据的凭据目录的路径(默认值/var/run/dapr/credentials
--trust-domain CA信任域(默认为localhost
--config 配置文件的路径或配置对象的名称(默认为daprsystem

拉取测试案例


打开一个新的终端,拉取测试代码

  1. cd ~
  2. git clone https://github.com/dapr/quickstarts.git
  3. cd quickstarts/hello-world/node


为每个 Dapr sidecar 实例提供 TLS 证书。您可以通过在运行 Dapr 实例之前设置以下环境变量来实现:

  1. export DAPR_TRUST_ANCHORS=`cat $HOME/.dapr/certs/ca.crt`
  2. export DAPR_CERT_CHAIN=`cat $HOME/.dapr/certs/issuer.crt`
  3. export DAPR_CERT_KEY=`cat $HOME/.dapr/certs/issuer.key`
  4. export NAMESPACE=default


如果使用 Dapr CLI,将 Dapr 指向上面的配置文件以运行启用 mTLS 的 Dapr 实例:

  1. npm install
  2. dapr run --app-id myapp --app-port 3000 --dapr-http-port 3500 --config ~/config.yaml node app.js


在成功运行启动后,十秒内未发现异常,mTLS启动成功。

Sentry 服务配置


以下是将工作负载证书 TTL 更改为 25 秒的 Sentry 配置示例:

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Configuration
  3. metadata:
  4. name: daprsystem
  5. namespace: default
  6. spec:
  7. mtls:
  8. enabled: true
  9. workloadCertTTL: "25s"


allowedClockSkew允许的时间偏差,多久更新一次证书:

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Configuration
  3. metadata:
  4. name: daprsystem
  5. namespace: default
  6. spec:
  7. mtls:
  8. enabled: true
  9. workloadCertTTL: "25s"
  10. allowedClockSkew: "15m"

Kubernetes 中的 mTLS


下图显示了 Sentry 系统服务如何根据由运营商提供或由 Sentry 服务生成并存储为 Kubernetes 机密的根/颁发者证书为应用程序颁发证书

检测Kubernetes是否启用mTLS

  1. dapr mtls -k

Sentry 服务配置


我们可以通过如下命令可查看Sentry配置

  1. kubectl get configurations/daprsystem --namespace dapr-system -o yaml


我们可以看到默认的工作负载证书TTL为24小时,默认情况下允许15分钟的时钟偏移。允许时钟偏移是为了避免由于时差导致的证书验证错误。

  1. # 编辑 Sentry 服务配置
  2. kubectl edit configurations/daprsystem --namespace dapr-system


保存更改后,对控制平面执行滚动更新:

  1. kubectl rollout restart deploy/dapr-sentry -n dapr-system
  2. kubectl rollout restart deploy/dapr-operator -n dapr-system
  3. kubectl rollout restart statefulsets/dapr-placement-server -n dapr-system

通过Helm添加自带证书


使用 Helm,您可以提供 PEM 编码的根证书、颁发者证书和私钥,这些证书将填充到 Sentry 服务使用的 Kubernetes 机密中。
建用于生成证书的配置文件,这是生成带有 SAN(主题替代名称)扩展字段的 v3 证书所必需的。首先将以下内容保存到名为 的文件中root.conf

  1. [req]
  2. distinguished_name = req_distinguished_name
  3. x509_extensions = v3_req
  4. prompt = no
  5. [req_distinguished_name]
  6. C = US
  7. ST = VA
  8. L = Daprville
  9. O = dapr.io/sentry
  10. OU = dapr.io/sentry
  11. CN = cluster.local
  12. [v3_req]
  13. basicConstraints = critical, CA:true
  14. keyUsage = critical, digitalSignature, cRLSign, keyCertSign
  15. extendedKeyUsage = serverAuth, clientAuth
  16. [alt_names]
  17. DNS.1 = cluster.local


对 重复此操作issuer.conf,将相同的内容粘贴到文件中,但添加pathlen:0到 basicConstraints 行的末尾,如下所示:

  1. [req]
  2. distinguished_name = req_distinguished_name
  3. x509_extensions = v3_req
  4. prompt = no
  5. [req_distinguished_name]
  6. C = US
  7. ST = VA
  8. L = Daprville
  9. O = dapr.io/sentry
  10. OU = dapr.io/sentry
  11. CN = cluster.local
  12. [v3_req]
  13. basicConstraints = critical, CA:true
  14. keyUsage = critical, digitalSignature, cRLSign, keyCertSign
  15. extendedKeyUsage = serverAuth, clientAuth
  16. [alt_names]
  17. DNS.1 = cluster.local
  18. basicConstraints = critical, CA:true, pathlen:0


运行以下命令以生成根证书和密钥

  1. openssl ecparam -genkey -name prime256v1 | openssl ec -out root.key
  2. openssl req -new -nodes -sha256 -key root.key -out root.csr -config root.conf -extensions v3_req
  3. openssl x509 -req -sha256 -days 365 -in root.csr -signkey root.key -outform PEM -out root.pem -extfile root.conf -extensions v3_req


接下来运行以下命令以生成颁发者证书和密钥:

  1. openssl ecparam -genkey -name prime256v1 | openssl ec -out issuer.key
  2. openssl req -new -sha256 -key issuer.key -out issuer.csr -config issuer.conf -extensions v3_req
  3. openssl x509 -req -in issuer.csr -CA root.pem -CAkey root.key -CAcreateserial -outform PEM -out issuer.pem -days 365 -sha256 -extfile issuer.conf -extensions v3_req


安装 Helm 并通过配置将根证书、颁发者证书和颁发者密钥传递给 Sentry:

  1. kubectl create ns dapr-system
  2. helm install \
  3. --set-file dapr_sentry.tls.issuer.certPEM=issuer.pem \
  4. --set-file dapr_sentry.tls.issuer.keyPEM=issuer.key \
  5. --set-file dapr_sentry.tls.root.certPEM=root.pem \
  6. --namespace dapr-system \
  7. dapr \
  8. dapr/dapr

更新根证书或颁发者证书


现在您拥有新证书,您可以更新保存它们的 Kubernetes 密钥。编辑 Kubernetes 机密:


将Kubernetes 机密中的ca.crt,issuer.crtissuer.key密钥替换为新证书中的相应值。 注意:这些值必须是 base64 编码的
如果您使用不同的私钥对新的证书根进行签名,请重新启动所有启用 Dapr 的 pod。推荐的方法是执行部署的 rollout 重新启动:

  1. kubectl rollout restart deploy/myapp

检查根证书的过期时间

  1. dapr mtls expiry

将根 CA、颁发者证书和密钥从 Kubernetes 导出到本地文件

  1. dapr mtls export -o ./certs

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

微信密码框提示下载并安装安全控件

登录微信商户平台 输入密码时 一直提示 微信密码框提示下载并安装安全控件 点击下载重复下载了很多次 依然没有用解决办...

图片上传的安全校验

记个笔记控制层用的框架SpringMVC上传文件时,后台使用MultipartFile对象接收,前台action的enctype属性必须设置为multipart/...

sqlserver保障远程连接的安全

如果是只读的话建个视图,建个普通用户只对该视图进行读。读写的话就只能自己在加一层代理服务,由代理来进行读写,各客户...

在WEB API中进行统一安全验证类DelegatingHandler

根据web api 官方参考文献 总结出一下代码举例:将 HTTP 响应消息的处理委托给另一处理程序(称为“内部处理程序”)的 HTT...

登录安全

登录安全问题我们在获取数据库中的登录数据时候,因为用的是简单的查询语句,所以很容易破解 因为我们查询的登录语句是sel...

C6.0-7.3 unsafe 不安全块的使用

unsafe关键字相信很多朋友都没有用到过今天特此来讲一下1.在unsafe中可以调用指针这是非常重要的一点 1 简单的案例:statici...

.net core安全相关源码地址

https://github.com/aspnet/Security具体的DefaultAuthorizationService类地址:https://github.com/aspnet/Security/blob/...

c list的线程安全

看看msdn上关于list线程安全的解释:此类型的公共静态(SharedVisual Basic)成员是线程安全的。但不保证所有实例成员都是...

Docker容器安全应用限制Seccomp

Docker容器安全应用限制Seccomp[TOC] Seccomp 简介 SecComp定义了哪些系统调用应该和不应该被容器执行。它们定义在一个JS...

servlet 线程安全问题 5

线程安全问题一、创建Javaweb项目。。。。。二、创建类1、继承抽象类,重写方法2、doGet的具体逻辑三、在web.xml的配置四、...

“代理 XP”组件已作为此服务器安全配置的一部分被关闭。系统管理员可以使用 sp_configure 来启用“代理 XP”。有关启用“代理 XP”的详细信息

新建维护计划的时候遇到下图的报错信息 :“代理 XP”组件已作为此服务器安全配置的一部分被关闭。系统管理员可以使用 sp_co...

Kubernetes 安全检测Kube-bench

Kubernetes 安全检测Kube-bench[TOC] 简介Kube-bench可以检查Kubernetes是否根据CIS Kubernetes基准中定义的安全最佳实践...

Kubernetes 镜像安全Trivy

Kubernetes 镜像安全Trivy[TOC] Trivy的特征与简介rivy是一种适用于CI的简单而全面的容器漏洞扫描程序。软件漏洞是指软件...

mysql触发器。mysql安全,mysql用户与权限管理。

MySQL触发器什么是触发器:触发器是个特殊的存储过程,不是由用户触发,是系统根据事件来触发。对表操作比如 添加,删除,...
这一世以无限游戏为使命!
排名
2
文章
621
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术