Безопасное подключение к кластеру

Когда клиент подключается к узлу кластера Service Fabric, может быть установлено безопасное взаимодействие, и клиент может быть аутентифицирован с помощью безопасности на основе сертификатов или Microsoft Entra ID. Эта проверка подлинности гарантирует, что только авторизованные пользователи могут получить доступ к кластеру и развернутыми приложениями и выполнять задачи управления. Сертификат или безопасность Microsoft Entra должны быть ранее включены в кластере при создании кластера. Дополнительные сведения о сценариях безопасности кластера см. в разделе "Безопасность кластера". Если вы подключаетесь к кластеру, защищенному с помощью сертификатов, настройте сертификат клиента на компьютере, который подключается к кластеру.

Подключение к защищенному кластеру с помощью интерфейса командной строки Azure Service Fabric (sfctl)

Существует несколько различных способов подключения к защищенному кластеру с помощью интерфейса командной строки Service Fabric (sfctl). При использовании сертификата клиента для проверки подлинности сведения о сертификате должны соответствовать сертификату, развернутму на узлах кластера. Если у сертификата есть центры сертификации (ЦС), необходимо дополнительно указать доверенные ЦС.

Вы можете подключиться к кластеру sfctl cluster select с помощью команды.

Сертификаты клиента можно указать двумя разными способами, либо в виде пары сертификатов и ключей, либо в виде одного PFX-файла. Для защищенных паролем файлов PEM вам будет предложено автоматически ввести пароль. Если вы получили сертификат клиента в виде PFX-файла, сначала преобразуйте PFX-файл в PEM-файл с помощью следующей команды.

openssl pkcs12 -in your-cert-file.pfx -out your-cert-file.pem -nodes -passin pass:your-pfx-password

Если ваш PFX-файл не защищен паролем, используйте -passin pass: для последнего параметра.

Чтобы указать сертификат клиента в виде pem-файла, укажите путь к файлу в аргументе --pem . Рассмотрим пример.

sfctl cluster select --endpoint https://testsecurecluster.com:19080 --pem ./client.pem

Защищенные паролем pem-файлы будут запрашивать пароль перед выполнением любой команды.

Чтобы указать сертификат, пара ключей использует --cert и --key аргументы, чтобы указать пути к файлам для каждого соответствующего файла.

sfctl cluster select --endpoint https://testsecurecluster.com:19080 --cert ./client.crt --key ./keyfile.key

Иногда сертификаты, используемые для обеспечения безопасности тестовых или кластеров разработки, не проходят проверку сертификатов. Чтобы обойти проверку сертификата, укажите --no-verify параметр. Рассмотрим пример.

Предупреждение

Не используйте этот параметр no-verify при подключении к рабочим кластерам Service Fabric.

sfctl cluster select --endpoint https://testsecurecluster.com:19080 --pem ./client.pem --no-verify

Кроме того, можно указать пути к каталогам доверенных сертификатов ЦС или отдельных сертификатов. Чтобы указать эти пути, используйте --ca аргумент. Рассмотрим пример.

sfctl cluster select --endpoint https://testsecurecluster.com:19080 --pem ./client.pem --ca ./trusted_ca

После подключения вы сможете выполнять другие команды sfctl для взаимодействия с кластером.

Подключение к кластеру с помощью PowerShell

Прежде чем выполнять операции с кластером с помощью PowerShell, сначала установите подключение к кластеру. Подключение к кластеру используется для всех последующих команд в заданном сеансе PowerShell.

Подключение к небезопасным кластерам

Чтобы подключиться к небезопасным кластерам, укажите адрес конечной точки кластера команде Connect-ServiceFabricCluster :

Connect-ServiceFabricCluster -ConnectionEndpoint <Cluster FQDN>:19000 

Подключение к защищенному кластеру с помощью идентификатора Microsoft Entra

Чтобы подключиться к защищенному кластеру, использующего идентификатор Microsoft Entra для авторизации доступа администратора кластера, укажите отпечаток сертификата кластера и используйте флаг AzureActiveDirectory .

Connect-ServiceFabricCluster -ConnectionEndpoint <Cluster FQDN>:19000 `
-ServerCertThumbprint <Server Certificate Thumbprint> `
-AzureActiveDirectory

