Code Monkey home page Code Monkey logo

graph-azure's People

Contributors

a-u-h-g avatar aiwilliams avatar andrew8xx8 avatar austin-rausch avatar austinkelleher avatar dependabot-preview[bot] avatar dependabot[bot] avatar dhaiwat10 avatar edreyer1 avatar ericanagle1 avatar erkangz avatar extremex avatar gastonyelmini avatar gonzalo-avalos-ribas avatar j1-internal-automation avatar jablonnc avatar jakeferrero avatar janettelynch avatar jayson-jensen-pro avatar jfish7 avatar jzolo22 avatar keionnederousselle avatar mknoedel avatar ndowmon avatar nick-ncsu avatar ronaldeam avatar rpgph avatar tuffmastermind avatar vdubber avatar zemberdotnet avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

graph-azure's Issues

Question-driven development: Azure Permissions

I'm trying to figure out the best way to add entities/relationships so that we can answer useful questions for azure users.

Given the following goal:
Find all azure principals that have the ability to delete key vaults in the ndowmon-j1dev key vault

Pseudocode:

FIND principal (user, user group, or service principal) \\ could be any of the three
  THAT IS ASSIGNED roleDefinition
  THAT (ALLOWS?) scope (management group, subscription, resource group, or resource) 
  WHERE roleDefinition.notAllows !== Microsoft.KeyVault/vaults/delete and 
        roleDefinition.allows === Microsoft.KeyVault/vaults/delete and
        resource.name === ndowmon-j1dev
