云技术基础

学习视频笔记均来自B站UP主" 泷羽sec",如涉及侵权马上删除文章

笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负

https://space.bilibili.com/350329294*

为什么要学云技术?

无论是防御还是进攻,强大的底层技术基础都是必要的 从防御的角度,了解底层技术才能知道如何构建防御体系 从进攻的角度,了解底层技术才能发现漏洞并且开发漏洞利用 攻击者和防御者都必须了解对方的运作方式

云技术历史

传统基础设施构建阶段:

以前构建系统的时候,需要购买设备,租用数据中心机柜,然后搭建基础设施。

特点:在这个阶段,构建系统需要购买大量的硬件设备,租用数据中心机柜,并手动搭建基础设施。这种方式不仅成本高昂,而且灵活性差,难以适应快速变化的市场需求。资源利用率低,扩展性差,难以满足大规模、高并发的业务需求。

虚拟化技术阶段

随着处理器的不断进化,虚拟机出现了。它能把一台机器的资源分成多台机器来使用,提高了资源利用率,变得更加灵活可拓展,实现了从裸机基础设施到虚拟化基础设施的转变。

特点:虚拟化技术提高了资源利用率,使得资源更加灵活可拓展。通过虚拟化技术,企业可以构建出从裸机基础设施到虚拟化基础设施的转变,降低了成本,提高了效率。

容器化技术阶段

接着,容器化技术登场,进一步提高了效率,实现了服务器,网络和存储的虚拟交付。

特点:容器化技术进一步提高了资源的利用效率,实现了服务器、网络和存储的虚拟交付。通过容器化技术,企业可以更加快速地部署和管理应用程序,降低了运维成本。

云计算阶段

现在,我们把最新一代的基础设施称为"云"。云计算不是单一的技术,而是众多技术的集合体,它包括了虚拟化技术、容器化技术、自动化技术、大数据技术等众多先进技术。

特点:云计算提供了按需付费、弹性扩展、高可用性等优势,使得企业可以更加灵活地应对市场需求的变化。通过云计算,企业可以快速地获取计算资源、存储资源和数据库资源等,降低了IT成本,提高了业务效率。

服务类型:云计算服务通常分为基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)三种类型。IaaS提供底层的计算、存储和网络资源;PaaS提供开发、测试和部署应用程序的平台;SaaS则提供完整的应用程序服务,用户无需关心底层的基础设施和平台。

云服务

云是一种 IT 基础设施系统,它将资源的创建抽象在软件层面。 云基础架构必须稳定且无频繁中断 地理分布的云基础设施提高容错能力 云必须能够快速扩展以满足需求

公有云服务商

Amazon web services (AWS) Azure google(GCP) .华为云,腾讯云,阿里云.... 组织可以使用openStack等工具在自己的数据中心搭建私有云。或者部分业务运行在 私有云中,部分运行在公有云中

云分类

基础设施既服务(laas) 定义:IaaS 是云计算服务模式的最底层,它提供了基本的计算资源,如服务 器、存储设备、网络设备等,以虚拟机或裸金属服务器的形式出租给用户。用户 可以像使用自己的数据中心资源一样,在这些基础设施上安装操作系统、部署应 用程序、配置网络等。

示例:亚马逊的 AWS EC2(Elastic Compute Cloud)是典型的 IaaS 服务。用户 通过 AWS 控制台或 API,可以选择不同类型的 EC2 实例,这些实例具有不同的 CPU、内存、存储等配置。

平台既服务(PAAS)

定义:PaaS 在 IaaS 的基础上,提供了一个完整的应用程序开发和运行平台。它 包括操作系统、编程语言运行环境、数据库管理系统、中间件等,让开发者能够 专注于应用程序的开发,而无需关心底层的基础设施。 示例:Heroku 是一款流行的 PaaS 产品。开发者可以使用多种编程语言(如 Python、Ruby、Node.js 等)在 Heroku 平台上开发应用程序。Heroku 会自动处理 应用程序的部署、运行环境的配置、扩展等工作。

