一、为什么要对比腾讯云 vs 华为云
企业上云时经常面临选择:腾讯云还是华为云?或者多云并用?两者的安全模型结构相似但细节差异很大,用 AWS/阿里云的经验套过来容易踩坑。
1.1 架构对比概览
┌─────────────────┬────────────────────────┬────────────────────────┐
│ 维度 │ 腾讯云 (Tencent Cloud) │ 华为云 (Huawei Cloud) │
├─────────────────┼────────────────────────┼────────────────────────┤
│ 身份管理 │ CAM (Cloud Access Mgr) │ IAM (Identity and Access)│
│ K8s 服务 │ TKE (Tencent K8s Engine)│ CCE (Cloud Container Engine)│
│ 密钥管理 │ KMS + SecretId/SecretKey│ KMS + AccessKey/SecretKey│
│ 审计日志 │ CLS + CloudAudit │ LTS + CTS (Cloud Trace Service)│
│ 网络隔离 │ VPC + 安全组 + NAT │ VPC + 安全组 + EIP │
│ 安全态势 │ 云镜 (Cloud Mirror) │ 态势感知 (SecMaster) │
└─────────────────┴────────────────────────┴────────────────────────┘
二、身份管理深度对比:CAM vs IAM
2.1 核心概念差异
| 功能点 | 腾讯云 CAM | 华为云 IAM |
|---|---|---|
| 根账户凭证 | SecretId + SecretKey | AccessKeyId + SecretKey |
| 子账号 | Sub-Account | IAM User |
| 角色 | CAM Role(支持 ExternalId) | IAM Role(支持 MFA Condition) |
| 权限策略 | JSON Policy(类似 AWS) | JSON Policy(类似 AWS) |
| 跨账号 AssumeRole | sts:AssumeRole |
sts:AssumeRole |
| 权限边界 | 不支持 Permission Boundary | 支持 (2024 起) |
| 服务控制 | 无 SCP,但有 Organization Policy | 支持 Organization + SCP |
| MFA | 腾讯 MFA 微信小程序 | 华为 MFA App / 硬件 Token |
| Condition 条件 | 支持时间/IP/Source VPC | 支持时间/IP/Source VPC/Principal Tag |
2.2 PoC:腾讯云 CAM 权限提升
腾讯云 CAM 的策略格式和 AWS 几乎一样,但缺少 Permission Boundary 意味着过宽的 TrustPolicy 更致命。
#!/usr/bin/env python3
"""
腾讯云 CAM 权限提升 PoC
前置: 攻击者拿到了子账号 SecretId/SecretKey 且有 cam:PassRole
"""
from tencentcloud.common import credential
from tencentcloud.cam.v20190116 import cam_client, models
def list_vulnerable_roles():
cred = credential.Credential("AKIDxxxxxxxx", "xxxxxxxxxxxxx")
client = cam_client.CamClient(cred, "ap-guangzhou")
# 列出所有 Role
req = models.ListRolesRequest()
resp = client.ListRoles(req)
for role in resp.RoleList:
print(f"Role: {role.RoleName}, Arn: {role.RoleId}")
# TrustPolicy
policy = json.loads(role.PolicyDocument)
principal = policy.get("statement", [{}])[0].get("principal", {})
if principal == "*" or (isinstance(principal, dict) and principal.get("qcs") == "*"):
print(f" 🔴 TrustPolicy=*!可以直接 AssumeRole")
# 腾讯云 AssumeRole 到高权限 Role
def escalate():
from tencentcloud.sts.v20180813 import sts_client, models as sts_models
cred = credential.Credential("AKIDxxxxxxxx", "xxxxxxxxxxxxx")
sts = sts_client.StsClient(cred, "ap-guangzhou")
req = sts_models.AssumeRoleRequest()
req.RoleArn = "qcs::cam::uin/1234567890:roleName/admin-role"
req.RoleSessionName = "attacker-session"
req.DurationSeconds = 3600
resp = sts.AssumeRole(req)
print(f"[+] 拿到临时凭证: {resp.Credentials}")
# SecretId: resp.Credentials.TmpSecretId
# SecretKey: resp.Credentials.TmpSecretKey
# Token: resp.Credentials.Token
2.3 PoC:华为云 IAM 权限提升
#!/usr/bin/env python3
"""
华为云 IAM 权限提升 PoC - 演示 SCP 和 Permission Boundary 的优势
"""
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkiam.v3 import IamClient, ListRolesRequest
def audit_huawei_iam():
credentials = BasicCredentials(
ak="AKIA6Q...",
sk="xxxxxxxx",
project_id="0469dc0d..."
)
client = IamClient.new_builder().with_credentials(credentials).with_endpoint("https://iam.myhuaweicloud.com").build()
# 1. 枚举 Role
roles = client.list_roles(ListRolesRequest()).to_dict()["roles"]
for role in roles:
trust = role.get("assume_role_policy_document", "")
if '"Effect":"Allow"' in trust and '"Principal":"*"' in trust:
print(f"🔴 Role {role['name']}: TrustPolicy=*")
# 2. 华为云独有的: 检查 Permission Boundary
# 华为云 2024 年开始支持 Permission Boundary
# 如果 Role 有 Boundary,即使 TrustPolicy 被攻破,权限也会被 Boundary 卡死
2.4 多云统一 IAM 策略模板
// unified-minimal-role.json - 同时适配腾讯云 CAM 和 华为云 IAM
// 腾讯云用 qcs 作为资源标识符前缀
// 华为云用 urn 或 *cloud.cn 作为前缀
{
"version": "2.0",
"statement": [
{
"effect": "allow",
"action": [
// 腾讯云格式
"cos:GetObject",
"cos:PutObject",
// 华为云格式(同时写,两边都只认识自己的)
"obs:GetObject",
"obs:PutObject"
],
"resource": [
// 腾讯云: qcs::cos::ap-guangzhou::bucket-1234567890/path/*
"qcs::cos:ap-guangzhou:*:bucket-1234567890/path/*",
// 华为云: obs bucket
"urn:obs:*:*:bucket-myproject/data/*",
"*",
"obs:*:*:bucket-myproject/data/*"
],
"condition": {
"ip_equal": {
"qcs:ip": ["203.0.113.0/24"]
}
}
}
]
}
三、容器安全对比:TKE vs CCE
3.1 K8s 服务特性
| 功能 | 腾讯云 TKE | 华为云 CCE |
|---|---|---|
| 基础 K8s 版本 | 1.24-1.30 | 1.23-1.30 |
| CNI | Global Router / VPC-CNI | VPC CNI / Canal |
| 运行时 | containerd (默认) | containerd |
| 节点池 | 支持 + 自动扩容 | 支持 + 自动扩容 |
| 组件升级 | 托管升级 | 托管升级 |
| Istio 支持 | TKE Mesh(可选) | Istio 插件 |
| 安全扫描 | TKE 安全中心 | CCE 安全中心 |
3.2 关键差异:谁能访问 kubeconfig?
# 腾讯云: CAM 里有个特殊权限 "tke:DescribeClusterCredential"
# 拿到这个权限就能直接调 API 拿到 kubeconfig
tccli tke DescribeClusterCredential --cluster-id c-123456789
# 华为云: IAM 里权限名是 "cce:ListClusterCredentials"
huawei cloud CCE ListClusterCredentials --cluster-id cce-xxx
# 两边都需要: 定期审计谁有这个权限
3.3 容器运行时安全差异
# 腾讯云 TKE: 支持安全加固选项
# 在节点池级别开启
apiVersion: nodepool.tke.cloud.tencent.com/v1
kind: NodePool
metadata:
name: secure-np
spec:
security:
allowPrivileged: false # 禁止特权容器
allowHostNetwork: false # 禁止 HostNetwork
allowHostDir: false # 禁止 HostDir 挂载
hostPID: false
hostIPC: false
seccompProfile: RuntimeDefault
---
# 华为云 CCE: 通过 PodSecurityPolicy + CCE Addon 配置
apiVersion: cce.io/v1alpha1
kind: SecurityPolicy
metadata:
name: restricted-policy
spec:
rules:
privilegeContainer: false
hostNetwork: false
hostPath: false
hostPID: false
四、密钥管理对比
| 功能 | 腾讯云 KMS | 华为云 KMS |
|---|---|---|
| 密钥类型 | 对称(AES-256)、非对称(RSA/SM2)、信封加密 | 对称/非对称/国密 |
| 自带密钥(HSM) | 支持 | 支持 |
| 自动轮换 | 支持(1-365天) | 支持 |
| 跨区域同步 | 支持 | 支持 |
| 多账号授权 | 支持 | 支持 |
| 明文泄露审计 | CloudAudit | CTS |
| 国密算法 | SM2/SM3/SM4 | SM2/SM3/SM4 |
4.1 攻击场景:KMS Key 策略太宽
# 腾讯云: 检查所有 KMS Key 的策略
tccli kms ListKeys --region ap-guangzhou | jq '.KeyMetadataList[].KeyId' | while read kid; do
policy=$(tccli kms GetKeyPolicy --key-id $kid --region ap-guangzhou --output json | jq '.Policy')
if echo $policy | grep -q "Principal.*\*"; then
echo "🔴 KMS Key $kid Policy = *, 任何人都能 Decrypt!"
fi
done
# 华为云: 类似
huawei cloud kms listkeys | jq '.keys[].key_id' | while read kid; do
policy=$(huawei cloud kms listkeypolicies --key_id $kid | jq .)
...
done
五、审计日志差异
| 功能 | 腾讯云 CloudAudit | 华为云 CTS |
|---|---|---|
| 日志格式 | JSON | JSON |
| 保留时长 | 永久存储 + 冷归档 | 30天免费 + 付费延长 |
| 查询 | CLS (Cloud Log Service) | LTS (Log Tank Service) |
| 告警 | 支持基于规则的告警 | 支持 |
| 导出 | COS 存储桶 | OBS 存储桶 |
| 跨账号聚合 | 支持 | 支持 |
5.1 关键:审计日志的"谁看了什么"
# 腾讯云: 找出谁最近调用了 IAM 敏感 API
tccli clisearch SearchLog --topic-id your-log-topic-id --region ap-guangzhou --query "eventName:CreateAccessKey OR eventName:AssumeRole" --from 24h --output json | jq '.results[] | {eventName, operator: .user.userName, time}'
# 华为云 CTS 类似
huawei cloud cts listtraces --resource-type "iam" --trace-type "activity" --time_range begin="$(date -d '24 hours ago' +%s)" end="$(date +%s)"
六、攻防对抗场景对比
6.1 场景 1:拿到子账号凭证后,横向移动到 K8s Secret
腾讯云路径:
子账号 SecretId/SecretKey →
tccli tke DescribeClusterCredential →
拿到 kubeconfig →
kubectl get secrets -A
华为云路径:
子账号 AK/SK →
huawei cloud CCE ListClusterCredentials →
拿到 kubeconfig →
kubectl get secrets -A
防御:两端都需要最小权限原则 + 审计谁调用了 DescribeClusterCredential
6.2 场景 2:OSS/COS Bucket 公开泄露
# 腾讯云: 批量检查 COS Bucket ACL
tccli cos ListBuckets --region ap-guangzhou | jq '.Buckets[].Name' | while read bucket; do
acl=$(tccli cos GetBucketAcl --bucket $bucket --region ap-guangzhou --output json)
if echo $acl | grep -q "Grantee.*\*"; then
echo "🔴 COS Bucket $bucket 公开访问!"
tccli cos PutBucketAcl --bucket $bucket --region ap-guangzhou --acl private
fi
done
# 华为云 OBS
huawei cloud obs listbucket | jq '.buckets[].name' | while read bucket; do
acl=$(huawei cloud obs getbucketacl --bucket $bucket)
...
done
七、多云统一安全治理方案
7.1 Terraform 统一检测脚本
# multi-cloud-security-audit.tf
variable "providers" {
default = {
tencent = {
secret_id = "YOUR_SECRET_ID"
secret_key = "YOUR_SECRET_KEY"
region = "ap-guangzhou"
}
huawei = {
ak = "YOUR_AK"
sk = "YOUR_SK"
region = "cn-north-4"
}
}
}
# 腾讯云安全组扫描
data "tencentcloud_security_group" "tencent_all" {
count = 1
# Terraform 没有原生 scan,建议用脚本
}
# 更实用: 用 Python 写一个统一审计脚本
#!/usr/bin/env python3
"""
多云安全审计统一入口
支持: 腾讯云 / 华为云 / AWS / 阿里云
"""
import json, subprocess, sys
def run(cmd):
return subprocess.run(cmd, capture_output=True, text=True, shell=True)
class BaseAuditor:
def audit(self):
raise NotImplementedError
class TencentCloudAuditor(BaseAuditor):
def audit(self):
print("[腾讯云] 审计中...")
# 1. CAM 权限
result = run("tccli cam ListRoles --region ap-guangzhou --output json")
roles = json.loads(result.stdout).get("RoleList", [])
for role in roles:
policy = json.loads(role.get("PolicyDocument", "{}"))
principal = policy.get("statement", [{}])[0].get("principal", {})
if principal == "*":
print(f" 🔴 Role {role['RoleName']} TrustPolicy=*")
# 2. COS Bucket
result = run("tccli cos ListBuckets --region ap-guangzhou --output json")
buckets = json.loads(result.stdout).get("Buckets", [])
for b in buckets:
acl_result = run(f"tccli cos GetBucketAcl --bucket {b['Name']} --region ap-guangzhou --output json")
# 检查 ACL 是否有 *
# 3. TKE
result = run("tccli tke DescribeClusters --region ap-guangzhou --output json")
clusters = json.loads(result.stdout).get("ClusterSet", [])
print(f" 集群数: {len(clusters)}")
class HuaweiCloudAuditor(BaseAuditor):
def audit(self):
print("[华为云] 审计中...")
# 1. IAM
result = run("huawei cloud iam listroles")
# 类似检查 TrustPolicy
# 2. OBS
result = run("huawei cloud obs listbucket")
# 3. CCE
result = run("huawei cloud CCE listclusters")
if __name__ == "__main__":
cloud = sys.argv[1] if len(sys.argv) > 1 else "all"
if cloud in ("tencent", "all"): TencentCloudAuditor().audit()
if cloud in ("huawei", "all"): HuaweiCloudAuditor().audit()
八、总结:多云安全 Checklist
| 项目 | 腾讯云措施 | 华为云措施 |
|---|---|---|
| 身份管理 | CAM TrustPolicy 禁止 * | IAM + Permission Boundary |
| K8s 安全 | TKE 安全中心 + PSA | CCE + PodSecurity |
| 密钥管理 | KMS + COS 加密 | KMS + OBS 加密 |
| 审计 | CLS 实时告警 | LTS 实时告警 |
| 网络 | 安全组 + VPC-CNI | 安全组 + VPC CNI |
| 态势感知 | 云镜 + 威胁情报 | SecMaster + 威胁情报 |
核心结论:腾讯云和华为云的安全模型差异远小于相似点。真正的差距在于成熟度——华为云 Permission Boundary、SCP 组织控制这些 AWS 级别的功能比腾讯云更完善,但腾讯云在攻防对抗(云镜 + 安全运营)上有更丰富的国内实战经验。多云场景下,用 Terraform + Python 脚本做统一审计是成本最低的方案。