Azure AD with Launchpad
This chapter discusses preparing Azure AD for use with Kubernetes.
Page Contents
Overview
You can use Azure AD as your identity provider (IdP) when using Stardog Launchpad.
Our goal in this tutorial is to do the following:
-
Show the commands needed to register Stardog as an application an Azure AD.
-
Show the commands help to show when automating in a CI/CD pipeline.
This page only covers how to set up Azure AD via the CLI.
Prerequisites
Commands:
Setup
Setting up the environment
Log in to Azure using the instructions found here.
Set the environment variable SUBSCRIPTION
to the one you want to work with. You can see available subscriptions with:
az account subscription list
Then you can set it with:
export SUBSCRIPTION=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Registering the Stardog Application
You can get your TENANT_ID
with the following command:
export AZURE_TENANT_ID=$(az account list | \
jq -r --arg SUBSCRIPTION $SUBSCRIPTION '.[] | select (.id == $SUBSCRIPTION).tenantId)'
This command does the following to set the AZURE_TENANT_ID
variable:
az account list
: Gets a list of all the subscriptions for the logged-in account.jq -r
: Processes the output as raw strings.--arg SUBSCRIPTION $SUBSCRIPTION
sets a variable insidejq
’s environment.'.[]
iterates over the entire list of subscriptions returned byaz account list
.select (...)
: Uses a filter to extract thetenantId
for the subcription whoseid
matches the id we stored in$SUBSCRIPTION
.
Now we’re ready to create the application. For the remainder of this tutorial, we’ll assume the application is called “Stardog Application (dev)”.
export AZURE_STARDOG_APP_ID=$(az ad app create --display-name "Stardog Apps (dev)" --sign-in-audience AzureADMyOrg --web-redirect-uris https://[your company's endpoint]/oauth/azure/redirect --enable-access-token-issuance true --enable-id-token-issuance --query appId --output tsv)
This command does the following to set the AZURE_STARDOG_APP_ID
variable:
az ad app create
: Creates a new application registration in Azure AD.--display-name "Stardog Apps (dev)"
: This sets the display name, as mentioned above.--sign-in-audience AzureADMyOrg
: Specifies the sign-in audience for the application. Intended for users in the same organization as the Azure AD tenant.--web-redirect-uris https://[your company's endpoint]/oauth/azure/redirect
: Sets the rediect URI for the application. After a user signs in, Azure AD will redirect them to this URI.--enable-access-token-issuance true
: Enables the issuance of access tokens and ID tokens for the application.--query appId
: Extracts just theappId
value from the full output of the application creation command. TheappId
is the unique identifier for the application in Azure AD.--output tsv
: Specifies the output of the command should be in TSV (Tab-Separated Values) format.
If the application is already registered, you can set AZURE_STARDOG_APP_ID
like this:
AZURE_STARDOG_APP_ID=$(az ad app list | jq -r --arg APP_NAME "Stardog Apps (dev)" '.[] | select (.displayName == $APP_NAME).appId')
Setting up the application
Create a service principal for the application like so:
az ad sp create –id $AZURE_STARDOG_APP_ID
Then get the Object ID associated with the application, which will we need to create the scope:
AZURE_STARDOG_OBJECT_ID=$(az ad app show --id $AZURE_STARDOG_APP_ID --query id --output tsv)
Now add the identifierUri
:
az rest --method PATCH --uri https://graph.microsoft.com/v1.0/applications/$AZURE_STARDOG_OBJECT_ID --headers 'Content-Type=application/json' --body "{'identifierUris':[ 'api://$AZURE_STARDOG_APP_ID' ]}"
This command does the following:
az rest
: Makes a REST API call to Azure services.--method PATCH
: Use thePATCH
method in the API call. PATCH is used to apply partial modifications to a resource.--uri https://graph.microsoft.com/v1.0/applications/$AZURE_STARDOG_OBJECT_ID
: Specifies the URI of the REST API endpoint. It targets the Microsoft Graph API endpoint for modifying an Azure AD application.$AZURE_STARDOG_OBJECT_ID
, which we just set, contains the Object ID of the Stardog application.--headers 'Content-Type=application/json'
: Specifies the Content-Type header asapplication/json
, indicating the request body is in JSON format.--body "{'identifierUris':[ 'api://$AZURE_STARDOG_APP_ID' ]}"
: This is the request body of thePATCH
request. It’s settingidentifierUris
to include the$AZURE_STARDOG_APP_ID
we set earlier.
Permission Scope
Permission Scope Definition
Next we need to prepare a JSON definition file based on the following template:
{
"api": {
"oauth2PermissionScopes": [
{
"adminConsentDescription": "openid",
"adminConsentDisplayName": "openid",
"id": "",
"isEnabled": true,
"type": "User",
"userConsentDescription": "openid",
"userConsentDisplayName": "openid",
"value": "openid"
},
{
"adminConsentDescription": "Directory.Read.All.",
"adminConsentDisplayName": "Directory.Read.All",
"id": "",
"isEnabled": true,
"type": "User",
"userConsentDescription": "Directory.Read.All",
"userConsentDisplayName": "Directory.Read.All",
"value": "Directory.Read.All"
},
{
"adminConsentDescription": "profile",
"adminConsentDisplayName": "profile",
"id": "",
"isEnabled": true,
"type": "User",
"userConsentDescription": "profile",
"userConsentDisplayName": "profile",
"value": "profile"
},
{
"adminConsentDescription": "email",
"adminConsentDisplayName": "email",
"id": "",
"isEnabled": true,
"type": "User",
"userConsentDescription": "email",
"userConsentDisplayName": "email",
"value": "email"
}
]
}
}
We recommend saving this file as ad_oauth2PermissionScopes.json
.
You will need to add values for the following 4 variables:
SCOPE_OPEN_ID
SCOPE_READ_ALL_ID
SCOPE_PROFILE_ID
SCOPE_EMAIL_ID
To do this, you can run the uuidgen
command 4 times in your shell and copy and paste the values into your definition file.
The above template is Mustache-compatible, so the scope definition process can be easily automated.
Applying the Permission Scope
You can apply your permission scope with:
az rest --method PATCH --uri https://graph.microsoft.com/v1.0/applications/$AZURE_STARDOG_OBJECT_ID --headers 'Content-Type=application/json' --body @/path/to/ad_oauth2PermissionScopes.json
You can check the scope with the following command:
az ad app show --id $AZURE_STARDOG_APP_ID --query api.oauth2PermissionScopes
Authorized Definition
Now we need to add a definition to tell Azure AD the client is authorized. Create a JSON definition file based on the following template:
{
"api": {
"preAuthorizedApplications": [
{
"appId": "",
"delegatedPermissionIds": [
"",
"",
"",
""
]
}
]
}
}
Replace the variables with the same values used in ad_oauth2PermissionScopes.json
. We recommend saving this file as ad_oauth2AuthorizedClient.json
.
Then run the following command:
az rest --method PATCH --uri https://graph.microsoft.com/v1.0/applications/$AZURE_STARDOG_OBJECT_ID --headers 'Content-Type=application/json' --body @/path/to/ad_oauth2AuthorizedClient.json
Groups
Group setup
Now we need to make sure the groups Stardog relies on actually exist. For the purposes of this exercise, we will assume you simply use the defaults, which are:
stardog_reader
stardog_writer
stardog_admin
To check whether they exist, you can run the following command:
az ad group list | jq -r --arg group 'stardog_admin' '.[]| select(.displayName == $group) | .displayName == $group'
(Replace stardog_admin
with whichever group you’re testing.)
If this command does not return true, you can create the group with the following command:
az ad group create --display-name stardog_admin --mail-nickname stardog_admin
Group Membership
To get a list of your group members, run:
az ad group member list --group stardog_admin | jq '.[] | .displayName '
To add a member to a group, you need their member ID. You can list your users, find the member to add via their userPrincipleName
, and store their ID in a variable called ID
:
ID=$(az ad user list | jq -r --arg upn 'person@example.com' '.[] | select(.userPrincipalName == $upn) | .id')
Then add them to the group:
az ad group member add --group stardog_admin --member-id $ID
If you simply want to add yourself, you can use this command to retrieve the current user’s ID:
ID=$(az ad signed-in-user show | jq .id -r)
Getting info required for Stardog Helm Chart
The only thing left is to link Stardog with Azure AD. We will need the following environment variables for our Helm Chart:
AZURE_TENANT_ID
: Defined above.AZURE_STARDOG_APP_ID
: Defined above.AZURE_CLIENT_SECRET
: Can be defined as follows:AZURE_CLIENT_SECRET=$(az ad app credential reset --id $AZURE_STARDOG_APP_ID --display-name puppy | jq -r '.password')