Team Security

The team Security page lives under iKASecure in the top bar. It is scoped to a team and groups code findings, AI endpoint findings, hardening controls, and the workspace audit log. Available tabs depend on workspace entitlements and, for the audit log, the signed-in user's workspace role.

Open the security page

  1. Select iKASecure in the top bar. It opens the last team you used, or your first team.
  2. Select the required team under Your teams in the left sidebar. To see every team at once, select All teams above that list.
  3. Start on OWASP Top 10 to review code-security findings.
  4. Open Infrastructure for the infrastructure and runtime controls (cloud audit, runtime scanning, database isolation and review, API scan, container/image scanning and IaC scanning), and Non-OWASP Controls for the other hardening controls. Both need the security entitlement. Each tab's number counts its own Missing, Planned and Not checked yet controls; the ? next to the tabs lists which statuses it counts.
  5. Open OWASP LLM Top 10 to review AI endpoint findings when your plan includes aiRedTeam. On a plan without it (Pro), iKASecure → Overview, All teams and Applications show the note "AI findings need the Pro+ plan" and count no AI findings; they do not open the upgrade popup.
  6. Open Audit Log when the workspace has the auditLog entitlement and your role is Owner or Admin.

Tabs hidden by an entitlement or role cannot be opened from this page. The server enforces these checks as well as the page, so the visible navigation is not the security boundary.

Security page navigation showing the OWASP Top 10 view

Insights

With the security entitlement, Insights sits above the tabs. It shows together what each folded row says on its own, and its counts equal Overview for the team (every source: your code, packages, AI endpoints and infrastructure).

Team tabs on Overview, All teams and Applications

Overview, All teams and Applications show the same row of team tabs: All teams, then one tab for each of your teams. Select a tab to see only that team's findings, severity counts, scans, rules and applications.

Scans

All teams → Scans shows one row per scanned AI endpoint, and one row per code, infrastructure or repository-controls target, newest scan first.

Run a scan

Run a scan opens one panel. An agent does the work: it runs the scanners from the npm package ikanban (npx -y ikanban@latest secscan), maps your folders to the team's applications, and publishes. You download nothing and type no command.

  1. Pick What to scan: Everything, Code, AI endpoints, Dependencies, Containers & IaC, Web app (DAST), API (OpenAPI), AWS account, Repository controls or Imported report. Code and Dependencies are the same scan run.
  2. Pick the Team the findings go to.
  3. Select Send to my runner to start a session on your laptop's iKanban runner in the repository shown, with the agent shown (Claude, Copilot or Antigravity). Or select Copy prompt and paste it into any coding agent opened in the repository.
  4. The agent replies with one list: findings per severity, what it filed, which folders it mapped to which application, and what it skipped and why.

Send to my runner logs a task in your iKAgent home team and opens its session. The session shows what you asked for, for example Scan: code and dependencies; the full instructions sent to the agent stay folded under Scan instructions sent to the agent.

Applications. A dependency scan files its findings to an application of the team. A team starts with none. Add them in iKASecure → Run a scan → Applications, one per folder with a package manifest (for example backend and frontend), or ask an agent to do it with security_create_application. Run a scan shows that field for Dependencies, Code and Everything, lists the team's applications, and warns when there are none. The Applications page lists every scanned row and has a Run a scan button. Open counts findings not fixed yet (open, being fixed or in review); Closed counts fixed, accepted and false-positive ones. Last scan is when a scanner last checked the row: the newest AI run, or recorded code, dependency or infrastructure scan; "—" means no scan of it was recorded yet. Select a row or a box to open All teams → Findings with exactly that application's findings, open and closed; the Application filter chip there removes the filter. Names use lowercase letters, digits, ., _ and -.

A team that was never scanned reads Never scanned. Run a scan to see what it finds. Nothing needs attention appears only after a scan found nothing open.

The prompt is the same text as .iKanban/prompts/security-scan.md and the ikanban-security-scan skill in the laptop kit. What decides whether a part runs:

