Birden çok Azure uygulaması ve hizmeti arasında parolasız bağlantılar yapılandırma
Makale
Uygulamalar genellikle aynı anda birden çok Azure hizmeti arasında güvenli bağlantılar gerektirir. Örneğin, bir kurumsal Azure Uygulaması Service örneği birkaç farklı depolama hesabına, bir Azure SQL veritabanı örneğine, bir service bus'a ve daha fazlasına bağlanabilir.
Yönetilen kimlikler , Azure kaynakları arasındaki güvenli ve parolasız bağlantılar için önerilen kimlik doğrulama seçeneğidir. Bu görevlerin çoğu Azure tarafından dahili olarak ele alındığından, geliştiricilerin yönetilen kimlikler için birçok farklı gizli diziyi el ile izlemesi ve yönetmesi gerekmez. Bu öğreticide, yönetilen kimlikleri ve Azure Identity istemci kitaplığını kullanarak birden çok hizmet arasındaki bağlantıları yönetme adımları açıklanmaktadır.
Yönetilen kimlik türlerini karşılaştırma
Azure aşağıdaki yönetilen kimlik türlerini sağlar:
Sistem tarafından atanan yönetilen kimlikler doğrudan tek bir Azure kaynağına bağlanır. Bir hizmette sistem tarafından atanan yönetilen kimliği etkinleştirdiğinizde, Azure bağlı bir kimlik oluşturur ve bu kimlik için yönetim görevlerini dahili olarak işler. Azure kaynağı silindiğinde kimlik de silinir.
Kullanıcı tarafından atanan yönetilen kimlikler , bir yönetici tarafından oluşturulan ve bir veya daha fazla Azure kaynağıyla ilişkilendirilebilen bağımsız kimliklerdir. Kimliğin yaşam döngüsü bu kaynaklardan bağımsızdır.
Yönetilen kimlikler genellikle uygulama kodunuzda istemci kitaplığından Azure.Identity çağrılan DefaultAzureCredential bir sınıf aracılığıyla uygulanır. DefaultAzureCredential birden çok kimlik doğrulama yöntemini destekler ve hangilerinin çalışma zamanında kullanılması gerektiğini otomatik olarak belirler. Bu yaklaşım hakkında daha fazla bilgiyi DefaultAzureCredential genel bakış sayfasından okuyabilirsiniz.
Azure'da barındırılan bir uygulamayı birden çok Azure hizmetine Bağlan
Mevcut bir uygulamayı parolasız bağlantılar kullanarak birden çok Azure hizmetine ve veritabanına bağlamakla görevlendirildiniz. Aşağıdaki adımlar Azure Spring Apps, Sanal Makineler, Container Apps ve AKS gibi diğer Azure barındırma ortamları için de geçerli olsa da, uygulama Azure Uygulaması Hizmetinde barındırılan bir ASP.NET Core Web API'dir.
Bu öğretici aşağıdaki mimariler için geçerlidir, ancak en düşük yapılandırma değişiklikleriyle diğer birçok senaryoya da uyarlanabilir.
Aşağıdaki adımlarda, bir uygulamanın sistem tarafından atanan yönetilen kimliği kullanacak şekilde ve yerel geliştirme hesabınızın birden çok Azure Hizmetine bağlanacak şekilde nasıl yapılandırılması gösterilmektedir.
Sistem tarafından atanan yönetilen kimlik oluşturma
Azure portalında, diğer hizmetlere bağlanmak istediğiniz barındırılan uygulamaya gidin.
Hizmete genel bakış sayfasında Kimlik'i seçin.
Hizmet için sistem tarafından atanan yönetilen kimliği etkinleştirmek için Durum ayarını Açık olarak değiştirin.
Her bağlı hizmet için yönetilen kimliğe rol atama
Kimliğinize erişim izni vermek istediğiniz depolama hesabının genel bakış sayfasına gidin.
Rol arama kutusunda, blob verilerinde okuma ve yazma işlemleri gerçekleştirme izinleri veren Depolama Blob Veri Katkıda Bulunanı'nı arayın. Kullanım örneğiniz için uygun olan rolü atayabilirsiniz. Listeden blob veri katkıda bulunanı Depolama seçin ve İleri'yi seçin.
Rol ataması ekle ekranında, Erişim ata seçeneği içinYönetilen kimlik'i seçin. Ardından +Üye seç'i seçin.
Açılır öğede, uygulama hizmetinizin adını girerek oluşturduğunuz yönetilen kimliği arayın. Sistem tarafından atanan kimliği seçin ve açılır menüyü kapatmak için Seç'i seçin.
Rol atamasını tamamlamak için Gözden geçir ve ata'yı seçene kadar birkaç kez İleri'yi seçin.
Bağlanmak istediğiniz diğer hizmetler için bu işlemi yineleyin.
Yerel geliştirmeyle ilgili dikkat edilmesi gerekenler
Ayrıca, yönetilen kimliğinize roller atadığınız gibi bir kullanıcı hesabına roller atayarak yerel geliştirme için Azure kaynaklarına erişimi etkinleştirebilirsiniz.
Yönetilen kimliğinize Depolama Blob Veri Katkıda Bulunanı rolünü atadıktan sonra, Erişim ata'nın altında bu kez Kullanıcı, grup veya hizmet sorumlusu'na tıklayın. Açılır menüyü yeniden açmak için + Üye seç'i seçin.
E-posta adresine veya adına göre erişim vermek istediğiniz user@domain hesabını veya Microsoft Entra güvenlik grubunu arayın ve seçin. Bu, Visual Studio veya Azure CLI gibi yerel geliştirme araçlarınızda oturum açmak için kullandığınız hesapla aynı olmalıdır.
Not
Birden çok geliştiricisi olan bir ekip üzerinde çalışıyorsanız, bu rolleri bir Microsoft Entra güvenlik grubuna da atayabilirsiniz. Ardından, uygulamayı yerel olarak geliştirmek için erişmesi gereken herhangi bir geliştiriciyi bu grubun içine yerleştirebilirsiniz.
Projenizin içine NuGet paketine Azure.Identity bir başvuru ekleyin. Bu kitaplık, uygulamak DefaultAzureCredentialiçin gerekli tüm varlıkları içerir. Uygulamanızla ilgili diğer Tüm Azure kitaplıklarını da ekleyebilirsiniz. Bu örnekte, Azure.Storage.Blobs Blob Depolama ve Key Vault'a bağlanmak için ve Azure.KeyVault.Keys paketleri eklenir.
Dosyanızın Program.cs en üstüne aşağıdaki using deyimlerini ekleyin:
using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Security.KeyVault.Keys;
Proje kodunuzun Program.cs dosyasında, uygulamanızın bağlanacağı gerekli hizmetlerin örneklerini oluşturun. Aşağıdaki örnekler, karşılık gelen SDK sınıflarını kullanarak Blob Depolama ve service bus'a bağlanır.
var blobServiceClient = new BlobServiceClient(
new Uri("https://<your-storage-account>.blob.core.windows.net"),
new DefaultAzureCredential(credOptions));
var serviceBusClient = new ServiceBusClient("<your-namespace>", new DefaultAzureCredential());
var sender = serviceBusClient.CreateSender("producttracking");
Projenizin içine bağımlılığı pom.xml dosyanıza ekleyinazure-identity. Bu kitaplık, uygulamak DefaultAzureCredentialiçin gerekli tüm varlıkları içerir. Uygulamanızla ilgili diğer Tüm Azure bağımlılıklarını da ekleyebilirsiniz. Bu örnekte, azure-storage-blob Blob Depolama ve Key Vault'a bağlanmak için ve azure-messaging-servicebus bağımlılıkları eklenir.
Proje kodunuzda, uygulamanızın bağlanacağı gerekli hizmetlerin örneklerini oluşturun. Aşağıdaki örnekler, karşılık gelen SDK sınıflarını kullanarak Blob Depolama ve service bus'a bağlanır.
class Demo {
public static void main(String[] args) {
DefaultAzureCredential defaultAzureCredential = new DefaultAzureCredentialBuilder().build();
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
.endpoint("https://<your-storage-account>.blob.core.windows.net")
.credential(defaultAzureCredential)
.buildClient();
ServiceBusClientBuilder clientBuilder = new ServiceBusClientBuilder().credential(defaultAzureCredential);
ServiceBusSenderClient serviceBusSenderClient = clientBuilder.sender()
.queueName("producttracking")
.buildClient();
}
}
Projenizin içinde yalnızca kullandığınız hizmet bağımlılıklarını eklemeniz gerekir. Bu örnekte, spring-cloud-azure-starter-storage-blob Blob Depolama ve Key Vault'a bağlanmak için ve spring-cloud-azure-starter-servicebus bağımlılıkları eklenir.
Proje kodunuzda, uygulamanızın bağlanacağı gerekli hizmetlerin örneklerini oluşturun. Aşağıdaki örnekler, karşılık gelen SDK sınıflarını kullanarak Blob Depolama ve service bus'a bağlanır.
@Service
public class ExampleService {
@Autowired
private BlobServiceClient blobServiceClient;
@Autowired
private ServiceBusSenderClient serviceBusSenderClient;
}
Projenizin içinde, pakete başvuru eklemek için @azure/identity npm kullanın. Bu kitaplık, uygulamak DefaultAzureCredentialiçin gerekli tüm varlıkları içerir. Uygulamanızla ilgili diğer Azure SDK kitaplıklarını yükleyin.
Dosyanızın index.js en üstüne aşağıdaki deyimleri ekleyerek uygulamanızın bağlanacağı hizmetler için gerekli istemci sınıflarını içeri aktarın import :
import { DefaultAzureCredential } from "@azure/identity";
import { BlobServiceClient } from "@azure/storage-blob";
import { KeyClient } from "@azure/keyvault-keys";
Dosyanın içinde index.js , uygulamanızın bağlanacağı Azure hizmetleri için istemci nesneleri oluşturun. Aşağıdaki örnekler, karşılık gelen SDK sınıflarını kullanarak Blob Depolama ve Key Vault'a bağlanır.
// Azure resource names
const storageAccount = process.env.AZURE_STORAGE_ACCOUNT_NAME;
const keyVaultName = process.env.AZURE_KEYVAULT_NAME;
// Create client for Blob Storage using managed identity
const blobServiceClient = new BlobServiceClient(
`https://${storageAccount}.blob.core.windows.net`,
new DefaultAzureCredential()
);
// Create client for Key Vault using managed identity
const keyClient = new KeyClient(`https://${keyVaultName}.vault.azure.net`, new DefaultAzureCredential());
// Create a new key in Key Vault
const result = await keyClient.createKey(keyVaultName, "RSA");
Bu uygulama kodu yerel olarak çalıştırıldığında, DefaultAzureCredential kullanılabilir ilk kimlik bilgileri için bir kimlik bilgisi zincirinde arama yapacaktır. Managed_Identity_Client_ID yerel olarak null ise, yerel Azure CLI veya Visual Studio oturum açma bilgilerinizden kimlik bilgilerini otomatik olarak kullanır. Bu işlem hakkında daha fazla bilgiyi Azure Kimlik kitaplığına genel bakış sayfasından okuyabilirsiniz.
Uygulama Azure'a dağıtıldığında, DefaultAzureCredential değişkeni app service ortamından otomatik olarak alır Managed_Identity_Client_ID . Bu değer, uygulamanızla yönetilen bir kimlik ilişkilendirildiğinde kullanılabilir hale gelir.
Bu genel işlem, uygulamanızın herhangi bir kod değişikliğine gerek kalmadan yerel olarak ve Azure'da güvenli bir şekilde çalışmasını sağlar.
Birden çok yönetilen kimlik kullanarak birden çok uygulama Bağlan
Önceki örnekteki tüm uygulamalar aynı hizmet erişim gereksinimlerini paylaşsa da, gerçek ortamlar genellikle daha incedir. Birden çok uygulamanın tümünün aynı depolama hesaplarına bağlandığı, ancak uygulamalardan ikisinin de farklı hizmetlere veya veritabanlarına eriştiği bir senaryo düşünün.
Bu kurulumu kodunuzda yapılandırmak için, uygulamanızın her depolama hesabına veya veritabanına bağlanmak için ayrı hizmetler kaydettiğinizden emin olun. yapılandırırken DefaultAzureCredentialher hizmet için doğru yönetilen kimlik istemci kimliklerini çektiğinden emin olun. Aşağıdaki kod örneği aşağıdaki hizmet bağlantılarını yapılandırıyor:
Paylaşılan kullanıcı tarafından atanan yönetilen kimliği kullanarak depolama hesaplarını ayırmak için iki bağlantı
İkinci bir paylaşılan kullanıcı tarafından atanan yönetilen kimlik kullanılarak Azure Cosmos DB ve Azure SQL hizmetlerine bağlantı
// Get the first user-assigned managed identity ID to connect to shared storage
const clientIdStorage = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Storage");
// First blob storage client that using a managed identity
BlobServiceClient blobServiceClient = new BlobServiceClient(
new Uri("https://<receipt-storage-account>.blob.core.windows.net"),
new DefaultAzureCredential()
{
ManagedIdentityClientId = clientIDstorage
});
// Second blob storage client that using a managed identity
BlobServiceClient blobServiceClient2 = new BlobServiceClient(
new Uri("https://<contract-storage-account>.blob.core.windows.net"),
new DefaultAzureCredential()
{
ManagedIdentityClientId = clientIDstorage
});
// Get the second user-assigned managed identity ID to connect to shared databases
var clientIDdatabases = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Databases");
// Create an Azure Cosmos DB client
CosmosClient client = new CosmosClient(
accountEndpoint: Environment.GetEnvironmentVariable("COSMOS_ENDPOINT", EnvironmentVariableTarget.Process),
new DefaultAzureCredential()
{
ManagedIdentityClientId = clientIDdatabases
});
// Open a connection to Azure SQL using a managed identity
string ConnectionString1 = @"Server=<azure-sql-hostname>.database.windows.net; User Id=ClientIDOfTheManagedIdentity; Authentication=Active Directory Default; Database=<database-name>";
using (SqlConnection conn = new SqlConnection(ConnectionString1))
{
conn.Open();
}
class Demo {
public static void main(String[] args) {
// Get the first user-assigned managed identity ID to connect to shared storage
String clientIdStorage = System.getenv("Managed_Identity_Client_ID_Storage");
// Get the DefaultAzureCredential from clientIdStorage
DefaultAzureCredential storageCredential =
new DefaultAzureCredentialBuilder().managedIdentityClientId(clientIdStorage).build();
// First blob storage client that using a managed identity
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
.endpoint("https://<receipt-storage-account>.blob.core.windows.net")
.credential(storageCredential)
.buildClient();
// Second blob storage client that using a managed identity
BlobServiceClient blobServiceClient2 = new BlobServiceClientBuilder()
.endpoint("https://<contract-storage-account>.blob.core.windows.net")
.credential(storageCredential)
.buildClient();
// Get the second user-assigned managed identity ID to connect to shared databases
String clientIdDatabase = System.getenv("Managed_Identity_Client_ID_Databases");
// Create an Azure Cosmos DB client
CosmosClient cosmosClient = new CosmosClientBuilder()
.endpoint("https://<cosmos-db-account>.documents.azure.com:443/")
.credential(new DefaultAzureCredentialBuilder().managedIdentityClientId(clientIdDatabase).build())
.buildClient();
// Open a connection to Azure SQL using a managed identity
String connectionUrl = "jdbc:sqlserver://<azure-sql-hostname>.database.windows.net:1433;"
+ "database=<database-name>;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database"
+ ".windows.net;loginTimeout=30;Authentication=ActiveDirectoryMSI;";
try {
Connection connection = DriverManager.getConnection(connectionUrl);
Statement statement = connection.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Projenizin içinde, pakete başvuru eklemek için @azure/identity npm kullanın. Bu kitaplık, uygulamak DefaultAzureCredentialiçin gerekli tüm varlıkları içerir. Uygulamanızla ilgili diğer Azure SDK kitaplıklarını yükleyin.
Dosyanızın index.js en üstüne aşağıdaki deyimleri ekleyerek uygulamanızın bağlanacağı hizmetler için gerekli istemci sınıflarını içeri aktarın import :
import { DefaultAzureCredential } from "@azure/identity";
import { BlobServiceClient } from "@azure/storage-blob";
import { KeyClient } from "@azure/keyvault-keys";
Dosyanın içinde index.js , uygulamanızın bağlanacağı Azure hizmetleri için istemci nesneleri oluşturun. Aşağıdaki örnekler, karşılık gelen SDK sınıflarını kullanarak Blob Depolama, Cosmos DB ve Azure SQL'e bağlanır.
// Get the first user-assigned managed identity ID to connect to shared storage
const clientIdStorage = process.env.MANAGED_IDENTITY_CLIENT_ID_STORAGE;
// Storage account names
const storageAccountName1 = process.env.AZURE_STORAGE_ACCOUNT_NAME_1;
const storageAccountName2 = process.env.AZURE_STORAGE_ACCOUNT_NAME_2;
// First blob storage client that using a managed identity
const blobServiceClient = new BlobServiceClient(
`https://${storageAccountName1}.blob.core.windows.net`,
new DefaultAzureCredential({
managedIdentityClientId: clientIdStorage
})
);
// Second blob storage client that using a managed identity
const blobServiceClient2 = new BlobServiceClient(
`https://${storageAccountName2}.blob.core.windows.net`,
new DefaultAzureCredential({
managedIdentityClientId: clientIdStorage
})
);
// Get the second user-assigned managed identity ID to connect to shared databases
const clientIdDatabases = process.env.MANAGED_IDENTITY_CLIENT_ID_DATABASES;
// Cosmos DB Account endpoint
const cosmosDbAccountEndpoint = process.env.COSMOS_ENDPOINT;
// Create an Azure Cosmos DB client
const client = new CosmosClient({
endpoint: cosmosDbAccountEndpoint,
credential: new DefaultAzureCredential({
managedIdentityClientId: clientIdDatabases
})
});
// Open a connection to Azure SQL using a managed identity with mssql package
// mssql reads the environment variables to get the managed identity
const server = process.env.AZURE_SQL_SERVER;
const database = process.env.AZURE_SQL_DATABASE;
const port = parseInt(process.env.AZURE_SQL_PORT);
const type = process.env.AZURE_SQL_AUTHENTICATIONTYPE;
const config = {
server,
port,
database,
authentication: {
type // <---- Passwordless connection
},
options: {
encrypt: true
}
};
await sql.connect(sqlConfig);
Ayrıca, kullanıcı tarafından atanan yönetilen kimliğin yanı sıra sistem tarafından atanan yönetilen kimliği aynı anda bir kaynakla ilişkilendirebilirsiniz. Bu, tüm uygulamaların aynı paylaşılan hizmetlere erişmesi gereken ancak uygulamalardan birinin de ek bir hizmete çok özel bir bağımlılığı olduğu senaryolarda yararlı olabilir. Sistem tarafından atanan bir kimlik kullanmak, uygulama silindiğinde söz konusu uygulamaya bağlı kimliğin silinmesini de sağlar ve bu da ortamınızı temiz tutmaya yardımcı olabilir.
Bu öğreticide, bir uygulamayı parolasız bağlantılara geçirmeyi öğrendiniz. Bu makalede ele alınan kavramları daha ayrıntılı incelemek için aşağıdaki kaynakları okuyabilirsiniz: