Defenssive AI Security Manager

Terms of service

Last updated 10 October 2026 (third revision).

Sections 1 to 6 describe the service, and are written from the implementation rather than from a template. They state what it does, what it cannot do, and what we do not promise — and the main claims are listed at the end with the code, configuration or record each one rests on. Most of those are internal to us; the Microsoft and GitHub sources are public.

Sections 7 to 12 — fees, liability, warranties, indemnities and governing law — are with counsel and are not yet settled. We would rather say so than publish a template we have not read carefully. If you need those terms before proceeding, ask us at support@defenssive.com and we will tell you where they stand.

This page describes a product. It is not legal advice.


1. What the service is

Defenssive AI Security Manager reads the security configuration of your Microsoft 365 and Microsoft Entra ID tenant and reports where it differs from published security baselines, principally the CISA Secure Cloud Business Applications (SCuBA) baselines — Entra ID above all, with checks drawn from the Exchange Online and Defender baselines — plus additional checks of our own, each labelled with where it comes from. Our checks of your SharePoint, OneDrive and Microsoft Teams settings are among those additional checks, and are not counted as SCuBA coverage.

On the Monitor plan it also reads the configuration of the Microsoft Azure subscriptions you choose, and reports what Prowler, open-source software we run on our own server, finds there, in a Cloud area. Those are Prowler's checks, in Prowler's words and labelled as Prowler's, not SCuBA coverage and not checks of our own, and they are assessed about once a week and whenever you start an assessment.

It is a reporting service. It observes and describes; it does not act.

2. What it does not do

These are properties of the product rather than promises about intent, and they follow from the permissions your administrator approves:

3. What we do not promise

Stated plainly, because a security product that oversells is worse than one that undersells.

Coverage is partial and stated. The version of CISA's Entra ID baseline we measure against — the one in CISA's ScubaGear repository on 17 September 2026, four policies ahead of its last numbered release, v1.8.0 — has 34 policies. We have written a check for 30 of them. Of those, 24 are checked on every assessment. Nine of the 24 read your Conditional Access policies, a feature that needs Microsoft Entra ID P1 or P2. In a tenant without either, where Microsoft refuses that read, those checks report that they could not run or that the policy is not applicable, unless Security Defaults settles the question. The remaining 6 need Privileged Identity Management, which comes with Microsoft Entra ID P2 or Microsoft Entra ID Governance, and report as not applicable rather than as a pass in a tenant with neither.

Four are not implemented at all, and we publish which and why: two (MS.AAD.2.2 and MS.AAD.8.3) because we have found no way for applications to read the setting on Microsoft Graph v1.0, the version we use; one (MS.AAD.9.1) because it needs a Microsoft permission we do not ask for; and one (MS.AAD.4.1) because where your security logs are sent is set up in Azure, not in Microsoft 365, and we do not ask for the Azure access needed to read it. We do not report a policy we have no check for as one you have passed.

These figures are for the Entra ID baseline. Checks drawn from other baselines, and our own additional checks, are listed in the product with the source each comes from.

A clean result means our checks found nothing, not that nothing is there. We assess the configuration Microsoft exposes to us. We do not test whether a control works, whether it is evaded, or whether something outside our permissions is wrong.

Where we cannot determine an answer, we say so rather than guess. A check that could not read what it needed reports that it could not run. A policy your licence does not cover reports as not applicable. Neither is counted as a pass. Where one of our checks itself finds that your licence no longer covers a policy — Privileged Identity Management without Microsoft Entra ID P2 or Governance, for example — a finding we raised under that policy before is closed as not applicable, not as resolved, and is not counted as fixed. Where a check could not run, or was not run because Microsoft refused to let us read a service your tenant holds no licence for — Exchange Online, for example — a finding we raised under it before stays open until an assessment can check it again.

Findings can be wrong. They are produced by software reading an API, and both change. We correct errors when we find them.

We do not guarantee continuous availability, and a scan may be delayed by Microsoft's own rate limits, some of which apply to our application across all our customers at once.

4. Your responsibilities

5. Access, and ending it

Access is granted by your administrator through Microsoft's own consent screen. It can be withdrawn at any time, without asking us, by deleting our application under Enterprise applications in the Microsoft Entra admin center. Microsoft then stops issuing us new access tokens for your tenant, but it does not cancel a token it has already issued, and we reuse a token until shortly before it expires. So reading can continue until that token expires, at a time Microsoft sets when it issues the token. (Microsoft's Access tokens page gives a default of 60 to 90 minutes, but says it does not apply to tokens for Microsoft's own services, such as Microsoft Graph, which ours are.) Removing only the directory role you assigned us leaves our Microsoft Graph and Defender permissions in place. Closing your workspace, below, stops our reading sooner: nothing new is read from your tenant after it, though a read already under way can finish.

An owner can also close your workspace in the product's Settings. That stops every assessment and email, disconnects your tenant on our side, and signs everyone out; it cannot be reopened. Our application stays in your tenant, with the access you granted it, until your administrator removes it.

Data already collected is handled as described in the privacy notice. Neither withdrawing access nor closing a workspace deletes data. Deletion is performed on request, by us — and copies remain in the backups our service makes, still readable by us, for about four months at most after the deletion. Backups from our earlier pilot environment are not on that schedule, as the privacy notice explains.

6. Changes to what we read

