A service principal in Azure DevOps is essentially a security identity that allows you to authenticate and authorize access to your Azure DevOps resources.
To create a service principal, you'll need to register an application in Azure Active Directory, which will then be used to authenticate and authorize access to your Azure DevOps resources.
Service principals can be used to automate tasks, deploy code, and manage resources in Azure DevOps, making them an essential tool for DevOps teams.
By using a service principal, you can separate the identity of your automation tools from your personal identity, reducing the risk of security breaches.
Creating a Service Principal
Creating a Service Principal is a crucial step in Azure DevOps. You can create a service principal in the Azure portal, and it will be automatically created by Azure Pipeline when you connect to an Azure subscription from inside a pipeline definition.
To create a service principal manually, you can use the Azure CLI. Simply login to the Azure Portal, open the Azure cloud shell, and enter the command `az ad sp create-for-rbac -n ServicePrincipalName`. Replace `ServicePrincipalName` with your desired value, and you'll get a JSON output that you'll need later.
A service principal is a representation of an application object for a given tenant, and it's used to access resources in Azure. You can create a system-assigned managed identity or a user-assigned managed identity, depending on your needs.
To add a service principal to an Azure DevOps organization, you'll need to enter the application or managed identity's display name. If you're a Project Collection Administrator (PCA), you can also grant a service principal access to specific projects and assign a license.
Here are the steps to create a service principal using the Azure CLI:
- Login to the Azure Portal.
- Open the Azure cloud shell and select Bash.
- Enter the command `az ad sp create-for-rbac -n ServicePrincipalName` and replace `ServicePrincipalName` with your desired value.
- Copy the JSON output to notepad or a text file.
- Grant contributor permission to the service principal by going to the Subscriptions section in Azure portal, selecting Access control (IAM), and adding a role assignment.
- Enter the following command to get the Azure Subscription ID: `az account show`.
Remember to replace `ServicePrincipalName` with your desired value, and make sure to copy the JSON output and the subscription ID to notepad or a text file for later use.
Configure Managed Identities
To configure managed identities, you'll need to decide which type to create: system-assigned or user-assigned. System-assigned managed identities are tied to the lifecycle of an Azure service instance and are automatically deleted when the resource is deleted. User-assigned managed identities, on the other hand, are standalone Azure resources that can be assigned to one or more instances of an Azure service.
You can create a system-assigned managed identity by enabling it directly on an Azure service instance. This is a convenient option, but keep in mind that only that Azure resource can use this identity to request tokens from Microsoft Entra ID. A user-assigned managed identity, however, can be used by multiple instances of an Azure service.
Here are the key differences between system-assigned and user-assigned managed identities:
To create a user-assigned managed identity, you'll need to create a new Azure resource and assign it to the instances of an Azure service that need to use it. This gives you more flexibility and control over the identity, but also requires more setup and management.
In either case, managed identities eliminate the need for developers to manage credentials, as Microsoft Entra ID takes care of credential management and rotation. This is a significant security benefit, as it reduces the risk of credential exposure and makes it easier to manage access to Azure resources.
Azure DevOps Integration
To integrate a service principal with Azure DevOps, you'll need to add it to your organization. This can be done through the Users page or with the ServicePrincipalEntitlements APIs.
As a Project Collection Administrator (PCA), you can grant a service principal access to specific projects and assign a license. If you're not a PCA, you'll need to reach out to one to update project memberships or license access levels.
You can only add a managed identity or service principal for the tenant your organization is connected to, so make sure you're working within the correct boundaries.
Add Principal to Organization
To add a service principal to your Azure DevOps organization, you'll need to follow these steps. You can do this through the Users page or with the ServicePrincipalEntitlements APIs.
First, you'll need to enter the application or managed identity's display name. If you're using the ServicePrincipalEntitlements API, make sure to pass in the service principal's object id and not the application's object id.
A user account with the necessary permissions is required to add the service principal. This can be a Project Collection Administrator (PCA), Project Administrator, or Team Administrator, depending on the organization's policies.
If you're a PCA, you can also grant the service principal access to specific projects and assign a license. If not, you'll need to reach out to the PCA for assistance.
Here are the possible user accounts that can add a service principal to your organization:
Remember, you can only add a managed identity or service principal for the tenant your organization is connected to. If you need to access a managed identity in a different tenant, you'll need to check the FAQ for a workaround.
Bring Your Own UI
You can bring your own Service Principal for an Azure Container Registry connection, which is a great way to integrate your existing Azure setup with Azure DevOps.
To do this, select "Others" as the type during the creation experience.
The required information includes the Docker Registry URL, Docker ID, and Docker Password.
These are the client ID and secret you created for your Service Principal in Azure.
Give the connection a name, decide on Grant access permission to all pipelines, and click Save.
Here's a quick rundown of the required fields:
The UI might not be the most user-friendly, but it gets the job done.
What's Covered
You'll see how to create a service principal, which is a crucial step in deploying an app to an Azure resource from Azure Pipelines. A service principal is essentially an identity for your application, and it needs to have the right permissions to access Azure resources.
A service principal can be automatically created by Azure Pipeline when you connect to an Azure subscription from inside a pipeline definition or when you create a new service connection from the project settings page. However, it's recommended to manually create one using the Azure CLI to have a pre-defined set of permissions.
You'll also learn how to grant contributor permission to the service principal, which is necessary for it to access Azure resources.
In addition, you'll discover the benefits of using managed identities, which eliminate the need for developers to manage credentials and secrets.
Here are the key topics covered in this article:
- Creating a service principal using Azure CLI
- Granting contributor permission to the service principal
- Using managed identities for secure authentication
- Integrating Azure Key Vault with Azure Pipelines
Authentication and Authorization
Authentication and Authorization is a crucial aspect of using Azure DevOps Service Principals. You can use the Microsoft Entra ID token to authenticate to Azure DevOps resources.
Service Principals can be added to Microsoft Entra ID groups, but they won't be displayed in a list of group members due to a technical limitation. However, they still inherit any group permissions set on top of the Microsoft Entra ID group they belong to.
To authenticate a Service Principal, you need to explicitly add it to an organization, as sign-in isn't possible for service principals. This is because the process of materialization requires a user to sign in to the organization for the first time.
Service Principals can't be organization owners or create organizations, and they can't create tokens like personal access tokens (PATs) or SSH Keys. They can generate their own Microsoft Entra ID tokens, but these tokens have limitations.
Here are the key differences between Service Principals and standard user accounts:
- Service Principals can be added to security groups and teams
- Service Principals can be assigned to any access level
- Service Principals can be removed from the organization
- Service Principals can use the Service Principal Graph APIs to perform CRUD operations
It's worth noting that Service Principals and Managed Identities are treated the same as new identities in an organization with defined permissions.
Frequently Asked Questions
What is the difference between Azure DevOps service principal and managed identity?
Service Principal is ideal for apps requiring specific access and control, while Managed Identity automates login details for seamless Azure integration
Sources
- https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/service-principal-managed-identity
- https://blog.yannickreekmans.be/bring-your-own-service-principal-for-an-azure-container-registry-connection-in-azure-devops/
- https://www.azuredevopslabs.com/labs/vstsextend/azurekeyvault/
- https://jeffbrown.tech/terraform-workload-identity-azure-devops/
- https://devblogs.microsoft.com/devops/introducing-service-principal-and-managed-identity-support-on-azure-devops/
Featured Images: pexels.com