mcpField
P
performing-cloud-asset-inventory-with-cartography

performing-cloud-asset-inventory-with-cartography

github.com/mukul975セキュリティ35.2k61 回インストール8 週間前に更新
リポジトリ

performing-cloud-asset-inventory-with-cartography について

CartographyでAWS、GCP、Azureのクラウド資産を収集し、Neo4jのグラフに関係性とともに整理する方法をセキュリティチーム向けに説明します。資産棚卸し、監査、攻撃経路の分析に利用できます。

主な機能

  1. 01クラウド資産と関係性の集約
  2. 02Neo4jグラフデータベースへの保存
  3. 03IAM、ネットワーク、アカウント間の関係の可視化
  4. 04Cypherによるセキュリティクエリ
  5. 05定期的な資産同期

活用シーン

  1. 01AWS、GCP、Azure資産の棚卸し
  2. 02公開状態のS3バケットの検出
  3. 03過剰な権限を持つIAMロールの特定
  4. 04機密資産への攻撃経路の分析

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill performing-cloud-asset-inventory-with-cartography

インストール後、Claude Code で/performing-cloud-asset-inventory-with-cartographyを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.py

詳細

Cartography によるクラウドアセットインベントリの実施

概要

Cartography は、インフラストラクチャアセットとその関係を統合して Neo4j グラフデータベースにまとめる、CNCF サンドボックスプロジェクトです(Lyft で開発が始まりました)。クラウド API をクエリしてリソースを検出し、それらの関係をマッピングすることで、セキュリティチームが攻撃経路を特定し、アセットレポートを作成し、セキュリティ改善が必要な領域を見つけられるようにします。グラフモデルにより、IAM 権限の連鎖、ネットワーク経路、アカウント間の信頼関係など、隠れたつながりが明らかになります。

使用する場面

  • Cartography を使用してクラウドアセットインベントリを実施するセキュリティ評価を行う場合
  • 関連するセキュリティイベントに対するインシデント対応手順を実行する場合
  • 定期的なセキュリティテストや監査を実施する場合
  • 実地テストを通じてセキュリティ制御を検証する場合

前提条件

  • Python 3.8+
  • Neo4j 4.x または 5.x データベース
  • クラウドプロバイダーの認証情報(AWS、GCP、Azure)
  • Docker(任意。Neo4j のデプロイに使用)
  • Neo4j 用に最低 4GB の RAM。大規模な環境ではさらに必要です

インストール

# Install Cartography
pip install cartography

# Verify installation
cartography --help
Docker を使用した Neo4j のデプロイ
docker run -d \
  --name neo4j \
  -p 7474:7474 -p 7687:7687 \
  -e NEO4J_AUTH=neo4j/changethispassword \
  -e NEO4J_PLUGINS='["apoc"]' \
  -v neo4j_data:/data \
  neo4j:5-community

Cartography の実行

AWS の基本同期
# Sync AWS account data to Neo4j
cartography \
  --neo4j-uri bolt://localhost:7687 \
  --neo4j-user neo4j \
  --neo4j-password-env-var NEO4J_PASSWORD
特定の AWS モジュールの同期
cartography \
  --neo4j-uri bolt://localhost:7687 \
  --neo4j-user neo4j \
  --neo4j-password-env-var NEO4J_PASSWORD \
  --aws-sync-all-profiles
GCP の同期
cartography \
  --neo4j-uri bolt://localhost:7687 \
  --neo4j-user neo4j \
  --neo4j-password-env-var NEO4J_PASSWORD \
  --gcp-requested-syncs compute iam storage

セキュリティに焦点を当てた Cypher クエリ

パブリックアクセスが可能な S3 バケットをすべて検索
MATCH (b:S3Bucket)
WHERE b.anonymous_access = true
   OR b.anonymous_actions IS NOT NULL
RETURN b.name, b.anonymous_actions, b.region, b.arn
ORDER BY b.name
管理者ポリシーを持つ IAM ユーザーを特定
MATCH (user:AWSUser)-[:POLICY]->(policy:AWSPolicy)
WHERE policy.name = 'AdministratorAccess'
   OR policy.arn CONTAINS 'AdministratorAccess'
RETURN user.name, user.arn, policy.name, user.password_last_used
インターネットに公開されている EC2 インスタンスを検索
MATCH (instance:EC2Instance)-[:MEMBER_OF_EC2_SECURITY_GROUP]->(sg:EC2SecurityGroup)
      -[:MEMBER_OF_EC2_SECURITY_GROUP_RULE]->(rule:IpRule)
