feat(web): add IwoooS host action gates
This commit is contained in:
@@ -1282,6 +1282,43 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostActionGates": {
|
||||
"title": "Host Action Gate Matrix",
|
||||
"subtitle": "Breaks host-related high-risk actions into read-only gates. This only explains what is locked and what human decision is required; it does not provide execution entry points.",
|
||||
"gateLabel": "Required gate",
|
||||
"items": {
|
||||
"activeScan": {
|
||||
"title": "Active scan",
|
||||
"body": "Active scans for Kali 112 and development hosts 168 / 111 are not approved and cannot be triggered from IwoooS.",
|
||||
"gate": "requires S1.6 scan scope approval plus a follow-up runtime gate"
|
||||
},
|
||||
"credentialedScan": {
|
||||
"title": "Credentialed scan",
|
||||
"body": "Any credentialed scan requires scope, credential handling, and redacted evidence rules before it can proceed.",
|
||||
"gate": "requires S1.6 scope approval; credentialed scan remains false"
|
||||
},
|
||||
"kaliExecute": {
|
||||
"title": "Kali /execute",
|
||||
"body": "The Kali execution endpoint remains a block candidate and is not opened just because hosts are visible.",
|
||||
"gate": "requires a human decision record and S3.4 follow-up runtime gate"
|
||||
},
|
||||
"sshChange": {
|
||||
"title": "SSH / host change",
|
||||
"body": "Logging into hosts, changing settings, tuning services, restarting services, or changing SSH settings is outside the frontend authority.",
|
||||
"gate": "requires explicit human approval, a change plan, and rollback evidence"
|
||||
},
|
||||
"kaliUpdate": {
|
||||
"title": "Kali host update",
|
||||
"body": "Kali updates and host tuning affect scan results and toolchain stability, so they must be approved separately from posture display.",
|
||||
"gate": "requires maintenance window, update list, validation metrics, and rollback plan"
|
||||
},
|
||||
"runtimeBlocking": {
|
||||
"title": "Runtime blocking control",
|
||||
"body": "Turning findings into product blocking or runtime enforcement still waits for owner evidence and a human decision.",
|
||||
"gate": "requires an accepted decision record; active runtime gates remain 0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nextGate": {
|
||||
"title": "Next High-level Gate",
|
||||
"body": "S4.9 Gitea owner attestation response is the recommended next owner evidence. Headline progress should only increase after owner responses, redacted payload ingestion, active runtime gates, or GitHub primary readiness actually change."
|
||||
|
||||
@@ -1283,6 +1283,43 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostActionGates": {
|
||||
"title": "主機動作 Gate 矩陣",
|
||||
"subtitle": "把主機相關高風險動作拆成只讀 gate。這裡只說明哪些動作仍被鎖住,以及需要哪一類人工決策;不提供任何執行入口。",
|
||||
"gateLabel": "需要 Gate",
|
||||
"items": {
|
||||
"activeScan": {
|
||||
"title": "Active scan",
|
||||
"body": "對 Kali 112、開發主機 168 / 111 的主動掃描仍未批准,不能由 IwoooS 直接觸發。",
|
||||
"gate": "需要 S1.6 scan scope approval 與後續 runtime gate"
|
||||
},
|
||||
"credentialedScan": {
|
||||
"title": "Credentialed scan",
|
||||
"body": "任何帶憑證的掃描都必須先有 scope、credential handling 與脫敏 evidence 規範。",
|
||||
"gate": "需要 S1.6 scope approval;目前 credentialed scan=false"
|
||||
},
|
||||
"kaliExecute": {
|
||||
"title": "Kali /execute",
|
||||
"body": "Kali 執行端點仍是 block candidate,不能因主機已納入視野就開放。",
|
||||
"gate": "需要人工 decision record 與 S3.4 follow-up runtime gate"
|
||||
},
|
||||
"sshChange": {
|
||||
"title": "SSH / host change",
|
||||
"body": "登入主機、改設定、套用調校、重啟服務或變更 SSH 設定都不屬於目前前端權限。",
|
||||
"gate": "需要明確人工批准、變更計畫與 rollback evidence"
|
||||
},
|
||||
"kaliUpdate": {
|
||||
"title": "Kali host update",
|
||||
"body": "Kali 更新與主機調校會影響掃描結果與工具鏈穩定性,必須和資安 gate 分開批准。",
|
||||
"gate": "需要維護窗口、更新清單、驗證指標與 rollback 計畫"
|
||||
},
|
||||
"runtimeBlocking": {
|
||||
"title": "Runtime blocking control",
|
||||
"body": "把 finding 變成產品阻擋或 runtime enforcement 仍要等 owner evidence 與人工決策。",
|
||||
"gate": "需要 accepted decision record;active runtime gates 仍為 0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nextGate": {
|
||||
"title": "下一個高層 Gate",
|
||||
"body": "S4.9 Gitea owner attestation response 是目前建議先收的 owner evidence。任何 headline 提升都要等 owner response、redacted payload ingestion、active runtime gate 或 GitHub primary readiness 有真實變化。"
|
||||
|
||||
@@ -81,6 +81,13 @@ type HostCoverageItem = {
|
||||
tone: 'steady' | 'warn' | 'locked'
|
||||
}
|
||||
|
||||
type HostActionGateItem = {
|
||||
key: string
|
||||
gate: string
|
||||
icon: typeof ShieldCheck
|
||||
tone: 'steady' | 'warn' | 'locked'
|
||||
}
|
||||
|
||||
const postureMetrics: PostureMetric[] = [
|
||||
{ key: 'overall', value: '58%', tone: 'warn' },
|
||||
{ key: 'framework', value: '80-85%', tone: 'steady' },
|
||||
@@ -183,6 +190,15 @@ const hostCoverageItems: HostCoverageItem[] = [
|
||||
{ key: 'dev111', address: '192.168.0.111', icon: Radar, tone: 'warn' },
|
||||
]
|
||||
|
||||
const hostActionGateItems: HostActionGateItem[] = [
|
||||
{ key: 'activeScan', gate: 'S1.6', icon: Radar, tone: 'locked' },
|
||||
{ key: 'credentialedScan', gate: 'S1.6', icon: Lock, tone: 'locked' },
|
||||
{ key: 'kaliExecute', gate: 'S3.4', icon: Activity, tone: 'locked' },
|
||||
{ key: 'sshChange', gate: 'S3.4', icon: Lock, tone: 'locked' },
|
||||
{ key: 'kaliUpdate', gate: 'S3.4', icon: FileWarning, tone: 'warn' },
|
||||
{ key: 'runtimeBlocking', gate: 'S3.4', icon: ShieldCheck, tone: 'locked' },
|
||||
]
|
||||
|
||||
const evidenceItems = [
|
||||
'iwooos-posture-projection.snapshot.json',
|
||||
'security-rollout-policy.snapshot.json',
|
||||
@@ -457,6 +473,34 @@ function HostCoverageCard({ item, index }: { item: HostCoverageItem; index: numb
|
||||
)
|
||||
}
|
||||
|
||||
function HostActionGateCard({ item, index }: { item: HostActionGateItem; index: number }) {
|
||||
const t = useTranslations('iwooos.hostActionGates')
|
||||
const Icon = item.icon
|
||||
return (
|
||||
<div style={{ ...band, minHeight: 180, padding: 16 }}>
|
||||
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12 }}>
|
||||
<div style={{ display: 'flex', alignItems: 'center', gap: 9 }}>
|
||||
<Icon size={18} color={toneColors[item.tone]} />
|
||||
<span style={{ fontSize: 11, color: '#87867f' }}>{item.gate}</span>
|
||||
</div>
|
||||
<span style={{ fontSize: 11, color: '#9b978b' }}>{String(index + 1).padStart(2, '0')}</span>
|
||||
</div>
|
||||
<h2 style={{ fontSize: 14, margin: '12px 0 6px', color: '#141413' }}>
|
||||
{t(`items.${item.key}.title` as never)}
|
||||
</h2>
|
||||
<p style={{ fontSize: 12, lineHeight: 1.55, color: '#6f6d66', margin: 0 }}>
|
||||
{t(`items.${item.key}.body` as never)}
|
||||
</p>
|
||||
<div style={{ marginTop: 10, display: 'grid', gap: 5 }}>
|
||||
<div style={{ fontSize: 11, color: '#87867f' }}>{t('gateLabel')}</div>
|
||||
<div style={{ fontSize: 11, color: toneColors[item.tone], lineHeight: 1.45 }}>
|
||||
{t(`items.${item.key}.gate` as never)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default function IwoooSPage({ params }: { params: { locale: string } }) {
|
||||
const t = useTranslations('iwooos')
|
||||
|
||||
@@ -549,6 +593,26 @@ export default function IwoooSPage({ params }: { params: { locale: string } }) {
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section style={{ marginBottom: 14 }}>
|
||||
<div style={{ marginBottom: 14 }}>
|
||||
<h2 style={{ fontSize: 16, margin: 0 }}>{t('hostActionGates.title')}</h2>
|
||||
<p style={{ fontSize: 12, color: '#6f6d66', margin: '6px 0 0', lineHeight: 1.55 }}>
|
||||
{t('hostActionGates.subtitle')}
|
||||
</p>
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
display: 'grid',
|
||||
gridTemplateColumns: 'repeat(auto-fit, minmax(210px, 1fr))',
|
||||
gap: 12,
|
||||
}}
|
||||
>
|
||||
{hostActionGateItems.map((item, index) => (
|
||||
<HostActionGateCard key={item.key} item={item} index={index} />
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section
|
||||
style={{
|
||||
display: 'grid',
|
||||
|
||||
Reference in New Issue
Block a user