The console’s connector form lists every capability for every provider. A connector that asks for a capability its provider does not support is refused, so select only the ones in the table.
Rules that apply to every connector
Credentials references
Connector credentials are never typed into the console. The connector form asks for a credentials reference, which is a name, and NHI Security refuses a reference that looks like a secret. The name must resolve to an entry your deployment holds, or the synchronization fails with aconfiguration_error before any provider call. There are two ways an entry comes to exist:
- In your deployment’s configuration, registered by whoever operates your TRUSTIVAN deployment. This is the route for a first connector, and the only route for the AWS mode that uses the deployment’s own identity.
- Through the API, by an Organization Admin:
POST /nhi/api/v1/credentials/materialstores the values encrypted at rest. The console has no screen for it, and it attaches the material to an identity that is already in your inventory, so it cannot be used before a first connector has synchronized.
Endpoints
- Public HTTPS only, on port 443, 6443 or 8443. Private, loopback, link-local, carrier-grade NAT and cloud metadata addresses are refused, as are
localhostand names ending in.internal,.localor.localdomain. A provider reachable only inside your network, such as a private Kubernetes API server or an internal Vault, cannot be connected today. - Permitted hosts only. AWS and GitHub have built-in permitted hosts. Kubernetes and Vault have built-in hosts for managed offerings, and any other host must be allowed by your deployment operator. MCP has no built-in hosts at all.
- For GitHub, Kubernetes, Vault and MCP, the hostname is resolved and every resolved address is checked, redirects are refused, and responses are size-limited.
People are left out
A human’s account never enters the inventory or the graph. Where a provider cannot tell a machine from a person, the account is either excluded or recorded asunknown, never guessed from its name.
Last use is shown only where the provider reports it
Of the five, only AWS reports last use, and only for roles and access keys. Everywhere else NHI Security shows that last use is not reported, rather than implying the identity was never used. This is why thestale_identity policy reports identities from other providers as not assessable rather than as unused.
Requests are paced and retried
Each connector makes at most 10 requests per second. Throttling, timeouts and provider outages are retried with growing delays, up to three attempts in total, and a provider’sRetry-After is obeyed. Authentication and authorization failures are never retried.
AWS
Discovers the non-human identity surface of one AWS account per connector.What it collects
What it collects
Relationships:
ASSUMES (from each role’s trust policy), HAS_PERMISSION (attached managed and inline policies), BELONGS_TO (group membership), and ACCESSES to each specific ARN an inline Allow statement names.Ownership comes from tags, matched without regard to case. Owner, OwnerEmail, Owner_Email, Contact and ContactEmail are declared. Team, ManagedBy (and Managed-By, Managed_By), CreatedBy (and Created-By), BusinessUnit and aws:cloudformation:stack-name are inferred.Permissions it needs
Permissions it needs
iam:GetLoginProfile, iam:ListAccessKeys and iam:GetAccessKeyLastUsed if you set includeUsers to false, and drop iam:GetAccessKeyLastUsed alone if you set includeKeyLastUsed to false. Removing them without changing the setting records the affected users as unknown and marks the run partially_failed.Authentication
Authentication
In
assume_role mode the role’s trust policy must trust your deployment’s AWS principal and require the connector’s External ID, which is connector-<connector id> and is shown on the connector page. NHI Security generates it and always sends it; an external ID supplied in settings or credentials is refused.Before reading anything, on every health check and every synchronization, the connector calls sts:GetCallerIdentity and refuses to collect if the credentials belong to a different account from the one on the connector.Settings
Settings
Settings marked API only are not on the console form; set them with
PATCH /nhi/api/v1/connectors/{connectorId}. The account ID always comes from the connector’s scope, never from settings.What it does not do
What it does not do
- Managed policy documents are not read. The
HAS_PERMISSIONedge to a managed policy is drawn, but its statements are not collected. Denystatements are not recorded, and conditions are not evaluated. A conditionalAllowis recorded and flagged as conditional.NotActionandNotResourcestatements are recorded as wildcard grants. Access computed from AWS data is therefore an upper bound.- Account principals in trust policies are not expanded. A role that trusts
arn:aws:iam::123456789012:rootdoes not produce an edge from every principal in that account. - Resources are not discovered. Buckets, databases and other AWS resources are not collected.
- One account per connector. There is no AWS Organizations-wide discovery.
GitHub
Discovers the machine identities of one GitHub organization on github.com. GitHub Enterprise Server is not supported.What it collects
What it collects
Relationships: installations and bots
BELONGS_TO the organization; each installation HAS_PERMISSION for each App permission (for example contents:write); a bot HAS_PERMISSION for the organization admin role where it holds it.GitHub states no owner and no last use for installations or bots, so none is recorded.Permissions it needs
Permissions it needs
A fine-grained personal access token for the organization, with read access to the organization permissions that cover these calls:
To include private and internal repositories, give the token access to them.
Authentication and settings
Authentication and settings
One mode,
token. Your operator registers the token under the field name token. GitHub App authentication is not implemented.Turning off both
includeApps and includeBots is refused.What it does not do
What it does not do
- It does not discover Actions workflow identities, secrets, deploy keys or runners.
- It does not read the audit log or secret-scanning alerts.
- It does not know which repositories an installation can reach, so it draws no installation-to-repository edge.
- Its organization check is weak: any token can read a public organization, so a healthy result mainly proves that the next call, listing installations or members, was permitted.
Kubernetes
Discovers the ServiceAccounts of one cluster and what they are bound to.What it collects
What it collects
Pods and Secrets are never read.Ownership comes from annotations and labels.
owner, owners, owner-email, contact and contact-email are declared; team, managed-by, part-of, created-by, release-name and instance are inferred. A prefix such as example.com/owner is accepted.Permissions it needs
Permissions it needs
list only. For a cluster-wide connector:apps and batch rules are needed only while includeWorkloads is on. The health check also reads the API server’s /version, which Kubernetes normally allows to any authenticated caller.For a connector restricted to some namespaces, bind a Role with the namespaced rules in each of those namespaces, plus a ClusterRole with clusterrolebindings only. ClusterRoleBindings are always read, because they are how an account in one namespace gains permission everywhere.Authentication and settings
Authentication and settings
One mode,
token: a bearer token your operator registers under the field name token. A short-lived ServiceAccount token that you rotate is the best choice. Client certificates are not supported.The Endpoint is required: the cluster’s API server URL. Built-in permitted hosts are eks.amazonaws.com and azmk8s.io; other hosts must be allowed by your deployment operator. The API server’s certificate must be trusted by the deployment; there is no option to skip TLS verification.What it does not do
What it does not do
- It cannot detect a connector pointed at the wrong cluster, because Kubernetes has no cluster identity endpoint.
- Role and ClusterRole rules are not read, so the graph shows that an account is bound to
cluster-adminbut not whatcluster-admincontains. - A binding to the group
system:serviceaccounts:<namespace>is not represented. - Workload identity federation into Google Cloud or Azure produces no edge. It is mentioned only in the ServiceAccount’s evidence.
- Last use is not reported.
HashiCorp Vault
Discovers the machine identities of one Vault (HCP Vault, or a self-hosted Vault reachable over public HTTPS).What it collects
What it collects
Relationships: an AppRole
BELONGS_TO its auth mount; AppRoles and entities HAS_PERMISSION for their policies; entities AUTHENTICATES_WITH each alias’s mount; and, where an AWS auth alias names a full IAM ARN, an inferred ASSUMES edge from that AWS principal to the entity.An AppRole with bind_secret_id: false is called out in its evidence, because its role ID alone is enough to authenticate. Vault records no owner and no last use, so none is shown.Permissions it needs
Permissions it needs
list and read pair for each additional AppRole mount you configure. The policy never grants access to role IDs or secret IDs.Authentication and settings
Authentication and settings
The Endpoint is required.
hashicorp.cloud is permitted by default; other hosts must be allowed by your deployment operator.What it does not do
What it does not do
- It does not read AppRole secret ID accessors, so Vault contributes nothing to the credential inventory.
- It does not read the audit device, so last use is not reported.
MCP tool servers
Reads the tools a Model Context Protocol server publishes. It reports no identities: an MCP server answers whoever authenticates and does not know its callers.What it collects
What it collects
A tool with no hint, or only
destructiveHint, has effect unknown. An Organization Admin can declare any tool’s effect on its page.Capabilities (enabledCapabilities): tool_discovery, resource_discovery, relationship_discovery.What it needs
What it needs
For
bearer, your operator registers the token under the field name token. The connector only runs the initialize handshake and calls tools/list, so a token restricted to listing tools is enough.What it does not do
What it does not do
- It never calls a tool, and never reads MCP resources or prompts.
- It cannot say which agent uses which tool, or which resource a tool acts on. The protocol carries neither fact.
- It never decides what a tool does from its name or description.

