診断 (Pro)

診断は、DefectDojoが自身の外部と通信を試みたすべての試行、そして他のシステムがDefectDojoと通信を試みたすべての試行を記録する、単一の台帳です。チケットが作成されなかったとき、スキャンがインポートされなかったとき、あるいはユーザーがサインインできなかったとき、何が起きたのか、いつ起きたのか、どの設定に対してか、そして誰がそれを引き起こしたのかを教えてくれるのがこのページです。

Diagnosticsは DefectDojo Pro の機能です。Connect > Diagnostics の下にあります。

診断台帳、エラー表示

記録される内容

DefectDojoの外部に到達するすべてのサブシステムについて、試行ごとに1行が記録されます。

ソース生成される行の内容
コネクタアップストリームコネクタによるdiscoverおよびsyncの実行
ダウンストリームインテグレーターJira、GitHub、GitLab、ServiceNow、その他のダウンストリームコネクタへのプッシュ
JiraレガシーJira連携: プッシュ、コメント、プレビュー
SSO (OIDC/OAuth2)OAuthプロバイダー経由のサインイン試行
SAMLSAMLアサーション(署名や属性の失敗を含む)
LDAPLDAPバインドおよびルックアップ
インポート / 再インポートUI、API、スケジュールのいずれかによるスキャンのアップロード
ルールエンジンルール評価とそれが試みるアクション
スケジューリングスケジュール実行(一度も開始されなかったものを含む)
Senseiリポジトリスキャンおよび修正の実行
通知送信通知の配信
システムどの製品にも属さないインスタンスレベルの活動

行はサブシステムの代わりにではなく、サブシステムと並行して書き込まれます。各アダプターは元のレコードに紐付けられており、意図的にフェイルセーフに設計されています。診断行の書き込みで例外が発生しても、そのエラーは握りつぶされ、元の操作はそのまま続行されます。したがって、診断がプッシュ、インポート、ログインの失敗の原因になることは決してありません。

行はそれを生成したレコードをキーとしているため、元のレコードを再保存すると、重複を追加するのではなく既存の診断行が更新されます。1回の試行は、Queued から Running を経て結果に至るまで、その生涯を通じて1つの行のままです。

行のフィールド