软件既服务(SaaS) 定义:SaaS 是一种通过互联网提供软件应用服务的模式,用户无需在本地安装 软件,而是通过浏览器或专用客户端访问云端的软件应用。软件的维护、升级、 数据存储等工作都由 SaaS 提供商负责。 示例:Salesforce 是一款知名的 SaaS 产品,主要用于客户关系管理。企业用户 可以通过浏览器访问 Salesforce 的应用程序,进行客户信息管理、销售机会跟 踪、营销活动策划等业务操作。用户只需要一个账号和密码,就可以在任何有网 络连接的地方使用该软件。另外,微软的 Office 365 也是 SaaS 的典型代表,用户 可以在云端使用 Word、Excel、PowerPoint 等办公软件,并且可以实现多人协作 编辑文档等功能,数据存储在云端,方便用户随时随地访问。

云架构设计

组件选择

确定架构(难改),选择绑定/非绑定组件(开发、开源、购买) 云原生组件: 为分布式系统设计,CNCF认证(非必须)、安全编码、开源(部分) laC:引导介质(Packer)、安装系统(Terraform)、 自动配置(Ansible)、 状态强制 (Monit)

集成部署 使用持续集成和持续交付(CICD) 管道来构建环境 包括测试、测量和扫描代码更改的自动化测试和部署(GitOps)

弹性可靠 任何单点故障都有故障转移或其他机制,使业务可以持续提供(冗余) GSLB (智能DNS、GTM)解决客户单访问的单点故障隐患

平衡控制 控制保护系统免受漏洞和内部攻击的组件,应平衡控制和可用性

云设计模式 云架构设计不必从头开始, 使用已检验的设计模式是最佳选择

微服务架构 松散耦合、 模块化服务而设计,微服务协同工作以完成整体服务每个服务都可以 独立修改代码和重用,提高系统整体弹性和容错 大多数云利用微服务架构,云原生应用被构建充当微服务,便于水平扩展安全优势: 每个微服务应用强化、隔离,单一服务漏洞对整体系统影响小缺点:调试更加复杂, 需要跨不同服务跟踪事务;性能短板

零信任架构 对资源的每个请求都需要验证来源已授权,然后授权短期访问(令牌)实现ZTA的 一种常见方法是Open ID Connect (OIDC) 联盟访问 授权处于活动状态时可以访问任何联合内服务 密码重置是针对ZTA的常见攻击方式

安全控制

网络控制 传统架构使用防火墙实现网络控制,云环境网络抽象为SDN、SD WANSDN对不同的 接口(如API或GUI) 设置网络规则 通过mTLS不仅流量加密,也对客户端进行身份验证,拥有证书才能访问微服务访问 控制 不正确的访问管理可导致权限提升,甚至破坏整个基础设施 现代访问管理系统多使用令牌进行访问控制,提供对服务的短时访问权 JWT通常用于访问云端资源,伪造和破解密码是常见攻击手段 另一种类型的权限控制机制是强制访问控制MAC

身份管理 企业通常使用AD、LDAP进行身份管理 AWS IAM是身份和访问管理(IAM)的公共云服务 Google联盟认证OIDC经常用于2FA 云身份提供者(ldP)作为真实身份来源, 是更安全的解决方案(Azure AD)

容器与云 虚拟化中每个VM需要运行自己的操作系统, 显着增加了总体开销 容器化是一种更加现代的架构,容器共享内核与硬件,更快、更小、更高效 容器远没有虚拟化强大,因此容器是对虚拟化的补充,而非取代 容器的系统开销更小(可忽略),因此可以进一 步分离应用组件,例如搜索、登录、查 询、订单功能分开 容器使用映像作为模板生成。映像相当于计算机硬盘 容器使用不同发行版文件加载内核,运行容器

在Ubuntu上生成cent os7容器

安装Docker 使用Docker这个流行的容器化工具 确保你已经安装了Docker。如果没有安装,可以使用以下命令安装:

sudo apt-get update

sudo apt-get install docker.io

检查是否安装成功 docker -v

启用Docker sudo service docker start

启动成功后,没有错误信息输出。 可以使用 sudo docker ps命令来验证 Docker 是否正常启动。

sudo docker ps

Docker配置中国镜像源

首先,需要找到 daemon.json 文件。在 Linux 系统中,该文件通常位 于/ etc/docker/ 目录下。如果没有这个文件,可以使用文本编辑器(如 nano )创建一个。

