声明
学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负
关于云技术基础的那些事儿-Base1
在过去,搭建一个应用程序可真是个大工程。得去购买服务器,租赁机房,进行安装、上架,还得拧螺丝、接网线。但如今,情况大不相同啦。现在很多基础设施都已经云化了。我们可以直接找像阿里云、腾讯云这样的云服务器厂家,购买一些云服务器,短短几分钟就能申请下来。基于这些云服务器,我们可以轻松地进行各种各样的应用部署。
一、云技术基础
什么是云架构?
不管是防御系统还过是进攻系统,强大的底层技术基础都是必不可少的。
从防御的角度来看,只有了解底层技术,我们才能知道如何构建防御体系。从进攻的角度讲,了解底层技术才能发现漏洞并开发出漏洞利用的方法。所以呢,攻击者和防御者都必须清楚对方的运作方式。
以前构建系统的时候,需要购买设备、租用数据中心机柜,然后搭建基础设施。随着处理器的不断进化,虚拟机出现了。它能把一台机器的资源分成多台机器来使用,提高了资源利用率,变得更加灵活可拓展,实现了从裸机基础设施到虚拟化基础设施的转变。接着,容器化技术登场,进一步提高了效率,实现了服务器、网络和存储的虚拟交付。现在,我们把最新一代的基础设施称为“云”,它可不是单一的技术哦,而是众多技术的集合。
什么是云服务?
云是一种 IT 基础设施系统,它将资源的创建抽象在容错、地理分布和可扩展的物理基础设施之上。并以服务器的形式按需求交付能力,非常易于使用,可以自动创建服务器、存储、网络等等。云基础架构必须稳定,不能频繁出现中断。地理分布的云基础设施能够提高容错能力,而且云必须能够快速扩展,以满足各种需求。
有很多公有云服务商,比如 Amazon Web Services(AWS)、Azure、Google(GCP),还有华为云、腾讯云、阿里云等等。组织可以使用 OpenStack 等工具在自己的数据中心搭建私有云,或者一部分业务运行在私有云中,一部分运行在公有云中。
什么是云分类?
- 基础设施即服务(IaaS):就像提供建筑材料和工具,让你可以自己搭建房子。
- 平台即服务(PaaS):类似有了基本框架的房子,你只需进行装修和布置。
- 软件即服务(SaaS):直接给你一个装修好可以直接入住的房子。
共享责任模型
云服务在提供容错和扩展的同时,也在不同层面增加了安全性的模糊性。如果是 AWS 程序漏洞导致大量数据泄露,AWS 不承担责任。但如果 AWS 数据中心物理安全遭到破坏,客户数据被盗取,AWS 就得承担责任。
云架构使用什么技术?
- 虚拟化:把一台机器的资源分成多台虚拟机器,多台裸机汇集形成资源集群,隔离资源的使用,灵活且可扩展资源池。它抽象了硬件安装过程,但仍有改进空间,并非专为云而生。技术栈的灵活性和可定制性提升,促使了容器的出现。
- 容器:容器就像一个个独立的小空间,允许开发人员与堆栈各部分灵活交互,实现按需生成服务,提高网络抽象程度,方便应用迁移扩展,更高效地使用资源。系统管理和网络工程可以外包给其他公司。云是多种技术的集合。
- 组件选择:确定架构(这很难改),选择绑定或非绑定组件,可以自己开发、用开源的或者购买。云原生组件是为分布式系统设计的,CNCF 认证不是必须的,要安全编码,部分是开源的。
- 基础设施即代码(IaC):包括引导介质(Packer)、安装系统(Terraform)、自动配置(Ansible)、状态强制(Monit)。
集成部署有什么作用?
使用持续集成和持续交付(CICD)管道来构建环境,包括测试、测量和扫描代码更改的自动化测试和部署(GitOps)。要做到有弹性可靠,即任何单点故障都有故障转移或其他机制,让业务能持续提供(这叫冗余)。全球负载均衡(GSLB,比如智能 DNS、GTM)能解决客户单访问的单点故障隐患。还要平衡控制,控制保护系统免受漏洞和内部攻击的组件,应平衡控制和可用性。
云设计模式由有哪些?
云架构设计不必从头开始,采用已检验的设计模式是最佳选择。
- 微服务架构:为松散耦合、模块化服务而设计,微服务协同工作完成整体服务。每个服务都可以独立修改代码和重用,提高系统整体弹性和容错。大多数云利用微服务架构,云原生应用被构建充当微服务,便于水平扩展。安全优势是每个微服务应用强化、隔离,单一服务漏洞对整体系统影响小。缺点是调试更复杂,需要跨不同服务跟踪事务;性能可能有短板。
- 零信任架构:对资源的每个请求都需要验证来源已授权,然后授权短期访问(用令牌)。实现零信任架构的一种常见方法是 Open ID Connect(OIDC)联盟访问。授权处于活动状态时可以访问任何联合内服务。密码重置是针对零信任架构的常见攻击方式。
安全控制有哪些方式?
- 网络控制:传统架构用防火墙实现网络控制,云环境网络抽象为 SDN、SD WAN。SDN 可以对不同的接口(如 API 或 GUI)设置网络规则。通过 mTLS 不仅能加密流量,还能对客户端进行身份验证,有证书才能访问微服务。不正确的访问管理可导致权限提升,甚至破坏整个基础设施。现代访问管理系统多使用令牌进行访问控制,提供对服务的短时访问权。JWT 通常用于访问云端资源,伪造和破解密码是常见攻击手段。另一种类型的权限控制机制是强制访问控制 MAC。
- 身份管理:企业通常用 AD、LDAP 进行身份管理。AWS IAM 是身份和访问管理的公共云服务。Google 联盟认证 OIDC 经常用于 2FA。云身份提供者(IdP)作为真实身份来源,是更安全的解决方案,比如 Azure AD。
容器与云
虚拟化中每个 VM 需要运行自己的操作系统,大大增加了总体开销。容器化是更现代的架构,容器共享内核与硬件,更快、更小、更高效。容器是对虚拟化的补充,而非取代。容器的系统开销更小,可以进一步分离应用组件,比如搜索、登录、查询、订单功能分开。容器使用映像作为模板生成,映像相当于计算机硬盘。容器使用不同发行版文件加载内核,运行容器。
搭建属于自己的容器–Docker
docker_47">什么是docker呢?
Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及应用的依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
以下是 Docker 的一些关键特性和概念:
容器化(Containerization):
Docker 使用容器来隔离应用和环境,这与传统的虚拟化技术不同,容器共享宿主机的操作系统内核,但提供隔离的用户空间。
镜像(Images):
Docker 镜像是一个轻量级、可执行的软件包,包含了运行应用所需的代码、运行时、系统工具、系统库和设置。镜像是创建 Docker 容器的基础。
容器(Containers):
容器是镜像的运行实例。容器可以被创建、启动、停止、删除等。每个容器都是独立的,并且与其他容器隔离。
Dockerfile:
Dockerfile 是一个文本文件,包含了一系列的指令和参数,用于自动构建 Docker 镜像。
Docker 客户端和守护进程:
Docker 使用客户端-守护进程架构。Docker 守护进程(dockerd)运行在宿主机上,管理 Docker 对象,如镜像、容器、网络和卷。Docker 客户端(docker)是用户用来与守护进程交互的命令行工具。
Docker 仓库(Registries):
Docker 仓库用于存放 Docker 镜像。最知名的公共仓库是 Docker Hub,用户可以上传(push)和下载(pull)镜像。企业也可以搭建私有仓库。
Docker 网络(Networking):
Docker 提供了网络功能,允许容器之间以及容器与外部世界之间进行通信。Docker 支持多种网络配置,包括桥接网络、覆盖网络和自定义网络。
Docker 卷(Volumes):
Docker 卷是一种数据持久化机制,允许数据在容器之间共享,以及在容器和宿主机之间共享。卷独立于容器的生命周期,即使容器被删除,卷中的数据也不会丢失。
Docker Compose:
Docker Compose 是一个工具,用于定义和运行多容器 Docker 应用程序。使用 YAML 文件来配置应用程序的服务,然后使用一个简单的命令 docker-compose up 来启动和停止所有服务。
安全性:
Docker 提供了多种安全特性,包括内核能力、AppArmor、Seccomp、用户命名空间等,以确保容器的安全性。
可移植性:
Docker 容器可以在多种环境中运行,包括物理机、虚拟机、数据中心和云平台。
轻量级:
由于容器共享宿主机的内核,因此启动速度快,资源占用少。
docker_76">为什么不用kail搭建docker容器?
因为kail是secure的系统,镜像很大,工具众多,ubuntu系统稳定,但是容器还是得centos7真正的稳定,后面我将搭建一些网恋避险的网站,使用就是云服务器中的centos7。这个嘛就后续分享,现在我们继续搭建docker容器,后续咱学习Kubernetes 容器,Podman容器。容器有很多,咱会其中几个即可,就像数据库一样,学到就用到。
docker_78">在 Ubuntu 上安装docker有哪些方式呢?
在 Ubuntu 上生成 CentOS 7 容器,可以使用 Docker 这个流行的容器化工具。步骤如下:
注意:如果时用的虚拟机记得网卡选择桥接,不然就需要配置dns,比较繁琐,
1、 前置条件
操作系统要求
Docker 支持以下版本的 Ubuntu 64 位操作系统:
- Ubuntu Jammy 22.04 (LTS)
- Ubuntu Impish 21.10
- Ubuntu Focal 20.04 (LTS)
- Ubuntu Bionic 18.04 (LTS)
- CPU 架构要求:x86_64 (或 amd64), armhf, arm64, 和 s390x 均支持 Docker 安装。
2、卸载旧版本
如果你之前安装过老版本的 Docker , 请先执行如下面命令卸载:
sudo apt-get remove docker docker-engine docker.io containerd runc
这里我未安装,所以也就不存咋卸载一说
3、开始安装 Docker
Ubuntu 支持如下几种方法安装 Docker:
通过 apt 安装,后续升级更方便(推荐方法);
手动下载 .deb 包安装,完全手动管理升级;
使用脚本自动安装 Docker, 适用于测试、开发环境中;
一般来说,选择使用apt安装方便且实用快捷
docker_103">如何使用apt安装docker呢?
使用 APT 安装(推荐方式)
1、更新 apt 包索引:
sudo apt-get update
2、由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们需要添加使用 HTTPS 传输的软件包以及 CA 证书。
sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg \lsb-release
注意:这里安装的时候若是在终端中安装,那不需要换行符\,若是通过vim编辑后执行,则需要换行,额外空间yes即可
3、为了确认所下载软件包的合法性,需要添加 Docker 的 GPG 密钥,为了确保下载速度,走的国内源,注释的为国外源
sudo mkdir -p /etc/apt/keyrings
# 国内源
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 官方源
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
这里我选择用国内源,国外的源下载太慢了,当然也可以直接编辑源为一个vim文件进行执行
设置国内镜像源:你可以配置 Docker 使用国内的镜像源,比如阿里云的镜像源,以加速镜像的拉取。创建或编辑 /etc/docker/daemon.json 文件
具体的源url如下:
注意:这里的源文件时是非常重要的,其他源可能报错无法访问,毕竟ubuntu的服务器在国外。ubuntu比较坑,没有vim
使用命令:apt install vim
是不是不想手动敲,学会信息收集,ubuntu是无法从主机复制路径的噢,相信大家会信息收集到解决方式的,winscp,vm tools也可以。
再次强调,没有源,是无法访问docker 的hello world镜像的噢
4、向 sources.list 中添加 Docker 软件源
echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 官方源
# echo \
# "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
# $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
5、安装 Docker
更新 apt 软件包索引,安装最新版本的 Docker Engine、containerd 和 Docker Compose:
sudo apt-get updatesudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
选择yes即可
到这里也就安装完成了
注意: 运行 apt-get update 报 GPG 错误?
你默认的 umask 可能设置不正确,导致无法检测到 repo 的公钥文件。运行以下命令,然后再次尝试更新 apt 索引:sudo chmod a+r /etc/apt/keyrings/docker.gpg
6、如何安装指定版本的 Docker ?
要想安装特定版本的 Docker, 需要先获取 repo 中可用的版本号,然后再安装:
apt-cache madison docker-ce
docker-ce | 5:20.10.16~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.15~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.14~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.13~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
第二列中显示的即为版本号,如5:20.10.163-0ubuntu-jammy.
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io docker-compose-plugin
通过 .deb 包手动安装
如果你无法通过 apt 安装 Docker, 还可以手动下载指定版本的 .deb 包来安装。注意,每次升级时,同样需要下载一个新的 .deb 包。
1、访问 https://download.docker.com/linux/ubuntu/dists/
, 选择你的 Ubuntu 版本,然后进入 pool/stable/
, 选择对应的 CPU 架构: amd64、 armhf、arm64
或s390x
,下载.deb 安装包。
安装 Docker, 将下面的路径更改为你下载的 .deb 包路径:
sudo dpkg -i /path/to/package.deb
使用脚本自动安装 Docker
在测试或开发环境中, Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,Ubuntu 系统上可以使用这套脚本安装,另外可以通过 --mirror 选项使用国内源进行安装:
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
若你想安装测试版的 Docker, 可以从 test.docker.com 获取脚本后再执行它:
$ curl -fsSL test.docker.com -o get-docker.sh
执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 的稳定(stable)版本安装在 Ubuntu 系统中。
docker_204">测试docker是否安装成功
1、启动 Docker
# 设置 Docker 服务开机自动启动
sudo systemctl enable docker
# 启动 Docker 服务
sudo systemctl start docker
2、建立 Docker 用户组
默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。
出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
- 建立 docker 组:
sudo groupadd docker
- 将当前用户加入 docker 组:
sudo usermod -aG docker $USER
- 验证 Docker 是否安装成功
运行 Docker 并打印 hello-world:
sudo docker run hello-world
此命令会下载测试镜像,并基于此镜像运行容器,然后在打印 hello-world 后退出容器。若成功打印信息,表示 Docker 安装成功。
当然docker的使用还未真正开始
具体的使用手册,大家可以学习如下
:学会使用docker
在Ubuntu中安装加速器
- 安装/升级 Docker 客户端
推荐安装 1.10.0 以上版本的 Docker 客户端,参考文档 docker-ce - 配置镜像加速器
针对 Docker 客户端版本大于 1.10.0 的用户
您可以通过修改 daemon 配置文件 /etc/docker/daemon.json 来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
创建 Apache 容器后台运行:“docker container run -d --rm -p 8080:80 httpd
”。
常用命令:
- “
docker exe -it 899 /bin/bash
”:进入特定容器。
首先需要知道容器id:
列出所有容器(包括未运行的):docker ps -a
列出正在运行的容器:docker ps
进入特定docker exec -it [id] /bin/bash
通过docker ps 就可以获取到容器的id
容器还有很多的命令,容器docker的命令很多,大家自行学习和了解,也可以在官方文档上进行学习。
容器要学的东西很多,一时半会是写不完的,咱现在就先了解下,后面慢慢再来系统的学习下docker。
Podman 是 Docker 的替代产品,无守护进程。 - “
sudo podman run -d --r-m --network host httpd
”:运行容器。 - “
podman pod create --name wha
”:创建空 pod。 - “
podman run -d --pod wha httpd
”:在 pod 中运行容器。 - “
podman run -pod wha -it alpine/curl /bin/asho
”:在 pod 中运行可找东西的工具并互动。
大部分容器化过程都采用开放容器计划(OCI)标准,所以 Podman 和 Docker 可互操作。
容器的真相
Linux 没有单一被称为“容器”的特性。实际上,“容器”是阻止进程访问其他进程和资源的特性组合,发生在内核级别,可以控制其限制级别。
容器的历史:
- 197x 年代引入 chroot,可以指示进程的新根目录,但不完美。命名空间可实现每个进程分离网络、进程和其他命名空间。
- 1999 年 FreeBSD 发布 Jails,在 chroot 之上提供更多限制(Linux 不支持)。
- 2002 年引入命名空间,分离内核资源。
- 2006 年谷歌引入进程容器,后被称为 cgroup,可限制特定进程的内存和 CPU 资源。结合 cgroup 和命名空间发布了 Linux 容器(LXC)项目。
Linux 中有八种用户命名空间:挂载、进程 ID、网络、进程间通信、UTS、用户 ID、控制组、时间、syslog。
Linux中的命名空间详解
在Linux操作系统中,命名空间(namespaces)是一种内核级别的特性,用于将系统资源隔离开来,使得在不同命名空间中的进程看到不同的系统视图。Linux提供了多种类型的命名空间,每种都隔离了不同的系统资源。以下是一些常用的Linux命名空间:
Mount Namespace(挂载命名空间)
:
用于隔离文件系统挂载点。在不同的挂载命名空间中,可以有不同的挂载点和文件系统结构。
UTS Namespace(UNIX Time-Sharing System Namespace)
:
用于隔离网络主机名和域名。在不同的UTS命名空间中,可以有不同的主机名和NIS域名。
IPC Namespace(进程间通信命名空间)
:
用于隔离进程间通信设施,如System V IPC、POSIX消息队列等。
Network Namespace(网络命名空间)
:
用于隔离网络设备、网络栈、端口等网络资源。在不同的网络命名空间中,可以有不同的网络配置和网络接口。
PID Namespace(进程ID命名空间)
:
用于隔离进程编号。在不同的PID命名空间中,进程ID是独立的,一个进程在不同的命名空间中可以有不同的PID。
User Namespace(用户命名空间)
:
用于隔离用户和组ID。在不同的用户命名空间中,可以有不同的用户和组ID映射。
Cgroup Namespace(控制组命名空间)
:
用于隔离控制组层次结构,允许对资源进行更细粒度的控制。
Time Namespace(时间命名空间)
:
用于隔离系统时间。在不同的时间命名空间中,可以有不同的时钟和定时器。
Signal Namespace(信号命名空间)
:
用于隔离信号的发送和接收。
dockerdocke_323">docker中有命名空间吗?docke用什么配置文件限制访问呢?
Docker 默认不使用用户命名空间。为防止特权内核调用,它使用内核 capabilities 和 seccomp 配置文件限制访问。Linux 有特权或非特权进程。非特权进程有正确权限可写入系统文件,特权进程几乎无所不能。当非特权用户只需要特殊权限时,可使用 Capabilities。Linux 将一些系统级任务分组为 40 多个类别,称为 Capabilities。
常见 Capabilities:
- CAP_CHOWN:允许进程修改文件所有者。
- CAP_NET_ADMIN:对网络配置执行管理任务。
- 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:允许写入内核审计日志。
提升工具权限有隐患,可能被恶意用户利用,破坏系统、窃取敏感信息或完全控制整个系统。
通过docker中的内核capabilities ,我们知道一般来说docker中都是非特权的进程,不同的进程执行也是需要排队的,故提升权限是很重要的,可以使用常见的Capabilities参数进行提权。这不仅仅在渗透中很有用,在实际搭建靶场和网站时也是非常有用的。