如何同时管理多台服务器?
服务器多用户管理数据共享方式还是比较多的,有几种可参考操作:
开启网上邻居共享,这样电脑直接打开网上邻居就可以访问对方的文件夹和资料了。可以同时操作共享资源。
安装辅助软件,比如ftp服务端工具,另一台用ftp客户端即可互相访问资料,修改删除添加等等。
直接开启远程服务,3389,可以直接远程控制操作服务器界面,如同操作本地电脑一样。完全操作服务器上的文件数据。
安装第三方辅助管理工具,协助企业管理多台电脑的工具,可以互相访问制定电脑的文件资料。属于多功能兼顾的方案。
采用目前技术较为尖端的云系统构架,制作云服务器做文件分发,让公司企业的文件同时存在云端多台服务器中,确保安全,并且可以多客户端操作。
运维人员的工作每天基本上都是在检查问题,枯燥但又重要, 要是你的某一个环节出现问题并没有及时发现问题,对于企业来说损失可能非常大,基本上运维人每天的工作我罗列了下,有这几种:
1、负责服务器的硬件配置、软件安装、机房上下架等技术维护工作
2、负责虚拟化技术产品物理机配置、管理和日常运行监控和维护
3、负责独立主机或虚拟应用产品的开通使用、日常维护、故障诊断和排除
4、提供独立主机或虚拟应用客户产品操作和应用方面的技术支持
5、监视分管的服务器,及时发现问题,并积极解决问题
现在信息化数字时代,单靠人工去检查出现错误几率会很大,而且有的运维人还不只管理两台服务器,像我们公司的运维每人至少要管理30台服务器,这样子单靠人工运维耗费的人工成本和时间是非常大的,所以还是推荐你用运维工具吧,比如云帮手()1支持跨云商批量管理服务器
2兼容性强大,兼容市面基本所有的云商云主机,兼容操作系统;
3操作简单,可视化界面预览资源、一键修复、一键部署;
4 可以远程登录云主机FTP桌面,处理云主机上的文件;
5监控和资源还有告警功能,这个是挺好的,不用盯着看;
6系统修复功能,这个是挺实用也比较必须的;
7免费使用。总得来说功能还是挺全的,不存在需要又要另外找软件的尴尬。
你好,很高兴回答你这个问题。从运维的角度来讲,服务器的数量少并不意味着我们的运维工作就非常轻松,相反我们更应该重视此阶段的工作。
我们可以从以下几方面来开展我们的运维工作:
1应用服务器
我们可以从当前服务器中找出 至少2个节点装Vsphere虚拟化,建立一个数据中心、集群 ;如果你的服务器有多网卡和SCSI,还可以做一些更高级的应用,如vmotion、负载均衡、高可用等。当虚拟机或服务器故障,可以 实现故障自动转移,有效的避免了单节点的故障,提供服务器的容错率 。
我们可以在新建的虚拟机部署Web、API等各种应用,而且 虚拟机可以在vCenter图形化界面下统一管理 。这一般是中小公司的在服务器方面的解决方案。
当然,我们对docker比较熟悉,可以使用一套docker解决方案,这比Vsphere更能节省一部分资源。当然这个需要的技能要求也比较高,需要我们不断积累。
2数据库服务器
数据库服务器在此我们单独拿出来,是因为数据库对服务器性能、磁盘IO要求比较高,不太建议使用虚拟机,当然这需要根据业务的实际情况来做选择。 数据库我们需要通过一主一从、一主二从的方式实现高可用,来避免数据库单点问 题,我们还可以选择合适的proxy来进行读写分离、读负载均衡等。另外还要考虑数据的本地备份、异地备份,来确保数据可恢复。
3系统监控
当我们在应用服务器和数据库服务器上线一套系统后, 我们需要通过监控掌握从服务器硬件、基础状态、应用、数据库等从下到上的运行状态 ,以便我们能够对告警及时做出响应。考虑到报警的及时性,我们需要监控接入多种报警渠道,如微信、钉钉、邮件、短信等。监控的目的是发现问题、解决访问,因此我们需要踏实的做好这一步,才能为我们的业务保驾护航。
好了,其实不管服务器多少,我们都需要扎实的把基础打好,这样才能以不变应万变面对各种情形。希望我的回答能够帮到你。
题主没有详细说明具体应用系统的功能,比如是否单一的Web服务?有没有微服务、分布式、集群化扩展的潜在需求?
通常来说,建议使用云服务自动化运维。云服务已经成为IT技术的核心基础设施,充分利用云服务带来的弹性和分布式优势,赋能自动化运维。
一,自动构建系统
如果需要构建应用,那么就建议配置使用CI/CD持续化集成和自动化部署,比如常用的Jenkins,配置Git代码提交时触发构建,然后自动部署。
二,日志收集处理系统
1,ELK是常见的日志收集管理系统,包括ElasticSearch, LogStash, Kibana三个服务,架构示意图如下:
2,在ELK系统中,Kibana是一个图形化展示工具,配置查询条件,运维人员随时可以搜索指定日志信息,分析处理故障。
三,服务监控
1,云监控CloudMonitor
主流云服务商都将监控功能集成到了基础架构中,以阿里云为例,云监控提供了多种配置,多维度全方位监控。
比如配置CPU使用率到达80%时,自动触发动作,增加服务器实例,同时邮件通知运维人员。
2,应用监控
以监控宝为例,配置服务地址,选择分布在不同地区和运营商的监测点。当监测点不能正常调用配置的服务地址时,将收到警告信息,可以选择邮件、短信、电话等通知方式。
四,潜在的系统扩展需求
1,是否集群化部署?需要AutoScaling自动伸缩吗?
小型化和集群化并不冲突。如果采用集群化部署,可以配置触发条件,满足时自动增加或者释放服务器资源。比如当CPU使用率达到75%或者内存占用率达到75%时,根据配置好的服务器和数量,自动触发。
2,是否使用Docker容器技术?
Docker将应用以及依赖打包到一个可移植的镜像中,可以实现虚拟化,有助于快捷高效的交付应用,结合Docker-compose资源编排,快速实现自动部署更新,不再需要常用的Jenkins构建服务器。
机器数比较小的话,你可以用云的服务器,这样可以节省好多钱。找一个专门的运维,还不如让开发自己来搞,因为机器少运维他也应付得过来。现在都在搞云计算了,把你的机器放上阿里云或者腾讯云,你自己维护好很多,包括网络贷款都很容易扩容。上面这个我说到的只是说建议你如果你已经是自己的机器了。我建议你从我下面所说的来搞。
认为的整个过程的话一般分为三个阶段,第一的话是手工阶段,什么东西都是手工搞。
第2个阶段就是脚本阶段了,本来手工搞的东西全部脚本化。
第3个阶段就是平台化了,平台化了之后,所有东西都在页面上完成系统完成,不需要人工来干预,甚至不用运维来搞。
有一些人说既然认为就是最后的一个阶段,但是这个很不成熟。所以我就不说了。
针对你这个机器数少的,你可以手工认为,或者说用脚本认为都没问题。
在合适的阶段做合适的事情就是最好的。所以我建议你手工运维或者脚本运维。
我们项目用的 wgcloud运维监控系统 ,它前身是开源项目,后来推出的商业版,也有免费版
wgcloud运行很稳定,性能很好,部署和上手容易
wgcloud支持主机各种指标监控(cpu状态/温度,内存状态,磁盘容量/IO,硬盘smart监控,系统负载,网卡流量,硬件系统信息等),数据可视化,进程应用监控,大屏可视化,服务接口检测,DOCKER监控,自动生成网络拓扑图,端口监控,日志文件监控,web SSH(堡垒机),指令下发执行,告警信息推送(邮件钉钉微信短信等)
可以装虚拟机代替,在同一个局域网情况下
找服务商外包服务,或者网上托管也不贵收费
服务器数量比较少,比如10台服务器,基本可以不设置运维岗位了,后端开发人员 或者架构师就能搞定。
我就是那种曾经在创业的小公司待过的开发人员,开发,运维我都干了。
但是想想如何更科学更高效的运维还是很有必要的。
运维的目的
软件系统的运行时环境:即公司的业务产线,靠它创造业务价值,这个是最核心的功能诉求。
实时监控系统: 任何时候都要对当前公司的产线的压力一清二楚,有问题功能随时解决,有性能问题及时扩容或者回收资源
降低服务器成本:在业务萎缩的情况下,准确评估哪些资源可以回收,降低服务器的支出
这个是当时我认为的运维的三个主要目的。
运维方案开发半路出家,当时采用的是shell+python+ansible+jekins+elk的方式
首先,我会及时的更新业务产线的物理架构图,根据架构图来规划服务器的资源使用。
比如多少个web服务,数据库多少,zk,kafka,redis集群怎么分布。
集群部署一般是放在多个服务器上的,这个时候ansible就派上用场了。
jekins主要用来自动发布更新程序已经做定时回收磁盘的任务。
elk主要用来做应用的日志系统和监控告警; 可以通过看板随时知道产线的请求数量和并发数量;
以上的运维方案适用于小公司。运维工程师看到了可以补充
搞个zabbix刷
数量少。如果配置好可以虚拟化。然后跑容器
本书以Windows最新的服务器操作系统Windows Server 2008为平台,以网络管理和网络服务为中线,详细介绍网络管理员在日常工作中,对Windows Server 2008操作系统的配置和应用等知识,以帮助解决可能面临的各种问题及给出合理的解决方案。
本书具体内容包括Windows Server 2008规划与安装、Active Directory目录服务、用户和组账号管理、磁盘系统的管理、配置与管理文件服务器、配置与管理打印服务器、配置与管理DNS服务器、配置与管理DHCP服务器、远程管理和终端服务、电子证书服务、路由和远程策略等。
1.本书内容
通过本书的学习,不仅可以学到网络操作系统的基本操作,还可以了解一些常用服务器的配置及应用的相关知识。
本书共分4篇11章,每一篇都介绍不同操作系统应用的相关内容。
第一篇为服务器基本操作篇(包含第1~3章),介绍Windows Server 2008服务器的一些管理性内容。
第1章为Windows Server 2008规划与安装,详细介绍Windows Server 2008的安装、账户及权限管理、活动目录应用等。
第2章为Active Directory目录服务,详细介绍规则Active Directory实施、实现Active Directory、创建组织单位及其对象、控制对Active Directory对象的访问等。
第3章为用户和组账号管理,详细介绍规划新用户账号、创建用户账号、管理用户账号、组账号管理、组策略管理等。
第二篇为文件及打印服务篇(包含第4~6章),介绍服务器操作系统中的磁盘管理、文件服务器配置及管理、打印服务器的配置与管理等。
第4章为磁盘系统管理,详细介绍磁盘概述、基本卷的管理、动态磁盘的管理、镜像卷与RAID-5卷的修复等。
第5章为配置与管理文件服务器,详细介绍文件服务与资源共享、资源访问权限的控制、加密文件系统(EFS)与压缩、数据的备份和还原、分布式文件系统等。
第6章为配置与管理打印服务器,详细介绍打印概述、安装打印服务器、打印服务器的管理等。
第三篇为网络管理篇(包含第7、8章),介绍DNS服务器和DHCP服务器的配置及应用。
第7章为配置与管理DNS服务器,详细介绍DNS的基本概念与原理、安装和添加DNS服务器、创建和管理DNS区域等。
第8章为配置与管理DHCP服务器,详细介绍DHCP服务及其工作原理、DHCP服务的安装和配置、配置DHCP客户端、复杂网络的DHCP服务器的部署等。
第四篇为远程管理篇(包含第9~11章),介绍远程登录、远程桌面、电子证书服务、路由和远程访问等。
第9章为远程管理和终端服务,详细介绍配置和使用远程桌面、配置远程协助、Telnet服务等。
第10章为电子证书服务,详细介绍数字证书、CA的层次结构、企业CA的安装与证书申请、签名与加密的电子邮件、企业从属CA的安装等。
第11章为路由和远程访问,详细介绍软路由、远程访问、远程访问安全机制、虚拟专用网络、验证通信协议、远程访问策略等。
k8s是什么
Kubernetes 是一个可移植的,可扩展的开源容器编排平台,用于管理容器化的工作负载和服务,方便了声明式配置和自动化。它拥有一个庞大且快速增长的生态系统。Kubernetes 的服务,支持和工具广泛可用。
为什么现在流行使用容器
早期: 在物理服务器上面部署应用程序存在资源分配问题,因为其不能在物理服务器中的应用程序定义资源边界,导致应用程序资源利用不足而无法扩展
后来: 为了解决该问题,引入了虚拟化技术, 虚拟化技术是指允许你在单个物理服务器的 CPU 上运行多个虚拟机,可以让多个应用程序在虚拟机之间进行隔离,具有一定的安全性, 每一个虚拟机就是一台完整的计算机, 在虚拟化硬件之上运行所有组件
现在: 多数在物理服务器上面部署应用程序都是采kubectl用容器的方式,容器类似于虚拟机,它们都具有自己的文件系统、CPU、内存、进程空间等, 且由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。基于此特点被企业大范围使用
为什么需要使用k8s容器
若出现这样一个环境: 在生产环境中如果一个容器发生故障,则我们需要手动去启动另外一个容器,这样的操作是对我们的管理员来说是不太方便的, 若一个容器出现故障,另一个容器可以自动启动容器接管故障的容器,这样是最好的
k8s就可以实现该效果,Kubernetes 提供了一个可弹性运行分布式系统的框架。 Kubernetes 会满足你的扩展要求、故障转移、部署模式等。
k8s功能: 服务发现和负载均衡, 存储编排, 自动部署和回滚, 自动完成装箱计算, 自我修复, 密钥与配置管理
名词解释
secret
Secret有三种类型:
Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的目录中;/run/secrets/kubernetesio/serviceaccountOpaque:base64编码格式的Secret,用来存储密码、密钥等;kubernetesio/dockerconfigjson:用来存储私有docker registry的认证信息。k8s的组成
k8s是由组件,API,对象等组成
包含所有相互关联组件的 Kubernetes 集群图如下:
组件
控制平面组件kube-apiserver: 为k8s的api服务器,公开了所有Kubernetes API, 其他所有组件都必须通过它提供的API来操作资源数据保证集群状态访问的安全隔离集群状态访问的方式和后端存储实现的方式:API Server是状态访问的方式,不会因为后端存储技术etcd的改变而改变。etcd: 为k8s的键值数据库,保存了k8s所有集群数据的后台数据库。kube-scheduler: 收集和分析当前Kubernetes集群中所有Node节点的资源(内存、CPU)负载情况,然后依此分发新建的Pod到Kubernetes集群中可用的节点。 kube-controller-manager: 在主节点上运行 控制器 的组件。cloud-controller-manager: 云控制器管理器是指嵌入特定云的控制逻辑的 控制平面组件Node 组件kubelet: 一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都 运行在 Pod 中。kube-proxy: kube-proxy是集群中每个节点上运行的网络代理,维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。容器运行时: 负责运行容器的软件。插件(Addons)DNS: 集群 DNS 是一个 DNS 服务器,和环境中的其他 DNS 服务器一起工作,它为 Kubernetes 服务提供 DNS 记录。Web 界面(仪表盘): Dashboard 是Kubernetes 集群的通用的、基于 Web 的用户界面。容器资源监控: 容器资源监控 将关于容器的一些常见的时间序列度量值保存到一个集中的数据库中,并提供用于浏览这些数据的界面。集群层面日志: 集群层面日志 机制负责将容器的日志数据 保存到一个集中的日志存储中,该存储能够提供搜索和浏览接口。API
Kubernetes 控制面 的核心是 API 服务器。 API 服务器负责提供 HTTP API,以供用户、集群中的不同部分和集群外部组件相互通信。
对象
Kubernetes对象是Kubernetes系统中的持久实体。Kubernetes使用这些实体来表示集群的状态
具体来说,他们可以描述:
容器化应用正在运行(以及在哪些节点上)这些应用可用的资源关于这些应用如何运行的策略,如重新策略,升级和容错Kubernetes 架构
Kubernetes 架构由节点,控制面到节点通信, 控制器, 云控制器管理器组成
master 流程图
Kubecfg将特定的请求,比如创建Pod,发送给Kubernetes Client。Kubernetes Client将请求发送给API server。API Server根据请求的类型,比如创建Pod时storage类型是pods,然后依此选择何种REST Storage API对请求作出处理。REST Storage API对的请求作相应的处理。将处理的结果存入高可用键值存储系统Etcd中。在API Server响应Kubecfg的请求后,Scheduler会根据Kubernetes Client获取集群中运行Pod及Minion/Node信息。依据从Kubernetes Client获取的信息,Scheduler将未分发的Pod分发到可用的Minion/Node节点上。节点
节点可以是一个虚拟机或者物理机器,取决于所在的集群配置。 每个节点包含运行 Pods 所需的服务, 这些 Pods 由 控制面 负责管理
节点上的组件包括 kubelet、 容器运行时以及 kube-proxy。
节点状态
可以使用 kubectl 来查看节点状态和其他细节信息:
kubectl describe node <�节点名称>
一个节点包含以下信息:
地址HostName:由节点的内核设置。可以通过 kubelet 的 —hostname-override 参数覆盖。ExternalIP:通常是节点的可外部路由(从集群外可访问)的 IP 地址。InternalIP:通常是节点的仅可在集群内部路由的 IP 地址。状况(conditions 字段描述了所有 Running 节点的状态)Ready 如节点是健康的并已经准备好接收 Pod 则为 True;False 表示节点不健康而且不能接收 Pod;Unknown 表示节点控制器在最近 node-monitor-grace-period 期间(默认 40 秒)没有收到节点的消息DiskPressure为True则表示节点的空闲空间不足以用于添加新 Pod, 否则为 FalseMemoryPressure为True则表示节点存在内存压力,即节点内存可用量低,否则为 FalsePIDPressure为True则表示节点存在进程压力,即节点上进程过多;否则为 FalseNetworkUnavailable为True则表示节点网络配置不正确;否则为 False容量与可分配描述节点上的可用资源:CPU、内存和可以调度到节点上的 Pod 的个数上限。信息关于节点的一般性信息,例如内核版本、Kubernetes 版本(kubelet 和 kube-proxy 版本)、 Docker 版本(如果使用了)和操作系统名称。这些信息由 kubelet 从节点上搜集而来。控制面到节点通信
节点到控制面apiserver在安全的 HTTPS 端口(443)上监听远程连接请求以客户端证书的形式将客户端凭据提供给 kubelet控制面到节点API 服务器到 kubelet连接用于获取 Pod 日志挂接(通过 kubectl)到运行中的 Pod提供 kubelet 的端口转发功能。(注: 在连接状态下, 默认apiserver 不检查 kubelet 的服务证书。容易受到中间人攻击,不安全)apiserver 到节点、Pod 和服务SSH 隧道(目前已经废弃)产生原因: 若无服务证书, 又要求避免在非受信网络或公共网络上进行连接,则可以在apiserver 和 kubelet 之间使用ssh隧道Kubernetes 支持使用 SSH 隧道来保护从控制面到节点的通信路径。Konnectivity 服务为ssh隧道的替代品, Konnectivity 服务提供 TCP 层的代理,以便支持从控制面到集群的通信。控制器
在 Kubernetes 中,控制器通过监控集群 的公共状态,并致力于将当前状态转变为期望的状态。
举个例子: 当前室内温度为20度, 我们通过调节遥控器,使其温度上升至24度, 这20度到24度的变化即为让其从当前状态接近期望状态。
控制器模式分为直接控制和通过API服务器来控制
云控制器管理器
云控制器管理器是指嵌入特定云的控制逻辑的 控制平面组件。 云控制器管理器允许您链接聚合到云提供商的应用编程接口中, 并分离出相互作用的组件与您的集群交互的组件。
云控制器管理器中的控制器包括:
节点控制器节点控制器负责在云基础设施中创建了新服务器时为之 创建 节点(Node)对象。 节点控制器从云提供商获取当前租户中主机的信息。执行功能:针对控制器通过云平台驱动的 API 所发现的每个服务器初始化一个 Node 对象利用特定云平台的信息为 Node 对象添加注解和标签获取节点的网络地址和主机名检查节点的健康状况。路由控制器Route 控制器负责适当地配置云平台中的路由,以便 Kubernetes 集群中不同节点上的 容器之间可以相互通信。服务控制器服务(Service)与受控的负载均衡器、 IP 地址、网络包过滤、目标健康检查等云基础设施组件集成。 服务控制器与云驱动的 API 交互,以配置负载均衡器和其他基础设施组件。Kubernetes 安全性
云原生安全
云原生安全4个C: 云(Cloud)、集群(Cluster)、容器(Container)和代码(Code)
云原生安全模型的每一层都是基于下一个最外层,代码层受益于强大的基础安全层(云、集群、容器)。我们无法通过在代码层解决安全问题来为基础层中糟糕的安全标准提供保护。
基础设施安全
Kubetnetes 基础架构关注领域
建议
通过网络访问 API 服务(控制平面)
所有对 Kubernetes 控制平面的访问不允许在 Internet 上公开,同时应由网络访问控制列表控制,该列表包含管理集群所需的 IP 地址集。
通过网络访问 Node(节点)
节点应配置为 仅能 从控制平面上通过指定端口来接受(通过网络访问控制列表)连接,以及接受 NodePort 和 LoadBalancer 类型的 Kubernetes 服务连接。如果可能的话,这些节点不应完全暴露在公共互联网上。
Kubernetes 云访问提供商的 API
每个云提供商都需要向 Kubernetes 控制平面和节点授予不同的权限集。为集群提供云提供商访问权限时,最好遵循对需要管理的资源的最小特权原则。Kops 文档提供有关 IAM 策略和角色的信息。
访问 etcd
对 etcd(Kubernetes 的数据存储)的访问应仅限于控制平面。根据配置情况,你应该尝试通过 TLS 来使用 etcd。更多信息可以在 etcd 文档中找到。
etcd 加密
在所有可能的情况下,最好对所有驱动器进行静态数据加密,但是由于 etcd 拥有整个集群的状态(包括机密信息),因此其磁盘更应该进行静态数据加密。
集群组件安全
运行的应用程序的安全性关注领域访问控制授权(访问 Kubernetes API)认证方式应用程序 Secret 管理 (并在 etcd 中对其进行静态数据加密)Pod 安全策略服务质量(和集群资源管理)网络策略Kubernetes Ingress 的 TLS 支持容器安全
容器安全性关注领域容器搭建配置(配置不当,危险挂载, 特权用户)容器服务自身缺陷Linux内核漏洞镜像签名和执行代码安全
代码安全关注领域仅通过 TLS 访问(流量加密)限制通信端口范围第三方依赖性安全静态代码分析动态探测攻击(黑盒)Kubernetes架构常见问题
Kubernetes ATTACK 矩阵
信息泄露
云账号AK泄露
API凭证(即阿里云AccessKey)是用户访问内部资源最重要的身份凭证。用户调用API时的通信加密和身份认证会使用API凭证
API凭证是云上用户调用云服务API、访问云上资源的唯一身份凭证。
API凭证相当于登录密码,用于程序方式调用云服务API
k8s configfile泄露
kubeconfig文件所在的位置:
$HOME/kube/config
Kubeconfig文件包含有关Kubernetes集群的详细信息,包括它们的位置和凭据。
云厂商会给用户提供该文件,以便于用户可以通过kubectl对集群进行管理 如果攻击者能够访问到此文件(如办公网员工机器入侵、泄露到Github的代码等),就可以直接通过API Server接管K8s集群,带来风险隐患。
Master节点SSH登录泄露
常见的容器集群管理方式是通过登录Master节点或运维跳板机,然后再通过kubectl命令工具来控制k8s。
云服务器提供了通过ssh登陆的形式进行登陆master节点
若Master节点SSH连接地址泄露,攻击者可对ssh登陆进行爆破,从而登陆上ssh,控制集群
容器组件未鉴权服务
Kubernetes架构下常见的开放服务指纹如下:
kube-apiserver: 6443, 8080kubectl proxy: 8080, 8081kubelet: 10250, 10255, 4149dashboard: 30000docker api: 2375etcd: 2379, 2380kube-controller-manager: 10252kube-proxy: 10256, 31442kube-scheduler: 10251weave: 6781, 6782, 6783kubeflow-dashboard: 8080注:前六个重点关注: 一旦被控制可以直接获取相应容器、相应节点、集群权限的服务
了解各个组件被攻击时所造成的影响
组件分工图:
假如用户想在集群里面新建一个容器集合单元, 流程如下:
用户与 kubectl进行交互,提出需求(例: kubectl create -f podyaml)kubectl 会读取 ~/kube/config 配置,并与 apiserver 进行交互,协议:http/httpsapiserver 会协同 ETCD, kube-controller-manager, scheduler 等组件准备下发新建容器的配置给到节点,协议:http/httpsapiserver 与 kubelet 进行交互,告知其容器创建的需求,协议:http/https;kubelet 与Docker等容器引擎进行交互,创建容器,协议:http/unix socket容器已然在集群节点上创建成功攻击apiserver
apiserver介绍:
在Kubernetes中,对于未鉴权对apiserver, 能访问到 apiserver 一般情况下就能获取了集群的权限
在攻击者眼中Kubernetes APIServer
容器编排K8S总控组件pods, services, secrets, serviceaccounts, bindings, componentstatuses, configmaps,endpoints, events, limitranges, namespaces, nodes, persistentvolumeclaims,persistentvolumes, podtemplates, replicationcontrollers, resourcequotas …可控以上所有k8s资源可获取几乎所有容器的交互式shell利用一定技巧可获取所有容器母机的交互式shell默认情况下apiserver都有鉴权:
未鉴权配置如下:
对于这类的未鉴权的设置来说,访问到 apiserver 一般情况下就获取了集群的权限:
如何通过apiserver来进行渗透,可参考:https://Kubernetesio/docs/reference/generated/kubectl/kubectl-commands
攻击kubelet
每一个Node节点都有一个kubelet(每个节点上运行的代理)服务,kubelet监听了10250,10248,10255等端口。
10250端口,是kubelet与apiserver进行通信对主要端口, 通过该端口,kubelet可以知道当前应该处理的任务该端口在最新版Kubernetes是有鉴权的, 但在开启了接受匿名请求的情况下,不带鉴权信息的请求也可以使用10250提供的能力, 在Kubernetes早期,很多挖矿木马基于该端口进行传播
在配置文件中,若进行如下配置,则可能存在未授权访问漏洞
/var/bin/kubulet/config/yaml
若10250端口存在未授权访问漏洞,我们可以直接访问/pods进行查看
根据在pods中获取的信息,我们可以在容器中执行命令
curl -Gks https://host:10250/exec/{namespace}/{podname}/{containername} \-d 'input=1' -d 'output=1' -d 'tty=1' \-d 'command=whoami'
上述命令得到websocket地址,连接websocket得到命令结果:
使用wscat工具连接websocket
wscat -c “https://XXXX:10250/{websocket}” --no-check
即可得到我们执行命令的结果
获取token
/var/run/secrets/kubernetesio/serviceaccount
然后即可访问kube-api server,获取集群权限
curl -ks -H "Authorization: Bearer \ ttps://master:6443/api/v1/namespaces/{namespace}/secrets
"
攻击kubelet总体步骤如下:
访问pods获取信息获取namespace、podsname、containername执行exec获取token/var/run/secrets/kubernetesio/serviceaccount利用Token访问API Server进行对pods操作。攻击dashboard
dashboard登陆链接如下:
http://xxxxxxxxxxxx:xxxx/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login
dashboard界面如下:
dashboard是Kubernetes官方推出的控制Kubernetes的图形化界面在Kubernetes配置不当导致dashboard未授权访问漏洞的情况下,通过dashboard我们可以控制整个集群。
默认情况下, dashboard是需要进行鉴权操作的,当用户开启了enable-skip-login时可以在登录界面点击Skip跳过登录进入dashboard
通过skip登陆的dashboard默认是没有操作集群的权限,因为Kubernetes使用RBAC(Role-based access control)机制进行身份认证和权限管理,不同的serviceaccount拥有不同的集群权限。
但有些开发者为了方便或者在测试环境中会为Kubernetes-dashboard绑定cluster-admin这个ClusterRole(cluster-admin拥有管理集群的最高权限)
为Kubernetes-dashboard绑定cluster-admin 设置如下:
新建dashboard-adminyaml内容apiVersion: rbacauthorizationk8sio/v1kind: ClusterRoleBindingmetadata: name: kubernetes-dashboardroleRef: apiGroup: rbacauthorizationk8sio kind: ClusterRole name: cluster-adminsubjects : kind: ServiceAccount name: kubernetes-dashboard namespace: kubernetes-dashboardkubectl create -f dashboard-adminyaml后通过skip登陆dashboard便有了管理集群的权限
创建Pod控制node节点,该pod主要是将宿主机根目录挂载到容器tmp目录下。
新建一个Pod如下:
通过该容器的tmp目录管理node节点的文件
攻击etcd
Kubernetes默认使用了etcd v3来存储数据, 若能na
etcd对内暴露2379端口,本地127001可免认证访问 其他地址要带—endpoint参数和cert进行认证。
未授权访问流程:
检查是否正常链接etcdctl endpoint health读取service account tokenetcdctl get / --prefix --keys-only | grep /secrets/kube-system/clusterrole通过token认访问API-Server端口6443,接管集群:kubectl --insecure-skip-tls-verify -s https://127001:6443/ --token="[ey]" -n kube-system get pods攻击docker remote api(Docker daemon公网暴露)
2375是docker远程操控的默认端口,通过这个端口可以直接对远程的docker 守护进程进行操作。Docker 守护进程默认监听2375端口且未鉴权
当机器以方式启动daemon时,可以在外部机器对该机器的docker daemon进行直接操作:
docker daemon -H=0000:2375
之后依次执行systemctl daemon-reload、systemctl restart docker
外部主机使用 即可操作暴露2375端口的主机
-H
因此当你有访问到目标Docker API 的网络能力或主机能力的时候,你就拥有了控制当前服务器的能力。我们可以利用Docker API在远程主机上创建一个特权容器,并且挂载主机根目录到容器
检测目标是否存在docker api未授权访问漏洞的方式也很简单,访问http://[host]:[port]/info路径是否含有ContainersRunning、DockerRootDir等关键字。
攻击kubectl proxy
二次开发所产生的问题
管理Kubernetes无论是使用 kubectl 或 Kubernetes dashboard 的UI功能,其实都是间接在和 APIServer 做交互
如果有需求对k8s进行二次开发的话,大部分的开发功能请求了 APIServer 的 Rest API 从而使功能实现的。
例如:
给用户销毁自己POD的能力DELETE https://apiserver:8443/api/v1/namespaces/default/pods/sleep-75c6fd99c-g5kss类似于这样去调用apiserver, 攻击者若修改namespace、pod和容器名, 那么即可造成越权
推荐工具
Kube-Hunter扫描漏洞
kube-hunter是一款用于寻找Kubernetes集群中的安全漏洞扫描器
下载地址: https://githubcom/aquasecurity/kube-hunter
CDK(强推)
CDK是一款为容器环境定制的渗透测试工具,在已攻陷的容器内部提供零依赖的常用命令及PoC/EXP。集成Docker/K8s场景特有的 逃逸、横向移动、持久化利用方式,插件化管理。
下载地址: https://githubcom/cdk-team/CDK/wiki/CDK-Home-CN
参考链接
https://developeraliyuncom/article/765449groupCode=aliyunsecurity
https://xzaliyuncom/t/4276#toc-2
https://wwwsecrsscom/articles/29544
https://kubernetesio/zh/docs/concepts/workloads/pods/#what-is-a-pod
https://wwwhuweihuangcom/kubernetes-notes/concepts/architecture/kubernetes-architecturehtml
https://wwwkubernetesorgcn/service-account
https://wwwaquaseccom/cloud-native-academy/cloud-native-applications/cloud-native-infrastructure/
https://wwwcdxyme/p=827
0条评论