课程名称:3.8.3 Cloud Security(云安全)
学习时长:
60分钟
课程收获:
在 K8s 和 Cloud 环境下如何配置保证 TiDB 数据库集群的安全
课程内容:
一、Managing TiDB TLS certificate
- Recap of TiDB TLS
- mTLS为TiDB各组件进行加密,通信双方都需要提供证书认证身份
- TLS用于MySQL客户端通信加密(SQL层),不需要客户端必须通过证书认证,也可以通过用户名密码进行身份认证
- TLS证书一般是由通信双方都信任的第三方认证生成
- Kubernetes Secret
用于保存敏感资源是secret资源类型,以base64形式编码的,通过yaml文件进行创建,比明文相对安全
- Security pratices
- secret文件不要加载的源码管理中(否则一旦泄露与明文无区别)
因base64不是一个安全加密方式 - 使用静态加密配置K8s集群
保证secret文件是被加密 - 使用RBAC限制用户对secret的访问
避免未经授权的用户或程序访问 - 例子
- secret文件不要加载的源码管理中(否则一旦泄露与明文无区别)
- How to use Secret
- 通过命令创建(防止yaml文件加载到源码管理中)
kubectl create secret generic mysecret --from-literal=user=admin --from-literal=password=1f2d12ninf12 - 挂载到POD容器里面一个文件
- 也可在env中直接引用
- 例子
- 通过命令创建(防止yaml文件加载到源码管理中)
- Cert Manager
是K8s实际证书管理工具- 支持多种CA机构颁发的证书
- 支持自动续期功能,防止证书过期
- 使用简单直观
- cert资源类型
对应CA机构的Issuer
描述证书样子的Certificate
对应签证书中CSR的CertificateRequest(自动生成用户无需关心) - 部署命令
helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v0.16.0 --set installCRDs=true
- Managing TiDB TLS with Cert Manager
- 创建一个CA根证书(因域名不可达所以需要创建自签名证书)
通过Cert Manager创建,存储在demo secret中,此证书需要严格的权限控制保证安全 - 创建一个Issuer
通过根证书对其他证书颁发签名
- 命名方式限制
server secret:${cluster_name}-${componet_name}-cluster-secret
client secret:${cluster_name}-client-secret - 因PD只能支持校验一个CommonName(CN),所以只能使用一个值
- Server端创建的长连接更新证书无影响,只能重建连接更新证书
- 创建一个CA根证书(因域名不可达所以需要创建自签名证书)
二、Public Cloud security pratice for TiDB
- Cloud IAM
IAM的基本功为能认证和授权
- TiDB可以结合使用云上资源
- 备份直接使用S3和GCS
- TiKV通过AWS KMS加密数据
- TiDB也可以直接调用API访问云上资源
- 示例
$ aws s3 ls
- Cloud Authn & Authz
- 配置授权TiDB访问AWS资源的两个选项
- 创建IAM用户并将AWS证书存储在K8s Secret中
- 创建IAM角色并将该角色分配给TIDB pod
- AWS和K8s拥有两套独立的权限管理系统
- 分配Role指定权限,减少泄露风险
- 通过OIDC实现两套权限管理系统整合
- Managing IAM credentials for TiDB
- 为每个需要与公有云API交互的进程授权IAM角色
- 通过OIDC,让EKS apiserver直接给POD分配AWS Role及临时的token
避免静态的token泄露,或需要将静态的token分发到每个节点上的风险 - 如何实现此功能(非公有云环境)
- 开启EKS的OIDC
eksctl utils associate-iam-oidc-provider --cluster {cluster_name} --approve - 为备份创建IAM role
- 将读写S3的权限授权到role
- 配置role允许被OIDC使用
- 给K8s service account关联role
- 给备份任务创建K8s service account
- 创建备份任务’Backup’CR
- 配置参数sendCredToTiKV:false
否则执行备份是会将任务分发到每个TiKV节点导致失败
- 开启EKS的OIDC
- S3 security configuration(公有云环境使用)
- 需要将S3的bucket设置成private
- 开启S3 bucket加密