FIND (azure_user|azure_user_group|azure_service_principal)
   THAT ASSIGNED azure_role_definition
   THAT ALLOWS (
      azure_keyvault WITH name = key-vault-id OR
      azure_resource_group THAT HAS azure_keyvault WITH name = key-vault-id OR
      azure_subscription THAT HAS azure_resource_group THAT HAS azure_keyvault WITH name = key-vault-id
   )
   WHERE 
      azure_role_definition.notAllows !== (
         * OR 
         */delete OR 
         Microsoft.KeyVault/*/delete OR 
         Microsoft.KeyVault/vaults/delete
      ) AND 
      azure_role_definition.allows === (
         * OR
         */delete OR
         Microsoft.KeyVault/*/delete OR 
         Microsoft.KeyVault/vaults/delete
      )

Questions:

  1. Should the services on azure_role_definition.allows become an entity? I think they should just be fields on azure_role_definition but maybe it would be better to say something like THAT ALLOWS Microsoft.KeyVault WITH notAllows !== (* OR */delete OR vaults/delete) AND allows == (* OR */delete OR vaults/delete.
  2. Does the J1QL allow for a more elegant parsing syntax so that we wouldn't need to use (* OR */delete ...) for string matching these RBAC permissions?
  3. Does J1QL implement any traversal shortcuts for the target scope (keyvault, resource group or subscription)? Something like the * (0 or more) quantifier in regular expressions, e.g. THAT ALLOWS (* THAT HAS)* azure_keyvault WITH name = key-vault-id.
  4. Does the relationship ALLOWS make sense for azure_role_definition --ALLOWS--> (azure_subscription|azure_resource_group|<azure_resource (azure_keyvault, etc...)>)

As a comparison, here's a query to look at specific access to an IAM resource:
EDIT: This query is "Which users have access to production data stores via cross-account IAM assume role trusts?"

Find User as user 
   that ASSIGNED aws_iam_role as assignedRole 
   that TRUSTS aws_iam_role as crossAcctRole 
   that ASSIGNED AccessPolicy as policy 
   that ALLOWS as permission DataStore with tag.Production=true as ds 
return 
   user._type, 
   user.displayName, 
   assignedRole.tag.AccountName, 
   assignedRole.displayName, 
   crossAcctRole.tag.AccountName, 
   crossAcctRole.displayName, 
   policy.displayName, 
   permission.displayName, 
   permission.actions, 
   permission.resources, 
   ds.tag.AccountName, 
   ds._type, 
   ds.displayName, 
   ds.classification, 
   ds.encrypted, 
   ds.webLink

Database `encrypted` property flaps when provider API errors occur

An API error occurs at times when requesting transparentDataEncryptions ("The gateway did not receive a response from 'Microsoft.Sql' within the specified time period."), so sometimes we don't have the data for the encrypted property. This then causes the entity in the graph to be bumped on _version, but the raw data is not bumped because the value for encrypted is not found in the database response, but the transparentDataEncryptions response.

We need to avoid changing the encrypted property when we experience transient errors, otherwise alerts and whatnot can be generated with false positives.

Ingest Security Tasks

API

Alerts on security events that happened on the subscription
Alerts by Resource Group
Recommended tasks that will help improve the security of the subscription proactively
Tasks by Resource Group

Entities

Azure Resource _type of the Entity _class of the Entity
Security Alert azure_sequrity_alert Task
Security Task azure_sequrity_task Task

Relationships

From Type To
azure_account HAS azure_sequrity_alert
azure_resource_group HAS azure_sequrity_alert
azure_account HAS azure_sequrity_task
azure_resource_group HAS azure_sequrity_task

Ingest Storage Account data protection properties

For each applicable azure_storage_account entity, ingest additional properties for blob service data protection. We currently ingest blobSoftDeleteEnabled and blobSoftDeleteRetentionDays but tracking and other recovery information should also be ingested:

Screen Shot 2021-04-30 at 2 18 27 PM

Add Azure AD Roles & Administrators

The Azure integration currently ingests RBAC roles, but there are roles and administrators associated specifically with Azure Active Directory that should be ingested.

AzureAD 'User.mail' can be null

In some cases (e.g. personal Azure accounts), the mail field may be null. If the field returns null, it breaks entity validation for the User entity.

Azure also supports otherMails: string[], which is most likely present for azure personal accounts. It's doesn't appear that the target endpoint in DirectoryGraphClient.iterateUsers returns the otherMails property at the moment, unfortunately.

Ingest Networking Resources

API

All Virtuall Networks
Virtual Networks in Resource Group

Subnets in Virtual Network
Application Security Groups by Resource Group
Interface Endpoins (relation between interface and subnets)

Firewalls in subsciption

Entities

Azure Resource _type of the Entity _class of the Entity
Virtual Network azure_virtual_network Network
Subnet azure_subnet Network
Security Group azure_sequrity_group Firewall
Firewall azure_firewall Firewall

Relationships

From Type To
azure_account HAS azure_virtual_network
azure_virtual_network HAS azure_subnet
azure_resource_group HAS azure_sequrity_group
azure_account HAS azure_firewall

StorageAccount.endpoints can include array of objects

The JupiterOne data model disallows arrays of non-primitive types in entity properties. The endpoints property on azure_storage_account entities is an array that usually contains only strings, but can in some cases contain objects. When this occurs, synchronization fails with

Error: Error uploading collected data (API response: code=ENTITY_UPLOAD_FAILED_VALIDATION, message="1 validation error(s):- Error in entities[0].endpoints (reason=OBJECTS_WITHIN_ARRAYS_NOT_ALLOWED)

Log if RoleAssignment.scope is found in the job state, but not matched to _type

If the RoleAssignment.scope is found in the job state, we create a relationship between RoleAssignment and <scope>. However, we're explicitly defining dependsOn steps and targetType metadata to ensure the integration and its documentation captures all target entities that we're currently ingesting.

If a scope is found in the jobState, but _type is not matched, we should alert with a log message that the developer should add dependsOn and _type matcher.

Related to #146

Ingest Computing Resources

API

Virtual Machines in Recource Group
Disks in the Subscription
Application Gateways in subscription
Load Balancers
Alert Rules - List By Resource Group

Entities

Azure Resource _type of the Entity _class of the Entity
Virtual Machine azure_virtual_machine Host
Disk azure_disk Disk
Virtual Machine SshPublicKey azure_vm_public_key AccessKey
Network Interface azure_network_interface Network
Application Gateway azure_applicaiton_gateway Gateway
Application Gateway SSL Certificate azure_appgw_certificate Certificate
Load Balancer azure_load_balancer Gateway
Monitoring Alert Rule azure_monitoring_alert_rule Task

Relationships

From Type To
azure_account HAS azure_virtual_machine
azure_account HAS azure_disk
azure_virtual_machine HAS azure_vm_public_key
azure_virtual_machine HAS azure_disk
azure_virtual_machine HAS azure_network_interface
azure_applicaiton_gateway HAS azure_network_interface
azure_applicaiton_gateway USES azure_key_vault_certificate
azure_applicaiton_gateway USES azure_applicaiton_gateway_certificate
azure_resource_group HAS azure_monitoring_alert_rule
azure_resource_group HAS azure_virtual_machine

Ingest Azure Container Instances

Azure Container Instances offers the fastest and simplest way to run a container in Azure, without having to provision any virtual machines and without having to adopt a higher-level service. For more information, see the Azure Container Instances overview.

API

Conainers in Subscription

Entities

Azure Resource _type of the Entity _class of the Entity
Conainer azure_container Task
Container Group azure_container_group Project

Relationships

From Type To
azure_account HAS azure_container_group
azure_container_group HAS azure_container

Add `azure_vm|USES|azure_storage_container`

Azure VMs can use either "managed" disks or "unmanaged" disks. "Managed" disks are an entity of their own, and this integration properly creates azure_vm|USES|azure_managed_disk relationships.

However, "unmanaged" disks refer to data stored in a storage account's blob container. These relationships are not being created currently, but the entities have the storage container ID, so they should be added.

Security Groups cannot create `DENIES` relationships

Upgrading the SDK to v3.0.0 introduces type checking for relationship _class. The azure integration was previously using the Denies relationship class for certain relationships between security groups.

function securityGroupRuleRelationshipClass(rule: Rule): string {

In order to complete the major version bump, I'm going to remove the DENIES relationships in security groups. However, It'd be great to add the DENIES type to the SDK and add these relationships back in the future.

Ingest Database Services

API

Cosmos Database Accounts in Subscription
Cosmos Databases for Account
Maria DB Servers
Maria DB Database by Server
MySQL DB Servers
MySQL DB Database by Server
[Postgresql Servers]https://docs.microsoft.com/en-us/rest/api/postgresql/servers/list
[Postgresql Databases by Server]https://docs.microsoft.com/en-us/rest/api/postgresql/databases/listbyserver
Redis Caches
Azure SQL Servers
Azure SQL Databases by Server

Entities

Azure Resource _type of the Entity _class of the Entity
Cosmos Database Account azure_cosmos_db_account Cluster
Cosmos Database azure_cosmos_db_database Database
Maria DB Server azure_maria_db_server Cluster
Maria DB Database azure_maria_db_database Database
MySQL DB Server azure_mysql_server Cluster
MySQL DB Database azure_mysql_database Database
Postgresql Server azure_postgresql_server Cluster
Postgresql Database azure_postgresql_database Database
Azure SQL Server azure_sql_server Cluster
Azure SQL Database azure_sql_database Database
Redis Cache Instance azure_redice_cache Database

Relationships

From Type To
azure_account HAS azure_cosmos_db_account
azure_account HAS azure_maria_db_server
azure_maria_db_server HAS azure_maria_db_database
azure_account HAS azure_mysql_server
azure_mysql_server HAS azure_mysql_database
azure_account HAS azure_postgresql_server
azure_postgresql_server HAS azure_postgresql_database
azure_account HAS azure_sql_server
azure_sql_server HAS azure_sql_database
azure_account HAS azure_redice_cache

Each DB has its own Firewall settings which could be ingested as well.

Storage Accounts fail with unparsed XML

Understand & handle the following error in storage accounts:

22:04:55.744Z ERROR Local: Step "Storage Accounts" failed to complete due to error. (errorCode="UNEXPECTED_ERROR", errorId="472281fb-6ad1-4607-978c-fea4012372c4", reason="Unexpected error occurred executing integration! Please contact us in Slack or at https://support.jupiterone.io if the problem continues to occur.") (stepId=rm-storage-resources, errorId=472281fb-6ad1-4607-978c-fea4012372c4)
  RestError: Error "SyntaxError: Unexpected token  in JSON at position 0" occurred while parsing the response body - <?xml version="1.0" encoding="utf-8"?>
  <StorageServiceProperties><Cors/><DeleteRetentionPolicy><Enabled>false</Enabled></DeleteRetentionPolicy></StorageServiceProperties>.
      at new RestError (/home/nick/projects/github/graph-azure/node_modules/@azure/storage-blob/node_modules/@azure/core-http/dist/index.js:2359:28)
      at errorHandler (/home/nick/projects/github/graph-azure/node_modules/@azure/storage-blob/node_modules/@azure/core-http/dist/index.js:3288:17)
      at runMicrotasks (<anonymous>)
      at processTicksAndRejections (internal/process/task_queues.js:97:5)

Normalize ingested properties to J1 data model

The J1 data model specifies properties that are intended to represent a normalization across all integrations which ingest data classified in the model. For example, all class: "User" entities should have an email, username, etc. This is particularly important for properties such as createdOn (defined for all entities), when a value for that property can be determined. Without this normalization, the query and presentation power of J1 is diminished.

Regarding User entities, it is important to understand that these will be mapped to a Person entity automatically, in order to support finding all user records across data providers which belong to an actual person. It is reasonable to make Person entity properties such as lastName, a good rule for normalizing User properties such as surname (transfer provider surname to User entity property lastName).

Here is the mapping that occurs for other integrations, showing how properties on User entities are transferred to the automatically created Person entities:

{
      "sourceFilter": {
        "_type": [
          "OR",
          ["==", "okta_user"],
          ["==", "google_user"]
        ],
        "employeeType": [
          "AND",
          ["!=", "bot"],
          ["!=", "generic"],
          ["!=", "service"],
          ["!=", "shared"],
          ["!=", "system"]
        ],
        "userType": [
          "AND",
          ["!=", "bot"],
          ["!=", "generic"],
          ["!=", "service"],
          ["!=", "shared"],
          ["!=", "system"]
        ]
      },
      "relationshipProperties": {
        "_class": "IS"
      },
      "relationshipDirection": "FORWARD",
      "targetFilterKeys": [["_class", "email"]],
      "propertyMappings": [
        {
          "sourceProperty": "email",
          "targetProperty": "email",
          "transforms": [
            "toLowerCase"
          ]
        },
        {
          "sourceProperty": ["firstName", "lastName"],
          "targetProperty": "displayName",
          "delimiter": " "
        },
        {
          "sourceProperty": ["firstName", "lastName"],
          "targetProperty": "name",
          "delimiter": " "
        },
        {
          "sourceProperty": "firstName",
          "targetProperty": "firstName"
        },
        {
          "sourceProperty": "lastName",
          "targetProperty": "lastName"
        },
        {
          "targetValue": "Person",
          "targetProperty": "_class"
        },
        {
          "targetValue": "employee",
          "targetProperty": "_type"
        },
        {
          "sourceProperty": "employeeType",
          "targetProperty": "employeeType"
        },
        {
          "sourceProperty": "employeeNumber",
          "targetProperty": "employeeId"
        },
        {
          "sourceProperty": "username",
          "targetProperty": "userIds"
        },
        {
          "sourceProperty": "title",
          "targetProperty": "title"
        },
        {
          "sourceProperty": "manager",
          "targetProperty": "manager"
        },
        {
          "sourceProperty": "managerId",
          "targetProperty": "managerId"
        },
        {
          "sourceProperty": "managerEmail",
          "targetProperty": "managerEmail"
        },
        {
          "sourceProperty": "bitbucketUsername",
          "targetProperty": "bitbucketUsername"
        },
        {
          "sourceProperty": "githubUsername",
          "targetProperty": "githubUsername"
        }
      ]
    },

Can't Retrieve Diagnostic Settings For Azure Storage Resources

We are currently unable to retrieve Diagnostic Settings for Azure Storage resources (Tables, Queues, Blobs, File Shares). Retrieving Diagnostic Settings for Azure Storage resources is needed to complete CIS Benchmark 3.3, Ensure Storage logging is enabled for Queue service for read, write, and delete requests (Manual).

This benchmark requires that you ensure that the Diagnostic Settings for Storage Queues has a Status that is set to Off and it's Queue Properties include Read, Write, and Delete under the Logging section.

These settings and properties are listed in the classic version of Diagnostic Settings.

Screen Shot 2021-01-12 at 12 20 59 PM

We were unable to find an npm package (Azure Client) that allows us to retrieve classic Diagnostic Settings for Azure Storage resources. We were also unable to find a way to create classic Diagnostic Settings using Terraform for Azure resources.

It seems as though the classic Diagnostic Settings are being phased out in favor of new Diagnostic Settings. Azure is calling these settings preview Diagnostic Settings.

Screen Shot 2021-01-12 at 12 25 17 PM

These 'preview' settings seem to be the same version of Diagnostic Settings that we were able to successfully retrieve for other Azure resources to complete other CIS Benchmarks, and come from the same Azure Monitor Client that we've been using.

When attempting to use Terraform to create preview Diagnostic Settings for Azure Storage resources, as we've successfully done for other Azure resources, we received the following errors.

Screen Shot 2020-12-31 at 1 38 46 PM

This is odd, considering that Azure's documentation says that the newer, preview version of Diagnostic Settings are supported for Azure Storage Resources.

Screen Shot 2020-12-31 at 1 38 12 PM

It may be that Terraform does not yet support the creation of preview Diagnostic Settings for Azure Storage resources, even though it supports the creation of Diagnostic Settings for other Azure resources.

Until we are able to find an Azure client that allows us to retrieve classic Diagnostic Settings, or Terraform allows us to create preview Diagnostics Settings for Azure Storage resources, we may not be able to complete or test CIS Benchmark 3.3, Ensure Storage logging is enabled for Queue service for read, write, and delete requests (Manual).

Ingest Azure Key Vault

Use Key Vault to safeguard and manage cryptographic keys and secrets used by cloud applications and services.

API

List Vaults in Subscription
Secrets by Vault
Keys by Vault
Certificates by Vault

Entities

Azure Resource _type of the Entity _class of the Entity
Vault azure_key_vault Group
Vault Key azure_key_vault_key AccessKey
Vault Secret azure_key_vault_secret AccessKey
Vault Certificate azure_key_vault_certificate Certificate

Relationships

From Type To
azure_account HAS azure_key_vault
azure_key_vault HAS azure_key_vault_key
azure_key_vault HAS azure_key_vault_secret
azure_key_vault HAS azure_key_vault_certificate

Match roleAssignment -> scopes _only_ where explicit

I have discussed with @aiwilliams that we don't want to generate any placeholder entities for role assignment -> scope targets. If the entity is not found, we should not create a relationship.

The simple implementation creates a problem: what happens if we have a role assignment that points to a known entity type (ex. azure_keyvault_service) that for some reason is not found with jobState.findEntity(keyvaultId)? We want to log that the entity was not found, so developers can see if there is something wrong with the implementation of role_assignment->keyvault_service relationships.

Simply logging any time an entity is not found, however, will create noise for many, many entities that we're not ingesting yet. So we should first check if the resourceId matches a pattern we expect to ingest before looking for that entity. (/subscriptions/<s-id>/resourceGroups/<rg-id>/providers/Microsoft.KeyVault/vaults/<v-id>)

However, if we only create relationships when we explicitly know the matching resource ID pattern, it requires that developers always add matching patterns for new resource entities. If an entity does exist in the job state, but there is not matcher, we should alert developers so they can add the new matching pattern and create relationships between role_assignment and the new entity type.

Since we want to be able to check if a target scope exists in the jobState, the step which generates role-assignment->scope relationships needs to run as late as possible in the dependency tree. This would require a change to the SDK.

Clients should not re-auth every time they are created.

Every time a new client is created, a new call to /tokens and /subscriptions endpoints are executed. When new clients are instantiated over and over, this causes a ton of additional unnecessary API calls. We should be able to cache this information for re-use across clients.

Ingest CDN Settings

APIs:

List CDN Profiles in Subscription
List Endpoints in CDN Porfile
List Origins in CDN Porfile

Entities

Azure Resource _type of the Entity _class of the Entity
CDN Profile azure_cdn_profile Group
CDN Endpoint azure_cdn_endpoint Gateway
CDN Origin azure_cdn_origin Project
CDN Domain azure_cdn_domain Domain

Relationships

From Type To
azure_account HAS azure_cdn_profile
azure_cdn_profile HAS azure_cdn_endpoint
azure_cdn_endpoint HAS azure_hostname
azure_cdn_origin HAS azure_hostname

Resource groups must be lowercased for relationships

Ingest all Role Definitions

Currently, the azure integration ingests ONLY role definitions that are associated with a role assignment.

Also, add azure_subscription HAS azure_role_definition relationships.

Fix typing on `ListResourcesEndpoint` so type assertions are no longer required

Oftentimes, Azure ARM resource clients don't conform directly with what we have defined as a ListResourcesEndpoint and developers use a pattern of type asserting as below:

     resourceEndpoint: {
        list: async () =>
          serviceClient.eventSubscriptions.listByResource(
            resourceGroupName,
            providerNamespace,
            type,
            name,
          ),
        linkNext: serviceClient.eventSubscriptions.listByResourceNext,
      } as ListResourcesEndpoint,

This can lead to non-compliant interfaces, and the ListResourcesEndpiont type should be updated so that type assertions are no longer required.

Error when credentials are invalid

When user credentials are invalid, an exception is raise, killing the integration.

{ error_executing: Unexpected error occurred executing integration! We're looking into it.
    at invokeExecutionHandler (webpack:///./src/integration/execution/invokeExecutionHandler.ts?:25:13)
    at process._tickCallback (internal/process/next_tick.js:68:7)
  _cause:
   TypeError: Cannot read property 'map' of undefined
       at Object.fetchAzureData [as default] (./jupiter-integration-azure/src/azure/fetchAzureData.ts:13:12)
       at process._tickCallback (internal/process/next_tick.js:68:7),
  code: undefined,
  statusCode: undefined,
  expose: true,
  correlationId: undefined,
  name: 'error_executing' }

The AzureClient needs some work done to handle non-200 responses.

Ingest RBAC Data

Ingest Resource Groups from Azure Data service and connect it with users and groups. This data requires to connect things together across Azure services

Resource Groups - List

Roles - List
Roles by Resource Group
Use RBAC to manage access Example

Entities

Azure Resource _type of the Entity _class of the Entity
Account azure_account Account
Resource Group azure_resource_group Group

Relationships

From Type To
azure_account HAS azure_resource_group
azure_resource_group HAS azure_user
azure_region HAS azure_group
azure_user ASSIGNED azure_resource_group
azure_group ASSIGNED azure_resource_group

Ingest App Services

Azure App Service used to run web apps, mobile app back ends, and API apps in Azure. Detailed overview.

App Services
Service Cerificates
Certificates

Entities

Azure Resource _type of the Entity _class of the Entity
Account azure_account Account
Site azure_site Project
Hostname azure_hostname Domain
Resource Group azure_resource_group Group
Certificate azure_appservice_certificate Certificate

Relationships

From Type To
azure_account HAS azure_resource_group
azure_account HAS azure_site
azure_site HAS azure_hostname
azure_site HAS azure_appservice_certificate
azure_resource_group HAS azure_site
azure_region HAS azure_site
azure_user MANAGES azure_site
azure_user_group MANAGES azure_site

Create Role Definition Permission to Scope relationship

Azure Role Definitions enumerate permissions using four fields:

"permissions": [
  {
    "actions": [
      "*"
    ],
    "notActions": [
      "Microsoft.Authorization/*/Delete",
      "Microsoft.Authorization/*/Write",
      "Microsoft.Authorization/elevateAccess/Action",
      "Microsoft.Blueprint/blueprintAssignments/write",
      "Microsoft.Blueprint/blueprintAssignments/delete"
    ],
    "dataActions": [],
    "notDataActions": []
  }
]

Stop logging "Unhandled storage account service!"

Initially, only blob and file storage account services were enabled in this integration, but a few months back the two remaining services (queue and table) were added.

The integration wrongly logs a message about unhandled storage account services.

Ingest Azure Management Groups

Ingest Azure Management Group entities and associated relationships. In particular, RBAC roles should create ASSIGNED relationships where applicable with Azure Management Groups.

Azure API sometimes throws `FeatureNotSupportedForAccount` for queues and tables

According to Azure API documentation, Tables and Queues are available in storage accounts of kind "General-purpose V1" (Storage) and "General-purpose V2" (StorageV2). In some cases, API calls to /storageAccounts/<storage-account>/queueServices/default/queues (or /tableServices/default/tables) return 400 errors with FeatureNotSupportedForAccount Queue is not supported for the account.

This has only been seen on storage accounts with kind: 'Storage', but it doesn't necessarily rule out issues with kind: 'StorageV2'.

`role_assignment-><principal>` relationships should be mapped if config.ingestActiveDirectory=false

We create direct relationships between azure_role_assignment and principals including azure_user, azure_group, azure_service_principal etc. If the integration instance has the ingestActiveDirectory flag set to false, then it will not be possible to create the required relationships.

If the config value is set to false, we should generate mapped relationships instead of direct relationships.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.