k8s-安全-TLS双向加密认证

k8s-安全-TLS双向加密认证

1. 简介

安全第一步,尝试与k8s建立连接(也就是与apiserver建立连接),使用apiserver的restful接口对k8s集群资源进行查看或者操作,使用tls进行双向加密认证,同时加密通信流量,k8s默认使用的安全端口是6443。

TLS(传输层安全协议)是一种安全协议(前身是SSL),用于加密通信流量和身份认证。身份认证使用非对称加密,非对称加密使用公钥加密只能使用私钥解密,反之亦然。

2. TLS认证过程

第一步,客户端生成随机数RNc,服务端生成随机数RNs,相互发送给对方

开始之前:
	客户端(公钥,私钥,RNc),把RNc发送给服务端
	服务端(公钥,私钥,RNs),把RNs发给客户端

结果:
	客户端(公钥,私钥,RNc,RNs)
	服务端(公钥,私钥,RNc,RNs)

第二步,证书交换,客户端把证书发给服务端,服务端把证书发给客户端(证书内包含公钥信息)

结果:
	客户端(公钥,私钥,RNc,RNs,服务端公钥)
	服务端(公钥,私钥,RNc,RNs,客户端公钥)

第三步,计算通信加密密码

开始之前:
	客户端(公钥,私钥,RNc,RNs,服务端公钥,PMS),客户端生成新随机数PMS,并使用服务端公钥加密,然后发送给服务端
	服务端(公钥,私钥,RNc,RNs,客户端公钥)

结果:
	客户端(公钥,私钥,RNc,RNs,PMS,服务端公钥)
	服务端(公钥,私钥,RNc,RNs,PMS,客户端公钥),PMS是服务端通过私钥解密出来

计算通信加密密码 MS = Calculate(RNc, RNs, PMS),后续通信使用该密码进行对称加密

3. 关于证书

证书通常由权威机构进行签名,做证书的时候需要生成证书请求,然后由ca证书进行签名。可以自己作为ca证书作为权威机构,然后给自己的证书进行签名,也就是制作自签名证书,在公司内部或内网环境经常使用这种方式。

4. 使用

生成rootCA.key,制作rootCA.crt,制作证书需要填写一些基础信息(国家,地区,公司等)