网易云镜像源: { } "registry-mirrors": ["https://hub - mirror.c.163.com/"]

重启 Docker 服务 :完成配置后,需要重启 Docker 服务使配置生效。在 Ubuntu 或 Debian 系统中,可以使用命令 sudo service docker restart ;在 CentOS 或 RHEL 系统中,可以使用 sudo systemctl restart docker

Docker中安装CentOS 7

拉取CentOS 7的官方Docker镜像: sudo docker pull centos:7

运行一个基于CentOS 7镜像的容器:

sudo docker run -it --name my_centos7 centos:7 /bin/bash

sudo docker run -d --name my_centos7 centos:7 /bin/bash

两命令都会创建, exit 退出后仍然存在,可使用 docker ps -a进行查看 在这个命令中:

-it 选项允许你交互式地运行容器,会占用终端。OR或者 -d 选项(Detached,分离 模式),容器就会在后台启动并运行,不会占用当前终端

--name my_centos7 给容器命名为my_centos7。

执行上述命令后,你会进入到一个新的CentOS 7容器中,可以在这个环境中执行 CentOS 7系统的命令。

centos:7 指定使用的镜像。

/bin/bash 启动容器后执行的命令,这里启动了bash让你能与容器交互。 现在就是进入了CentOS 7中而并非之前的服务器 输入exit 就会退出容器

容器与云

创建Apache容器后台运行

docker container run -d --rm -p 8080:80 httpd

第一次运行镜像的容器时都会有Unable 这是很常见的情况,因为本来就没有,所 以需要Docker去网上pull

使用curl命令检查搭建是否成功

curl localhost:8080

存在回显,有具体标签,表示搭建成功

Docker

常用命令 查看所有正在运行容器

docker container ls

查看所有已经创建的容器

docker ps -a

查看特定容器的进程信息

docker top

登陆后台运行的容器

docker exec -it 290b81b8fbfa /bin/bash---

使用设置的参数

name也是可以的.如: /bin/bash docker exec -it my_centos7

停止容器

docker container stop 290b81b8fbfa

挂载宿主机目

docker container run -d --rm -p 8080:80 -v /home/user/webroot/:/usr/local/apache2/htdocs/ httpd

-d 参数 功能:表示以 "分离(detached)" 模式运行容器。 含义和作用:当容器以这种模式启动后,它会在后台运行,不会占用当前的 命令行终端。这使得你可以在启动容器后,继续在终端中执行其他任务,比 如启动其他容器、检查容器状态或者运行其他系统命令等。例如,你可以在 启动这个 httpd 容器后,马上使用 启动并在后台运行。

--rm 参数 docker ps 命令查看容器是否已经成功 功能:设置容器在退出时自动删除。 含义和作用:一旦容器内的任务完成或者因为某种原因(如发生错误、手动 停止等)停止运行,Docker 会自动删除这个容器。这有助于保持 Docker 环境 的整洁,避免大量无用的容器占用磁盘空间。特别是在临时测试或者短期运 行容器的场景下非常有用,比如你只是想快速测试一下 置,使用完后容器自动删除,不需要手动清理。

