Nebius
Bring your Nebius AI Cloud tenant into the JupiterOne graph for exposure management and access reviews — the tenant and its projects, compute instances with their private and public IP addresses, hostname and DNS name, object-storage buckets with whether anonymous access is enabled, tenant user accounts with their email address and name, service accounts, IAM groups and their members, and the access permits that grant roles to each group. Find publicly reachable instances and public buckets, see which service account each instance runs as, and answer who has which role by following user to group to role. The integration reads resource configuration only: bucket contents, instance cloud-init user data and user phone numbers and profile photos are never ingested.
- Installation
- Authorization
- Data Model
- Types
Installation
This integration connects to Nebius AI Cloud using the Nebius AI Cloud REST API (https://api.nebius.cloud) and ingests your tenant and its projects, compute instances, object-storage buckets, tenant user accounts, service accounts, IAM groups, group memberships and access permits. It is built for exposure management (which instances and buckets are reachable from the internet) and access reviews (who holds which role through which group). The integration authenticates as a Nebius service account, every request is read-only, and it is managed by JupiterOne and runs in the JupiterOne cloud, so no collector is needed.
Prerequisites
- A Nebius AI Cloud tenant.
- A Nebius account that can create service accounts and add them to groups. Nebius requires membership in a group with the
adminrole in the tenant or project, such as the defaultadminsgroup. openssl(or another tool) to generate an RSA key pair.- Access to JupiterOne with permission to configure integrations.
Configuration in Nebius
The integration authenticates with a service-account authorized key. You upload the public half of an RSA key pair to a service account and give JupiterOne the private half. On each run the integration signs a short-lived JWT (RS256) with the private key and exchanges it at https://auth.eu.nebius.com/oauth2/token/exchange for a Bearer access token, which authorizes every API request. The private key itself is never sent to Nebius.
Each integration instance ingests one tenant: the tenant that contains the service account. To ingest another tenant, create a service account there and a separate integration instance.
Create the service account
- In the Nebius web console, open Administration → IAM.
- Click Create resource, then Service account.
- Confirm the service account name, select the project to create it in, and click Create and continue.
You can also create it with the Nebius CLI: nebius iam service-account create --name <service_account_name>. Note the service account ID (serviceaccount-...); nebius iam service-account get-by-name --name <service_account_name> returns it.
Grant read access
Nebius grants roles to groups, not directly to service accounts. Add the service account to a group that holds the viewer role across the tenant. The simplest option is the default viewers group, which Nebius creates in every tenant with the tenant-wide viewer role:
- In Administration → IAM, open the Groups tab and open the
viewersgroup. - Click Add members, switch to the Service accounts tab, and click Add next to the service account.
With the CLI: nebius iam group-membership create --parent-id <group_ID> --member-id <service_account_ID>.
We recommend granting the role at the tenant level. Users, groups and access permits are read from the tenant, and the integration lists the tenant's projects to find everything else. The integration never writes to Nebius, so editor and admin are not needed.
The Nebius viewer role is read-only for configuration, but Nebius documents that it also lets the holder access data in resources, for example download objects from buckets. The integration never reads bucket objects or other resource data. Nebius also offers a security-auditor role, which grants read-only access to resource configuration without the data in them and is intended for third-party security tools. The integration was built against viewer; if you use a custom group with security-auditor instead, run the integration once and check the job log for permission errors.
Create the authorized key
-
Generate an RSA key pair:
openssl genrsa -out private.pem 4096 && \openssl rsa -in private.pem -outform PEM -pubout -out public.pem -
In Administration → IAM, open the Service accounts tab and open the service account.
-
Click Upload authorized key, click Attach file and select
public.pem. Optionally set an expiration date, then click Upload key. -
The key appears on the Authorized keys tab. Copy its ID (
publickey-...).
With the CLI: nebius iam auth-public-key create --account-service-account-id <service_account_ID> --data "$(cat public.pem)".
You now have the three values JupiterOne needs: the service account ID, the authorized key ID, and the private key (private.pem). Store the private key somewhere safe. If you set an expiration date on the key, the integration stops ingesting when it expires, until you upload a new key and update the instance.
Configuration in JupiterOne
To install the Nebius integration in JupiterOne, navigate to the Integrations tab in JupiterOne and select Nebius. Click New Instance to begin configuring your integration.
Creating an instance requires the following:
-
The Account Name used to identify the Nebius account in JupiterOne. Ingested entities will have this value stored in
tag.AccountNamewhen theAccountNametoggle is enabled. -
Description to assist in identifying the integration instance, if desired.
-
Polling Interval that you feel is sufficient for your monitoring needs. You may leave this as
DISABLEDand manually execute the integration. -
The Authentication fields below.
Authentication fields
| Field | Required | Description |
|---|---|---|
| Service Account ID | Yes | The ID of the service account created above (serviceaccount-...). |
| Authorized Key ID | Yes | The ID of the authorized key uploaded to the service account (publickey-...). |
| Private Key (PEM) | Yes | The RSA private key paired with the authorized key. Paste the full contents of private.pem, including the BEGIN and END lines. |
When you save the instance, JupiterOne checks that all three fields are set, signs a JWT and exchanges it for an access token, then reads the service account's own profile (GET /iam/v1/profiles). A malformed or non-RSA private key, an unknown key or service account, or a rejected request fails the check.
Filters
The filter is optional. Leave it empty to ingest every project in the tenant.
| Field | Default | Description |
|---|---|---|
| Project IDs | Empty (all projects in the tenant) | Ingest only these Nebius projects, by project ID. Applies to projects and to the compute instances, buckets and service accounts inside them. If none of the IDs match a project, no project data is ingested. |
Project IDs does not limit tenant-wide data: users, groups, group memberships and access permits are always read for the whole tenant. A group member or an instance's service account that lives in a project outside the filter is not ingested, so no relationship is created to it.
Narrowing Project IDs later removes data from JupiterOne. Projects that no longer match, and the compute instances, buckets and service accounts in them, are deleted from the graph on the next run.
Click Create once all values are provided to finalize the integration.
Data Sources
Each data source can be enabled or disabled on its own. All data sources are disabled by default, so enable the ones you want to ingest. The nebius_account entity for the tenant and the nebius_project entities for its projects are always created, because every other data source depends on them.
| Data Source | Description | Entities Created |
|---|---|---|
| Fetch Users | Tenant user accounts, with their email address, name, username, state and federation ID. | nebius_user |
| Fetch Groups | IAM groups in the tenant. | nebius_group |
| Fetch Group Memberships | Which users and service accounts belong to each group. Requires Fetch Users, Fetch Groups and Fetch Service Accounts. | Relationships only |
| Fetch Service Accounts | Service accounts in each ingested project. | nebius_service_account |
| Fetch Compute Instances | Compute instances (virtual machines) in each ingested project, with their private and public IP addresses, hostname, DNS name and state. | nebius_compute_instance |
| Fetch Buckets | Object-storage buckets in each ingested project, with whether anonymous access is enabled, versioning, default storage class, audit logging, domain name and region. | nebius_bucket |
| Fetch Access Permits | Access permits granted to each ingested group: the role, and the tenant, project or resource it applies to. Requires Fetch Groups. | nebius_access_role |
To ingest everything the integration supports, enable all seven data sources.
Fetch Group Memberships must be enabled together with Fetch Users, Fetch Groups and Fetch Service Accounts, and Fetch Access Permits must be enabled together with Fetch Groups. If a data source they depend on is disabled, they do not run at all and no memberships or access permits are ingested.
Relationships are built only when every data source they need is enabled:
| Relationship | Requires |
|---|---|
nebius_account HAS nebius_project | Always created |
nebius_account HAS nebius_user | Fetch Users |
nebius_account HAS nebius_group | Fetch Groups |
nebius_project HAS nebius_compute_instance | Fetch Compute Instances |
nebius_project HAS nebius_bucket | Fetch Buckets |
nebius_project HAS nebius_service_account | Fetch Service Accounts |
nebius_group HAS nebius_user | Fetch Group Memberships (with Users, Groups and Service Accounts) |
nebius_group HAS nebius_service_account | Fetch Group Memberships (with Users, Groups and Service Accounts) |
nebius_compute_instance USES nebius_service_account (the service account the instance runs as) | Fetch Compute Instances and Fetch Service Accounts |
nebius_access_role ASSIGNED nebius_group | Fetch Access Permits and Fetch Groups |
With Fetch Service Accounts disabled, compute instances are still ingested, but without the USES relationship.
Users
Nebius returns only the profile attributes each user has chosen to share with the tenant. A user whose attributes are not shared, or could not be read, is still ingested, named by its Nebius account name or ID, without email or name. A user is isActive: true when Nebius reports the account state as ACTIVE.
Groups and access permits
Groups are listed at the tenant level, so groups created inside a project are not ingested, and neither are the access permits granted to them. Each access permit becomes a nebius_access_role entity named after its role, with the granted role in role and the ID of the tenant, project or resource it applies to in resourceId.
Public instances and buckets
A compute instance has public: true when any of its network interfaces has a public IP address, or a private address in a public IP range. A bucket has public: true when Nebius reports anonymous access as enabled; when that status is missing, it is true if the bucket policy has a rule for anonymous access.
Example queries
Publicly available buckets:
FIND nebius_bucket WITH public = true
Compute instances with a public IP address, and the service account each one runs as:
FIND nebius_compute_instance WITH public = true AS i
THAT USES nebius_service_account AS sa
RETURN i.displayName, i.publicIpAddresses, sa.displayName
Everyone who holds the admin role, through which group, and where:
FIND nebius_access_role WITH role = 'admin' AS r
THAT ASSIGNED nebius_group AS g
THAT HAS (nebius_user | nebius_service_account) AS m
RETURN m.displayName, g.displayName, r.resourceId
Errors and permissions
The integration lists compute instances, buckets and service accounts project by project, and group memberships and access permits group by group:
- If Nebius denies access (
401or403) for any project or group, the step fails with an authorization error. Data from that step's previous run is kept rather than deleted. - If a project or group is not found (
404), it is skipped and the step continues. - Any other error fails the step.
If the integration cannot read the service account's profile, or the project the service account belongs to, it cannot resolve the tenant. The Fetch Account step then fails and no tenant data is ingested.
What the integration does not collect
- Bucket objects and other data stored in resources.
- Instance cloud-init user data, which often holds secrets. It is removed before the instance is stored.
- User phone numbers, profile photos, locale and time zone.
- Authorized keys, or any other credential material.
- Encryption state and data classification of buckets. Nebius does not expose them on the bucket, so
encryptedandclassificationare left empty. - Other Nebius resources, such as networks, disks, Kubernetes clusters and container registries.
Rate limits
The integration does not throttle its own requests. When Nebius answers with 429 Too Many Requests, it waits for the time given in the Retry-After header (30 seconds when the header is missing) before retrying. Requests that fail with a 5xx error or a network error are also retried, up to three attempts in total. Access tokens last 12 hours; if Nebius rejects the token with 401 or 403, the integration requests a new one and retries once.
Next steps
Now that your integration instance has been configured, it will begin running on the polling interval you provided, populating data within JupiterOne. Continue on to our Instance management guide to learn more about working with and editing integration instances.
Additional resources
- Authentication in the Nebius AI Cloud REST API — service-account authorized keys and the JWT token exchange
- Managing service accounts
- Authorized keys for service accounts
- Groups — default groups and how roles are granted to groups
- Adding members to groups
- Managing custom groups and access permits
- Roles —
viewer,security-auditorand the other roles - Nebius AI Cloud REST API reference
Permissions
IAM permissions that must be granted to the integration principal for data ingestion.
Show Permissions (6)
compute.instances.listiam.accessPermits.listiam.groupMemberships.listiam.groups.listiam.serviceAccounts.liststorage.buckets.list
Roles
RBAC roles that must be assigned to the integration principal.
Show Roles (2)
security-auditorviewer
Endpoints
API endpoints that the integration makes requests to.
Show Endpoints (9)
GET /compute/v1/instancesGET /iam/v1/access-permitsGET /iam/v1/group-memberships/list-membersGET /iam/v1/groupsGET /iam/v1/service-accountsGET /iam/v1/tenant-user-account-with-attributesGET /storage/v1/bucketsGET https://api.nebius.cloud/iam/v1/profilesGET https://api.nebius.cloud/iam/v1/projects/{id}
Documentation Links
Links to provider documentation relevant to setup and configuration.
Show Documentation Links (11)
- https://docs.nebius.com/iam/authorization/groups/manage
- https://docs.nebius.com/iam/authorization/roles
- https://docs.nebius.com/iam/service-accounts/manage
- https://docs.nebius.com/rest-api/authentication
- https://docs.nebius.com/rest-api/iam/v1/tenant-user-account-with-attributes/list
- https://docs.nebius.com/terraform-provider/reference/data-sources/compute_v1_instance
- https://docs.nebius.com/terraform-provider/reference/data-sources/iam_v1_access_permit
- https://docs.nebius.com/terraform-provider/reference/data-sources/iam_v1_group
- https://docs.nebius.com/terraform-provider/reference/data-sources/iam_v1_group_membership
- https://docs.nebius.com/terraform-provider/reference/data-sources/iam_v1_service_account
- https://docs.nebius.com/terraform-provider/reference/data-sources/storage_v1_bucket
Per-Step Breakdown
Detailed authorization requirements for each ingestion step.
Show all steps (2)
| Step | Permissions | Roles | Endpoints |
|---|---|---|---|
| Fetch Access Permits | iam.accessPermits.list | viewer | GET /iam/v1/access-permits |
| Fetch Group Memberships | iam.groupMemberships.list | viewer | GET /iam/v1/group-memberships/list-members |
Entities
The following entities are created:
| Resources | Entity _type | Entity _class |
|---|---|---|
| Access Role | nebius_access_role | AccessRole |
| Account | nebius_account | Account |
| Bucket | nebius_bucket | DataStore |
| Compute Instance | nebius_compute_instance | Host |
| Group | nebius_group | UserGroup |
| Project | nebius_project | Group |
| Service Account | nebius_service_account | User |
| User | nebius_user | User |
Relationships
The following relationships are created:
Source Entity _type | Relationship _class | Target Entity _type |
|---|---|---|
nebius_access_role | ASSIGNED | nebius_group |
nebius_account | HAS | nebius_project |
nebius_account | HAS | nebius_user |
nebius_account | HAS | nebius_group |
nebius_compute_instance | USES | nebius_service_account |
nebius_group | HAS | nebius_user |
nebius_group | HAS | nebius_service_account |
nebius_project | HAS | nebius_service_account |
nebius_project | HAS | nebius_compute_instance |
nebius_project | HAS | nebius_bucket |
Nebius Access Role
nebius_access_role inherits from AccessRole
| Property | Type | Description | Specifications |
|---|---|---|---|
permitId * | string | The Nebius access permit id. | |
resourceId * | string | null | Id of the resource the role is scoped to. | |
role * | string | The granted role name (e.g. 'viewer', 'editor'). |
Nebius Account
nebius_account inherits from Account
| Property | Type | Description | Specifications |
|---|---|---|---|
tenantId * | string | The Nebius tenant id that owns the ingested resources. |
Nebius Bucket
nebius_bucket inherits from DataStore
| Property | Type | Description | Specifications |
|---|---|---|---|
bucketId * | string | The Nebius bucket id (unique within Nebius). | |
defaultStorageClass * | string | null | Default storage class for uploads (e.g. 'STANDARD', 'INTELLIGENT'). | |
domainName * | string | null | Public domain name of the bucket. | |
isVersioningEnabled * | boolean | null | Whether object versioning is enabled (versioningPolicy == ENABLED). | |
objectAuditLogging * | string | null | Which requests are audit-logged ('NONE', 'MUTATE_ONLY', or 'ALL'). | |
region * | string | null | Region the bucket resides in. | |
state * | string | null | Lifecycle state of the bucket (e.g. 'ACTIVE'). |
Nebius Compute Instance
nebius_compute_instance inherits from Host
| Property | Type | Description | Specifications |
|---|---|---|---|
instanceId * | string | The Nebius compute instance id (unique within Nebius). | |
state * | string | null | Vendor VM lifecycle state (e.g. 'RUNNING', 'STOPPED', 'ERROR'). |
Nebius Group
nebius_group inherits from UserGroup
| Property | Type | Description | Specifications |
|---|---|---|---|
groupId * | string | The Nebius group id (unique within the tenant). | |
state * | string | null | Group state reported by IAM (e.g. 'ACTIVE'). |
Nebius Project
nebius_project inherits from Group
| Property | Type | Description | Specifications |
|---|---|---|---|
containerState * | string | null | Lifecycle state of the project container (e.g. 'ACTIVE'). | |
projectId * | string | The Nebius project id (unique within the tenant). | |
region * | string | null | The region the project resides in. |
Nebius Service Account
nebius_service_account inherits from User
| Property | Type | Description | Specifications |
|---|---|---|---|
serviceAccountId * | string | The Nebius service account id. |
Nebius User
nebius_user inherits from User
| Property | Type | Description | Specifications |
|---|---|---|---|
federationId * | string | null | Federation id of the linked global user account, when present. | |
state * | string | null | Account state reported by IAM ('ACTIVE', 'INACTIVE', 'BLOCKED'). | |
userId * | string | The Nebius tenant user account id. |