certifly_

A fly on the wall
of every system you run.

Certifly lands on your identity provider, your code host, your cloud, your chat and your domains, and reads everything without touching a thing. It holds the policies, controls and frameworks you have committed to, ties every control to the checks that test it, and starts buzzing the moment what you wrote down and what is actually running disagree. Better to hear it from a fly than from an auditor.

Connect one system free No trial clock: the free plan runs every check. See pricing.

Watch one control go red

Five steps, one control, one admin who never got round to a security key. Press through it.

AC-4 Administrators must enroll a phishing-resistant authenticator.

not tested
You write the control

An owner, an operator, a frequency, and a test procedure. It serves your access-control policy and claims the SOC 2 and ISO 27001 requirements it answers. Type “ensure” or “appropriate” and the editor asks you what you actually mean.

Status: not tested. Nothing has shown it working yet, so it does not get to look like it is.

You attach a check
rule "okta.user.admin-phishing-resistant-mfa" {
  severity   = "critical"
  applies_to = "okta :: okta_user"
  check = cel(<<-EOT
    !resource.config.isAdmin ||
      resource.config.factors.exists(f,
        f.factorType in ["webauthn", "u2f"] && f.status == "ACTIVE")
  EOT)
}

Abridged. One of 236 checks that ship with Certifly, every one of them readable source. Write your own in a form or as code, and run it against your real data before you save it.

Certifly imports Okta
  1. 09:00:02 okta_user  pulled 412 · changed 3
  2. 09:00:04 okta_role_assignment  pulled 19
  3. 09:00:05 evaluating 28 okta checks…
  4. 09:00:05 critical Admin amy.ade@example.com (Super Administrator) has SMS and Okta Verify enrolled; neither is phishing-resistant.
  5. 09:00:06 routed to Identity → opened SEC-142, due in 7 days

The control turns failing. The finding gets an owner and an issue in Linear or Jira, chosen by routing rules you set.

Somebody closes the ticket
  1. 14:12:40 SEC-142 moved to Done in Linear
  2. 14:12:41 re-checking okta_user amy.ade@example.com…
  3. 14:12:44 still failing: no WebAuthn or U2F factor is active
  4. 14:12:44 SEC-142 reopened, with a comment saying why

Your tracker says what people are doing. Certifly says whether the setting is fixed. Marking an issue done only ever starts a re-check.

The actual fix
  1. 16:03:10 amy.ade@example.com enrolled a security key (webauthn, ACTIVE)
  2. 16:03:55 re-checking okta_user amy.ade@example.com…
  3. 16:03:58 passing: finding resolved
  4. 16:03:58 SEC-142 closed · verified fixed by Certifly, inside its due date

AC-4 reads effective. The issue, the finding and the fix are kept as evidence, and the CSV for your auditor says when each happened.

Example data. Every name and identifier in this story is generated.

The most useful lie

Most compliance dashboards would show you a score. Here are six controls. Flip the switch to see them the way a percentage would.

No score.83% compliant

  • AC-4 Admins use phishing-resistant MFA failing
  • AC-7 Leavers lose access within a day effective
  • CM-2 Production deploys need a reviewer not testedNo check attached yet.
  • IR-1 Incident runbook reviewed each quarter not performedQ3 ended with nothing recorded, so a deficiency opened itself.
  • EM-3 DMARC enforced on every mail domain not testedThe credential cannot see that field. Unknown is not compliant.
  • AC-9 Access reviewed each quarter effective

Two working, one broken, and three nobody knows about. Those are different problems with different owners, so Certifly never averages them.

Three controls nobody has checked just became green. That is the number this product refuses to show you.

Pick your stack

Twelve sources and 236 checks ship today. Choose what you run to see what Certifly would read.

88 checks across 34 object types + 6 that look across all of them

Google Workspace

  • SPF must never end in +all
  • Mailbox delegates must be internal accounts
  • Chrome devices must boot in Verified mode

Okta

  • Apps must not be assigned to the Everyone group
  • The Admin Console must require phishing-resistant MFA
  • Admin accounts must not sit unused for 90+ days

Microsoft Entra ID

  • MFA must be enforced for administrators
  • Guest accounts must not hold directory roles
  • Third-party apps must not hold high-privilege permissions

OneLogin

  • Security policies must require MFA
  • Super-user privileges must not be granted through a role
  • User mappings must not grant a super-user role

GitHub

  • Organization owners must have two-factor enrolled
  • Production environments must require a reviewer
  • Environments holding secrets must restrict which branches deploy

Slack

  • An app denied by an administrator must not still be running
  • Guest accounts must not hold admin
  • Apps installed by a departed person must be re-owned or removed

Linear

  • Sign-in should go through your identity provider with SAML
  • Webhooks should deliver only to approved hosts
  • Guests on a private team should be reviewed