$ openssl genrsa  -out rootCA.key 2048
$ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Guangdong
Locality Name (eg, city) [Default City]:Shenzhen 
Organization Name (eg, company) [Default Company Ltd]:k8stest
Organizational Unit Name (eg, section) []:tester
Common Name (eg, your name or your server's hostname) []:k8sca 
Email Address []:test@k8s.ca

生成k8s-apiserver.key,制作证书签名请求文件k8s-apiserver.csr,最后由ca进行签名颁发证书

非常重要:制作证书签名请求时,Common Name字段一定要正确填写主机名或者主机IP

$ openssl genrsa -out k8s-apiserver.key 2048
$ openssl req -new -key k8s-apiserver.key -out k8s-apiserver.csr
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Guangdong
Locality Name (eg, city) [Default City]:Shenzhen
Organization Name (eg, company) [Default Company Ltd]:k8stest
Organizational Unit Name (eg, section) []:tester
Common Name (eg, your name or your server's hostname) []:192.168.0.104
Email Address []:test@k8s.apiserver

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

使用ca为k8s-apiserver进行签名并颁发证书

$ openssl x509 -req -in k8s-apiserver.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out k8s-apiserver.crt -days 500 -sha256

5. 验证

使用刚才制作的证书启动kube-apiserver,单独启动apiserver仅做tls认证测试

$ ./kube-apiserver --etcd-servers=http://127.0.0.1:2379 --tls-cert-file=./k8s-apiserver.crt --tls-private-key-file=./k8s-apiserver.key --advertise-address=192.168.0.104 --secure-port=6443 --client-ca-file=./rootCA.crt 

在另一台主机访问apiserver,不携带证书进行访问,返回的是401未授权

$ curl https://192.168.0.104:6443 -k                                                                    
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {
    
  },
  "status": "Failure",
  "message": "Unauthorized",
  "reason": "Unauthorized",
  "code": 401
}                       

携带服务端证书进行访问(仅测试,正常情况下应该携带由ca签名的客户端证书),返回api列表

$ curl https://192.168.0.104:6443 --cacert rootCA.crt --cert k8s-apiserver.crt --key k8s-apiserver.key
{
  "paths": [
    "/api",
    "/api/v1",
    "/apis",
    "/apis/",
    "/apis/admissionregistration.k8s.io",
    "/apis/admissionregistration.k8s.io/v1beta1",
    "/apis/apiextensions.k8s.io",
    "/apis/apiextensions.k8s.io/v1beta1"
    ...
}

制作客户端证书并进行访问,客户端证书生成证书请求文件,并使用ca签名并颁发证书

重要:客户端证书的Common Name需要填写本机IP地址

$ openssl genrsa -out client.key 2048 
$ openssl req -new -key client.key -out client.csr
$ openssl x509 -req -in client.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out client.crt -days 500 -sha256

使用客户端证书访问apiserver

$ curl https://192.168.0.104:6443 --cacert rootCA.crt --cert client.crt --key client.key                  
{
  "paths": [
    "/api",
    "/api/v1",
    "/apis",
    "/apis/",
    "/apis/admissionregistration.k8s.io",
    "/apis/admissionregistration.k8s.io/v1beta1",
    "/apis/apiextensions.k8s.io",
    ...
}

6. 其他

可以把rootCA.crt导入浏览器的证书颁发机构,这样通过浏览器访问k8s就不会出现非安全网站提示,查看ca证书信息

把生成的客户端证书转成pfx格式导入浏览器,则可以通过浏览器访问apiserver

$ openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt -certfile rootCA.crt

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

1 条评论
登录 后参与评论

相关文章

来自专栏Linux运维学习之路

https原理及实践

转载请注明出处 安全知识 网络安全问题 数据机密性 在网络传输数据信息时,对数据的加密是至关重要的,否则所有传输的数据都是可以随时被第三方看到,完全没有机密性可...

3829
来自专栏葬爱家族

和HTTPS握个手

“姑娘们,起来吃毓婷啦!” 520刚过去,5月21号早上这句话就突然火了,像我这种单纯的小宝宝根本不知道是什么意思。

833
来自专栏微信公众号:Java团长

JavaWeb学习总结(三)——Tomcat服务器学习和使用(二)

  在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:

741
来自专栏惨绿少年

HTTPS 原理与证书实践

1.1 网络安全知识 1.1.1 网结安全出现背景 网络就是实现不同主机之间的通讯,网络出现之初利用TCP/IP协议簇的相关协议概念,已经满足了互连两台主机之间...

4797
来自专栏网络

从https的演进到burpsuite抓包的漫谈

开始先抛出一下三个问题: 网站登录用户名密码明文传输,改用https协议是否能解决这个问题? 那为什么我采用https了通过burp还是可以看到明文密码? 如果...

2498
来自专栏Golang语言社区

Go和HTTPS--1

近期在构思一个产品,考虑到安全性的原因,可能需要使用到HTTPS协议以及双向数字证书校验。之前只是粗浅接触过HTTP(使用Golang开 发微信系列)。对HTT...

2994
来自专栏滕先生的博客

聊聊 iOS 中的网络加密介绍下介绍下HTTPS交互原理介绍下我们需要做什么

2647
来自专栏Play & Scala 技术分享

解析Java为什么不接受合法的HTTPS证书

2785
来自专栏blackheart的专栏

[信息安全] 1.密码工具箱

0. 何谓安全? 对于信息安全性的重要性,我想大家都不会否认。那么具体来说应该具有哪些特性才能称之为安全呢?举个简单的例子:我给你发送一条消息“借给我100元”...

18810
来自专栏即时通讯技术

一文读懂Https的安全性原理、数字证书、单项认证、双项认证等

本文引用了作者Smily(博客:blog.csdn.net/qq_20521573)的文章内容,感谢无私分享。

622

扫码关注云+社区