cloud-infrastructure-security

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Cloud & 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
undefined
yaml
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: - "*" # 所有資源
undefined
iam_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
undefined
terraform
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! } }
undefined
resource "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
undefined
yaml
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-1
undefined
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-1
undefined

驗證步驟

验证步骤

  • 使用 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
undefined
terraform
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 # 防止意外刪除 }
undefined
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 # 防止意外删除 }
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
undefined
bash
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
undefined
aws s3api put-bucket-acl --bucket my-bucket --acl private aws s3api put-bucket-policy --bucket my-bucket --policy file://policy.json
undefined

RDS 公開存取

RDS公开存取

terraform
undefined
terraform
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] }

---

參考資源

参考资源

記住:雲端配置錯誤是資料外洩的主要原因。單一曝露的 S3 bucket 或過度寬鬆的 IAM policy 可能危及整個基礎設施。永遠遵循最小權限原則與縱深防禦。
记住:云端配置错误是资料外泄的主要原因。单一暴露的S3 bucket或过度宽松的IAM policy可能危及整个基础设施。永远遵循最小权限原则与纵深防御。