Подключение к защищенному кластеру с помощью сертификата клиента

Выполните следующую команду PowerShell, чтобы подключиться к защищенному кластеру, использующего сертификаты клиента для авторизации доступа администратора.

Подключение с использованием общего имени сертификата

Укажите общее имя сертификата кластера и общее имя сертификата клиента, которому предоставлены разрешения для управления кластерами. Сведения о сертификате должны соответствовать сертификату на узлах кластера.

Connect-serviceFabricCluster -ConnectionEndpoint $ClusterName -KeepAliveIntervalInSec 10 `
    -X509Credential `
    -ServerCommonName <certificate common name>  `
    -FindType FindBySubjectName `
    -FindValue <certificate common name> `
    -StoreLocation CurrentUser `
    -StoreName My 

ServerCommonName — это общее имя сертификата сервера, установленного на узлах кластера. FindValue — это общее имя сертификата клиента администратора. При заполнении параметров команда выглядит следующим образом:

$ClusterName= "sf-commonnametest-scus.southcentralus.cloudapp.azure.com:19000"
$certCN = "sfrpe2eetest.southcentralus.cloudapp.azure.com"

Connect-serviceFabricCluster -ConnectionEndpoint $ClusterName -KeepAliveIntervalInSec 10 `
    -X509Credential `
    -ServerCommonName $certCN  `
    -FindType FindBySubjectName `
    -FindValue $certCN `
    -StoreLocation CurrentUser `
    -StoreName My 

Подключение с помощью отпечатка сертификата

Укажите отпечаток сертификата кластера и отпечаток сертификата клиента, которому предоставлены разрешения для управления кластерами. Сведения о сертификате должны соответствовать сертификату на узлах кластера.

Connect-ServiceFabricCluster -ConnectionEndpoint <Cluster FQDN>:19000 `  
          -KeepAliveIntervalInSec 10 `  
          -X509Credential -ServerCertThumbprint <Certificate Thumbprint> `  
          -FindType FindByThumbprint -FindValue <Certificate Thumbprint> `  
          -StoreLocation CurrentUser -StoreName My

ServerCertThumbprint — отпечаток сертификата сервера, установленного на узлах кластера. FindValue — это отпечаток сертификата клиента администратора. При заполнении параметров команда выглядит следующим образом:

Connect-ServiceFabricCluster -ConnectionEndpoint clustername.westus.cloudapp.azure.com:19000 `  
          -KeepAliveIntervalInSec 10 `  
          -X509Credential -ServerCertThumbprint AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00 `  
          -FindType FindByThumbprint -FindValue BB22CC33DD44EE55FF66AA77BB88CC99DD00EE11 `  
          -StoreLocation CurrentUser -StoreName My 

Подключение к защищенному кластеру с помощью Windows Active Directory

Если автономный кластер развернут с использованием безопасности AD, подключитесь к кластеру, добавив параметр WindowsCredential.

