| name | cloud-infrastructure-security |
| description | 雲端基礎設施安全檢查清單與最佳實踐。
Use when: 部署到雲端平台、配置 IAM、設定 CI/CD pipeline、實作 IaC、配置監控或管理 secrets。
Triggers: "cloud security", "IAM policy", "CI/CD security", "Terraform security", "Cloudflare WAF", "雲端安全", "基礎設施安全".
|
Cloud & Infrastructure Security Skill | 雲端基礎設施安全
確保雲端基礎設施、CI/CD pipeline 與部署配置遵循安全最佳實踐並符合業界標準。
適用情境
- 部署應用程式到雲端平台(AWS, Vercel, Railway, Cloudflare)
- 配置 IAM 角色與權限
- 設定 CI/CD pipeline
- 實作基礎設施即程式碼(Terraform, CloudFormation)
- 配置日誌與監控
- 管理雲端環境中的 secrets
- 設定 CDN 與邊緣安全
- 實作災難復原與備份策略
雲端安全檢查清單
1. IAM 與存取控制
最小權限原則
iam_role:
permissions:
- s3:GetObject
- s3:ListBucket
resources:
- arn:aws:s3:::my-bucket/*
iam_role:
permissions:
- s3:*
resources:
- "*"
驗證步驟
2. Secrets 管理
雲端 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;
驗證步驟
3. 網路安全
VPC 與防火牆配置
# ✅ 正確:限制的安全群組
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!
}
}
驗證步驟
4. 日誌與監控
CloudWatch/Logging 配置
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,
})
}]
});
};
驗證步驟
5. CI/CD Pipeline 安全
安全的 Pipeline 配置
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- name: Secret scanning
uses: trufflesecurity/trufflehog@main
- name: Audit dependencies
run: npm audit --audit-level=high
- 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
驗證步驟
6. Cloudflare & CDN 安全
Cloudflare 安全配置
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
});
}
};
驗證步驟
7. 備份與災難復原
自動備份
# ✅ 正確:自動 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 # 防止意外刪除
}
驗證步驟
部署前雲端安全檢查清單
任何生產雲端部署前:
常見雲端安全配置錯誤
S3 Bucket 曝露
aws s3api put-bucket-acl --bucket my-bucket --acl public-read
aws s3api put-bucket-acl --bucket my-bucket --acl private
aws s3api put-bucket-policy --bucket my-bucket --policy file://policy.json
RDS 公開存取
# ❌ 錯誤
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]
}
參考資源
記住:雲端配置錯誤是資料外洩的主要原因。單一曝露的 S3 bucket 或過度寬鬆的 IAM policy 可能危及整個基礎設施。永遠遵循最小權限原則與縱深防禦。