フィールド意味
日時行が記録された日時。開始終了所要時間 は試行自体を表します
ソース上記の表にあるサブシステム
プロバイダーそのソース内の具体的なツールまたはプロバイダー(jiragithubokta、スキャナー名など)
操作試みられた内容(pushsyncloginreimportrule_run
ステータスQueuedRunningSuccessFailedTimed outSkipped、または Dry run
深刻度InfoWarningError、または Critical
概要ひと目で安全に読める一行の結果
トリガー試行を開始させたもの: UIAPIScheduledWebhookAutomaticCommand line、または System
実行者責任を持つユーザー、または無人実行の場合は System
アセット試行が属する製品。空欄はインスタンスレベルを意味します
関連オブジェクト試行の対象となった検出事項、エンゲージメント、その他のレコード
設定どの設定が使用されたか、そのラベルで示します
外部参照作成されたIssueキーなど、他システムが返した識別子
相関ID1つの論理操作に属する行をひも付けます
報告された詳細 および コンテキスト完全な技術的詳細(制限あり、誰が何を見られるか を参照)

4つのビュー

テーブル上部のタブは、あらかじめ用意された起点であり、自分で組み立て直す必要のあるフィルターではありません。

  • エラー — 失敗とタイムアウト。最初に開くべきタブです。
  • 成功 — 動作している連携が実際に機能している証拠。「何も同期されていない」という報告を受けたときに役立ちます。
  • 完了しなかった — 完了すべき時間をとうに過ぎても、まだ Queued または Running のままの試行。これらは静かな失敗です。何も失敗していないので何も報告されませんが、何も届いてもいません。
  • すべてのイベント — フィルターなしのすべて。

すべてのイベント、あらゆるソースを表示

現在表示中のビューはページURLの一部になっているため、ビューにリンクを張ることができ、リフレッシュしても保持されます。

一覧を絞り込む

  • 期間 — ヘッダーのボタンから、24時間、7日間、30日間、または90日間を選択できます。
  • ソース件数 — サマリーカード下の色付きの件数もクイックフィルターとして機能します。クリックするとそのソースのみを表示し、もう一度クリックする(または ソースフィルターを解除)と元に戻ります。一度にアクティブにできるのは1つまたはゼロです。
  • 列ごとのフィルターと並べ替え — 深刻度やソースを含め、すべての列でフィルターと並べ替えができます。深刻度は五十音順ではなく重大さ順(CriticalInfo)で並べ替えられ、ソースは内部で保持されている値ではなく画面に表示されているラベルで並べ替えられます。
  • キーワード検索 — テキストフィールドを横断して一度に検索します。
  • 列の表示設定 — 列の選択やその保存済みレイアウトは、他のPro一覧と同様に動作します。

クイックフィルターとして使われるソース件数

行の先頭にある虫眼鏡アイコンをクリックすると、試行の全体を開くことができます。

マスキング通知を含む単一のイベント

行が書き込まれる前に認証情報は除去されます

連携エラーは失敗したリクエストを引用しますが、その引用には Authorization ヘッダー、クエリ文字列内のトークン、接続URL内のパスワードなど、機密情報が含まれることがあります。診断は入力の時点でそれらを取り除くため、元の値がデータベースに到達することはなく、後から気が変わってもそれが露出することはありません。

除去される対象は2種類あります。

  • 認証情報らしいキーの下にある値passwordtokensecretapi_keyauthorizationprivate_key など、キー名が秘密情報らしく見えるものすべて(大文字小文字やハイフン・スペースの有無は問いません)。ごく一部のキーは、その内容ではなく存在すること自体が重要であるため対象外です。
  • どこに現れても認証情報らしく見える値 — bearerおよびbasic認証ヘッダー、JWT、URLに埋め込まれた認証情報(https://user:pass@host)、識別可能なベンダーのトークンプレフィックス、PEMブロック。

それぞれは [redacted] に置き換えられます。周囲のメッセージはそのまま残るため、エラーは読める状態を保ちます。

401 Unauthorized: Authorization: [redacted]
upload rejected: https://svc:[redacted]@sftp.example/out/…

長い値は切り詰められ、深くネストしたコンテキストはフラット化されるため、一つの巨大なペイロードによってテーブルが肥大化することはありません。

行から何かが除去された場合、そのフィールドが元々空だったのか除去されて空になったのか迷わせることなく、行自体がその旨を示します。

マスキングは設計上ベストエフォートです。 スクラバーは認証情報の形状を認識します。機密情報らしく見えないキーの下にある、普通の文章のように見える秘密情報は、記録されてしまう可能性があります。診断を、秘密情報が絶対に存在しないことが保証された場所としてではなく、運用ログとして扱ってください。そして技術的な詳細は、必要な人だけに閲覧を制限しておいてください。

誰が何を見られるか

診断は階層化されています。失敗の概要は製品オーナーにとって有用ですが、その背後にある生のリクエストはそうではないためです。

スーパーユーザーそれ以外のユーザー
自分が権限を持つ製品の行はいはい
インスタンスレベルの行(製品に紐付かない)はいいいえ
概要、ソース、ステータス、深刻度、日時、設定はいはい
報告された詳細コンテキストリモートIPはい非表示(非表示である旨が表示されます)

スーパーユーザー以外のユーザーには、データが欠落しているように見える空欄ではなく、詳細情報が存在していて非表示になっていることが示されます。SSO、SAML、LDAPなど、どの製品にも属さない活動を示すインスタンスレベルの行は、アクセスを許可し得る製品メンバーシップが存在しないため、スーパーユーザー専用です。

レコードの保持期間

スケジュールタスクが台帳を刈り込むため、無制限に増え続けることはありません。

深刻度保持期間
Info30日間
WarningErrorCritical180日間

両方の期間は DIAGNOSTIC_EVENT_INFO_RETENTION_DAYS および DIAGNOSTIC_EVENT_RETENTION_DAYS の設定で変更できます。削除はバッチ単位で実行されるため、大規模な削除でも長時間トランザクションを保持し続けることはありません。

API

この台帳はAPI経由では読み取り専用で、/api/v2/diagnostic_events/ で提供されます。

エンドポイント返される内容
GET /api/v2/diagnostic_events/以下のフィルターに対応した一覧
GET /api/v2/diagnostic_events/{id}/1件のイベント
GET /api/v2/diagnostic_events/summary/ヘッダーカードの元になる件数(ソースごとの集計を含む)
GET /api/v2/diagnostic_events/choices/sourcestatusseveritytrigger の有効な値

便利なパラメーター:

パラメーター効果
sourcestatusseveritytriggerカンマ区切りで複数の値を同時に指定できます
failures_only=true失敗とタイムアウト
unresolved_only=trueまだキューにあるか実行中の試行
product_name製品名でフィルタリング
object_model試行の対象となったレコードの種類でフィルタリング
o=並べ替え。- を付けると逆順になります(o=-created_at

同じアクセス規則が適用されます。スーパーユーザー以外は、制限されたフィールドが非表示になった、製品スコープの行のみを取得します。

何が問題だったのかを突き止める

  • チケットが一度も作成されなかった。 ソースをインテグレーター(またはJira)に絞り込み、ステータスを確認します。Failed であれば概要に理由が示されます。事後もずっと Queued のままであれば、ジョブが一度も実行されなかったことを意味し、認証情報の問題ではなくワーカーやスケジューリングの問題です。
  • ユーザーがサインインできない。 ソースをSSO、SAML、またはLDAPに絞り込み、そのユーザーの試行の失敗内容を確認します。不正なアサーション署名、拒否されたバインド、一致しない属性などです。これらの行はインスタンスレベルのため、スーパーユーザーのみが閲覧できます。
  • スキャンが表示されない。 ソースをインポート / 再インポートに絞り込みます。トリガーを見れば無人のスケジュールアップロードか誰かの手動アップロードかが分かり、実行者を見れば誰に確認すればよいかが分かります。
  • 何かが延々とリトライしている。 相関IDで並べ替える、または1つに絞り込むことで、同一の論理操作に属するすべての試行をまとめて確認できます。
  • 「何も動いていない」。 まず同じ期間の成功を開いてください。そこで健全な一覧が見えれば、漠然とした障害を具体的なものに絞り込めます。

関連項目