Files
scrivas/findings/discovery_dashboard.html
T
Alvaro Del Valle 3cce1fa61f Initial Scrivas AWS discovery deliverables
Read-only cloud discovery of the Scrivas AWS Organization (o-qfj0pvhhv7)
to inform a proposal.

- scripts/: boto3 org assessment, member-account assessment, fast discovery
- findings/: self-contained HTML dashboards, written report, summary JSON,
  and the rendered Prowler benchmark report
- docs/full_discovery_plan.md: phased full-discovery plan
- index.html: landing page linking all reports
- Pipfile/.python-version: reproducible pipenv env (Python 3.12.11)

Large raw scans (OCSF JSON, CSV, compliance/) are git-ignored.
2026-08-19 14:50:09 -04:00

304 lines
21 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<title>Scrivas — AWS Discovery Findings</title>
<style>
:root {
--bg:#eef0f3; --panel:#ffffff; --panel-2:#f7f8fa; --ink:#171d27;
--ink-soft:#4a5563; --ink-faint:#79828f; --line:#dde1e7; --line-soft:#e8ebef;
--accent:#0d6e78; --accent-ink:#0a565e;
--good:#2f8657; --warn:#b5832a; --crit:#bd463b;
--crit-bg:#fbeceb; --good-bg:#eaf4ee; --warn-bg:#f8f1e2;
--mono: ui-monospace,"SF Mono","SFMono-Regular",Menlo,Consolas,monospace;
--sans: ui-sans-serif,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
--shadow:0 1px 2px rgba(20,26,38,.04),0 6px 20px -12px rgba(20,26,38,.18);
}
@media (prefers-color-scheme:dark){:root{
--bg:#0d1117;--panel:#161c26;--panel-2:#1b222e;--ink:#e8ecf1;--ink-soft:#aab3c0;
--ink-faint:#7c8695;--line:#28303c;--line-soft:#212934;--accent:#3bb4bf;--accent-ink:#8fdfe6;
--good:#54b681;--warn:#d6a94a;--crit:#e26b60;--crit-bg:#2a1917;--good-bg:#132419;--warn-bg:#251d10;
--shadow:0 1px 2px rgba(0,0,0,.3),0 8px 24px -14px rgba(0,0,0,.6);}}
:root[data-theme="dark"]{
--bg:#0d1117;--panel:#161c26;--panel-2:#1b222e;--ink:#e8ecf1;--ink-soft:#aab3c0;
--ink-faint:#7c8695;--line:#28303c;--line-soft:#212934;--accent:#3bb4bf;--accent-ink:#8fdfe6;
--good:#54b681;--warn:#d6a94a;--crit:#e26b60;--crit-bg:#2a1917;--good-bg:#132419;--warn-bg:#251d10;
--shadow:0 1px 2px rgba(0,0,0,.3),0 8px 24px -14px rgba(0,0,0,.6);}
:root[data-theme="light"]{
--bg:#eef0f3;--panel:#ffffff;--panel-2:#f7f8fa;--ink:#171d27;--ink-soft:#4a5563;
--ink-faint:#79828f;--line:#dde1e7;--line-soft:#e8ebef;--accent:#0d6e78;--accent-ink:#0a565e;
--good:#2f8657;--warn:#b5832a;--crit:#bd463b;--crit-bg:#fbeceb;--good-bg:#eaf4ee;--warn-bg:#f8f1e2;
--shadow:0 1px 2px rgba(20,26,38,.04),0 6px 20px -12px rgba(20,26,38,.18);}
*{box-sizing:border-box;}
body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans);line-height:1.5;-webkit-font-smoothing:antialiased;}
.wrap{max-width:1120px;margin:0 auto;padding:32px 24px 64px;}
header{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:16px;padding-bottom:20px;border-bottom:2px solid var(--ink);}
.eyebrow{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--accent);font-weight:700;}
h1{font-size:clamp(24px,4vw,34px);margin:6px 0 4px;letter-spacing:-.02em;text-wrap:balance;font-weight:750;}
.sub{color:var(--ink-soft);font-size:14px;}
.idcard{font-family:var(--mono);font-size:12px;color:var(--ink-soft);text-align:right;line-height:1.7;}
.idcard b{color:var(--ink);}
.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin:22px 0 12px;}
@media (max-width:760px){.kpis{grid-template-columns:repeat(2,1fr);}}
.kpi{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:16px;box-shadow:var(--shadow);position:relative;overflow:hidden;}
.kpi::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--accent);}
.kpi.crit::before{background:var(--crit);}.kpi.warn::before{background:var(--warn);}.kpi.good::before{background:var(--good);}
.kpi .n{font-size:28px;font-weight:750;letter-spacing:-.02em;font-variant-numeric:tabular-nums;}
.kpi.crit .n{color:var(--crit);}.kpi.warn .n{color:var(--warn);}
.kpi .lbl{font-size:12px;color:var(--ink-faint);margin-top:2px;}
.kpi .meta{font-size:11px;color:var(--ink-soft);margin-top:8px;}
section{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:22px 24px;margin-bottom:18px;box-shadow:var(--shadow);}
.grid2{display:grid;grid-template-columns:1.15fr .85fr;gap:18px;}
@media (max-width:820px){.grid2{grid-template-columns:1fr;}}
.sec-head{display:flex;align-items:baseline;gap:10px;margin-bottom:16px;}
.sec-head .tag{font-family:var(--mono);font-size:12px;color:var(--accent);font-weight:700;}
.sec-head h2{font-size:17px;margin:0;letter-spacing:-.01em;}
.sec-head .note{margin-left:auto;font-size:12px;color:var(--ink-faint);}
/* cost bar chart */
.chart{display:flex;align-items:flex-end;gap:10px;height:170px;padding:8px 4px 0;border-bottom:1px solid var(--line);}
.bar{flex:1;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;gap:6px;height:100%;}
.bar .col{width:100%;max-width:46px;background:color-mix(in srgb,var(--accent) 30%,transparent);border-radius:5px 5px 0 0;transition:height .2s;}
.bar.last .col{background:var(--accent);}
.bar .v{font-family:var(--mono);font-size:10.5px;color:var(--ink-soft);font-variant-numeric:tabular-nums;}
.bar .m{font-size:10.5px;color:var(--ink-faint);}
.barscale{display:flex;justify-content:space-between;font-size:11px;color:var(--ink-faint);margin-top:6px;}
/* horizontal service breakdown */
.hb{display:flex;flex-direction:column;gap:9px;}
.hb .row{display:grid;grid-template-columns:130px 1fr auto;align-items:center;gap:10px;font-size:12.5px;}
.hb .svc{color:var(--ink-soft);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.hb .track{height:9px;background:var(--panel-2);border-radius:5px;overflow:hidden;}
.hb .fill{height:100%;background:var(--accent);border-radius:5px;}
.hb .amt{font-family:var(--mono);font-variant-numeric:tabular-nums;color:var(--ink);font-size:12px;}
.stat-row{display:flex;flex-wrap:wrap;gap:22px;}
.stat{display:flex;flex-direction:column;}
.stat .n{font-size:22px;font-weight:700;font-variant-numeric:tabular-nums;letter-spacing:-.01em;}
.stat .l{font-size:11.5px;color:var(--ink-faint);}
.pill{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:700;padding:3px 9px;border-radius:999px;}
.pill.crit{background:var(--crit-bg);color:var(--crit);}.pill.good{background:var(--good-bg);color:var(--good);}.pill.warn{background:var(--warn-bg);color:var(--warn);}
.dot{width:7px;height:7px;border-radius:50%;background:currentColor;}
.tbl-wrap{overflow-x:auto;}
table{width:100%;border-collapse:collapse;font-size:13px;min-width:540px;}
th{text-align:left;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint);font-weight:700;padding:0 12px 10px;border-bottom:1px solid var(--line);}
td{padding:12px;border-bottom:1px solid var(--line-soft);vertical-align:top;color:var(--ink-soft);}
td b{color:var(--ink);font-weight:600;}
td code{font-family:var(--mono);font-size:12px;}
tr:last-child td{border-bottom:none;}
.sev{white-space:nowrap;}
.acctgrid{display:grid;grid-template-columns:1fr 1fr;gap:14px;}
@media (max-width:720px){.acctgrid{grid-template-columns:1fr;}}
.acct{border:1px solid var(--line);border-radius:11px;padding:16px;background:var(--panel-2);}
.acct h3{margin:0 0 4px;font-size:14px;}
.acct .aid{font-family:var(--mono);font-size:11.5px;color:var(--ink-faint);}
.acct ul{margin:10px 0 0;padding-left:16px;font-size:12.5px;color:var(--ink-soft);line-height:1.7;}
footer{margin-top:24px;font-size:12px;color:var(--ink-faint);display:flex;flex-wrap:wrap;gap:6px 16px;}
footer code{font-family:var(--mono);color:var(--ink-soft);}
</style>
<div class="wrap">
<header>
<div>
<div class="eyebrow">Dasnuve · Cloud Discovery · Fast Track</div>
<h1>Scrivas — AWS Discovery Findings</h1>
<div class="sub">Resource footprint · security posture · cost — phases 25, read-only</div>
</div>
<div class="idcard">org&nbsp;<b>o-qfj0pvhhv7</b><br>2 accounts · us-east-2 primary<br>2026-08-19</div>
</header>
<div class="kpis">
<div class="kpi warn"><div class="n">$858<span style="font-size:14px">/mo</span></div><div class="lbl">Current run-rate (Jul)</div><div class="meta">up ~4× from $223 in January</div></div>
<div class="kpi crit"><div class="n">4</div><div class="lbl">GuardDuty high/critical findings</div><div class="meta">severity 89, both regions, open</div></div>
<div class="kpi crit"><div class="n">13</div><div class="lbl">Security groups open to 0.0.0.0/0</div><div class="meta">management account, us-east-2</div></div>
<div class="kpi warn"><div class="n">5</div><div class="lbl">Access keys &gt; 90 days old</div><div class="meta">incl. admin keys at 322 &amp; 319 days</div></div>
</div>
<!-- COST -->
<section>
<div class="sec-head"><span class="tag">05</span><h2>Cost baseline</h2><span class="note">Cost Explorer · unblended · payer account</span></div>
<div class="grid2">
<div>
<div class="chart" id="chart">
<div class="bar"><div class="col" style="height:26%"></div><div class="v">$223</div><div class="m">Jan</div></div>
<div class="bar"><div class="col" style="height:15%"></div><div class="v">$131</div><div class="m">Feb</div></div>
<div class="bar"><div class="col" style="height:61%"></div><div class="v">$522</div><div class="m">Mar</div></div>
<div class="bar"><div class="col" style="height:85%"></div><div class="v">$732</div><div class="m">Apr</div></div>
<div class="bar"><div class="col" style="height:87%"></div><div class="v">$746</div><div class="m">May</div></div>
<div class="bar"><div class="col" style="height:96%"></div><div class="v">$821</div><div class="m">Jun</div></div>
<div class="bar last"><div class="col" style="height:100%"></div><div class="v">$858</div><div class="m">Jul</div></div>
</div>
<div class="barscale"><span>Monthly spend, 2026</span><span>+284% Jan→Jul · 7-mo total ≈ $4,033</span></div>
</div>
<div>
<div style="font-size:12px;color:var(--ink-faint);margin-bottom:10px;">Top services · 6-month spend</div>
<div class="hb">
<div class="row"><span class="svc">EC2 Compute</span><span class="track"><span class="fill" style="width:100%"></span></span><span class="amt">$2,722</span></div>
<div class="row"><span class="svc">EC2 Other</span><span class="track"><span class="fill" style="width:14%"></span></span><span class="amt">$375</span></div>
<div class="row"><span class="svc">AWS WAF</span><span class="track"><span class="fill" style="width:13%"></span></span><span class="amt">$364</span></div>
<div class="row"><span class="svc">Security Hub</span><span class="track"><span class="fill" style="width:6%"></span></span><span class="amt">$153</span></div>
<div class="row"><span class="svc">VPC</span><span class="track"><span class="fill" style="width:4%"></span></span><span class="amt">$117</span></div>
<div class="row"><span class="svc">Config</span><span class="track"><span class="fill" style="width:3%"></span></span><span class="amt">$84</span></div>
<div class="row"><span class="svc">GuardDuty</span><span class="track"><span class="fill" style="width:2%"></span></span><span class="amt">$56</span></div>
<div class="row"><span class="svc">EKS</span><span class="track"><span class="fill" style="width:2%"></span></span><span class="amt">$47</span></div>
</div>
<p class="sub" style="margin:12px 0 0;font-size:12.5px;">EC2 compute is <b>67%</b> of spend — the primary optimization lever (rightsizing, Savings Plans, Graviton/spot). Security tooling (WAF, Security Hub, Config, GuardDuty) adds ~<b>$110/mo</b>.</p>
</div>
</div>
</section>
<!-- FOOTPRINT -->
<section>
<div class="sec-head"><span class="tag">03</span><h2>Resource footprint</h2><span class="note">active regions only · us-east-2 primary</span></div>
<div class="stat-row" style="margin-bottom:16px">
<div class="stat"><span class="n">7</span><span class="l">EC2 instances</span></div>
<div class="stat"><span class="n">9</span><span class="l">EBS volumes <span style="color:var(--warn)">(2 unattached)</span></span></div>
<div class="stat"><span class="n">7</span><span class="l">Elastic IPs</span></div>
<div class="stat"><span class="n">9</span><span class="l">S3 buckets</span></div>
<div class="stat"><span class="n">2</span><span class="l">Regions in use</span></div>
<div class="stat"><span class="n">15</span><span class="l">Idle regions</span></div>
</div>
<div class="acctgrid">
<div class="acct">
<h3>Scrivas Admin <span class="pill warn"><span class="dot"></span>management + workloads</span></h3>
<div class="aid">716468089330 · us-east-2</div>
<ul>
<li>7 EC2 · 9 EBS (2 unattached) · 7 EIPs · 9 S3 buckets</li>
<li>EKS IAM roles present (staging/gpu/infra/apps) — <b>no live clusters returned</b>; likely torn down, roles orphaned</li>
<li>RDS monitoring role present; VPC flow logs enabled</li>
<li><b>Anti-pattern:</b> production workloads run in the org management account</li>
</ul>
</div>
<div class="acct">
<h3>Lazka <span class="pill crit"><span class="dot"></span>bare &amp; unmonitored</span></h3>
<div class="aid">547868853286 · us-east-1</div>
<ul>
<li>0 EC2 · 0 S3 · 0 IAM users — effectively empty</li>
<li>Only default service-linked roles + OrganizationAccountAccessRole</li>
<li>Security Hub <b>not enabled</b>; no GuardDuty detector</li>
<li>Covered by the org CloudTrail, but otherwise dark</li>
</ul>
</div>
</div>
</section>
<!-- SECURITY + IAM -->
<section>
<div class="sec-head"><span class="tag">04</span><h2>Security posture &amp; IAM</h2><span class="note">prioritized risk register</span></div>
<div class="tbl-wrap">
<table>
<thead><tr><th>Severity</th><th>Finding</th><th>Evidence</th><th>Why it matters</th></tr></thead>
<tbody>
<tr>
<td class="sev"><span class="pill crit"><span class="dot"></span>High</span></td>
<td><b>Open GuardDuty high/critical findings</b></td>
<td><code>sev 89</code> in us-east-1 &amp; us-east-2</td>
<td>Active threat signals unremediated; no delegated security owner to triage</td>
</tr>
<tr>
<td class="sev"><span class="pill crit"><span class="dot"></span>High</span></td>
<td><b>13 security groups open to the internet</b></td>
<td><code>0.0.0.0/0</code> ingress, us-east-2</td>
<td>Direct attack surface on the workload account — needs port-level review</td>
</tr>
<tr>
<td class="sev"><span class="pill crit"><span class="dot"></span>High</span></td>
<td><b>Stale admin access keys</b></td>
<td><code>admin</code> keys 322 &amp; 319 days; +3 others &gt;90d</td>
<td>Long-lived static credentials for privileged users — top breach vector</td>
</tr>
<tr>
<td class="sev"><span class="pill warn"><span class="dot"></span>Medium</span></td>
<td><b>Console users without MFA</b></td>
<td>2 of 10 IAM users</td>
<td>Account-takeover risk; fails CIS AWS baseline</td>
</tr>
<tr>
<td class="sev"><span class="pill warn"><span class="dot"></span>Medium</span></td>
<td><b>Member account unmonitored</b></td>
<td>Lazka: no GuardDuty / Security Hub</td>
<td>Detection blind spot; org security services not delivered to members</td>
</tr>
<tr>
<td class="sev"><span class="pill good"><span class="dot"></span>Good</span></td>
<td><b>Org CloudTrail configured well</b></td>
<td>multi-region + org trail + log-file validation</td>
<td>Solid audit foundation to build on</td>
</tr>
<tr>
<td class="sev"><span class="pill good"><span class="dot"></span>Good</span></td>
<td><b>No public S3 buckets or public RDS</b></td>
<td>0 of 9 buckets public; 0 public DBs</td>
<td>Data-exposure basics are in order</td>
</tr>
</tbody>
</table>
</div>
</section>
<!-- PROWLER / COMPLIANCE -->
<section>
<div class="sec-head"><span class="tag">CIS</span><h2>Compliance benchmark</h2><span class="note">Prowler 5.39 · 632 checks · 1,230 findings · mgmt account</span></div>
<div class="grid2">
<div>
<div class="stat-row" style="margin-bottom:14px">
<div class="stat"><span class="n" style="color:var(--good)">70%</span><span class="l">Checks passing (861)</span></div>
<div class="stat"><span class="n" style="color:var(--crit)">2</span><span class="l">Critical failures</span></div>
<div class="stat"><span class="n" style="color:var(--crit)">111</span><span class="l">High failures</span></div>
<div class="stat"><span class="n" style="color:var(--warn)">189</span><span class="l">Medium failures</span></div>
</div>
<div style="font-size:12px;color:var(--ink-faint);margin:4px 0 8px;">Pass rate by framework</div>
<div class="hb">
<div class="row"><span class="svc">SOC 2</span><span class="track"><span class="fill" style="width:81%;background:var(--good)"></span></span><span class="amt">81%</span></div>
<div class="row"><span class="svc">ISO 27001:2022</span><span class="track"><span class="fill" style="width:77%;background:var(--good)"></span></span><span class="amt">77%</span></div>
<div class="row"><span class="svc">CIS 3.0</span><span class="track"><span class="fill" style="width:74%;background:var(--warn)"></span></span><span class="amt">74%</span></div>
<div class="row"><span class="svc">NIST CSF 2.0</span><span class="track"><span class="fill" style="width:71%;background:var(--warn)"></span></span><span class="amt">71%</span></div>
<div class="row"><span class="svc">PCI DSS 4.0</span><span class="track"><span class="fill" style="width:57%;background:var(--crit)"></span></span><span class="amt">57%</span></div>
</div>
<p class="sub" style="margin:12px 0 0;font-size:12.5px;">SOC 2 at <b>81%</b> aligns with their Secureframe program — a focused push closes the gap. PCI is lowest (not in scope unless they process cards).</p>
</div>
<div>
<div style="font-size:12px;color:var(--ink-faint);margin-bottom:10px;">Critical &amp; notable high failures</div>
<div class="trust">
<div class="trow" style="border-color:color-mix(in srgb,var(--crit) 40%,transparent)"><span class="pill crit"><span class="dot"></span>CRIT</span><span class="rn">Root account has no hardware MFA</span></div>
<div class="trow" style="border-color:color-mix(in srgb,var(--crit) 40%,transparent)"><span class="pill crit"><span class="dot"></span>CRIT</span><span class="rn">AWS-managed policy grants <code>*:*</code> admin</span></div>
<div class="trow"><span class="pill warn"><span class="dot"></span>HIGH</span><span class="rn">No delegated admin: Config / GuardDuty / Security Hub</span></div>
<div class="trow"><span class="pill warn"><span class="dot"></span>HIGH</span><span class="rn">IMDSv2 not enforced at account level</span></div>
<div class="trow"><span class="pill warn"><span class="dot"></span>HIGH</span><span class="rn">IAM users rely on long-lived credentials</span></div>
<div class="trow"><span class="pill warn"><span class="dot"></span>HIGH</span><span class="rn">Secrets Manager rotation disabled (19 secrets)</span></div>
<div class="trow"><span class="pill warn"><span class="dot"></span>HIGH</span><span class="rn">KMS key auto-rotation off · SCP region restriction absent</span></div>
</div>
<p class="sub" style="margin:12px 0 0;font-size:12px;">Full evidence: <code>findings/prowler/*.html</code> · <code>*.ocsf.json</code> · <code>compliance/</code></p>
</div>
</div>
</section>
<!-- ROADMAP -->
<section>
<div class="sec-head"><span class="tag"></span><h2>Proposal levers</h2><span class="note">where we create value</span></div>
<div class="tbl-wrap">
<table>
<thead><tr><th>Workstream</th><th>Driver from discovery</th><th>Outcome</th></tr></thead>
<tbody>
<tr><td><b>Landing zone &amp; account separation</b></td><td>Workloads in mgmt acct; flat org; empty Lazka</td><td>Move workloads to a dedicated account; OUs + SCP guardrails</td></tr>
<tr><td><b>Delegated security account</b></td><td>No delegated admin; unaddressed GD findings; Lazka dark</td><td>Central GuardDuty/Security Hub admin; org-wide monitoring</td></tr>
<tr><td><b>Cost optimization</b></td><td>EC2 = 67% of spend; 4× growth; unattached EBS</td><td>Rightsizing + Savings Plans + cleanup → recurring savings</td></tr>
<tr><td><b>Identity hardening</b></td><td>Stale admin keys; 2 users w/o MFA</td><td>Rotate/retire keys, enforce MFA, move to short-lived roles/SSO</td></tr>
<tr><td><b>Exposure reduction</b></td><td>13 internet-open SGs</td><td>Least-privilege ingress; WAF already in place to leverage</td></tr>
</tbody>
</table>
</div>
</section>
<footer>
<span>Read-only · boto3 via <code>dasnuve-scrivas-louis-impersonation</code></span>
<span>Reproduce: <code>scripts/fast_discovery.py</code></span>
<span>Raw: <code>findings/fast_discovery.json</code></span>
<span>Benchmark: <code>prowler aws</code> 632 checks · <code>findings/prowler/</code></span>
<span>Phases 25 + CIS benchmark · phase 6 on ice</span>
</footer>
</div>