Amazon Web Services

  • The root user must have no access keys
  • IAM users with console access must have MFA
  • IAM roles must not trust every principal

Google Cloud

  • IAM must not grant access to allUsers
  • Service account keys must be rotated within 90 days
  • Service accounts must not hold owner or editor

DigitalOcean

  • Reserved IPs should be assigned or released
  • Zones should hold records or be removed

Namecheap

  • Domains in the account should not be left expired
  • Registered domains should renew automatically
  • Registered domains should be locked against transfer

Your domains

  • CNAMEs must not point at an unclaimed service
  • Delegated zones must exist on their nameservers
  • Mail as your domain must come from known senders

Across every system

  • Access must end when a person leaves (critical on admins)
  • Access must end when a person is suspended
  • Accounts should belong to a person in the identity provider

critical high medium low  ·  Read-only wherever the provider allows it. The connection wizard tests every permission before anything is saved.

Every source, as a table
SourceChecksObject typesWhat it reads
Google Workspace3012users, groups, admin roles, Chrome devices, browsers & policies, mobile devices, mail forwarding, third-party app grants
GitHub308organization settings, members, repositories, rulesets, deployment environments, secrets (names and reach, never values)
Okta2814users & authenticators, apps, sign-on & authentication policies, admin roles, API tokens, network zones, ThreatInsight
Your domains273every DNS record, SPF, DKIM, DMARC, MTA-STS, CAA, DNSSEC, registration, dangling records, DMARC reports
Microsoft Entra ID269users, authentication methods, conditional access, role assignments, applications & service principals
Amazon Web Services2412IAM users, roles & policies, S3 buckets, KMS keys, security groups, CloudTrail, Route 53
Slack226members, workspaces, apps, channels, user groups
OneLogin217users, apps, policies, privileges, mappings
Linear95workspace security settings, teams, webhooks
Google Cloud85service accounts & keys, IAM bindings, Cloud DNS, reserved addresses
Namecheap32registrations: expiry, auto-renew, transfer lock
DigitalOcean23DNS zones, reserved and Droplet addresses
Across systems6—orphaned access, suspended but still active, not in the identity provider, unmatched, admin without MFA, dormant
Total23686

Questions it answers before the auditor asks

Each of these used to be an afternoon in somebody’s console. Open any of them.

Identity and access

Who left, but still has the keys?

Tell Certifly which system decides who works here. Anyone gone from it but still active in GitHub, Slack or AWS is orphaned access, critical when the account is an admin. Suspensions get a grace period first, so somebody on leave is not a fire.

Is “a.ade” on GitHub the same person as amy@ in Okta?

Accounts are correlated into people from what the providers report. Each link shows the value that made it, a wrong one can be separated, and a GitHub handle with no email can be joined to its owner by hand.

Did the quarterly access review actually remove anyone?

A review snapshots every live account, and each one is kept or revoked with a reason. A revoked account reads awaiting removal until an import sees it gone. The CSV your auditor gets says who decided, when, and when removal was confirmed.

How did this contractor end up a Super Administrator?

The access path: the account, the group it is in, the rule that put it there, and the role at the end, drawn as a graph with every route listed.

Policies, controls and frameworks

What did the access policy say in March?

Every version is kept, and a published one can never be edited. Each member presses I have read and accept, a new version asks again, and the acknowledgments export to CSV. Existing PDFs import as drafts.

Where do we stand on SOC 2?

SOC 2, ISO 27001, HIPAA, PCI DSS, NIST CSF and NYDFS Part 500 map through common controls to yours. Each requirement reads failing, not covered, automated, performed, evidenced, attested or not applicable. You get the breakdown, not a percentage.

Did anyone actually do the manual control this month?

Manual controls run on a schedule. A period that ends with nothing recorded opens a deficiency on its own. Operating tests sample performances from a recorded seed, and a deficiency closes only on a passing retest.

Can the auditor see it without us making them an account?

Open a Type I or Type II audit period and issue a read-only link with an expiry. Every view is logged. Export the control matrix, an evidence pack, or OSCAL.

Which evidence is about to lapse?

Evidence has an owner, a renewal cadence and a file. Thirty days before it lapses a reminder goes out, and when it does, the requirements it covered go back to not covered.

Findings

Is the ticket fixed, or just closed?

Findings route to a Linear team or a Jira project by severity and system. Marking the issue done makes Certifly re-check the setting. The finding closes only when an import sees the fix, and if it doesn’t, the issue is reopened.

Who decided we could live with this, and until when?

An exception needs a reason and a review date, recorded under the name of whoever made it. Require a second approver for any severity. Nobody can approve their own, and an expired exception counts again.

What changed in Okta yesterday, and who did it?

