cloud-infrastructure-security
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseCloud & Infrastructure Security Skill | 雲端基礎設施安全
Cloud & Infrastructure Security Skill | 云端基础设施安全
確保雲端基礎設施、CI/CD pipeline 與部署配置遵循安全最佳實踐並符合業界標準。
确保云端基础设施、CI/CD pipeline 与部署配置遵循安全最佳实践并符合业界标准。
適用情境
适用情境
- 部署應用程式到雲端平台(AWS, Vercel, Railway, Cloudflare)
- 配置 IAM 角色與權限
- 設定 CI/CD pipeline
- 實作基礎設施即程式碼(Terraform, CloudFormation)
- 配置日誌與監控
- 管理雲端環境中的 secrets
- 設定 CDN 與邊緣安全
- 實作災難復原與備份策略
- 部署应用程序到云端平台(AWS, Vercel, Railway, Cloudflare)
- 配置IAM角色与权限
- 设定CI/CD pipeline
- 实施基础设施即代码(Terraform, CloudFormation)
- 配置日志与监控
- 管理云端环境中的secrets
- 设定CDN与边缘安全
- 实施灾难恢复与备份策略
雲端安全檢查清單
云端安全检查清单
1. IAM 與存取控制
1. IAM 与存取控制
最小權限原則
最小权限原则
yaml
undefinedyaml
undefined✅ 正確:最小權限
✅ 正确:最小权限
iam_role:
permissions:
- s3:GetObject # 只有讀取權限
- s3:ListBucket
resources:
- arn:aws:s3:::my-bucket/* # 特定 bucket
iam_role:
permissions:
- s3:GetObject # 只有读取权限
- s3:ListBucket
resources:
- arn:aws:s3:::my-bucket/* # 特定bucket
❌ 錯誤:過度寬鬆的權限
❌ 错误:过度宽松的权限
iam_role:
permissions:
- s3:* # 所有 S3 動作
resources:
- "*" # 所有資源
undefinediam_role:
permissions:
- s3:* # 所有S3动作
resources:
- "*" # 所有资源
undefined驗證步驟
验证步骤
- 生產環境不使用 root 帳號
- 所有特權帳號啟用 MFA
- 服務帳號使用角色,非長期憑證
- IAM policy 遵循最小權限
- 定期進行存取審查
- 未使用的憑證已輪替或移除
- 生产环境不使用root账号
- 所有特权账号启用MFA
- 服务账号使用角色,非长期凭证
- IAM policy遵循最小权限
- 定期进行存取审查
- 未使用的凭证已轮换或移除
2. Secrets 管理
2. Secrets 管理
雲端 Secrets Manager
云端Secrets Manager
typescript
// ✅ 正確:使用雲端 secrets manager
import { SecretsManager } from '@aws-sdk/client-secrets-manager';
const client = new SecretsManager({ region: 'us-east-1' });
const secret = await client.getSecretValue({ SecretId: 'prod/api-key' });
const apiKey = JSON.parse(secret.SecretString).key;
// ❌ 錯誤:硬編碼或僅在環境變數
const apiKey = process.env.API_KEY; // 不輪替,不審計typescript
// ✅ 正确:使用云端secrets manager
import { SecretsManager } from '@aws-sdk/client-secrets-manager';
const client = new SecretsManager({ region: 'us-east-1' });
const secret = await client.getSecretValue({ SecretId: 'prod/api-key' });
const apiKey = JSON.parse(secret.SecretString).key;
// ❌ 错误:硬编码或仅在环境变量
const apiKey = process.env.API_KEY; // 不轮换,不审计驗證步驟
验证步骤
- 所有 secrets 存放在雲端 secrets manager
- 資料庫憑證啟用自動輪替
- API keys 至少每季輪替
- 程式碼、日誌或錯誤訊息中沒有 secrets
- 啟用 secret 存取審計日誌
- 所有secrets存放在云端secrets manager
- 数据库凭证启用自动轮换
- API keys至少每季轮换
- 代码、日志或错误信息中没有secrets
- 启用secret存取审计日志
3. 網路安全
3. 网络安全
VPC 與防火牆配置
VPC与防火墙配置
terraform
undefinedterraform
undefined✅ 正確:限制的安全群組
✅ 正确:限制的安全群组
resource "aws_security_group" "app" {
name = "app-sg"
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["10.0.0.0/16"] # 僅內部 VPC
}
egress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # 僅 HTTPS 出站
}
}
resource "aws_security_group" "app" {
name = "app-sg"
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["10.0.0.0/16"] # 仅内部VPC
}
egress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # 仅HTTPS出站
}
}
❌ 錯誤:對網際網路開放
❌ 错误:对互联网开放
resource "aws_security_group" "bad" {
ingress {
from_port = 0
to_port = 65535
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # 所有 port,所有 IP!
}
}
undefinedresource "aws_security_group" "bad" {
ingress {
from_port = 0
to_port = 65535
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # 所有port,所有IP!
}
}
undefined驗證步驟
验证步骤
- 資料庫非公開存取
- SSH/RDP port 限制為 VPN/bastion
- 安全群組遵循最小權限
- 配置 Network ACLs
- 啟用 VPC flow logs
- 数据库非公开存取
- SSH/RDP port限制为VPN/bastion
- 安全群组遵循最小权限
- 配置Network ACLs
- 启用VPC flow logs
4. 日誌與監控
4. 日志与监控
CloudWatch/Logging 配置
CloudWatch/Logging配置
typescript
// ✅ 正確:完整的日誌
const logSecurityEvent = async (event: SecurityEvent) => {
await cloudwatch.putLogEvents({
logGroupName: '/aws/security/events',
logStreamName: 'authentication',
logEvents: [{
timestamp: Date.now(),
message: JSON.stringify({
type: event.type,
userId: event.userId,
ip: event.ip,
result: event.result,
// 永不記錄敏感資料
})
}]
});
};typescript
// ✅ 正确:完整的日志
const logSecurityEvent = async (event: SecurityEvent) => {
await cloudwatch.putLogEvents({
logGroupName: '/aws/security/events',
logStreamName: 'authentication',
logEvents: [{
timestamp: Date.now(),
message: JSON.stringify({
type: event.type,
userId: event.userId,
ip: event.ip,
result: event.result,
// 永不记录敏感资料
})
}]
});
};驗證步驟
验证步骤
- 所有服務啟用 CloudWatch/logging
- 記錄失敗的驗證嘗試
- 審計管理員動作
- 配置日誌保留期(合規要求 90+ 天)
- 配置可疑活動警報
- 日誌集中且防篡改
- 所有服务启用CloudWatch/logging
- 记录失败的验证尝试
- 审计管理员动作
- 配置日志保留期(合规要求90+天)
- 配置可疑活动警报
- 日志集中且防篡改
5. CI/CD Pipeline 安全
5. CI/CD Pipeline安全
安全的 Pipeline 配置
安全的Pipeline配置
yaml
undefinedyaml
undefined✅ 正確:安全的 GitHub Actions workflow
✅ 正确:安全的GitHub Actions workflow
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: read # 最小權限
steps:
- uses: actions/checkout@v4
# 掃描 secrets
- name: Secret scanning
uses: trufflesecurity/trufflehog@main
# 依賴審計
- name: Audit dependencies
run: npm audit --audit-level=high
# 使用 OIDC,非長期 token
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789:role/GitHubActionsRole
aws-region: us-east-1undefinedname: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: read # 最小权限
steps:
- uses: actions/checkout@v4
# 扫描secrets
- name: Secret scanning
uses: trufflesecurity/trufflehog@main
# 依赖审计
- name: Audit dependencies
run: npm audit --audit-level=high
# 使用OIDC,非长期token
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789:role/GitHubActionsRole
aws-region: us-east-1undefined驗證步驟
验证步骤
- 使用 OIDC 取代長期憑證
- Pipeline 中進行 secrets 掃描
- 依賴漏洞掃描
- Container image 掃描(如適用)
- 強制分支保護規則
- 合併前需要程式碼審查
- 強制簽署提交
- 使用OIDC取代长期凭证
- Pipeline中进行secrets扫描
- 依赖漏洞扫描
- Container image扫描(如适用)
- 强制分支保护规则
- 合并前需要代码审查
- 强制签署提交
6. Cloudflare & CDN 安全
6. Cloudflare & CDN安全
Cloudflare 安全配置
Cloudflare安全配置
typescript
// ✅ 正確:帶安全標頭的 Cloudflare Workers
export default {
async fetch(request: Request): Promise<Response> {
const response = await fetch(request);
const headers = new Headers(response.headers);
headers.set('X-Frame-Options', 'DENY');
headers.set('X-Content-Type-Options', 'nosniff');
headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');
headers.set('Permissions-Policy', 'geolocation=(), microphone=()');
return new Response(response.body, {
status: response.status,
headers
});
}
};typescript
// ✅ 正确:带安全标头的Cloudflare Workers
export default {
async fetch(request: Request): Promise<Response> {
const response = await fetch(request);
const headers = new Headers(response.headers);
headers.set('X-Frame-Options', 'DENY');
headers.set('X-Content-Type-Options', 'nosniff');
headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');
headers.set('Permissions-Policy', 'geolocation=(), microphone=()');
return new Response(response.body, {
status: response.status,
headers
});
}
};驗證步驟
验证步骤
- WAF 啟用 OWASP 規則
- 配置速率限制
- 啟動 Bot 防護
- 啟用 DDoS 防護
- 配置安全標頭
- 啟用 SSL/TLS strict 模式
- WAF启用OWASP规则
- 配置速率限制
- 启动Bot防护
- 启用DDoS防护
- 配置安全标头
- 启用SSL/TLS strict模式
7. 備份與災難復原
7. 备份与灾难恢复
自動備份
自动备份
terraform
undefinedterraform
undefined✅ 正確:自動 RDS 備份
✅ 正确:自动RDS备份
resource "aws_db_instance" "main" {
allocated_storage = 20
engine = "postgres"
backup_retention_period = 30 # 30 天保留
backup_window = "03:00-04:00"
maintenance_window = "mon:04:00-mon:05:00"
enabled_cloudwatch_logs_exports = ["postgresql"]
deletion_protection = true # 防止意外刪除
}
undefinedresource "aws_db_instance" "main" {
allocated_storage = 20
engine = "postgres"
backup_retention_period = 30 # 30天保留
backup_window = "03:00-04:00"
maintenance_window = "mon:04:00-mon:05:00"
enabled_cloudwatch_logs_exports = ["postgresql"]
deletion_protection = true # 防止意外删除
}
undefined驗證步驟
验证步骤
- 配置自動每日備份
- 備份保留符合合規要求
- 啟用時間點復原
- 每季進行備份測試
- 災難復原計畫已文件化
- RPO 和 RTO 已定義並測試
- 配置自动每日备份
- 备份保留符合合规要求
- 启用时间点恢复
- 每季进行备份测试
- 灾难恢复计划已文件化
- RPO和RTO已定义并测试
部署前雲端安全檢查清單
部署前云端安全检查清单
任何生產雲端部署前:
- IAM:不使用 root 帳號、啟用 MFA、最小權限 policy
- Secrets:所有 secrets 在雲端 secrets manager 並輪替
- 網路:安全群組受限、無公開資料庫
- 日誌:CloudWatch/logging 啟用並設定保留
- 監控:配置異常警報
- CI/CD:OIDC 認證、secrets 掃描、依賴審計
- CDN/WAF:Cloudflare WAF 啟用 OWASP 規則
- 加密:靜態和傳輸中資料已加密
- 備份:自動備份並測試過復原
- 合規:符合 GDPR/HIPAA 要求(如適用)
- 文件:基礎設施已文件化、runbooks 已建立
- 事件回應:安全事件計畫已就位
任何生产云端部署前:
- IAM:不使用root账号、启用MFA、最小权限policy
- Secrets:所有secrets在云端secrets manager并轮换
- 网络:安全群组受限、无公开数据库
- 日志:CloudWatch/logging启用并设定保留
- 监控:配置异常警报
- CI/CD:OIDC认证、secrets扫描、依赖审计
- CDN/WAF:Cloudflare WAF启用OWASP规则
- 加密:静态和传输中资料已加密
- 备份:自动备份并测试过恢复
- 合规:符合GDPR/HIPAA要求(如适用)
- 文件:基础设施已文件化、runbooks已建立
- 事件回应:安全事件计划已就位
常見雲端安全配置錯誤
常见云端安全配置错误
S3 Bucket 曝露
S3 Bucket暴露
bash
undefinedbash
undefined❌ 錯誤:公開 bucket
❌ 错误:公开bucket
aws s3api put-bucket-acl --bucket my-bucket --acl public-read
aws s3api put-bucket-acl --bucket my-bucket --acl public-read
✅ 正確:私有 bucket 並指定存取
✅ 正确:私有bucket并指定存取
aws s3api put-bucket-acl --bucket my-bucket --acl private
aws s3api put-bucket-policy --bucket my-bucket --policy file://policy.json
undefinedaws s3api put-bucket-acl --bucket my-bucket --acl private
aws s3api put-bucket-policy --bucket my-bucket --policy file://policy.json
undefinedRDS 公開存取
RDS公开存取
terraform
undefinedterraform
undefined❌ 錯誤
❌ 错误
resource "aws_db_instance" "bad" {
publicly_accessible = true # 永遠不要這樣做!
}
resource "aws_db_instance" "bad" {
publicly_accessible = true # 永远不要这样做!
}
✅ 正確
✅ 正确
resource "aws_db_instance" "good" {
publicly_accessible = false
vpc_security_group_ids = [aws_security_group.db.id]
}
---resource "aws_db_instance" "good" {
publicly_accessible = false
vpc_security_group_ids = [aws_security_group.db.id]
}
---參考資源
参考资源
- AWS Security Best Practices
- CIS AWS Foundations Benchmark
- Cloudflare Security Documentation
- OWASP Cloud Security
- Terraform Security Best Practices
記住:雲端配置錯誤是資料外洩的主要原因。單一曝露的 S3 bucket 或過度寬鬆的 IAM policy 可能危及整個基礎設施。永遠遵循最小權限原則與縱深防禦。
- AWS Security Best Practices
- CIS AWS Foundations Benchmark
- Cloudflare Security Documentation
- OWASP Cloud Security
- Terraform Security Best Practices
记住:云端配置错误是资料外泄的主要原因。单一暴露的S3 bucket或过度宽松的IAM policy可能危及整个基础设施。永远遵循最小权限原则与纵深防御。