#渗透测试#SRC漏洞挖掘#云技术基础03之容器相关
目录
一、Podman相关
(一)Podman简介
(二)Pod相关操作
二、容器相关
(一)容器概念
(二)容器的历史发展
(三)Capabilities相关
三、Kubernetes(k8s)相关
(一)Kubernetes简介
(二)Kubernetes的核心概念
(三)Kubernetes的操作
四、Git相关
(一)Git简介
(二)Git的安装
(三)Git的基本使用
一、Podman相关
(一)Podman简介
Podman是Docker的替代产品,它无守护进程。在运行容器时,若不加sudo启动可能会报错,因为默认禁止侦听1024以下端口,例如运行httpd容器可以使用
sudo podman run -d --r-m --network host httpd
命令。(二)Pod相关操作
- 创建Pod
- 可以创建名为wha的空pod,命令为
podman pod create --name wha
。- 然后向这个pod中加入容器,如运行httpd容器和alpine/curl容器,可以分别使用
podman run -d --pod wha httpd
和podman run -pod wha -it alpine/curl /bin/asho
命令,之后在容器内可以使用curl localhost
进行相关操作。二、容器相关
(一)容器概念
容器是一种轻量级的虚拟化技术,用于将应用程序及其所有依赖项打包在一起,以便在不同的计算环境中进行移植和运行。它提供了一种隔离的运行环境,使得不同应用程序能够在独立的文件系统、网络和进程空间中运行,从而提升了安全性和稳定性。容器是一个轻量级、可执行的软件包,包含运行某个特定应用所需的所有代码、运行时环境、库和配置文件。与运行在物理或虚拟机上的应用不同,容器与宿主机共享内核,但在用户空间中以隔离的方式运行。
(二)容器的历史发展
- 早期技术
- 197x年代引入chroot,它是Linux上最原始的沙盒之一,可以指示进程的新根目录,但chroot中的进程可以访问网络、挂载和其他内核功能,攻击者如破解其中进程,则能够逃逸到主机其余部分。进入chroot目录可以使用
sudo chroot /home/userlroots/min/ /bin/bash
命令查看主机ip等操作,虽然chroot实现了某种形式的分段,但并不完美。- 重要技术的引入
- 1999年FreeBSD发布Jails,在chroot之上提供更多限制(Linux不支持)。
- 2002年引入namespaces,在需要时可分离内核资源,位于单独namespace中的进程不知道主机网络或其他进程网络。Linux中有八种用户命名空间,包括挂载、进程ID、网络、进程间通信、UTS、用户ID、控制组、时间、syslog等。以PID命名空间为例,可以查看当前shell的PID(如使用
echo $$
),还可以在新命名空间中运行bash(如使用sudo unshare --fork --pid --mount /bin/bash
)来创建容器化环境等操作来进一步隔离命名空间。- 2006年谷歌引入进程容器,后被称为cgroup,可将内存和CPU资源限制在特定进程中。结合cgroup和命名空间发布了Linux容器(LXC)项目,可创建在单独命名空间中运行的容器。
(三)Capabilities相关
- Capabilities概念
- Linux将一些系统级任务分组为40多个类别,称为Capabilities。能力允许非特权进程运行特定的系统级任务,而无需授予其完全访问权。例如Docker默认不使用用户命名空间,为了防止特权内核调用,其使用内核capabilities和seccomp配置文件限制访问。Linux具有特权或非特权进程,具有正确权限的非特权进程可以写入系统文件,但特权进程几乎无所不能,当非特权用户只需要特殊权限时,可使用Capabilities。
- 常见Capabilities
- CAP_CHOWN:允许进程修改文件所有者。
- CAP_NET_ADMIN:对网络配置(IP、防火墙等)执行管理任务。
- 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:允许写入内核审计日志。
- 提权隐患示例
- 以nmap工具为例,内核限制进程使用自定义数据包创建原始套接字的能力,非特权用户需要运行调用原始套接字能力的命令时存在提权操作。如先使用
sudo cp /usr/bin/nmap /usr/bin/nmap - cap
将nmap工具复制一份,再使用sudo setcap cap_net_raw+eip /usr/bin/nmap - cap
赋予权限,最后使用nmap - cap --privileged 127.0.0.1 - sS
进行扫描。这里的提权隐患在于随意提升工具的权限可能会被恶意用户利用,如果恶意用户获得对这个工具的控制,可能对系统进行破坏,绕过系统正常的安全机制,使系统更容易受到攻击等。三、Kubernetes(k8s)相关
(一)Kubernetes简介
Kubernetes,通常简称为K8s,是一个开源的容器编排平台。它可以自动化部署、扩展和管理容器化应用程序,能够在多个服务器上高效地运行容器,确保应用的高可用性和可扩展性。
(二)Kubernetes的核心概念
- Pod
- Pod是Kubernetes中最小的可部署单元,可以包含一个或多个容器,这些容器共享网络命名空间和存储卷,并且被一起调度和管理。
- Deployment
- 用于管理Pod的副本数量和更新策略,可以确保应用始终保持指定数量的副本在运行,并且可以实现滚动更新等功能。
- Service
- 定义了一组Pod的访问方式,提供了一个稳定的IP地址和端口,使得外部可以通过这个地址访问到一组Pod。
- Node
- 是Kubernetes中的工作节点,可以是物理服务器或虚拟机。每个Node上运行着Kubelet和容器运行时,负责管理容器的生命周期。
(三)Kubernetes的操作
- 安装
- 可以安装Minikube(一种用于本地开发的Kubernetes环境),先下载Minikube的安装包(根据操作系统选择合适版本),然后按照安装向导进行安装,安装完成后使用
minikube start
命令启动Minikube。- 部署应用
- 创建一个Deployment,例如部署一个Nginx服务器可以使用
kubectl create deployment nginx --image = nginx
命令,然后查看Deployment状态使用kubectl get deployments
命令。为了让外部可以访问到Nginx服务器,需要创建一个Service,使用kubectl expose deployment nginx --port = 80 --type = NodePort
命令,查看Service信息使用kubectl get services
命令。- 扩展应用
- 扩展Deployment的副本数量,如将Nginx的副本数量扩展到3,可以使用
kubectl scale deployment nginx --replicas = 3
命令,查看副本数量是否已经扩展使用kubectl get deployments
命令,获取Service的NodePort后,可以在浏览器中使用<Minikube IP>:<NodePort>
的地址访问Nginx服务器。- 更新应用
- 更新Deployment的镜像,如将Nginx的镜像更新为一个新的版本,可以使用
kubectl set image deployment/nginx nginx = new - image:version
命令,查看更新进度使用kubectl rollout status deployment/nginx
命令。四、Git相关
(一)Git简介
Git是一个分布式版本控制系统,用于跟踪文件的变化,方便团队协作开发软件项目。它可以记录文件的历史版本,允许开发者在不同版本之间切换,并且可以合并多个开发者的修改。
(二)Git的安装
- 不同操作系统的安装方法
- Windows:可以从Git官方网站下载安装程序进行安装。
- macOS:可以使用Homebrew等包管理器安装Git。
- Linux:可以通过系统的包管理器安装Git,例如在Ubuntu上可以使用
sudo apt - get install git
。(三)Git的基本使用
- 仓库操作
- 初始化仓库:在一个新的项目目录中,使用
git init
命令初始化一个Git仓库。- 添加文件:使用
git add <文件名>
命令将文件添加到暂存区,也可以使用git add.
将当前目录下的所有文件添加到暂存区。- 提交更改:使用
git commit - m "提交说明"
命令将暂存区的文件提交到本地仓库。- 查看状态:使用
git status
命令查看当前仓库的状态,包括哪些文件被修改、哪些文件在暂存区等。- 查看历史记录:使用
git log
命令查看提交历史记录。- 分支管理
- 创建分支:使用
git branch <分支名>
命令创建一个新分支。- 切换分支:使用
git checkout <分支名>
命令切换到指定分支。- 合并分支:当在一个分支上完成工作后,可以将其合并到另一个分支。首先切换到目标分支,然后使用
git merge <源分支名>
命令进行合并。- 远程仓库操作
- 添加远程仓库:使用
git remote add <远程仓库名> <远程仓库地址>
命令添加一个远程仓库。- 推送更改:使用
git push <远程仓库名> <分支名>
命令将本地分支的更改推送到远程仓库。- 拉取更改:使用
git pull <远程仓库名> <分支名>
命令从远程仓库拉取最新的更改并合并到本地分支。- 安全相关
- 避免敏感信息泄露:不要在Git仓库中提交敏感信息,如密码、密钥、个人身份信息等。如果不小心提交了敏感信息,可以使用
git rm --cached <文件名>
命令从暂存区删除文件,然后使用git commit --amend
命令修改上一次提交;创建一个.gitignore
文件,列出不需要被跟踪的文件和目录;确保与Git远程仓库的通信是加密的,可以使用SSH或HTTPS协议进行通信。- 定期备份:定期备份Git仓库,以防止数据丢失,可以使用Git的备份工具,或者将仓库复制到其他存储设备中。
- 定期进行安全审计:定期检查Git仓库的安全性,包括权限设置、敏感信息泄露等,可以使用第三方工具进行安全审计。
- 协作开发相关
- 克隆仓库:如果要参与一个项目,可以使用
git clone <远程仓库地址>
命令克隆仓库到本地。- 处理冲突:当多个开发者同时修改同一个文件时,可能会出现冲突,在合并分支时,需要手动解决冲突,然后提交更改。