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

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

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

К защищенному кластеру можно подключиться с помощью интерфейса командной строки Service Fabric CLI (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. Например:

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

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

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 A8136758F4AB8962AF2BF3F27921BE1DF67F4326 `  
          -FindType FindByThumbprint -FindValue 71DE04467C9ED0544D021098BCD44C71E183414E `  
          -StoreLocation CurrentUser -StoreName My 

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

При развертывании автономного кластера с помощью группы безопасности Active Directory подключитесь к кластеру, добавив параметр "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 = "71DE04467C9ED0544D021098BCD44C71E183414E";
string serverCertThumb = "A8136758F4AB8962AF2BF3F27921BE1DF67F4326";
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 = "A8136758F4AB8962AF2BF3F27921BE1DF67F4326";
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

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

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

string tenantId = "C15CFCEA-02C1-40DC-8466-FBD0EE0B05D2";
string clientApplicationId = "118473C2-7619-46E3-A8E4-6DA8D5F56E12";
string webApplicationId = "53E6948C-0897-4DA6-B26A-EE2A38A690B4";
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 = "A8136758F4AB8962AF2BF3F27921BE1DF67F4326";
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 = "A8136758F4AB8962AF2BF3F27921BE1DF67F4326";
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, укажите браузер следующим образом:

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-файл и следуйте инструкциям на экране, чтобы установить сертификат в цепочке ключей.

Следующие шаги