performing-cloud-asset-inventory-with-cartography について
CartographyでAWS、GCP、Azureのクラウド資産を収集し、Neo4jのグラフに関係性とともに整理する方法をセキュリティチーム向けに説明します。資産棚卸し、監査、攻撃経路の分析に利用できます。
主な機能
- 01クラウド資産と関係性の集約
- 02Neo4jグラフデータベースへの保存
- 03IAM、ネットワーク、アカウント間の関係の可視化
- 04Cypherによるセキュリティクエリ
- 05定期的な資産同期
活用シーン
- 01AWS、GCP、Azure資産の棚卸し
- 02公開状態のS3バケットの検出
- 03過剰な権限を持つIAMロールの特定
- 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 と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.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、AzureSubscriptionEC2Instance、S3Bucket、RDSInstance、AWSLambdaAWSUser、AWSRole、AWSGroup、AWSPolicyEC2SecurityGroup、EC2Subnet、AWSVpcGCPInstance、GCSBucket、GCPRole
主なリレーションシップタイプ
RESOURCE:アカウントがリソースを所有しますPOLICY:プリンシパルにポリシーがアタッチされていますSTS_ASSUME_ROLE_ALLOWS:プリンシパルがロールを引き受けられますMEMBER_OF_EC2_SECURITY_GROUP:インスタンスが SG に所属しますTRUSTS_AWS_PRINCIPAL:アカウント間の信頼関係
参考資料
- Cartography の GitHub:https://github.com/cartography-cncf/cartography
- Cartography のドキュメント:https://cartography.dev
- CNCF サンドボックスプロジェクト
- Neo4j Cypher クエリ言語のリファレンス
コメント
Markdown 対応