dependency-track-skill について
dependency-track-skillは、SBOMベースのソフトウェア構成分析プラットフォームDependency-Trackの導入と運用を案内するスキルです。デプロイ、設定、CI/CDの手順を扱い、ソフトウェアサプライチェーンのリスク管理に役立ちます。
主な機能
- 01Docker Compose、Helm、ArgoCDのデプロイ手順
- 02CycloneDX SBOMとVEXの管理
- 03脆弱性・コンプライアンスポリシー設定
- 04OIDC、LDAP、チームマッピング
- 05CI/CDのアップロードとスキャン例
活用シーン
- 01KubernetesへのDependency-Track導入
- 02OIDCのチームアクセスマッピング設定
- 03CI/CDへのSBOMアップロード工程の追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ julianobarbosa/ claude-code-skills --skill dependency-track-skillインストール後、Claude Code で/dependency-track-skillを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/azure-ad-validation.mdtroubleshooting.mdreferences/api/python-client.pyreferences/api/bash-scripts/manage-projects.shsecurity-gate.shupload-sbom.shreferences/cicd/azure-pipeline.yamlgithub-action.yamlgitlab-ci.yamljenkinsfilereferences/deployment/docker-compose-production.yamlhelm-values-hyades.yamlhelm-values.yamlreferences/policies/license-policies.jsonoperational-policies.jsonsecurity-policies.json詳細
Dependency-Track スキル
Dependency-Track を実装、デプロイ、運用するための包括的なガイドです。SBOM 管理を通じてソフトウェアサプライチェーンのリスクを特定し、低減するインテリジェントなソフトウェア構成分析(SCA)プラットフォームです。
現在のバージョン:
- Helm Chart:
0.40.0 - アプリケーションバージョン:
4.13.6 - Helm リポジトリ:
https://dependencytrack.github.io/helm-charts
概要
Dependency-Track は API ファーストのプラットフォームで、次の機能を備えています。
- CycloneDX SBOM と VEX ドキュメントを取り込み、生成します
- ポートフォリオ全体で既知の脆弱性についてコンポーネントを監視します
- NVD、GitHub Advisories、OSS Index、Snyk、Trivy、OSV、VulnDB と連携します
- セキュリティ、ライセンス、運用コンプライアンスのポリシー適用機能を提供します
- OAuth 2.0、OIDC、LDAP、Active Directory 認証に対応します
- 優先順位付けに EPSS(Exploit Prediction Scoring System)をサポートします
- API と外部サービスのコンポーネントを特定します
クイックリファレンス
| リソース | パス |
|---|---|
| デプロイテンプレート | references/deployment/ |
| CI/CD 連携 | references/cicd/ |
| API の例 | references/api/ |
| ポリシーテンプレート | references/policies/ |
| トラブルシューティング | references/troubleshooting.md |
1. デプロイオプション
Docker Compose(本番環境に推奨)
# Download official docker-compose
curl -LO https://dependencytrack.org/docker-compose.yml
# Start services
docker compose up -d
# Access UI at http://localhost:8080
# Default credentials: admin / admin
最小要件:
- API サーバー:4.5GB RAM、2 CPU コア
- フロントエンド:512MB RAM、1 CPU コア
推奨要件:
- API サーバー:16GB RAM、4 CPU コア
- フロントエンド:1GB RAM、2 CPU コア
Helm を使用した Kubernetes
# Add Helm repository
helm repo add dependency-track https://dependencytrack.github.io/helm-charts
helm repo update
# View available charts
helm search repo dependency-track
# Install with custom values
helm install dtrack dependency-track/dependency-track \
--namespace dtrack \
--create-namespace \
-f values-production.yaml
# Upgrade existing installation
helm upgrade dtrack dependency-track/dependency-track \
--namespace dtrack \
-f values-production.yaml
利用可能なチャート:
| チャート | 説明 | ステータス |
|---|---|---|
dependency-track/dependency-track | モノリシックデプロイ(v4.x) | 本番環境で利用可能 |
dependency-track/hyades | マイクロサービスデプロイ(v5.x) | インキュベーション中(GA 前) |
マニフェストと Helm の値の全容については、references/deployment/ を参照してください。
ArgoCD GitOps デプロイ(AKS)
複数のソースを使用する ApplicationSet で ArgoCD を利用する、エンタープライズ向け Kubernetes デプロイの場合:
ディレクトリ構成:
infra-team/
applicationset/
dependency-track.yaml # ArgoCD ApplicationSet definition
argo-cd-helm-values/
kube-addons/
dependency-track/
azure-ad-setup.sh # Azure AD App Registration script
cafehyna-dev/
values.yaml # Environment-specific Helm values
secretproviderclass.yaml # Azure Key Vault CSI integration
ApplicationSet の例(複数ソース):
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: dependency-track
namespace: argocd
spec:
generators:
- list:
elements:
- cluster: cafehyna-dev
url: https://aks-cluster-url:443
project: kube-addons
branch: main
environment: development
urlSuffix: ".dev"
template:
metadata:
name: "{{cluster}}-dependency-track"
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: "{{project}}"
sources:
# Source 1: Helm chart from official repository
- chart: dependency-track
repoURL: https://dependencytrack.github.io/helm-charts
targetRevision: "0.40.0"
helm:
releaseName: dependency-track
valueFiles:
- $values/argo-cd-helm-values/kube-addons/dependency-track/{{cluster}}/values.yaml
# Source 2: Values repository reference
- repoURL: https://your-git-repo.git
targetRevision: "{{branch}}"
ref: values
# Source 3: Additional manifests (SecretProviderClass)
- repoURL: https://your-git-repo.git
targetRevision: "{{branch}}"
path: argo-cd-helm-values/kube-addons/dependency-track/{{cluster}}
directory:
exclude: values.yaml
destination:
server: "{{url}}"
namespace: dependency-track
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- ServerSideApply=true
- CreateNamespace=true
Azure Key Vault CSI Driver(SecretProviderClass):
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: dependency-track-secrets-kv
namespace: dependency-track
spec:
provider: azure
parameters:
usePodIdentity: "false"
useVMManagedIdentity: "true"
userAssignedIdentityID: "<managed-identity-client-id>"
keyvaultName: "<key-vault-name>"
tenantId: "<tenant-id>"
objects: |
array:
- |
objectName: "dtrack-oidc-client-id"
objectType: "secret"
objectAlias: "oidc-client-id"
- |
objectName: "dtrack-oidc-client-secret"
objectType: "secret"
objectAlias: "oidc-client-secret"
secretObjects:
- secretName: dependency-track-secrets
type: Opaque
data:
- objectName: oidc-client-id
key: oidc-client-id
- objectName: oidc-client-secret
key: oidc-client-secret
AKS Spot Instance の許容設定(コスト最適化):
apiServer:
tolerations:
- key: kubernetes.azure.com/scalesetpriority
operator: Equal
value: spot
effect: NoSchedule
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: kubernetes.azure.com/scalesetpriority
operator: In
values:
- spot
ArgoCD の主な ignoreDifferences 設定:
ignoreDifferences:
# StatefulSet VolumeClaimTemplates (ServerSideApply drift)
- group: apps
kind: StatefulSet
jqPathExpressions:
- .spec.volumeClaimTemplates[]?.apiVersion
- .spec.volumeClaimTemplates[]?.kind
- .spec.volumeClaimTemplates[]?.status
# PVC dynamic fields
- group: ""
kind: PersistentVolumeClaim
jsonPointers:
- /status
- /spec/volumeName
# Azure Key Vault synced secrets
- group: ""
kind: Secret
name: dependency-track-secrets
jsonPointers:
- /data
ApplicationSet と値の例の全容については、references/deployment/argocd/ を参照してください。
Hyades(次世代アーキテクチャ)
Hyades は Dependency-Track v5 のインキュベーション中のプロジェクトで、モノリシックな API サーバーを、個別にスケーリング可能なマイクロサービスに分割します。
コンポーネント:
hyades-apiserver- コア API サーバーhyades-frontend- Web UIhyades-notification-publisher- 通知処理hyades-repository-meta-analyzer- リポジトリのメタデータ分析hyades-vulnerability-analyzer- 脆弱性スキャン
要件:
- 外部 PostgreSQL データベース
- Apache Kafka クラスター
- Kubernetes 1.19+
# Install Hyades (NOT PRODUCTION READY)
helm install hyades dependency-track/hyades \
--namespace dtrack \
--create-namespace \
--set common.database.jdbcUrl="jdbc:postgresql://postgres:5432/dtrack" \
--set common.database.username="dtrack" \
--set common.database.password="secret" \
--set common.kafka.bootstrapServers="kafka:9092"
警告: Hyades は一般提供されていません。予告なく破壊的変更が行われる可能性があります。テスト環境でのみ使用してください。GA ロードマップ:https://github.com/DependencyTrack/hyades/issues/860
2. 初期設定
初回セットアップ
-
初期化を待ちます(10~30 分以上):
- デフォルトユーザー、チーム、権限を作成します
- NVD、GitHub Advisories をミラーリングします(中断しないでください)
- 進捗状況を確認します:
docker logs -f dependency-track-apiserver
-
初回ログイン後、すぐにデフォルトのパスワードを変更します
-
Administration > Analyzers でアナライザーを有効化します:
- Internal Analyzer(組み込み)
- OSS Index(ossindex.sonatype.org の API トークンが必要)
- Snyk(任意。トークンが必要)
- Trivy(任意)
データベース設定(本番環境)
# docker-compose override for PostgreSQL
services:
apiserver:
environment:
ALPINE_DATABASE_MODE: external
ALPINE_DATABASE_URL: jdbc:postgresql://postgres:5432/dtrack
ALPINE_DATABASE_DRIVER: org.postgresql.Driver
ALPINE_DATABASE_USERNAME: dtrack
ALPINE_DATABASE_PASSWORD: ${DB_PASSWORD}
LDAP/Active Directory
# Active Directory configuration
ALPINE_LDAP_ENABLED=true
ALPINE_LDAP_SERVER_URL=ldap://ldap.example.com:3268
ALPINE_LDAP_BASEDN=dc=example,dc=com
ALPINE_LDAP_SECURITY_AUTH=simple
ALPINE_LDAP_AUTH_USERNAME_FORMAT=%[email protected]
ALPINE_LDAP_ATTRIBUTE_NAME=userPrincipalName
ALPINE_LDAP_ATTRIBUTE_MAIL=mail
ALPINE_LDAP_GROUPS_FILTER=(&(objectClass=group)(objectCategory=Group))
ALPINE_LDAP_USER_GROUPS_FILTER=(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={USER_DN}))
OpenID Connect(Azure AD、Okta、Keycloak)
ALPINE_OIDC_ENABLED=true
ALPINE_OIDC_ISSUER=https://login.microsoftonline.com/{tenant}/v2.0
ALPINE_OIDC_CLIENT_ID=your-client-id
ALPINE_OIDC_USERNAME_CLAIM=preferred_username
ALPINE_OIDC_TEAMS_CLAIM=groups
ALPINE_OIDC_USER_PROVISIONING=true
ALPINE_OIDC_TEAM_SYNCHRONIZATION=true
Azure AD OIDC グループ連携(詳細ガイド)
Dependency-Track における OIDC グループの仕組み
-
グループクレームのフロー:
- ユーザーが Azure AD を通じて認証します
- Azure AD は
groupsクレーム(グループのオブジェクト ID の配列)を含む ID トークンを返します - Dependency-Track は
groupsクレームを読み取ります(ALPINE_OIDC_TEAMS_CLAIMで設定) - OpenID Connect グループマッピングを通じて、グループがチームに紐付けられます
-
重要な動作:
- Administration > OpenID Connect Groups にグループが表示されるのは、そのグループに所属するユーザーが認証した後のみです
- グループマッピングの前にチームが存在している必要があります(
ALPINE_OIDC_TEAM_SYNCHRONIZATION=trueの場合は自動作成されます) - 表示名ではなく、グループのオブジェクト ID(UUID)が使用されます
方法 1:API による設定(推奨)
REST API を使用して、チーム、OIDC グループ、マッピングを作成します。
# Set environment variables
export DTRACK_URL="https://dtrack.example.com"
export DTRACK_API_KEY="your-api-key"
# Azure AD Group Object ID
AZURE_GROUP_ID="31d6daa5-5cc2-4e5f-9bf5-75ee8e09198c"
# 1. Create a Team (if doesn't exist)
curl -X PUT "${DTRACK_URL}/api/v1/team" \
-H "X-Api-Key: ${DTRACK_API_KEY}" \
-H "Content-Type: application/json" \
-d '{"name": "Administrators"}'
# 2. Get the Team UUID
TEAM_UUID=$(curl -s -H "X-Api-Key: ${DTRACK_API_KEY}" \
"${DTRACK_URL}/api/v1/team" | jq -r '.[] | select(.name=="Administrators") | .uuid')
# 3. Create OIDC Group (required before mapping)
# NOTE: Use Azure AD Group Object ID as both uuid and name
curl -X PUT "${DTRACK_URL}/api/v1/oidc/group" \
-H "X-Api-Key: ${DTRACK_API_KEY}" \
-H "Content-Type: application/json" \
-d "{\"uuid\": \"${AZURE_GROUP_ID}\", \"name\": \"${AZURE_GROUP_ID}\"}"
# 4. Get the created OIDC Group UUID
OIDC_GROUP_UUID=$(curl -s -H "X-Api-Key: ${DTRACK_API_KEY}" \
"${DTRACK_URL}/api/v1/oidc/group" | jq -r ".[] | select(.name==\"${AZURE_GROUP_ID}\") | .uuid")
# 5. Create OIDC Group-to-Team mapping
# IMPORTANT: Use UUID strings directly, NOT objects
curl -X PUT "${DTRACK_URL}/api/v1/oidc/mapping" \
-H "X-Api-Key: ${DTRACK_API_KEY}" \
-H "Content-Type: application/json" \
-d "{\"team\": \"${TEAM_UUID}\", \"group\": \"${OIDC_GROUP_UUID}\"}"
# 6. Assign permissions to Team
curl -X POST "${DTRACK_URL}/api/v1/permission/BOM_UPLOAD/team/${TEAM_UUID}" \
-H "X-Api-Key: ${DTRACK_API_KEY}"
重要:
/api/v1/oidc/mappingエンドポイントが想定しているのは、オブジェクトではなく UUID 文字列です。{"team": {"uuid": "..."}, "group": {"uuid": "..."}}を使用すると、HTTP 400 が返されます。
OIDC グループマッピングの確認
次のコマンドを使用して、OIDC グループがチームに正しくマッピングされていることを確認します。
# Set environment variables
export DTRACK_URL="https://dtrack.example.com"
export DTRACK_API_KEY="your-api-key"
# List all teams with their OIDC group mappings
/usr/bin/curl -s "${DTRACK_URL}/api/v1/team" \
-H "X-Api-Key: ${DTRACK_API_KEY}" | \
/usr/bin/jq '[.[] | select(.mappedOidcGroups | length > 0) | {
team: .name,
oidcGroups: [.mappedOidcGroups[] | .group.name]
}]'
# List all OIDC groups registered in D-Track
/usr/bin/curl -s "${DTRACK_URL}/api/v1/oidc/group" \
-H "X-Api-Key: ${DTRACK_API_KEY}" | \
/usr/bin/jq '.[] | {uuid: .uuid, name: .name}'
# Check specific team's OIDC mappings
TEAM_NAME="Administrators"
/usr/bin/curl -s "${DTRACK_URL}/api/v1/team" \
-H "X-Api-Key: ${DTRACK_API_KEY}" | \
/usr/bin/jq --arg team "$TEAM_NAME" '.[] | select(.name==$team) | {
name: .name,
uuid: .uuid,
oidcGroups: [.mappedOidcGroups[]? | {name: .group.name, uuid: .group.uuid}]
}'
出力例(cafehyna-dev クラスター):
[
{"team": "Administrators", "oidcGroups": ["31d6daa5-5cc2-4e5f-9bf5-75ee8e09198c"]},
{"team": "Auditors", "oidcGroups": ["39d0ddb2-8a0d-47c9-bc55-1993aadf7fe8"]},
{"team": "Developers", "oidcGroups": ["7144c503-7934-40fe-99e2-f45f67cb383e"]},
{"team": "Moderators", "oidcGroups": ["d34a2ea3-34c9-4744-a031-4e4a55d72746"]},
{"team": "ReadOnly", "oidcGroups": ["7109c419-028e-4b7b-8246-66517d512c3c"]}
]
注: 自動化環境でシェルのエイリアスによる問題を避けるには、フルパス(
/usr/bin/curl、/usr/bin/jq)を使用してください。
方法 2:UI による手動設定
-
チームを作成する:
- Administration > Access Management > Teams に移動します
- チームを作成します:Administrators、Moderators、Auditors、Developers
- 各チームに権限を割り当てます
-
グループをマッピングする:
- Administration > Access Management > OpenID Connect Groups に移動します
- 「Create Group」をクリックします
- Azure AD グループのオブジェクト ID(例:
31d6daa5-5cc2-4e5f-9bf5-75ee8e09198c)を入力します - マッピング先のチームを選択します
- 保存します
Azure AD グループのオブジェクト ID の取得
# List all Azure AD groups with DependencyTrack in name
az ad group list --filter "startswith(displayName, 'G-Usuarios-DependencyTrack')" \
--query "[].{name:displayName, id:id}" -o table
# Get specific group Object ID
az ad group show --group "G-Usuarios-DependencyTrack-Admin" --query id -o tsv
ID トークンのグループクレームの検証
-
JWT トークンをデコードする(jwt.io を使用):
- Dependency-Track にログインします
/api/v1/oidc/callbackへのネットワークリクエストを取得しますid_tokenをデコードし、groupsクレームに想定される UUID が含まれていることを確認します
-
Azure AD トークン設定のチェックリスト:
- アプリ登録で
groupMembershipClaims: SecurityGroupが設定されている - オプションのクレームで ID トークンに
groupsが含まれている - API のアクセス許可:
GroupMember.Read.All(委任) - 管理者の同意が付与されている
- アプリ登録で
環境変数のリファレンス
| 変数 | 説明 | 例 |
|---|---|---|
ALPINE_OIDC_ENABLED | OIDC を有効化 | true |
ALPINE_OIDC_ISSUER | Azure AD 発行者 URL | https://login.microsoftonline.com/{tenant}/v2.0 |
ALPINE_OIDC_CLIENT_ID | アプリ登録のクライアント ID | Key Vault から取得 |
ALPINE_OIDC_CLIENT_SECRET | アプリ登録のシークレット | Key Vault から取得 |
ALPINE_OIDC_USERNAME_CLAIM | ユーザー名のクレーム | preferred_username |
ALPINE_OIDC_TEAMS_CLAIM | グループのクレーム | groups |
ALPINE_OIDC_USER_PROVISIONING | ユーザーを自動作成 | true |
ALPINE_OIDC_TEAM_SYNCHRONIZATION | チームメンバーシップを自動同期 | true |
3. CI/CD 連携
ワークフロー:BOM アップロードパイプライン
┌─────────────┐ ┌─────────────┐ ┌──────────────────┐
│ Build │────▶│ Generate │────▶│ Upload to │
│ Project │ │ CycloneDX │ │ Dependency-Track │
└─────────────┘ │ SBOM │ └──────────────────┘
└─────────────┘ │
▼
┌─────────────┐ ┌──────────────────┐
│ Break │◀────│ Evaluate │
│ Build? │ │ Policies │
└─────────────┘ └──────────────────┘
Jenkins パイプライン
pipeline {
agent any
environment {
DTRACK_URL = 'https://dtrack.example.com'
DTRACK_API_KEY = credentials('dependency-track-api-key')
}
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
stage('Generate SBOM') {
steps {
sh 'mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom'
}
}
stage('Upload SBOM') {
steps {
dependencyTrackPublisher(
artifact: 'target/bom.xml',
projectId: env.PROJECT_UUID,
synchronous: true,
failedTotalCritical: 0,
failedTotalHigh: 5
)
}
}
}
}
GitHub Actions
name: SBOM Security Scan
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
sbom-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Generate SBOM
uses: CycloneDX/gh-node-module-generatebom@v1
with:
output: ./bom.json
- name: Upload to Dependency-Track
uses: DependencyTrack/gh-upload-sbom@v3
with:
serverHostname: ${{ secrets.DTRACK_URL }}
apiKey: ${{ secrets.DTRACK_API_KEY }}
projectName: ${{ github.repository }}
projectVersion: ${{ github.ref_name }}
bomFilename: ./bom.json
autoCreate: true
公式 GitHub Action のオプション(DependencyTrack/gh-upload-sbom@v3):
| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
serverHostname | はい | - | Dependency-Track サーバーの URL |
apiKey | はい | - | BOM_UPLOAD 権限を持つ API キー |
projectName | はい | - | プロジェクト名 |
projectVersion | はい | - | プロジェクトのバージョン |
bomFilename | はい | - | CycloneDX SBOM ファイルのパス |
autoCreate | いいえ | false | プロジェクトが存在しない場合に自動作成 |
parentName | いいえ | - | 親プロジェクト名 |
parentVersion | いいえ | - | 親プロジェクトのバージョン |
projectUuid | いいえ | - | 名前/バージョンの代わりに UUID を使用 |
GitLab CI
stages:
- build
- security
generate-sbom:
stage: build
image: cyclonedx/cyclonedx-cli
script:
- cyclonedx-py -r requirements.txt -o bom.json
artifacts:
paths:
- bom.json
upload-sbom:
stage: security
image: curlimages/curl
script:
- |
curl -X PUT "${DTRACK_URL}/api/v1/bom" \
-H "X-Api-Key: ${DTRACK_API_KEY}" \
-H "Content-Type: application/json" \
-d @- << EOF
{
"projectName": "${CI_PROJECT_NAME}",
"projectVersion": "${CI_COMMIT_REF_NAME}",
"autoCreate": true,
"bom": "$(base64 -w0 bom.json)"
}
EOF
Azure DevOps パイプライン
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
variables:
- group: dependency-track-credentials
steps:
- task: Maven@4
inputs:
mavenPomFile: 'pom.xml'
goals: 'package org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom'
- task: Bash@3
displayName: 'Upload SBOM to Dependency-Track'
inputs:
targetType: 'inline'
script: |
BOM_CONTENT=$(base64 -w0 target/bom.xml)
curl -X PUT "$(DTRACK_URL)/api/v1/bom" \
-H "X-Api-Key: $(DTRACK_API_KEY)" \
-H "Content-Type: application/json" \
-d "{\"projectName\":\"$(Build.Repository.Name)\",\"projectVersion\":\"$(Build.SourceBranchName)\",\"autoCreate\":true,\"bom\":\"${BOM_CONTENT}\"}"
4. REST API の使用
認証
Administration > Access Management > Teams > [Team] > API Keys で API キーを生成します。
# All API calls require the X-Api-Key header
curl -H "X-Api-Key: YOUR_API_KEY" \
https://dtrack.example.com/api/v1/project
OpenAPI 仕様
アクセス先:
- JSON:
http://localhost:8081/api/openapi.json - YAML:
http://localhost:8081/api/openapi.yaml
注記: ポート 8080(フロントエンド)ではなく、ポート 8081(API サーバー)を使用してください。
一般的な API 操作
# List all projects
curl -s -H "X-Api-Key: ${API_KEY}" \
"${DTRACK_URL}/api/v1/project" | jq
# Get project by name and version
curl -s -H "X-Api-Key: ${API_KEY}" \
"${DTRACK_URL}/api/v1/project/lookup?name=myapp&version=1.0.0" | jq
# Upload SBOM (Base64 encoded)
curl -X PUT "${DTRACK_URL}/api/v1/bom" \
-H "X-Api-Key: ${API_KEY}" \
-H "Content-Type: application/json" \
-d "{
\"projectName\": \"my-application\",
\"projectVersion\": \"1.0.0\",
\"autoCreate\": true,
\"bom\": \"$(base64 -w0 bom.json)\"
}"
# Upload SBOM (multipart - no encoding needed)
curl -X POST "${DTRACK_URL}/api/v1/bom" \
-H "X-Api-Key: ${API_KEY}" \
-F "projectName=my-application" \
-F "projectVersion=1.0.0" \
-F "autoCreate=true" \
-F "[email protected]"
# Get vulnerabilities for a project
curl -s -H "X-Api-Key: ${API_KEY}" \
"${DTRACK_URL}/api/v1/vulnerability/project/${PROJECT_UUID}" | jq
# Get policy violations
curl -s -H "X-Api-Key: ${API_KEY}" \
"${DTRACK_URL}/api/v1/violation/project/${PROJECT_UUID}" | jq
# Get component dependencies
curl -s -H "X-Api-Key: ${API_KEY}" \
"${DTRACK_URL}/api/v1/component/project/${PROJECT_UUID}" | jq
# Create project
curl -X PUT "${DTRACK_URL}/api/v1/project" \
-H "X-Api-Key: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "new-project",
"version": "1.0.0",
"description": "Project description",
"tags": [{"name": "production"}]
}'
5. ポリシー設定
ポリシーの種類
| 種類 | 目的 | 条件の例 |
|---|---|---|
| License | 許可または禁止するライセンスを制御します | Apache-2.0 は許可、GPL-3.0 は禁止 |
| Security | 脆弱性の深刻度のしきい値を設定します | Critical は不可、High は最大 5 件 |
| Operational | コンポーネントの許可リスト/拒否リストを設定します | log4j < 2.17.0 をブロック |
API によるポリシーの作成
# Create a security policy
curl -X PUT "${DTRACK_URL}/api/v1/policy" \
-H "X-Api-Key: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "No Critical Vulnerabilities",
"operator": "ANY",
"violationState": "FAIL",
"policyConditions": [
{
"subject": "SEVERITY",
"operator": "IS",
"value": "CRITICAL"
}
]
}'
# Create a license policy (denylist approach)
curl -X PUT "${DTRACK_URL}/api/v1/policy" \
-H "X-Api-Key: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "No Copyleft Licenses",
"operator": "ANY",
"violationState": "WARN",
"policyConditions": [
{
"subject": "LICENSE_GROUP",
"operator": "IS",
"value": "Copyleft"
}
]
}'
# Create operational policy (block specific component)
curl -X PUT "${DTRACK_URL}/api/v1/policy" \
-H "X-Api-Key: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "Block Vulnerable Log4j",
"operator": "ALL",
"violationState": "FAIL",
"policyConditions": [
{
"subject": "COORDINATES",
"operator": "MATCHES",
"value": "{\"group\":\"org.apache.logging.log4j\",\"name\":\"log4j-core\",\"version\":\"<2.17.0\"}"
}
]
}'
ポリシー条件の対象
AGE- コンポーネントの経過期間COORDINATES- グループ/名前/バージョンCPE- Common Platform EnumerationCWE- Common Weakness EnumerationEPSS- Exploit Prediction Scoring SystemLICENSE- 特定のライセンスLICENSE_GROUP- ライセンスの分類PACKAGE_URL- Package URL(PURL)SEVERITY- 脆弱性の深刻度SWID_TAGID- ソフトウェア ID タグVERSION- コンポーネントのバージョンCOMPONENT_HASH- MD5、SHA、Blake ハッシュ
6. 通知と連携
Webhook の設定
{
"notification": {
"level": "INFORMATIONAL",
"scope": "PORTFOLIO",
"group": "NEW_VULNERABILITY",
"timestamp": "2024-01-15T10:30:00Z",
"subject": {
"component": {
"name": "log4j-core",
"version": "2.14.1"
},
"vulnerability": {
"vulnId": "CVE-2021-44228",
"severity": "CRITICAL"
},
"affectedProjects": [...]
}
}
}
通知グループ
NEW_VULNERABILITY- 新しい脆弱性を特定NEW_VULNERABLE_DEPENDENCY- 新しい脆弱なコンポーネントを追加ANALYSIS_DECISION_CHANGE- 監査の判定を変更POLICY_VIOLATION- ポリシー違反を検出BOM_CONSUMED- SBOM を処理BOM_PROCESSED- SBOM の分析が完了VEX_CONSUMED- VEX ドキュメントを処理
連携先
- Slack/Teams:Webhook に直接対応
- Email:SMTP の設定
- Jira:ネイティブ連携
- DefectDojo:脆弱性の集約
- Fortify SSC:AppSec プラットフォーム
- ThreadFix:脆弱性管理
- Kenna Security:リスクの優先順位付け
7. SBOM 生成ツール
言語/エコシステム別
| 言語 | ツール | コマンド |
|---|---|---|
| Java/Maven | cyclonedx-maven-plugin | mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom |
| Java/Gradle | cyclonedx-gradle-plugin | gradle cyclonedxBom |
| Node.js | @cyclonedx/cyclonedx-npm | npx @cyclonedx/cyclonedx-npm --output-file bom.json |
| Python | cyclonedx-py | cyclonedx-py -r requirements.txt -o bom.json |
| Go | cyclonedx-gomod | cyclonedx-gomod mod -json -output bom.json |
| .NET | CycloneDX | dotnet CycloneDX <project> -o bom.json |
| Rust | cargo-cyclonedx | cargo cyclonedx -f json |
| Container | Syft | syft <image> -o cyclonedx-json > bom.json |
汎用ツール
# Syft - multi-ecosystem SBOM generator
syft packages dir:. -o cyclonedx-json > bom.json
# Trivy - with vulnerability scanning
trivy fs --format cyclonedx --output bom.json .
# cdxgen - comprehensive generator
cdxgen -o bom.json
8. ベストプラクティス
デプロイ
- 本番環境では外部 PostgreSQL を使用する(組み込み H2 ではなく)
- 十分な RAM を割り当てる(API サーバーには最低 4.5GB)
/dataディレクトリに永続ストレージを設定する- 適切な証明書を使用して TLS を有効にする
- データベースと設定の定期バックアップを設定する
運用
- CI/CD で SBOM を生成する - ビルド時に自動化します
- OSS Index Analyzer を有効にする - PURL ベースのスキャンに必要です
- NVD をローカルにミラーリングする - パフォーマンスが向上します
- パイプラインでは同期アップロードを使用する - すぐにフィードバックを得られます
- ポリシーゲートを実装する - 違反時にビルドを失敗させます
セキュリティ
- API キーを定期的にローテーションする
- 最小限の権限を持つチームスコープのキーを使用する
- コンプライアンスのために監査ログを有効にする
- エンタープライズ認証用に OIDC/LDAP を設定する
- ベンダーに SBOM の提供を契約上義務付ける
パフォーマンス
- 負荷の高い処理は営業時間外にスケジュールする
- 大きな API レスポンスにはページネーションを使用する
- 頻繁にアクセスするデータにキャッシュを実装する
- アナライザーキューの深さを監視する
- 複数の API サーバーレプリカで水平スケールする
9. トラブルシューティング
よくある問題
| 問題 | 原因 | 解決策 |
|---|---|---|
| 脆弱性が見つからない | OSS Index が有効になっていない | Admin > Analyzers で有効にし、API トークンを取得します |
| アナライザーが実行されない | 6 時間ごとのスケジュール | SBOM を再アップロードするか、スケジュールされた実行を待ちます |
| コンテナーがクラッシュする | RAM 不足 | API サーバーに最低 4.5GB を割り当てます |
| 413 Request Entity Too Large | Nginx のボディサイズ制限 | nginx.ingress.kubernetes.io/proxy-body-size: "100m" を追加します |
| PKIX path building error | 自己署名証明書 | 設定で内部 CA を構成します |
| LDAP 同期の遅延 | 非同期ジョブキュー | 待機するか、アカウントを手動で作成します |
| 1~2 週間後にサービスが停止する | OS による一時ファイルのクリーンアップ | -Djava.io.tmpdir=/path/to/tmpdir を設定します |
デバッグコマンド
# Check API server logs
docker logs -f dependency-track-apiserver
# Verify database connectivity
docker exec -it dependency-track-apiserver \
curl -s http://localhost:8080/api/version
# Check analyzer status
curl -s -H "X-Api-Key: ${API_KEY}" \
"${DTRACK_URL}/api/v1/configProperty?groupName=analyzer"
# Monitor mirror status
curl -s -H "X-Api-Key: ${API_KEY}" \
"${DTRACK_URL}/api/v1/mirror/nvd"
# Health check
curl -s "${DTRACK_URL}/api/version"
パフォーマンスのチューニング
# JVM settings for high-load environments
environment:
JAVA_OPTIONS: >-
-Xms8g
-Xmx16g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+ParallelRefProcEnabled
10. 参照ファイル
追加のテンプレートと例は references/ ディレクトリにあります。
デプロイメント:
references/deployment/docker-compose-production.yaml- 本番環境用の Docker Composereferences/deployment/helm-values.yaml- v4.x 用の Helm 値(Chart v0.40.0)references/deployment/helm-values-hyades.yaml- Hyades v5.x 用の Helm 値(Chart v0.10.0)references/deployment/kubernetes-manifests/- Kubernetes の生のマニフェスト
CI/CD 統合:
references/cicd/jenkinsfile- Jenkins Pipeline の例references/cicd/github-action.yaml- GitHub Actions のワークフローreferences/cicd/gitlab-ci.yaml- GitLab CI/CD パイプラインreferences/cicd/azure-pipeline.yaml- Azure DevOps Pipeline
API とスクリプト:
references/api/python-client.py- Python クライアントライブラリの例references/api/bash-scripts/- 一般的な操作用のシェルスクリプト
ポリシー:
references/policies/security-policies.json- セキュリティポリシーのテンプレートreferences/policies/license-policies.json- ライセンスポリシーのテンプレートreferences/policies/operational-policies.json- 運用ポリシーのテンプレート
トラブルシューティング:
references/troubleshooting.md- よくある問題と解決策
関連スキル
defectdojo-skill- 脆弱性管理との統合argocd-skill- Dependency-Track の GitOps デプロイメントquality-guardian- セキュリティテストとの統合