Implement GitOps workflows with ArgoCD and Flux for automated, declarative Kubernetes...
npx skills add ValorVie/custom-skills --skill "cloud-infrastructure-security"
Install specific skill from multi-skill repository
# Description
|
# SKILL.md
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/* # 特定 bucket
# ❌ 錯誤:過度寬鬆的權限
iam_role:
permissions:
- s3:* # 所有 S3 動作
resources:
- "*" # 所有資源
驗證步驟
- [ ] 生產環境不使用 root 帳號
- [ ] 所有特權帳號啟用 MFA
- [ ] 服務帳號使用角色,非長期憑證
- [ ] IAM policy 遵循最小權限
- [ ] 定期進行存取審查
- [ ] 未使用的憑證已輪替或移除
2. Secrets 管理
雲端 Secrets Manager
// ✅ 正確:使用雲端 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 存取審計日誌
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!
}
}
驗證步驟
- [ ] 資料庫非公開存取
- [ ] SSH/RDP port 限制為 VPN/bastion
- [ ] 安全群組遵循最小權限
- [ ] 配置 Network ACLs
- [ ] 啟用 VPC flow logs
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,
// 永不記錄敏感資料
})
}]
});
};
驗證步驟
- [ ] 所有服務啟用 CloudWatch/logging
- [ ] 記錄失敗的驗證嘗試
- [ ] 審計管理員動作
- [ ] 配置日誌保留期(合規要求 90+ 天)
- [ ] 配置可疑活動警報
- [ ] 日誌集中且防篡改
5. CI/CD Pipeline 安全
安全的 Pipeline 配置
# ✅ 正確:安全的 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
驗證步驟
- [ ] 使用 OIDC 取代長期憑證
- [ ] Pipeline 中進行 secrets 掃描
- [ ] 依賴漏洞掃描
- [ ] Container image 掃描(如適用)
- [ ] 強制分支保護規則
- [ ] 合併前需要程式碼審查
- [ ] 強制簽署提交
6. Cloudflare & CDN 安全
Cloudflare 安全配置
// ✅ 正確:帶安全標頭的 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 模式
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 # 防止意外刪除
}
驗證步驟
- [ ] 配置自動每日備份
- [ ] 備份保留符合合規要求
- [ ] 啟用時間點復原
- [ ] 每季進行備份測試
- [ ] 災難復原計畫已文件化
- [ ] RPO 和 RTO 已定義並測試
部署前雲端安全檢查清單
任何生產雲端部署前:
- [ ] IAM:不使用 root 帳號、啟用 MFA、最小權限 policy
- [ ] Secrets:所有 secrets 在雲端 secrets manager 並輪替
- [ ] 網路:安全群組受限、無公開資料庫
- [ ] 日誌:CloudWatch/logging 啟用並設定保留
- [ ] 監控:配置異常警報
- [ ] CI/CD:OIDC 認證、secrets 掃描、依賴審計
- [ ] CDN/WAF:Cloudflare WAF 啟用 OWASP 規則
- [ ] 加密:靜態和傳輸中資料已加密
- [ ] 備份:自動備份並測試過復原
- [ ] 合規:符合 GDPR/HIPAA 要求(如適用)
- [ ] 文件:基礎設施已文件化、runbooks 已建立
- [ ] 事件回應:安全事件計畫已就位
常見雲端安全配置錯誤
S3 Bucket 曝露
# ❌ 錯誤:公開 bucket
aws s3api put-bucket-acl --bucket my-bucket --acl public-read
# ✅ 正確:私有 bucket 並指定存取
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]
}
參考資源
- AWS Security Best Practices
- CIS AWS Foundations Benchmark
- Cloudflare Security Documentation
- OWASP Cloud Security
- Terraform Security Best Practices
記住:雲端配置錯誤是資料外洩的主要原因。單一曝露的 S3 bucket 或過度寬鬆的 IAM policy 可能危及整個基礎設施。永遠遵循最小權限原則與縱深防禦。
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.