Adding a Microsoft permission requires your administrator to approve the new permission set, so you will see it on Microsoft's own consent screen before it takes effect, and you may decline. Some access instead comes from a role your administrator assigns to our application, such as Global Reader or Security Reader, or Azure's Reader role on a subscription; that is done in your tenant, not on the consent screen, and our application cannot assign a role to itself. Within the permissions and role you have given us, we add checks from time to time, and a new check can read data that an earlier version did not; the privacy notice says what each permission is used for.


7–12. Commercial terms — with counsel

These require a lawyer and a commercial decision, and are deliberately not drafted from the implementation the way the sections above are:

A note on how section 3 is written, since it is unusual. A security product's terms normally disclaim reliance as heavily as possible. Section 3 is written to be accurate instead, and those are not the same document. When the commercial terms are settled, the factual statements are intended to survive alongside any disclaimers rather than be replaced by them: a customer who reads "we make no warranty of any kind" learns nothing, and a customer who reads "we have written 30 of 34 checks, 24 run on every assessment, and here is why the other four do not exist" can make a decision.


What this document asserts, and what each claim rests on

Claim Rests on
Does not change anything in your tenant Graph and Defender permissions all end .Read.* (GraphTokenBroker refuses anything else); Exchange: ExchangeReader.Allowed (fixed Get- cmdlets) and AssessmentAccessReadOnlyCheck; roles: Microsoft Learn, Microsoft Entra built-in roles permissions reference (Global Reader and Security Reader include microsoft.office365.serviceHealth/allEntities/allTasks and microsoft.azure.serviceHealth/allEntities/allTasks)
In Azure, Monitor plan only, Reader on chosen subscriptions, Prowler's checks in a Cloud area CspmResultsFactory (no Azure call off Monitor; a completed run reused for up to six and a half days, a fresh run for an assessment you start); GraphTokenBroker AzureRoles (empty); ProwlerAzureCheck (area Cloud, catalogue cloud.azure_* from migration 0192 with Prowler's text, severity source prowler); THIRD-PARTY-NOTICES.md (Apache-2.0); Microsoft Learn, Azure built-in roles, Reader
Does not read mailbox, file, chat or calendar content ExchangeReader.Allowed (configuration Get- cmdlets only); the Graph permission list (no Mail, Files, Chat or Calendars permission)
34 Entra ID policies (ScubaGear main e06238f, migration 0128), 30 with a check, 24 checked on every assessment (9 of them read Conditional Access, which needs Microsoft Entra ID P1 or P2), 4 not implemented Verified on production 2026-09-28 with the query below: assessed 24, licence 6, unavailable 2, permission 1, external 1; migration 0172 (the coverage ledger); v1.8.0 is the latest ScubaGear release on GitHub as of 2026-09-28; the nine that read identity/conditionalAccess/policies are MS.AAD.1.1, 2.1, 2.3, 3.1, 3.2, 3.6, 3.7, 3.8 and 3.9 (ScubaConditionalAccessChecks, ScubaPhishingResistantChecks, MfaBaselineCheck); Microsoft's refusal for a tenant without P1 or P2 is read as not available in the tenant (GraphClient); 1.1 and 3.9 (SecurityDefaultsBearsOnThis) and 3.2 (MfaBaselineCheck) consult Security Defaults; Microsoft Learn, Conditional Access overview (licence requirements: Microsoft Entra ID P1)
Closing a workspace stops assessments, email and new reads, and deletes nothing; deletion is on request Migrations 0138 and 0149; docs/workspace-deletion.md
Backup copies remain about four months at most after a deletion, readable by us; the earlier pilot environment's backups are not on that schedule The lifecycle rule expire-database-backups (90 days) and the locked 30-day immutability policy on stdefenssiveprodbk, owner-run 2026-09-28 (docs/pilot-external-actions.md §4); 30-day soft delete; docs/workspace-deletion.md (each backup holds the wrapped keys); the pilot account stdefenssivepilotbk still exists, kept by the owner's decision of 2026-09-28; the 2026-09-28 rule and locks were applied to the production account, not to it (docs/counsel-fact-pack.md, docs/tenant-migration.md phase 6)
No incident-response action without a recorded approval ADR 0004
30 of 34 policies have a check; 24 checked on every assessment scuba_policy table — select status, count(*) from scuba_policy group by 1
Unassessable policies are not reported as passes CheckResult.CouldNotRun and NotApplicable are distinct from Clean
Licence-gated policies report as not applicable; PIM needs P2 or Entra ID Governance; a finding a check closes because the licence no longer covers its policy is closed as not applicable, not as resolved, and is not counted as fixed; a check that could not run, or was not run because Microsoft refused a service the tenant holds no licence for, leaves an earlier finding open Migration 0077; TenantLicensing (Entra_Identity_Governance counts as PIM); CheckResult.NotApplicableByLicence (the PIM checks' answer without P2 or Governance); ScanRunner (a licence-driven not-applicable is closed through app.close_not_applicable_findings, never app.resolve_unseen_findings; a check that could not run, or that the licence gate did not run, is passed to neither); LicenceGate (a check is not run only when Microsoft refused the read and the licence list holds no active plan for the service); migration 0176 (the not_applicable closing row, which no email, digest or summary counts as fixed, and no page either until a later assessment reads the control in full and does not see the problem: migration 0178)
Withdrawing access stops new tokens; a token already issued is reused until 5 minutes before it expires and works until it expires; closing a workspace stops new reads GraphTokenBroker: Cache, RenewBefore, the InvalidateConnection remarks; GetAsync re-reads the connection before every token; migration 0138 (closure disconnects; in-flight requests are not recalled); Microsoft Learn: Access tokens (its 60 to 90 minute default is stated for registered APIs, not Microsoft-owned APIs)