Manage Azure AD groups and members using Crossplane. This guide provides a step-by-step process to set up Crossplane, install the Azure AD provider, and manage Azure AD groups and members.
- Azure CLI installed and configured
- Kubernetes cluster running (e.g., using Kind)
- Helm installed
- K9s installed (optional)
- Kubectx and Kubens installed (optional)
kind create cluster
kubectx kind-kind
helm repo add \
crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane \
crossplane-stable/crossplane \
--namespace crossplane-system \
--create-namespace
kubens crossplane-system
kubectl get pods -n crossplane-system
kubectl api-resources | grep crossplane
cat <<EOF | kubectl apply -f -
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: provider-azuread
spec:
package: xpkg.upbound.io/upbound/provider-azuread:v1
EOF
kubectl get provider
az ad sp create-for-rbac --sdk-auth --name crossplane-azad > azuread-credentials.json
Ensure that the following permissions are assigned to the Azure AD App for the service principal:
Permission Name | Type | Description | Admin Consent |
---|---|---|---|
Group.ReadWrite.All | Application | Read and write all groups | Yes |
GroupMember.ReadWrite.All | Application | Read and write all group memberships | Yes |
User.Read.All | Application | Read all users' full profiles | Yes |
kubectl create secret generic azuread-secret -n crossplane-system --from-file=creds=./azuread-credentials.json
cat <<EOF | kubectl apply -f -
apiVersion: azuread.upbound.io/v1beta1
metadata:
name: default
kind: ProviderConfig
spec:
credentials:
source: Secret
secretRef:
namespace: crossplane-system
name: azuread-secret
key: creds
EOF
kubectl describe providerconfigs
cat <<EOF | kubectl apply -f -
apiVersion: groups.azuread.upbound.io/v1beta2
kind: Group
metadata:
annotations:
meta.upbound.io/apiversion: groups/v1beta1/group
labels:
azadgroup.upbound.io/name: aks-reader
name: aks-reader
spec:
deletionPolicy: Orphan
forProvider:
displayName: aks-reader
securityEnabled: true
providerConfigRef:
name: default
EOF
kubectl get managed
kubectl describe managed
cat <<EOF | kubectl apply -f -
apiVersion: groups.azuread.upbound.io/v1beta1
kind: Member
metadata:
annotations:
meta.upbound.io/apiversion: groups/v1beta1/member
meta.upbound.io/objectid: xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
meta.upbound.io/upn: yourname@example.com
labels:
azadmember.upbound.io/name: aks-reader-xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
name: aks-reader-xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
spec:
deletionPolicy: Delete
forProvider:
groupObjectIdSelector:
matchLabels:
azadgroup.upbound.io/name: aks-reader
memberObjectId: xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
providerConfigRef:
name: default
EOF
k9s --context kind-kind -n crossplane-system