详见知乎:https://zhuanlan.zhihu.com/p/37165658关于哈希算法与MD5、SHA讲的很是详细。还有csdn的https://blog.csdn.net/ljy1988123/article/details/51506578
哈希算法有两个评价标准,一个是无法回源,一个是随机性(碰撞概率小),一个是计算速度。常见的算法 Hash SHA MD5
这一节主要掌握使用 kube-bench cis 安全基线检查集群的安全配置,并提高集群的安全性。所有操作都是抛砖引玉。
CIS—-Center fo internet Security 互联网安全中心
CIS Benchmarks -Default k8s security rules 默认的kubernets的安全准则 无论是原生还是通过谷歌或者亚马逊云的定制化
kubernets集群不管是运行与公有云还是私有云,都是有些元数据的资源的各种各样的标签。比如镜像id,网络设备id,硬盘的唯一id等。
2.2.1 最常说的权限控制原则
ingress objects with security control 一个具有安全控制的入口对象 what is ingress? 什么是入口 setup an ingress with services 使用服务设置入口 secure an ingress with tls 使用tls保护入口 参见官方文档 https://kubernetes.io/docs/concepts/services-networking/ingress/ 一个API对象,用于管理对集群中服务的外部访问,通常是HTTP。 入口可以提供负载平衡,SSL和基于名称的虚拟主机。
一般的外部访问应用的流程
这部分主要讲了kubernetes的Gui工具 dashboard。
1. Firewall rules in kubernetes kubernetes 集群中的防火墙规则
2. Implemented by the Network Plugin CNI(Calico/Weave) 网络插件的实施方案
3. Namespace level 命名空间的级别
4. Restrict the ingress and/or Egress for a goup of pods based on certain rules and conditions 根据某些规则和条件限制一组Pod的进入和/或出口
注: 先决条件是必须使用支持NetworkPolicy的网络解决方案 默认状况下没有网络策略的状态并且:
容器和系统调用 这个图就是为了突出 container 都运行在kernel层上面 是不是可以理解为containers中app是直接运行在宿主机 的内核之上, vm虚拟机中的app是运行在虚拟机操作系统的内核上而不是宿主机的内核之上?
cgroups 限制进程使用的资源
namespaces 限制可以看到的进程
例子:创建两个容器并检查它们是否彼此看不见
两个容器运行与相同命名空间 ``` root@cks-master:~# docker run --name c1 -d ubuntu sh -c "sleep 1d" bc244ea97b2c0053dfa3df81580973034683fdda0c56abafe4ba4705b22866be root@cks-master:~# docker exec c1 ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.2 0.0 2612 532 ? Ss 09:25 0:00 sh -c sleep 1d root 6 0.0 0.0 2512 588 ? S 09:25 0:00 sleep 1d root 7 0.0 0.0 5900 2960 ? Rs 09:25 0:00 ps aux root@cks-master:~# docker run --name c2 -d ubuntu sh -c "sleep 999d" 44393c4c47b07d6b210acdd30440d5f4c8d8fa836f9aa4b1eb51e53556c03ccf root@cks-master:~# docker exec c2 ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.1 0.0 2612 536 ? Ss 09:25 0:00 sh -c sleep 999d root 6 0.0 0.0 2512 596 ? S 09:25 0:00 sleep 999d root 7 0.0 0.0 5900 2852 ? Rs 09:25 0:00 ps aux root@cks-master:~# ps -aux|grep sleep root 6897 0.0 0.0 2612 532 ? Ss 17:25 0:00 sh -c sleep 1d root 6939 0.0 0.0 2512 588 ? S 17:25 0:00 sleep 1d root 7148 0.0 0.0 2612 536 ? Ss 17:25 0:00 sh -c sleep 999d root 7186 0.0 0.0 2512 596 ? S 17:25 0:00 sleep 999d root 7405 0.0 0.0 13780 1016 pts/0 S+ 17:26 0:00 grep --color=auto sleep root@cks-master:~# docker rm c2 --force c2 root@cks-master:~# docker run --name c2 --pid=contariner:c1 -d ubuntu sh -c "sleep 999d" docker: --pid: invalid PID mode. See 'docker run --help'. root@cks-master:~# docker run --name c2 --pid=container:c1 -d ubuntu sh -c "sleep 999d" 31a8e174129c86387d3f696d3b6166a860fa2f1ac878efca81c5f9a6d68d5486 root@cks-master:~# docker exec c2 ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 2612 532 ? Ss 09:25 0:00 sh -c sleep 1d root 6 0.0 0.0 2512 588 ? S 09:25 0:00 sleep 1d root 13 0.0 0.0 2612 608 ? Ss 09:26 0:00 sh -c sleep 999d root 18 0.0 0.0 2512 596 ? S 09:26 0:00 sleep 999d root 19 0.0 0.0 5900 2820 ? Rs 09:33 0:00 ps -aux root@cks-master:~# docker exec c1 ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 2612 532 ? Ss 09:25 0:00 sh -c sleep 1d root 6 0.0 0.0 2512 588 ? S 09:25 0:00 sleep 1d root 13 0.0 0.0 2612 608 ? Ss 09:26 0:00 sh -c sleep 999d root 18 0.0 0.0 2512 596 ? S 09:26 0:00 sleep 999d root 24 0.0 0.0 5900 2988 ? Rs 09:34 0:00 ps -aux
```
1. run container in container engine-在容器引擎中运行容器
2. Schedule containers effcient-高效的调度容器
3. Keep containers alive and health- 保持容器的存活和健康
4. Allow container communication- 允许容器的通信
5. Allow common deployment techniques-允许通用的部署技术
6. handle volumes-处理卷
Contarol Plance-控制平面,简单的不知道我理解的对不对为master节点上面的etcd scheduler apiserver controler manager 。至于cloud control manager我理解是使用云商托管的kubernets 比如腾讯云的 cke还有阿里云的ack 都有类似的kubernets的托管服务。
见: https://kubernetes.io/docs/concepts/overview/components/#control-plane-components
控制平面暴露kubernets的api服务,API服务器是Kubernetes控制平面的前端。 水平扩展 平衡实例之间流量
Consistent and highly-available key value store used as Kubernetes’ backing store for all cluster data 高度一直的kv键值数据库。用作kubernetes的备份与数据存储。
监视没有分配节点的新创建的Pod,并选择一个节点以使其运行。调度策略有很多种,官网现学现卖:
1. individual and collective resource requirements 个体和集体的资源需求
2. hardware/software/policy constraints 硬件/软件/策略约束
3. affinity and anti-affinity specifications 亲和性和反亲和力规范
4. data locality 数据本地性
5. inter-workload interference 工作负载之间的干扰
6. deadlines 生存周期
Control Plane component that runs controller processes. 控制平面运行控制的进程
云控制器暂时忽略吧,一般的还接触不到的
Data Plane—–数据平面 。一般理解为work节点 工作节点?主要有kubelet 和kube-proxy服务
在集群中每个节点上运行的代理。 确保容器在Pod中运行。维护节点上的网络规则.如果有kube-proxy可用,它将使用操作系统数据包过滤层。 否则,kube-proxy会转发流量本身
kube-proxy是一个网络代理,它在集群中的每个节点上运行,实现了Kubernetes Service概念的一部分。
容器运行时是负责运行容器的程序。 Kubernetes支持多种容器运行时:Docker,Containerd,CRI-O以及Kubernetes CRI(容器运行时接口)的任何实现形式。
注: 插件的命名空间资源属于kube-system
命名空间
1. dns 域名解析服务
2. Dashboard webui 仪表盘
3. Container Resource Monitoring 容器资源的监控
4. Cluster-level Logging 集群级别的日志
注: 默认是全部可以通信的,当然了 可以通过networkpolicy等方式进行隔离
注: 关于ca学习的不是太透彻,有时间单独的好好学习一下
1. CA is the trusted root of all certificates inside the cluster CA是群集内所有证书的受信任根
2. All cluster ertificates are signed by the CA 所有集群的证书都由CA签名
3. .Used by components to validate each other 组件用来相互验证
关于Scheduler->Api 和controller-manage->Api 和 kubelet->Api 还有 kubelet server cert
注: 由于限制不能谷歌云绑定银联卡了,直接拿两台腾讯云服务器做课程实例 线上跑的是自建的集群搭建方式详见:https://duiniwukenaihe.github.io/2020/07/22/tencent-slb-kubeadm-ha/(跑了两个集群,其实还是跑的1.16版本,只进行了小版本升级现为1.16.15版本) 关于安全组配置就不详细说明了,由于是个人测试这里也没有做安全组策略,直接开放了ALL,ssh端口也没有做更改,当然了密码设置还是符合个人的安全策略的。由于测试环境不做各种系统优化,复杂配置了。直接就按照课程的操作来了。 10.0.2.6 cks-master 10.0.2.17 cks-work 更改主机名 hostnamectl set-hostname cks-xxx 配置如下: (由于kill的课程是在国外的,apt仓库都是直接用的国外的,镜像仓库直接用的google的,切github仓库进行了版本更新故,修改了脚本):
sh install_master.sh
#!/bin/sh
# Source: http://kubernetes.io/docs/getting-started-guides/kubeadm/
### setup terminal
apt-get install -y bash-completion binutils
echo 'colorscheme ron' >> ~/.vimrc
echo 'set tabstop=2' >> ~/.vimrc
echo 'set shiftwidth=2' >> ~/.vimrc
echo 'set expandtab' >> ~/.vimrc
echo 'source <(kubectl completion bash)' >> ~/.bashrc
echo 'alias k=kubectl' >> ~/.bashrc
echo 'alias c=clear' >> ~/.bashrc
echo 'complete -F __start_kubectl k' >> ~/.bashrc
sed -i '1s/^/force_color_prompt=yes\n/' ~/.bashrc
### install k8s and docker
apt-get remove -y docker.io kubelet kubeadm kubectl kubernetes-cni
apt-get autoremove -y
apt-get install -y etcd-client vim build-essential
systemctl daemon-reload
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
KUBE_VERSION=1.19.3
apt-get update
apt-get install -y docker.io kubelet=${KUBE_VERSION}-00 kubeadm=${KUBE_VERSION}-00 kubectl=${KUBE_VERSION}-00 kubernetes-cni=0.8.7-00
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"storage-driver": "overlay2"
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# Restart docker.
systemctl daemon-reload
systemctl restart docker
# start docker on reboot
systemctl enable docker
docker info | grep -i "storage"
docker info | grep -i "cgroup"
systemctl enable kubelet && systemctl start kubelet
### init k8s
rm /root/.kube/config
kubeadm reset -f
kubeadm init --kubernetes-version=${KUBE_VERSION} --ignore-preflight-errors=NumCPU --skip-token-print
mkdir -p ~/.kube
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
echo
echo "### COMMAND TO ADD A WORKER NODE ###"
kubeadm token create --print-join-command --ttl 0
kubeadm config images list –kubernetes-version 1.19.3 确定1.19.3版本所需要的镜像版本,在阿里云镜像仓库下载并且修改镜像标签为k8s.gcr.io镜像仓库标签,当然了也可以采用创建kubeadm初始化文件的方式修改镜像仓库为阿里云或者其他国内镜像仓库。至于不同版本之间都是大同小异。
sh images.sh
#!/bin/bash
images=(
kube-apiserver:v1.19.3
kube-controller-manager:v1.19.3
kube-scheduler:v1.19.3
kube-proxy:v1.19.3
pause:3.2
etcd:3.4.13-0
coredns:1.7.0
)
for imageName in ${images[@]};do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
注:碰到的好玩的注意的:
ubuntu执行bash 显示:images.sh: 2: images.sh: Syntax error: “(“ unexpected why? 详见:https://blog.csdn.net/u014470581/article/details/51493150/
sudo dpkg-reconfigure dash ![image.png](https://img-blog.csdnimg.cn/img_convert/5eb2a9be5e0d238223f7d8fbe79049ee.png#align=left&display=inline&height=648&margin=[objectObject]&name=image.png&originHeight=648&originWidth=1286&size=32265&status=done&style=none&width=1286)
选择no 保存 就ok了。
1. kubernets Node should only do one thing : Kubernetes
kubernets节点应该只运行kubernets
1.1. Reduce Attack Surface 减少攻击面
1.2. Remove unnecessary applications 移除不必要的应用
2. Keep up to date 保持升级
3. Rutime security tools 运行时安全工具
4. Find and identify malicious processes 查找和识别恶意进程
5. Restrict IAM ssh access 限制IAM(Identity and Access Management 身份识别与访问管理服务) 与SSH访问
kubernetes components are runing secure and up-to-data kubernetes集群组件保持安全和最新的运行
**1. apiserver
Restrict(external)access 限制(外部)访问 use authentication ->authorization 使用身份认证 授权 Admission Controllers 控制器准入? noderestriction 节点限制 custom policies(opa) 自定义规则 Enable Audit Logging 启用审计日志记录 Security Benchmarking 安全基线测试
由此可见最新的还是很重要的,老的版本会有漏洞,有必要保证组件版本的更新升级 一个通过 pod 攻击etcd的例子展现与etcd的安全策略: 加密etcd 限制访问etcd 加密与etcd的通信
1. Use Secrets /no hardcoded credentials 使用secrets秘钥 而不是硬编码的凭据
2. RBAC 基于角色的访问控制
3. Container Sandboxing 容器沙盒
4. Container Hardening 容器加固
4.1 Attack Surface 攻击表面
4.2 Run as user 作为用户运行 no root
4.3 Readonly filesystem 只读的文件系统
5. Vulnerability Scanning 漏洞扫描
6. MTLS/ServiceMeshes 双向认证/服务网格在这里插入代码片