-p 8080:80 参数 功能:进行端口映射。 含义和作用:左边的 httpd 服务器的配 8080 是宿主机(运行 Docker 的物理机或虚拟机)上 的端口,右边的80是容器内 httpd 服务器默认监听的端口。通过这种映 射,外部客户端(如浏览器)访问宿主机的 8080 端口时,请求会被转发到 容器内 httpd 服务器监听的 80 端口。这就使得你可以通过宿主机的 8080 端口来访问容器内 httpd 服务器提供的网页服务。例如,在浏览器中输入宿 主机的 IP 地址加上 8080 端口(如 http://[宿主机IP]:8080 ),就可以访 问容器内 httpd 服务器上的网页。

-v /home/user/webroot/:/usr/local/apache2/htdocs/ 参数 功能:进行目录挂载。 含义和作用:左边的 /home/user/webroot/ 是宿主机上的一个目录,右边 的/ usr/local/apache2/htdocs/ 是容器内 httpd 服务器存放网页文档的 默认目录。通过这种挂载,将宿主机上的目录挂载到容器内相应的目录。这 样做有很多好处,一是方便在宿主机上直接对要提供给 httpd 服务器的网页 文档进行编辑、更新等操作。例如,你在宿主机的 /home/user/webroot/ 目录下新建一个 index.html 文件,容器内的 httpd 服务器就能直接使用 这个文件来提供网页服务。二是实现了数据的持久化和共享,即使容器重新 启动或者被删除后重新创建,只要宿主机上挂载的目录中的数据没有丢失, 容器内的 httpd 服务器就可以继续使用这些数据来提供网页服务。

httpd 部分 功能:指定要运行的容器所基于的镜像名称。 含义和作用: httpd 是一个常用的用于搭建 Apache HTTP 服务器的镜像。 通过运行基于这个镜像的容器,容器内部会启动 httpd 服务器,从而能够对 外提供网页服务。当容器启动后, httpd 服务器会根据容器内的配置和挂载 的网页文档目录来提供相应的网页内容

侦听宿主机80端口

docker container run -d --rm --network host -v

/home/user/webroot/:/usr/local/apache2/htdocs/ httpd

--network host

功能: 将容器的网络模式设置为 "host" 模式。

含义和作用: 在这种模式下,容器会直接使用宿主机的网络栈。容器内的网络接口和端 口将直接与宿主机相同,不再进行端口映射操作。例如,容器内 httpd 服务器监听的80端口,将直接在宿主机的80端口上进行监听。这对于 一些需要直接使用宿主机网络资源或者需要避免网络地址转换(NAT)带 来的复杂性的应用场景很有用。不过,这种模式也有一定的风险,因为容 器内的服务将直接暴露在宿主机网络上,可能会增加安全风险。

Podman

Podman 是 Docker 的替代产品

无守护进程

运行容器 (不加sudo启动报错,默认禁止侦听1024以下端口) sudo podman run -d --r-m --network host httpd pod是共享名称的多个容器的集合 创建名为wha的空pod (加入两个容器,访问容器1) podman pod create --name wha podman run -d --pod wha httpd podman run -pod wha -it alpine/curl /bin/bash 验证curl curl localhost PODMAN 大部分容器化过程都采用开放容器计划(OCI) 标准 因此Podman和Docker可互操作

容器的真相

Linux没有被称为"容器"的单一特性 实际上"容器"是阻止进程访问其他进程和资源的特性组合。由于这些发生在内核级 别,所以可以控制"容器"的限制级别 容器的历史 197x年代引入chroot 1999年FreeBSD发布Jails, 在chroot之上提供更多限制(Linux不支持) 2002年引入namespaces,在需要时可分离内核资源 位于单独入namespace中的进程不知道主机网络或其他进程网络 2006年谷歌引入进程容器,后被称为cgroup,可将内存和CPU资源限制在特定进程中 结合cgroup和命名空间发布了Linux容器(LXC) 项目,可创建在单独命名空间中运行 的容器 ●Linux中八种用户命名空间 挂载、进程ID(PID)、网络、进程间通信(IPC)、Unix分时(UTS)、用户ID、控制组、 时间、syslog 容器 是一种轻量级的虚拟化技术,用于将应用程序及其所有依赖项打包在一起,以便 在不同的计算环境中进行移植和运行。容器提供了一种隔离的运行环境,使得不同应 用程序能够在独立的文件系统、网络和进程空间中运行,从而提升了安全性和稳定性 容器是一个轻量级、可执行的软件包,包含运行某个特定应用所需的所有代码、运行 时环境、库和配置文件。与运行在物理或虚拟机上的应用不同,容器与宿主机共享内 核,但在用户空间中以隔离的方式运行。这种隔离确保了不同容器之间的独立性,避 免了相互干扰

Chroot

chroot是Linux上最原始的沙盒之一 ,可以指示进程的新根目录 chroot中的进程可以访问网络、挂载和其他内核功能,攻击者如破解其中进程, 则能够逃逸到主机其余部分 进入chroot目录

sudo chroot /home/userlroots/min/ /bin/bash

ps au root 48086 S 01:21 0:00 sudo chroot /home/student/roots/bionic/ /bin/bash

查看系统进程信息(ps命令),并且筛选出用户为 root ,进程 ID 为 48086 ,进程状态为S(可中断睡眠状态,通常表示进程正在等待某些事件完 成),启动时间为 01:21 ,占用 CPU 时间为 0:00 的进程相关内容。这个进程 对应的命令是

sudo chroot /home/student/roots/bionic/ /bin/bash

虽然chroot实现了某种形式的分段,但并不完美。命名空间可实现每个进程分离 网络、进程和其他命名空间

命名空间

Linux允许根据各种内核特性对进程进行分割 Linux中八种命名空间 挂载、进程ID(PID)、 网络、进程间通信(IPC)、 Unix分时(UTS)、用户ID、 控制 组、时间、syslog

  1. 以PID命名空间为例,查看当前shell的PID echo $$ $$ 是一个特殊变量,表示当前shell进程的进程ID(PID)

  2. 在新命名空间中运行bash (容器化环境) sudo unshare --fork --pid --mount /bin/bash

  3. 进一步隔离命名空间 ps aux root1 ... May100:08 /sbin/init mount-t proc none /proc root1 ... May 100:09 /bin/bash mount 是用于挂载文件系统的命令。

-t proc 表示要挂载的文件系统类型是

proc. 这个操作通常用于在特定的环境(比如容器或者经过命名空间隔离的环境)中重 新建立proc文件系统,以实现对进程相关信息的访问控制或者隔离 我们发现/sbin/init变为/bin/bash,这就起到一个命名隔离的效果

  1. 隔离网络命名空间 ip a

sudo unshare -fpmun --root /home/user/roots/ --mount-proc /bin/bash

ip a

Capabilities

Docker默认不使用用户命名空间。为了防止特权内核调用,其使用内核capabilities和 seccomp配置文件限制访问 Linux具有特权或非特权进程 具有正确权限的非特权进程可以写入系统文件,但特权进程几乎无所不能用户权限过 于宽泛,当非特权用户只需要特殊权限时,可使用Capabilities Linux将一些系统级任务分组为40多个类别,称为Capabilities 能力允许非特权进程运行特定的系统级任务,而无需授予其完全访问权 内核限制进程使用自定义数据包创建原始套接字的能力 内核不支持半开TCP连接 nmap 127.0.0.1-sS 非特权用户需要运行调用原始套接字能力的命令 SUID(所有者为root)

#提权隐患

sudo cp /usr/bin/nmap /usr/bin/nmap-cap

sudo setcap cap_ net raw+eip /usr/bin/

nmap-capo nmap-cap --privileged 127.0.0.1-sS

命令解释 sudo cp /usr/bin/nmap /usr/bin/nmap-cap这一步是使用管理员权限(sudo)将系统中的 nmap 工具复制一份并命名为 nmap-cap。 sudo setcap cap_net_raw+eip /usr/bin/nmap-cap这一步是给新复制的 nmap-cap 工具赋予 特定的权限,使其能够进行原始套接字操作等高级权限操作。 nmap-cap --privileged 127.0.0.1 -sS这一步是使用具有特殊权限的 nmap-cap 工具去扫 描本地地址。 这里的提权隐患在于: 随意提升工具的权限可能会被恶意用户利用。如果一个恶意用户获得了对这个工具的 控制,或者通过某种方式利用这个工具的高权限状态,就可能对系统进行破坏,比如 访问本不应该被访问的系统资源、窃取敏感信息等。 这种提权操作可能会绕过系统 正常的安全机制。系统通常有一系列的权限控制和安全策略来防止未经授权的操作, 但通过这种方式提权可能会打破这些安全防线,使系统更容易受到攻击。 如果这个 工具被黑客利用,他们可以利用其高权限来进一步渗透系统,甚至完全控制整个系 统,给系统的安全性带来极大的威胁。 常见Capabilities CAP_ CHOWN:允许进程修改文件所有者 CAP NET ADMIN: 对网络配置(IP、 防火墙等)执行管理任务0 CAP NET_ BIND SERVICE:允许绑定低于1024的端口 CAP NET RAW: 允许使用RAW套接字 CAP SYS ADMIN: "根"权限(危险),启用过多的功能集CAP_ SYS_ BOOT: 允许重 新启动主机 CAP_ SYS_ MODULE:允许加载和卸载内核模块 CAP_ SYS_ TIME:允许进程设置系统时钟 CAP SYS_ CHROOT:允许使用chroot CAP AUDIT _WRITE: 允许写入内核审计日志

Kubernetes(k8s)

介绍 Kubernetes,通常简称为 K8s,是一个开源的容器编排平台。它可以自动化部署、 扩展和管理容器化应用程序。Kubernetes 能够在多个服务器上高效地运行容器,确保 应用的高可用性和可扩展性。 核心概念 Pod Pod 是 Kubernetes 中最小的可部署单元,它可以包含一个或多个容器。这些容器共享 网络命名空间和存储卷,并且被一起调度和管理。 Deployment Deployment 用于管理 Pod 的副本数量和更新策略。它可以确保应用始终保持指定数 量的副本在运行,并且可以实现滚动更新等功能。 Service Service 定义了一组 Pod 的访问方式。它提供了一个稳定的 IP 地址和端口,使得外部 可以通过这个地址访问到一组 Pod。 Node Node 是 Kubernetes 中的工作节点,它可以是物理服务器或虚拟机。每个 Node 上运 行着 Kubelet 和容器运行时,负责管理容器的生命周期。

安装Minikube(用于本地开发的 Kubernetes 环境)

  1. 下载 Minikube 二进制文件 可以从 Minikube 官方网站下载适合你系统架构的版本。例如,对于 64 位的 Linux 系统,使用以下命令下载:

curl -LO

https://storage.googleapis.com/minikube/releases/latest/minikube linux-amd64

  1. 使下载的二进制文件可执行。 chmod +x minikube-linux-amd64

  2. 将可执行文件移动到 PATH 中的目录(例如 /usr/local/bin ),以便在任何 位置都能方便地使用 sudo mv minikube-linux-amd64 /usr/local/bin/minikube

启动Minikube minikube start 注意 :如果直接使用root用户启动它会报错,所以su切换到其他用户再启动 验证Minikube 是否成功启动 minikube status

部署应用到 Kubernetes 安装kubectl 下载k ubectl 二进制文件

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

使二进制文件可执行

chmod +x kubectl

将ku bectl 移动到 PATH 中的目录(例如 sudo mv kubectl /usr/local/bin/ /usr/local/bin ) 创建一个 Deployment

kubectl create deployment nginx --image=nginx

部署 Nginx 服务器。

查看 Deployment kubectl get deployments 创建一个 Service kubectl expose deployment nginx --port=80 --type=NodePort 让外部访问 Nginx 服务器。 查看 Service kubectl get services 访问应用 在 Service 信息中找到 NodePort 的端口号,使用":"在浏览器中访问 Nginx 服务器。 扩展应用 扩展 Deployment 的副本数量 kubectl scale deployment nginx --replicas=3 查看副本数量 kubectl get deployments 更新应用 更新 Deployment 的镜像 使用以下命令将 Nginx 的镜像更新为一个新的版本: kubectl set image deployment/nginx nginx=new-image:version 查看更新进度 使用以下命令查看 Deployment 的更新进度: kubectl rollout status deployment/nginx 我服务器太拉了,就不展示具体图片了

相关推荐
我曾经是个程序员20 分钟前
鸿蒙学习记录
开发语言·前端·javascript
爱上语文20 分钟前
宠物管理系统:Dao层
java·开发语言·宠物
小老鼠不吃猫1 小时前
力学笃行(二)Qt 示例程序运行
开发语言·qt
长潇若雪1 小时前
《类和对象:基础原理全解析(上篇)》
开发语言·c++·经验分享·类和对象
数据小小爬虫2 小时前
如何利用Python爬虫获取商品历史价格信息
开发语言·爬虫·python
Gao_xu_sheng2 小时前
Java程序打包成exe,无Java环境也能运行
java·开发语言
NiNg_1_2342 小时前
Python的sklearn中的RandomForestRegressor使用详解
开发语言·python·sklearn
谢家小布柔2 小时前
java中的继承
java·开发语言
黑色叉腰丶大魔王2 小时前
《基于 Python 的网页爬虫详细教程》
开发语言·爬虫·python