config-scan について
アプリケーション設定とIaCのセキュリティを確認するスキルです。環境ファイル、Docker、Kubernetes、Terraformなどをスキャンし、プロファイルや除外ルールも利用できます。
主な機能
- 01環境ファイルの秘密情報と危険な初期値を検査
- 02Dockerのセキュリティ設定を確認
- 03Kubernetesマニフェストをレビュー
- 04TerraformとIaCの設定ミスを検出
- 05スキャンプロファイルと除外ルールを適用
活用シーン
- 01デプロイ前の設定ファイルの確認
- 02DockerイメージとCompose設定の点検
- 03Kubernetesワークロードのリスク特定
- 04CI/CDへの設定チェックの追加
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ jwynia/ agent-skills --skill config-scanインストール後、Claude Code で/config-scanを入力して読み込まれたか確認します。
詳細
Config Scan
設定ファイルと Infrastructure as Code のセキュリティレビュー。
クイックスタート
/config-scan # Scan all config files
/config-scan --docker # Docker files only
/config-scan --k8s # Kubernetes manifests
/config-scan --terraform # Terraform files
/config-scan --env # Environment files
このスキルで検出できる項目
環境ファイル
.envファイル内のシークレット- 安全でないデフォルト値
- 必須のセキュリティ変数の不足
Docker セキュリティ
- root として実行
- 機密性の高いポートの公開
- 安全でないベースイメージ
- セキュリティオプションの不足
Kubernetes セキュリティ
- 特権コンテナ
- リソース制限の不足
- 安全でないサービスアカウント
- ネットワークポリシーの不備
Infrastructure as Code
- 過度に許可範囲の広い IAM ポリシー
- パブリック S3 バケット
- 暗号化されていないストレージ
- セキュリティグループの不足
アプリケーション設定
- デバッグモードが有効
- 詳細すぎるエラーメッセージ
- 安全でないデフォルト設定
スキャンのカテゴリ
環境ファイル
スキャン対象ファイル:.env、.env.*、*.env
| 問題 | 深刻度 | 説明 |
|---|---|---|
| .env 内のシークレット | HIGH | 認証情報にはシークレットマネージャーを使用してください |
| .env がコミット済み | CRITICAL | .gitignore に追加してください |
| DEBUG=true | HIGH | 本番環境の設定でデバッグモードが有効 |
| 弱いシークレット | MEDIUM | 短い値または単純な値 |
検出パターン:
# Committed .env files
git ls-files | grep -E '\.env$|\.env\.'
# Secrets in env files
(PASSWORD|SECRET|KEY|TOKEN|CREDENTIAL)=.+
# Debug flags
DEBUG=(true|1|yes)
NODE_ENV=development
Docker セキュリティ
スキャン対象ファイル:Dockerfile、docker-compose.yml
| 問題 | 深刻度 | 説明 |
|---|---|---|
| USER root | HIGH | コンテナが root として実行されます |
| COPY secrets | CRITICAL | シークレットがイメージにコピーされます |
| latest タグ | MEDIUM | ベースイメージのバージョンが固定されていません |
| 公開ポート | LOW | 広範なポート公開 |
| ヘルスチェックなし | LOW | ヘルス監視がありません |
検出パターン:
# Running as root (no USER directive)
FROM.*\n(?!.*USER)
# Copying secrets
COPY.*\.(pem|key|crt|env)
COPY.*secret
COPY.*password
# Unpinned images
FROM\s+\w+:latest
FROM\s+\w+\s*$
# Dangerous capabilities
--privileged
--cap-add
docker-compose.yml の問題:
# Privileged mode
privileged: true
# All capabilities
cap_add:
- ALL
# Host network
network_mode: host
# Sensitive mounts
volumes:
- /:/host
- /var/run/docker.sock
Kubernetes セキュリティ
スキャン対象ファイル:*.yaml、*.yml(k8s マニフェスト)
| 問題 | 深刻度 | 説明 |
|---|---|---|
| privileged: true | CRITICAL | ホストへの完全なアクセス |
| runAsRoot | HIGH | コンテナが root として実行されます |
| リソース制限なし | MEDIUM | DoS のリスク |
| hostNetwork | HIGH | Pod がホストネットワークを使用 |
| securityContext なし | MEDIUM | セキュリティ設定がありません |
検出パターン:
# Privileged containers
securityContext:
privileged: true
# Running as root
securityContext:
runAsUser: 0
runAsNonRoot: false
# Host access
hostNetwork: true
hostPID: true
hostIPC: true
# Dangerous volume mounts
volumes:
- hostPath:
path: /
# Missing limits
# (absence of resources.limits)
# Wildcard RBAC
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
Terraform/IaC
スキャン対象ファイル:*.tf、*.tfvars
| 問題 | 深刻度 | 説明 |
|---|---|---|
| パブリック S3 バケット | CRITICAL | データが露出します |
| IAM ポリシー内の * | HIGH | 過度に許可範囲が広い |
| 暗号化なし | HIGH | 保存データが暗号化されていません |
| 0.0.0.0/0 ingress | HIGH | インターネットに公開されています |
| ハードコードされたシークレット | CRITICAL | TF に認証情報があります |
検出パターン:
# Public S3
acl = "public-read"
acl = "public-read-write"
# Overly permissive IAM
"Action": "*"
"Resource": "*"
"Principal": "*"
# Open security groups
cidr_blocks = ["0.0.0.0/0"]
ingress {
from_port = 0
to_port = 65535
# Missing encryption
encrypted = false
# (or absence of encryption settings)
# Hardcoded secrets
password = "..."
secret_key = "..."
アプリケーション設定
スキャン対象ファイル:config/*.json、*.config.js、application.yml
| 問題 | 深刻度 | 説明 |
|---|---|---|
| DEBUG=true | HIGH | 本番環境でデバッグが有効 |
| 詳細なエラー | MEDIUM | スタックトレースが露出します |
| CORS * | HIGH | すべてのオリジンが許可されています |
| HTTPS なし | MEDIUM | 通信が暗号化されていません |
検出パターン:
// Debug mode
debug: true,
DEBUG: true,
NODE_ENV: 'development'
// Verbose errors
showStackTrace: true
detailedErrors: true
// CORS
origin: '*'
origin: true
Access-Control-Allow-Origin: *
// Session security
secure: false // cookies
httpOnly: false
sameSite: 'none'
出力形式
CONFIG SCAN RESULTS
===================
Files scanned: 23
Issues found: 15
CRITICAL (2)
------------
[!] Dockerfile:1 - Running as root
No USER directive found
Fix: Add "USER node" or similar non-root user
[!] terraform/s3.tf:12 - Public S3 bucket
acl = "public-read"
Fix: Remove public ACL, use bucket policies
HIGH (5)
--------
[H] docker-compose.yml:15 - Privileged container
privileged: true
Fix: Remove privileged flag, use specific capabilities
[H] k8s/deployment.yaml:34 - Missing resource limits
No CPU/memory limits defined
Fix: Add resources.limits section
...
MEDIUM (8)
----------
...
設定
無視ルール
.config-scan-ignore を作成します:
# Ignore specific files
files:
- "docker-compose.dev.yml"
- "terraform/modules/test/**"
# Ignore specific rules
rules:
- id: "docker-root-user"
files: ["Dockerfile.dev"]
reason: "Development only"
- id: "k8s-no-limits"
reason: "Handled by LimitRange"
スキャンプロファイル
# .config-scan.yaml
profile: production # or: development, strict
# Custom thresholds
thresholds:
fail_on: high
warn_on: medium
# Specific scanners
scanners:
docker: true
kubernetes: true
terraform: true
env_files: true
app_config: true
チェック対象のベストプラクティス
Docker
- 非 root ユーザーを指定
- ベースイメージをダイジェストで固定
- ビルドにシークレットを含めない
- マルチステージビルドを使用
- ヘルスチェックを定義
- root ファイルシステムを読み取り専用に設定
Kubernetes
- 非 root のセキュリティコンテキスト
- リソース制限を定義
- ネットワークポリシーを適用
- 特権コンテナを使用しない
- サービスアカウントの権限を適切に設定
- シークレットを保存時に暗号化
Terraform
- 状態ファイルを暗号化
- シークレットをハードコードしない
- IAM の最小権限
- 暗号化を有効化
- ロギングを有効化
- デフォルトでパブリックアクセスを許可しない
修正例
Docker:非 root として実行
# Before
FROM node:18
# After
FROM node:18
RUN groupadd -r app && useradd -r -g app app
USER app
Kubernetes:セキュリティコンテキスト
# Before
containers:
- name: app
image: myapp
# After
containers:
- name: app
image: myapp
securityContext:
runAsNonRoot: true
runAsUser: 1000
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
Terraform:プライベート S3
# Before
resource "aws_s3_bucket" "data" {
acl = "public-read"
}
# After
resource "aws_s3_bucket" "data" {
# No ACL (private by default)
}
resource "aws_s3_bucket_public_access_block" "data" {
bucket = aws_s3_bucket.data.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
CI/CD との統合
# GitHub Actions
- name: Config Security Scan
run: |
/config-scan --fail-on high
- name: Docker Scan
run: |
/config-scan --docker --fail-on critical
関連スキル
/security-scan- セキュリティの包括的な分析/secrets-scan- 認証情報の検出/dependency-scan- パッケージの脆弱性
コメント
Markdown 対応