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.
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.
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
09:00:02 okta_user pulled 412 · changed 3
09:00:04 okta_role_assignment pulled 19
09:00:05 evaluating 28 okta checks…
09:00:05critical Admin amy.ade@example.com (Super Administrator) has SMS and Okta Verify enrolled; neither is phishing-resistant.
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.
service accounts & keys, IAM bindings, Cloud DNS, reserved addresses
Namecheap
3
2
registrations: expiry, auto-renew, transfer lock
DigitalOcean
2
3
DNS zones, reserved and Droplet addresses
Across systems
6
—
orphaned access, suspended but still active, not in the identity provider, unmatched, admin without MFA, dormant
Total
236
86
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
A policy, and whether it is trueControls 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
Findings, grouped by checkOne 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, every account they holdEach 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
How the access was actually obtainedThe 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
What needs attentionOpen 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.