Every import is versioned and rendered as readable text, so a changed policy reads as three changed lines. Diff any two versions beside the provider’s own admin log for the time between them.

Can we prove the import wasn’t tampered with?

Every line of an import’s run log is hash-chained to the one before, and the chain is sealed when the run ends. The export says whether the log is complete and unaltered.

Domains and email

Which subdomain could someone else take over?

A CNAME to a deleted app or S3 bucket, an address in AWS, Google Cloud or DigitalOcean you no longer hold, a subdomain delegated to nameservers that don’t serve it. Hostnames come from certificate transparency logs and from your DNS hosts’ zones, checked hourly.

Are we ready for p=reject?

Point your DMARC rua at Certifly and see every sender and how much of its mail is aligned. Once 98% has passed for fourteen days, it tells you to enforce. Reports are accepted only from senders that pass DMARC themselves.

Did someone just change our MX record?

Every record change is kept with before and after. Changes to nameservers, MX or the apex alert Slack or your webhook, and when AWS recorded the edit, the change says who made it.

Running it

Can we make everyone sign in through Okta?

Okta, OneLogin, Entra ID, Google Workspace, JumpCloud or any OpenID Connect provider. Require it, map groups to roles, and end sessions with Okta Universal Logout. Admins keep a break-glass way in, and every use is recorded and alerted.

Who changed the session length?

The audit log records every change to sign-on, access, members, integrations and domains, with who made it and from which address. Nobody can edit or delete an entry, Certifly included.

Will the AI read our secrets?

AI is off until an admin turns it on. The assistant reads only what the person asking could already see, never changes anything, and is never sent credentials. Bring your own Anthropic key if you’d rather.

The connection broke. What permission is missing?

Validate connection re-tests every permission and names the one that went missing, with the command to grant it filled in. Credentials are write-only once saved.

What it looks like

Policies / Access Control / Controls The controls of an access-control policy, each beside the live state of the audit check that tests it: four failing with open counts, one unverified because nothing tests it.
A policy, and whether it is true Controls sit beside the live state of the checks that test them. Not tested is its own state, never a soft pass. Example data. Every name and identifier shown is generated.
Findings / Open / By rule The findings list grouped by audit check, each row showing a rule with its severity, who owns it, and how many findings and entities it is raising.
Findings, grouped by check One rule firing on eighty entities is one row with a count, not eighty rows saying the same sentence. Example data. Every name and identifier shown is generated.
Identities / Amy Ade / Accounts One person's correlated accounts: six accounts across GitHub, Okta and Slack, each showing the value that attached it and a control to reject it.
One person, every account they hold Each row shows the value that attached it, and a wrong one can be separated. Example data. Every name and identifier shown is generated.
Findings / Okta admin / Access path A graph of how access was obtained: an account, the groups it belongs to, the rule that assigned it, and the role that grants the permission, with the eight routes listed underneath.
How the access was actually obtained The account, the group, the rule that put them in it, and the role at the end. Example data. Every name and identifier shown is generated.
Dashboard Dashboard showing overall posture and open findings by severity, the findings that need attention, and connector health.
What needs attention Open findings by severity, what is assigned to you, and which connectors are healthy. Example data. Every name and identifier shown is generated.

What we ask your providers for

Twelve of the fourteen Google Workspace scopes are read-only. Two are not, and it is worth saying why rather than rounding the number up.

Reading a mailbox’s forwarding configuration requires gmail.settings.basic, and Google publishes no read-only equivalent. We chose it over gmail.readonly, which would let us read the mail itself, and we deliberately do not request gmail.settings.sharing, which is what actually authorizes changing forwarding. Listing the third-party apps each person has granted access requires admin.directory.user.security, the only scope Google offers for it. It could revoke those grants. Certifly only lists them.

Everywhere else the ask is read-only: SecurityAudit on AWS, reviewer roles on Google Cloud, Read.All Graph permissions on Entra ID, read-only app permissions on GitHub.

What it does not do

Certifly is a tool for finding things, not a certification and not a substitute for one. A field your credential cannot read is reported as unknown, never as compliant. It does not change your systems either: an access review records the decision to revoke, and Certifly confirms it when the next import sees the account gone.

A finding is a prompt to look. A clean result is not a promise.

How your data is handled

Credentials are sealed at rest and never displayed back to you. The server refuses to connect to private or link-local addresses. Issues opened in your tracker carry what was found and how to fix it, never configuration values or credentials. There is no analytics, no telemetry and no third-party JavaScript; this page loads nothing from anywhere else, fonts included.

For the data about your people that an import brings in, you are the controller and we are your processor. The privacy policy was written from an audit of the running system rather than from a template.

Connect one system. See what it says about you.

The free plan runs every check and shows every finding, with single sign-on, and it does not expire.