Connect-ServiceFabricCluster -ConnectionEndpoint <Cluster FQDN>:19000 `
          -WindowsCredential

Подключение к кластеру с помощью API FabricClient

Пакет SDK Service Fabric предоставляет класс FabricClient для управления кластерами. Чтобы использовать API FabricClient, получите пакет NuGet Microsoft.ServiceFabric.

Подключение к небезопасным кластерам

Чтобы подключиться к удаленному незащищенном кластеру, создайте экземпляр FabricClient и укажите адрес кластера:

FabricClient fabricClient = new FabricClient("clustername.westus.cloudapp.azure.com:19000");

Для кода, выполняющегося из кластера, например в надежной службе, создайте fabricClient без указания адреса кластера. FabricClient подключается к локальному шлюзу управления на узле, в котором в данный момент выполняется код, избегая дополнительного прыжка в сети.

FabricClient fabricClient = new FabricClient();

Подключение к защищенному кластеру с помощью сертификата клиента

Узлы в кластере должны иметь допустимые сертификаты, чей общий имя или DNS-имя в SAN отображается в свойстве RemoteCommonNames , заданном в FabricClient. После этого процесс обеспечивает взаимную проверку подлинности между клиентом и узлами кластера.

using System.Fabric;
using System.Security.Cryptography.X509Certificates;

string clientCertThumb = "BB22CC33DD44EE55FF66AA77BB88CC99DD00EE11";
string serverCertThumb = "AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00";
string CommonName = "www.clustername.westus.azure.com";
string connection = "clustername.westus.cloudapp.azure.com:19000";

var xc = GetCredentials(clientCertThumb, serverCertThumb, CommonName);
var fc = new FabricClient(xc, connection);

try
{
    var ret = fc.ClusterManager.GetClusterManifestAsync().Result;
    Console.WriteLine(ret.ToString());
}
catch (Exception e)
{
    Console.WriteLine("Connect failed: {0}", e.Message);
}

static X509Credentials GetCredentials(string clientCertThumb, string serverCertThumb, string name)
{
    X509Credentials xc = new X509Credentials();
    xc.StoreLocation = StoreLocation.CurrentUser;
    xc.StoreName = "My";
    xc.FindType = X509FindType.FindByThumbprint;
    xc.FindValue = clientCertThumb;
    xc.RemoteCommonNames.Add(name);
    xc.RemoteCertThumbprints.Add(serverCertThumb);
    xc.ProtectionLevel = ProtectionLevel.EncryptAndSign;
    return xc;
}

Подключение к безопасному кластеру в интерактивном режиме с помощью идентификатора Microsoft Entra

В следующем примере используется идентификатор Microsoft Entra для удостоверения клиента и сертификата сервера для удостоверения сервера.

Диалоговое окно автоматически открывается для интерактивного входа при подключении к кластеру.

string serverCertThumb = "AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00";
string connection = "clustername.westus.cloudapp.azure.com:19000";

var claimsCredentials = new ClaimsCredentials();
claimsCredentials.ServerThumbprints.Add(serverCertThumb);

var fc = new FabricClient(claimsCredentials, connection);

try
{
    var ret = fc.ClusterManager.GetClusterManifestAsync().Result;
    Console.WriteLine(ret.ToString());
}
catch (Exception e)
{
    Console.WriteLine("Connect failed: {0}", e.Message);
}

Подключение к защищенному кластеру в автоматическом режиме с использованием Microsoft Entra ID

В следующем примере используется Microsoft.Identity.Client версии: 4.37.0.

Дополнительные сведения о приобретении токена Microsoft Entra см. в разделе Microsoft.Identity.Client.

string tenantId = "aaaabbbb-0000-cccc-1111-dddd2222eeee";
string clientApplicationId = "33334444-dddd-5555-eeee-6666ffff7777";
string webApplicationId = "00001111-aaaa-2222-bbbb-3333cccc4444";
string[] scopes = new string[] { "user.read" };

var pca = PublicClientApplicationBuilder.Create(clientApplicationId)
    .WithAuthority($"https://login.microsoftonline.com/{tenantId}")
    .WithRedirectUri("urn:ietf:wg:oauth:2.0:oob")
    .Build();

var accounts = await pca.GetAccountsAsync();
var result = await pca.AcquireTokenInteractive(scopes)
    .WithAccount(accounts.FirstOrDefault())
    .ExecuteAsync();

string token = result.AccessToken;

string serverCertThumb = "AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00";
string connection = "clustername.westus.cloudapp.azure.com:19000";

var claimsCredentials = new ClaimsCredentials();
claimsCredentials.ServerThumbprints.Add(serverCertThumb);
claimsCredentials.LocalClaims = token;

var fc = new FabricClient(claimsCredentials, connection);

try
{
    var ret = fc.ClusterManager.GetClusterManifestAsync().Result;
    Console.WriteLine(ret.ToString());
}
catch (Exception e)
{
    Console.WriteLine("Connect failed: {0}", e.Message);
}

Подключение к защищенному кластеру без предварительного знания метаданных с помощью идентификатора Microsoft Entra

В следующем примере используется неинтерактивное приобретение маркеров, но такой же подход можно использовать для создания пользовательского интерактивного интерфейса приобретения маркеров. Метаданные Microsoft Entra, необходимые для получения токенов, считываются из конфигурации кластера.

string serverCertThumb = "AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00";
string connection = "clustername.westus.cloudapp.azure.com:19000";

var claimsCredentials = new ClaimsCredentials();
claimsCredentials.ServerThumbprints.Add(serverCertThumb);

var fc = new FabricClient(claimsCredentials, connection);

fc.ClaimsRetrieval += async (o, e) =>
{
    var accounts = await PublicClientApplicationBuilder
        .Create("<client_id>")
        .WithAuthority(AzureCloudInstance.AzurePublic, "<tenant_id>")
        .WithRedirectUri("<redirect_uri>")
        .Build()
        .GetAccountsAsync();

    var result = await PublicClientApplicationBuilder
        .Create("<client_id>")
        .WithAuthority(AzureCloudInstance.AzurePublic, "<tenant_id>")
        .WithRedirectUri("<redirect_uri>")
        .Build()
        .AcquireTokenInteractive(new[] { "<scope>" })
        .WithAccount(accounts.FirstOrDefault())
        .ExecuteAsync();

    return result.AccessToken;
};

try
{
    var ret = fc.ClusterManager.GetClusterManifestAsync().Result;
    Console.WriteLine(ret.ToString());
}
catch (Exception e)
{
    Console.WriteLine("Connect failed: {0}", e.Message);
}

Подключение к защищенному кластеру с помощью Service Fabric Explorer

Чтобы получить доступ к Service Fabric Explorer для данного кластера, введите в адресную строку браузера:

http://<your-cluster-endpoint>:19080/Explorer

Полный URL-адрес также доступен в области основных компонентов кластера на портале Azure.

Для подключения к защищенному кластеру в Windows или OS X с помощью браузера можно импортировать сертификат клиента, а браузер предложит вам сертификат, используемый для подключения к кластеру. На компьютерах Linux сертификат необходимо импортировать с помощью расширенных параметров браузера (каждый браузер имеет разные механизмы) и указать его на расположение сертификата на диске. Дополнительные сведения см. в статье "Настройка сертификата клиента ".

Подключение к защищенному кластеру с помощью идентификатора Microsoft Entra

Чтобы подключиться к кластеру, защищенному с помощью Microsoft Entra ID, откройте браузер по следующему адресу:

https://<your-cluster-endpoint>:19080/Explorer

Вам автоматически будет предложено войти с помощью идентификатора Microsoft Entra.

Подключение к защищенному кластеру с помощью сертификата клиента

Чтобы подключиться к кластеру, защищенному с помощью сертификатов, укажите браузер следующим образом:

https://<your-cluster-endpoint>:19080/Explorer

Вам автоматически будет предложено выбрать сертификат клиента.

Настройка сертификата клиента на удаленном компьютере

Для защиты кластера следует использовать по крайней мере два сертификата, один для сертификата кластера и сервера, а другой — для доступа к клиенту. Рекомендуется также использовать вторичные сертификаты и сертификаты доступа к клиенту. Чтобы защитить связь между клиентом и узлом кластера с помощью безопасности сертификатов, сначала необходимо получить и установить сертификат клиента. Сертификат можно установить в хранилище личного компьютера или текущего пользователя. Кроме того, вам потребуется отпечаток сертификата сервера, чтобы клиент смог пройти проверку подлинности кластера.

  • В Windows: дважды щелкните PFX-файл и следуйте инструкциям по установке сертификата в личном хранилище Certificates - Current User\Personal\Certificates. Кроме того, можно использовать команду PowerShell:

    Import-PfxCertificate -Exportable -CertStoreLocation Cert:\CurrentUser\My `
            -FilePath C:\docDemo\certs\DocDemoClusterCert.pfx `
            -Password (ConvertTo-SecureString -String test -AsPlainText -Force)
    

    Если это самозаверяющий сертификат, необходимо импортировать его в хранилище доверенных людей компьютера, прежде чем использовать этот сертификат для подключения к безопасному кластеру.

    Import-PfxCertificate -Exportable -CertStoreLocation Cert:\CurrentUser\TrustedPeople `
    -FilePath C:\docDemo\certs\DocDemoClusterCert.pfx `
    -Password (ConvertTo-SecureString -String test -AsPlainText -Force)
    
  • В Mac: дважды щелкните PFX-файл и следуйте инструкциям по установке сертификата в цепочке ключей.

Дальнейшие действия