PartRuns whenOtherwise the agent says
Code and dependenciesthe team's plan has Securitythe 402 answer: the plan lacks it
Dependency findingsa folder matches an application from --list-appswhich folders stayed in the local report only; it asks only when two folders fit one application
A language's dependency checkits auditor (cargo-audit, pnpm or npm, pip-audit) is installedSKIPPED, with the install command; nothing closes in that application
AI endpointsthe code has a chat endpoint, the team has an OpenAI key in Settings → AI Provider Keys (or OPENAI_API_KEY is set in the agent's shell), the plan has AI findings (Pro+), Node.js is installedone line naming which is missing
Imported reportthe repository holds a SARIF or JSON report from another scanner, up to 1 MB; secret scanners' reports (gitleaks, trufflehog, detect-secrets, semgrep secrets rules) are never imported. npx -y ikanban@latest import FILE --publish files each result with a CWE as a code finding; the file itself is never uploaded"No other scanner reports found", each skipped file, and how many results were not filed (no CWE)
Repository controlsalways (part H); branch protection also needs the GitHub CLI signed in (gh auth login)each check's result; a check that cannot run reads skipped, never a pass
Send to my runnerthe runner is online, and a repository is linkedthe session waits as Queued while iKanban starts the runner

What a scan sends, and what stays on your machine

Scans run on your machine. The full report stays encrypted on that machine. Only findings, with secrets cut, are sent to iKanban.

WhatWhere it goes
Findings: title, severity, file and line, the fix, the OWASP categoryiKanban, after secrets are cut to their first 4 characters and your home folder becomes ~
AI findings: the attack prompt, the model's answer and the grader's reasoniKanban, with secrets cut and each text cut to 2,000 characters
Each run's counts: found, closed, complete or notiKanban, shown under All teams → Scans
The full report and the scanner's raw outputyour machine only, encrypted under ~/.ikanban/scans/<repository>/<scan id>/ (%USERPROFILE%\.ikanban\scans on Windows)
The key that opens the storeyour machine only: the macOS Keychain, Windows DPAPI or the Linux Secret Service; else a file only you can read, ~/.ikanban/scan-store.key, and the scanner says so
Your AWS credentials and the iKanban keynever in a report or a finding

Non-OWASP Controls

The Non-OWASP Controls tab lists ten controls. Each one shows which check sets its status:

GroupControlChecked by
Supply chain & dependency scanninga CI workflow runs a dependency audit, or Dependabot or Renovate is set upRun a scan → Repository controls (part H)
Supply chain & dependency scanningevery package manifest has its lockfile in gitRun a scan → Repository controls (part H)
Code & secrets scanninga CI workflow runs secret scanning (gitleaks, trufflehog, detect-secrets), or GitHub secret scanning with push protection is onRun a scan → Repository controls (part H)
Code & secrets scanninga CI workflow runs CodeQL, Semgrep or a similar SAST toolRun a scan → Repository controls (part H)
Code & secrets scanningno .env or private key file is in git, and .gitignore covers themRun a scan → Repository controls (part H)
Repository & accessthe default branch blocks force-push and deletion and needs a pull requestRun a scan → Repository controls (part H), with your own gh sign-in
Repository & accessa CODEOWNERS file names ownersRun a scan → Repository controls (part H)
Security processSECURITY.md says how to report a vulnerabilityRun a scan → Repository controls (part H)
Security processevery open Critical or High finding has a fix taskiKanban, from your findings and fix tasks
AI / LLM safetya complete AI endpoint scan ran in the last 30 daysRun a scan → AI endpoints (part B)

Findings and controls

The OWASP Top 10 view groups code findings by category; expand a category to inspect finding titles, locations, severity, and status. The Infrastructure and Non-OWASP Controls views group controls by domain; expand a control to inspect its threat/goal and source, and on Infrastructure the findings of its scan. For a missing control, + Task creates a remediation task in the team's default project. These views are not a live scan of the repository: the page presents findings and control data published to iKanban.

To scan, select Run a scan on the team page. It opens the same panel as on Overview, set to this team, so every scan logs a task and a session in iKAgent. The panel's closed Run it yourself gives the npx commands for a manual run. The scanners reach you only through npm; iKanban no longer serves a scanner file. The scanner can publish results back to this page when run with --publish. It sends your API key only to iKanban's API (https://api.i-kanban.com, https://dev-api.i-kanban.com, or a server on your own machine) and never follows a redirect with it; any other --base-url stops the scanner before it sends anything. With --publish it records the run under Scans, and files each committed secret (A07) and risky file permission (A05) as a finding on this page. Dependency findings are filed only for an application the team has: run --list-apps to see the names, then add --app FOLDER=NAME for each folder that holds one (for example --app vibe-backend=backend). Without --app, dependency findings stay in the local report and reach no count. A rescan closes what it no longer finds, only for the same repository and, with --app, the same application. It files what is new and re-opens a finding marked fixed that it finds again. The scanner prints how many closed and re-opened. False positive and accepted findings never change, and a rescan never files the same flaw again as a new open finding. For a dependency, the same flaw means the same package and the same CVE id; a verdict on a finding with no CVE id does not hide a later one. A closed finding's fix task stays as it is, like Mark fixed. A dependency scan with a skipped auditor closes nothing in that application. Findings filed by a scanner older than 1.2.0 close only after a rescan reports them once. New numbers show when an agent's scan session ends, and on the next page visit or tab focus. A dependency upload names its team, and an application of another team is refused. On iKASecure → Applications, each application row shows its open and total findings: a dependency finding under its application, an AI finding under its endpoint, and a code finding under the team's Code scans row, because code findings do not name a repository. The rows of each kind add up to that kind's count on iKASecure → Overview.

For AI endpoint testing, pick AI endpoints in Run a scan. It covers prompt injection, data disclosure, and excessive agency, and publishes to the OWASP LLM Top 10 view.

The attacks use the team's OpenAI key from Settings → AI Provider Keys: your own key in the workspace first, else another member's. The key stays on iKanban's server. aiscan sends promptfoo's OpenAI calls through iKanban, which adds the key and forwards only those calls to OpenAI; usage shows on the key as aiscan. Members of a Pro+ team can run AI scans with the workspace's OpenAI key; the relay only accepts scan traffic (the red team's models, text only, capped replies, 120 calls a minute per member). OPENAI_API_KEY in the shell, when set, is used instead.

A scan run is separate from viewing the findings page. On the Audit Log view, the button on the right is CSV: it exports the filtered rows.

Infrastructure scans: containers, IaC and DAST

The Infrastructure tab lists the scans of how you ship and run the app, and their findings.

ScanCommandNeedsPlan
Container imagesnpx -y ikanban@latest infrascan --image NAME:TAG --publish --team TEAMTrivy, or DockerPro and Pro+
Infrastructure as code (Dockerfile, Kubernetes, Helm, Terraform, CloudFormation, Azure ARM)npx -y ikanban@latest infrascan --path . --path ../infra --publish --team TEAMTrivy, or DockerPro and Pro+
Web app (DAST, OWASP ZAP baseline, passive: no attacks)npx -y ikanban@latest dastscan --url URL --publish --team TEAMDocker, a registered targetPro+

Where each finding shows, and its OWASP tag

Each finding shows on exactly one tab. OWASP Top 10 lists code findings only (secscan). OWASP LLM Top 10 lists AI findings. Infrastructure lists every container, IaC, web app, API and AWS account finding, inside the control row of the scan that found it:

Control rowIts findings
Container / image scanningcontainer images
IaC scanninginfrastructure files (IaC)
DAST / runtime scanningthe web app
API vulnerability scanthe API
AWS infrastructure auditthe AWS account (every failed check)
Database network isolationthe AWS account's database network checks
Database security reviewthe AWS account's database setting checks

Open a control to see the evidence lines (last complete run, scope, open counts) and then its findings, worst first: 20 rows, then Show all. A control with no scan behind it has no findings list. A DAST target's N open findings opens its control on that target's open findings, with a chip to clear the filter (kept in the address as ?kind=dast&target=URL).

Each infrastructure finding has a small tag from its own OWASP list:

FindingListHow the code is chosen
Container imageOWASP Top 10 Infrastructure Security Risks 2024always ISR01 Outdated Software
IaC, AWS accountOWASP Top 10 Infrastructure Security Risks 2024by the check (the Prowler check id, or the IaC rule title), first match: encryption, KMS or TLS → ISR05; MFA, root, default admin, password or credential → ISR07; public access or a public snapshot → ISR08; security group, public, ingress or VPC → ISR06; tags or unused → ISR10; IAM, admin, policy or privilege → ISR04; CloudTrail, GuardDuty, logging or monitoring → ISR02; version or upgrade → ISR01; anything else → ISR03 Insecure Configurations
APIOWASP API Security Top 10 2023SSRF → API7; authentication, JWT, session or password → API2; anything else, injection included → API8 Security Misconfiguration
Web appOWASP Top 10 2021its A01–A10 code

The tag comes from the server, so the API (owasp_tag on each finding) and the MCP tools return the same one.

API and AWS account scans

Four Infrastructure rows follow these scans: API vulnerability scan, AWS infrastructure audit, Database network isolation and Database security review. Until a complete run in the last 30 days, each reads Not checked yet, never Enforced, with one line naming the Run a scan part that checks it. After a run they read Enforced, or Advisory while open critical or high findings of their scan remain.

RowRun a scan partCommandNeedsPlan
API vulnerability scanAPI (OpenAPI), part Fnpx -y ikanban@latest dastscan --url URL --openapi .iKanban/scans/openapi.json --publish --team TEAMDocker, the API's URL registered as a DAST targetDAST (dastScan, Pro+)
AWS infrastructure audit, Database network isolation, Database security reviewAWS account, part Gnpx -y ikanban@latest cloudscan --aws-profile PROFILE --region REGION --account ACCOUNT_ID --publish --team TEAMDocker, the AWS CLI v2 signed in to a read-only rolecloud account audit (cloudScan, Pro+)

Read a finding

Select a finding to open its panel. In plain words comes first: what it is, what it means and why it matters. How to fix it gives the one fix, then the scanner's own detail. Where names the file and line, and the header names the repository the scan covered.

For a finding that is not real, such as a sample key in a test, select False positive (code findings) and give the reason. For a real risk you choose to keep, select Accept the risk with the reason. A rescan never reopens either; Reopen undoes it. The scanner (secscan 1.3.0 and later) already skips keys in test code: a Rust #[cfg(test)] module or #[test] function, a Python test_ function, and test, fixture and doc folders.

To work through findings with an agent, use the ikanban-security-triage skill (.iKanban/prompts/security-triage.md for other agents).

Fix a finding with an agent

On iKASecure → All teams, open a finding's menu and select Fix with an agent. Claude, Copilot and Antigravity run on my machine; Claude and Copilot also run on GitHub. For a dependency finding, Antigravity · GitHub is greyed out: Antigravity on GitHub refuses every edit to package.json, lockfiles and Cargo.toml, so it can't upgrade a package. Use Antigravity on my machine, or Claude or Copilot, instead.

While the agent works, the finding reads Agent fixing. When its pull request is open, it reads In review until a person merges it. When the fix task is done, the finding becomes Fixed by itself. Mark fixed and Reopen in the menu change a code or dependency finding by hand; a finding marked as a false positive or an accepted risk keeps that status. Accept the risk works on an open finding of every kind and needs a reason: open the finding (or Accept risk… in its menu), select Accept the risk, and write why. The finding then reads Risk accepted with your reason, leaves the open counts, and a rescan never opens it again. Reopen in the finding undoes it. On an AI finding, Mark false positive also needs a reason.

Cancelling a fix task frees its finding: the finding no longer points to the cancelled task, and Create fix task or Fix with an agent files a new one.

Security-only API keys

A scanner or CI job needs a key, but not a key to the whole workspace. In Settings → API Keys, create the key with Area set to Security only. That key can read and file security findings, scans and fix tasks through the API and MCP, and nothing else. Add Read-only key to stop it from changing anything.

Through MCP, a Security-only key can use these tools:

ToolWhat it does
security_summaryCounts a team's open findings by severity and source, and names the five to fix first.
security_list_findingsLists a team's findings from code, AI endpoints and packages, worst first.
security_list_scansLists the recorded scans of a team (code, infrastructure, repository controls) and its AI endpoint scans.
security_list_applicationsLists the team's applications, the names dependency findings are filed under.
security_create_applicationAdds an application to a team, the name a dependency scan files to (--app FOLDER=NAME).
security_set_finding_statusMarks a finding fixed, a false positive or risk accepted (any source, with a reason), or reopens it.
security_create_fix_taskFiles the fix task for a finding or a missing control in one of the team's projects.

MCP is the public API. The REST exceptions are the upload routes that the shipped scanners and CI call with a vk_ key, and the route that adds an application:

Audit log

The audit log is workspace-wide, even though it appears within a team's iKASecure page. It is sorted newest first, supports filtering and search, and retains events for 90 days. Use CSV to export the currently filtered rows. Each finding status a person sets, from a screen or security_set_finding_status, adds a row: security.finding_fixed, security.finding_reopened, security.finding_false_positive or security.finding_accepted, with the source, the finding and the reason. This view is available only to workspace Owners and Admins with the required entitlement.

Related guidance

See Data Security for how configured AI provider keys and notification text are handled. See Members & Roles for team membership and role guidance.