WHERE rule.fromport <= 22 AND rule.toport >= 22
  AND rule.protocol IN ['tcp', '-1']
  AND '0.0.0.0/0' IN rule.ipranges
RETURN instance.instanceid, instance.publicipaddress, sg.groupid, sg.name
アカウント間の信頼関係を検出
MATCH (role:AWSRole)-[:TRUSTS_AWS_PRINCIPAL]->(principal:AWSPrincipal)
WHERE principal.arn CONTAINS ':root'
  AND NOT principal.arn CONTAINS role.accountid
RETURN role.arn, role.name, principal.arn AS trusted_account
ORDER BY role.name
パブリックな EC2 から機密性の高い S3 への攻撃経路を検索
MATCH path = (instance:EC2Instance)-[:STS_ASSUME_ROLE_ALLOWS|MEMBER_OF_EC2_SECURITY_GROUP|
  POLICY|INSTANCE_PROFILE*1..5]->(bucket:S3Bucket)
WHERE instance.publicipaddress IS NOT NULL
  AND bucket.name CONTAINS 'sensitive'
RETURN path
LIMIT 25
使用されていない IAM ロールを特定
MATCH (role:AWSRole)
WHERE role.last_used IS NULL
   OR role.last_used < datetime().epochMillis - (90 * 24 * 60 * 60 * 1000)
RETURN role.name, role.arn, role.last_used
ORDER BY role.last_used
過剰な権限を持つロールが割り当てられた Lambda 関数を検索
MATCH (func:AWSLambda)-[:STS_ASSUME_ROLE_ALLOWS]->(role:AWSRole)-[:POLICY]->(policy:AWSPolicy)
WHERE policy.name = 'AdministratorAccess'
RETURN func.name, func.arn, role.name, policy.name
ネットワーク経路の分析
MATCH (vpc:AWSVpc)-[:RESOURCE]->(subnet:EC2Subnet)-[:MEMBER_OF_SUBNET]->(instance:EC2Instance)
WHERE instance.publicipaddress IS NOT NULL
RETURN vpc.id, subnet.subnetid, subnet.cidr_block, instance.instanceid,
       instance.publicipaddress, instance.state

定期同期のスケジュール設定

Cron ベースの同期
# Add to crontab - sync every 6 hours
0 */6 * * * /usr/local/bin/cartography \
  --neo4j-uri bolt://localhost:7687 \
  --neo4j-user neo4j \
  --neo4j-password-env-var NEO4J_PASSWORD \
  >> /var/log/cartography/sync.log 2>&1
Docker Compose によるデプロイ
version: '3.8'
services:
  neo4j:
    image: neo4j:5-community
    ports:
      - "7474:7474"
      - "7687:7687"
    environment:
      NEO4J_AUTH: neo4j/securepwd123
      NEO4J_PLUGINS: '["apoc"]'
      NEO4J_dbms_memory_heap_max__size: 4G
    volumes:
      - neo4j_data:/data

  cartography:
    image: ghcr.io/cartography-cncf/cartography:latest
    depends_on:
      - neo4j
    environment:
      NEO4J_PASSWORD: securepwd123
      AWS_DEFAULT_REGION: us-east-1
    command: >
      --neo4j-uri bolt://neo4j:7687
      --neo4j-user neo4j
      --neo4j-password-env-var NEO4J_PASSWORD

volumes:
  neo4j_data:

データモデルの概要

主なノードタイプ
  • AWSAccount、GCPProject、AzureSubscription
  • EC2Instance、S3Bucket、RDSInstance、AWSLambda
  • AWSUser、AWSRole、AWSGroup、AWSPolicy
  • EC2SecurityGroup、EC2Subnet、AWSVpc
  • GCPInstance、GCSBucket、GCPRole
主なリレーションシップタイプ
  • RESOURCE:アカウントがリソースを所有します
  • POLICY:プリンシパルにポリシーがアタッチされています
  • STS_ASSUME_ROLE_ALLOWS:プリンシパルがロールを引き受けられます
  • MEMBER_OF_EC2_SECURITY_GROUP:インスタンスが SG に所属します
  • TRUSTS_AWS_PRINCIPAL:アカウント間の信頼関係

参考資料

コメント