Biblioteka odciążania protokołu TLS urządzenia HSM zarządzanego przez platformę Azure

Zarządzany moduł HSM platformy Azure oferuje bibliotekę odciążania protokołu TLS zgodną z protokołem PKCS#11 w wersji 2.40. Zarządzany moduł HSM platformy Azure nie obsługuje wszystkich funkcji wymienionych w specyfikacji PKCS#11; Zamiast tego biblioteka odciążania protokołu TLS obsługuje ograniczony zestaw mechanizmów i funkcji interfejsu dla odciążania protokołu SSL/TLS tylko przy użyciu klawiszy F5 (BigIP) i Nginx, głównie w celu generowania kluczy certyfikatów serwera TLS i generowania podpisów cyfrowych podczas uzgadniania protokołu TLS.

Aby uzyskać więcej informacji, zobacz Azure Managed HSM TLS Offload Library GitHub (Biblioteka odciążania protokołu TLS zarządzanego przez moduł HSM platformy Azure).

Biblioteka odciążania protokołu TLS wewnętrznie używa interfejsu API REST usługi Azure Key Vault do interakcji z zarządzanym modułem HSM platformy Azure.

Rozpoczęcie pracy

Atrybuty PKCS#11

Aby prawidłowo zintegrować z plikiem PKCS#11, generowanie kluczy (za pośrednictwem C_GenerateKeyPair) i lokalizowanie obiektów kluczy (za pośrednictwem C_FindObjectsInit/C_FindObjects) wymaga rozwiązania do przechowywania atrybutów PKCS#11 w obiekcie klucza usługi Azure Key Vault. Biblioteka odciążania PROTOKOŁU TLS konwertuje te niezbędne atrybuty PKCS#11 na tagi usługi Azure Key Vault.

Te "Tagi atrybutów" mają specjalny prefiks:

  • p11_pri_{nazwa atrybutu P11} — atrybuty klucza prywatnego
  • p11_pub_{nazwa atrybutu P11} — atrybuty klucza publicznego

Biblioteka odciążania protokołu TLS prawidłowo ustawia atrybuty Operacje klucza i Okres istnienia klucza usługi Azure Key Vault, aby usługa mogła prawidłowo wymuszać te ograniczenia dla wygenerowanych kluczy. Te atrybuty są również przechowywane jako tagi, takie jak inne atrybuty PKCS#11 do obsługi możliwości zapytań.

Aplikacje korzystające z biblioteki odciążania PROTOKOŁU TLS używają co najmniej jednego atrybutu PKCS#11 do lokalizowania i używania obiektów kluczy.

Ostrzeżenie

Klucze generowane przez bibliotekę odciążania protokołu TLS i ich tagi są dostępne za pośrednictwem interfejsu API REST usługi Azure Key Vault. Manipulowanie tymi tagami atrybutów P11 przy użyciu interfejsu API REST usługi Azure Key Vault może spowodować przerwanie aplikacji biblioteki odciążania protokołu TLS.

Generowanie klucza

Biblioteka odciążania protokołu TLS zawiera narzędzie do tworzenia kluczy, mhsm_p11_create_key. Uruchomienie narzędzia bez żadnych argumentów wiersza polecenia pokazuje prawidłowe użycie narzędzia.

Narzędzie do tworzenia klucza wymaga jednostki usługi przypisanej do roli "Zarządzanego użytkownika kryptograficznego modułu HSM" w zakresie "/keys".

Narzędzie do tworzenia klucza odczytuje poświadczenia jednostki usługi ze zmiennych środowiskowych MHSM_CLIENT_ID i MHSM_CLIENT_SECRET:

  • MHSM_CLIENT_ID — musi być ustawiona na identyfikator aplikacji (klienta) jednostki usługi
  • MHSM_CLIENT_SECRET — należy ustawić hasło jednostki usługi (klucz tajny klienta)

W przypadku tożsamości zarządzanych powyższe zmienne środowiskowe nie są potrzebne.

  • Użyj argumentu , --identity aby włączyć tożsamość zarządzaną za pomocą narzędzia mhsm_p11_create_key.
  • Tożsamość client_id zarządzana przypisana przez użytkownika powinna być cytowana w pliku konfiguracji MHSM (mhsm-pkcs11.conf). client_id Jeśli tożsamość zarządzana przypisana przez użytkownika nie zostanie podana, zostanie ona uwzględniona jako tożsamość zarządzana przypisana przez system.

Narzędzie do tworzenia kluczy losowo generuje nazwę klucza podczas tworzenia. Pełny identyfikator klucza usługi Azure Key Vault i nazwa klucza są drukowane w konsoli dla Twojej wygody.

MHSM_CLIENT_ID="<service-principal-application-id>" \
MHSM_CLIENT_SECRET="<service-principal-password>" \
mhsm_p11_create_key --RSA 4K --label tlsKey

Key is generated successfully. \
Managed HSM Key ID: https://myhsm.managedhsm.azure.net/keys/p11-6a2155dc40c94367a0f97ab452dc216f/92f8aa2f1e2f4dc1be334c09a2639908 \
Key Name: p11-6a2155dc40c94367a0f97ab452dc216f

Argument --label narzędzia do tworzenia klucza określa żądany CKA_LABEL dla wygenerowanych kluczy prywatnych i publicznych. Te atrybuty są zwykle wymagane do skonfigurowania obsługiwanych rozwiązań odciążania protokołu TLS (na przykład ustawienia konfiguracji protokołu SSL nginx "ssl_certificate_key").

Potrzebna jest nazwa klucza dla wszystkich zmian przypisań ról za pośrednictwem interfejsu wiersza polecenia platformy Azure.

Kontrola dostępu

Biblioteka odciążania PROTOKOŁU TLS tłumaczy C_FindObjectsInit na wywołanie interfejsu API REST usługi Azure Key Vault, które działa w zakresie /keys. Usługa MHSM wymaga uprawnień do odczytu w tym zakresie, aby użytkownik biblioteki odciążania PROTOKOŁU TLS autoryzować operację znajdowania dla kluczy utworzonych za pomocą narzędzia do tworzenia kluczy.

Aby uzyskać więcej informacji na temat lokalnej kontroli dostępu opartej na rolach modułu HSM zarządzanego przez platformę Azure, zobacz:

W poniższej sekcji opisano różne podejścia do implementowania kontroli dostępu dla jednostki usługi odciążania protokołu TLS i tożsamości zarządzanej.

Odciążanie jednostki usługi TLS

Jednostka usługi odciążania PROTOKOŁU TLS jest używana przez aplikację, która używa biblioteki odciążania PROTOKOŁU TLS do uzyskiwania dostępu do kluczy i powinna mieć co najmniej następujące uprawnienia za pośrednictwem przypisań ról:

  • Uprawnienie KeyRead do wszystkich kluczy w zarządzanym module HSM
  • Uprawnienie KeySign do kluczy niezbędnych do odciążania protokołu TLS

Administrator

Administracja Użytkownik utworzy niestandardową definicję roli i przypisania ról. W związku z tym Administracja użytkownik powinien być przypisany do jednej z następujących ról wbudowanych w zakresie "/":

  • Zarządzany oficer kryptograficzny modułu HSM
  • Administrator zasad zarządzanego modułu HSM
  • Administrator zarządzanego modułu HSM

Jednostka usługi generowania kluczy

Jednostka usługi generowania kluczy jest używana z narzędziem do tworzenia kluczy (mhsm_p11_create_key) do generowania kluczy odciążania protokołu TLS. Ta jednostka usługi powinna być przypisana do roli "Zarządzanego użytkownika kryptograficznego modułu HSM" w zakresie "/keys".

Interfejs wiersza polecenia platformy Azure

Interfejs wiersza polecenia platformy Azure może służyć do wykonywania zadań, takich jak przypisanie roli.

Podejście permissywne

Podejście permissywne jest prostsze i odpowiednie, gdy zarządzany moduł HSM platformy Azure jest używany wyłącznie do odciążania protokołu TLS.

Przypisz rolę użytkownika kryptograficznego do jednostki usługi odciążania protokołu TLS w zakresie "/keys". Daje to jednostce usługi odciążania protokołu TLS uprawnienie do generowania kluczy i znajdowania ich na potrzeby odciążania protokołu TLS.

az keyvault role assignment create --hsm-name ContosoMHSM \
--role "Managed HSM Crypto User"  \
--assignee TLSOffloadServicePrincipal@contoso.com  \
--scope /keys

W przypadku tożsamości zarządzanych określ argumenty poleceń w następujący sposób:

az keyvault role assignment create --hsm-name ContosoMHSM \
      --role "Managed HSM Crypto User"  \
       --assignee-object-id <object_id>  \
       --assignee-principal-type MSI \
       --scope /keys

Podejście szczegółowe

Podejście szczegółowe implementuje szczegółową kontrolę dostępu. Wymaga dwóch jednostek usługi (odciążanie jednostki usługi TLS i jednostki usługi generowania kluczy) oraz użytkownika Administracja.

Celem jest ograniczenie uprawnień jednostki usługi odciążania protokołu TLS do obsługi minimalnego wymaganego odciążania protokołu TLS. Użytkownik musi mieć uprawnienie Odczyt dla innych kluczy do obsługi funkcji C_FindObject* biblioteki.

Rola odczytu użytkownika biblioteki odciążania protokołu TLS

Pierwszym krokiem implementacji szczegółowego podejścia jest utworzenie roli niestandardowej. Tę operację należy wykonać tylko raz.

Użytkownik Administracja (z zarządzanym administratorem kryptograficznym hsM lub administratorem zarządzanych modułów HSM lub administratorem zasad zarządzanego modułu HSM) tworzy niestandardową definicję roli "Rola odczytu użytkownika biblioteki TLS":

az keyvault role definition create --hsm-name ContosoMHSM --role-definition '{ \
"roleName": "TLS Library User Read Role", \
"description": "Grant Read access to keys", \
"actions": [], \
"notActions": [], \
"dataActions": ["Microsoft.KeyVault/managedHsm/keys/read/action"], \
"notDataActions": [] \
}'

Generowanie kluczy

Klucze można wygenerować przy użyciu jednostki usługi generowania kluczy za pomocą narzędzia do tworzenia kluczy (mhsm_p11_create_key).

Udzielanie uprawnień

Użytkownik Administracja przypisuje następujące role do jednostki usługi odciążania protokołu TLS.

  • Przypisywanie roli "Rola odczytu użytkownika biblioteki TLS" w zakresie "/keys"
  • Przypisz rolę "Zarządzany użytkownik kryptograficzny modułu HSM" w zakresie "/keys/{key name}"

W poniższym przykładzie nazwa klucza to "p11-6a2155dc40c94367a0f97ab452dc216f".

az keyvault role assignment create --hsm-name ContosoMHSM  \
--role "TLS Library User Read Role"  \
--assignee TLSOffloadServicePrincipal@contoso.com  \
--scope /keys

az keyvault role assignment create --hsm-name ContosoMHSM  \
--role "Managed HSM Crypto User"  \
--assignee TLSOffloadServicePrincipal@contoso.com  \
--scope /keys/p11-6a2155dc40c94367a0f97ab452dc216f

Buforowanie połączeń

Aby zwiększyć wydajność wywołań podpisywania do zarządzanej usługi HSM, biblioteka odciążania PROTOKOŁU TLS buforuje połączenia TLS z serwerami usługi zarządzanego modułu HSM. Domyślnie odciążanie biblioteki TLS buforuje maksymalnie 20 połączeń TLS. Buforowanie połączeń można kontrolować za pomocą pliku konfiguracji MHSM (mhsm-pkcs11.conf).

"ConnectionCache": {
        "Disable": false, 
        "MaxConnections": 20
}

Wyłącz

Jeśli ta wartość jest prawdziwa, buforowanie połączeń zostanie wyłączone. Jest ona domyślnie włączona.

Maxconnections

Określa maksymalną liczbę połączeń z pamięcią podręczną. Maksymalny limit połączeń należy skonfigurować na podstawie liczby współbieżnych sesji PKCS11 używanych przez aplikację. Aplikacje zazwyczaj tworzą pulę sesji PKCS11 i używają ich z puli wątków do równoległego generowania żądań podpisywania. Maksymalna liczba żądań podpisywania generowanych przez aplikacje powinna być zgodna z liczbą współbieżnych żądań podpisywania.

Żądanie podpisania na sekundę (RPS) zależy od liczby współbieżnych żądań i liczby buforowanych połączeń. Określenie większej liczby lub nawet domyślnego limitu nie poprawi podpisywania RPS, jeśli liczba współbieżnych żądań podpisywania PKCS11 jest niższa niż ten limit. Maksymalna liczba połączeń współbieżnych w celu osiągnięcia trybu serii puli modułów HSM w warstwie Standardowa B1 wynosi około 30 w zależności od typu wystąpienia. Należy jednak spróbować użyć różnych liczb, aby ustalić optymalną liczbę współbieżnych połączeń.

Zapoznaj się z dokumentacją aplikacji lub skontaktuj się z dostawcą aplikacji, aby dowiedzieć się więcej o sposobie korzystania z biblioteki PKCS11 przez aplikację.

Korzystanie z biblioteki odciążania protokołu TLS

Generowanie kluczy

Biblioteka odciążania protokołu TLS zawiera narzędzie do tworzenia kluczy, mhsm_p11_create_key. Uruchomienie narzędzia bez żadnych argumentów wiersza polecenia pokazuje prawidłowe użycie narzędzia.

Narzędzie do tworzenia klucza wymaga jednostki usługi przypisanej do roli "Zarządzanego użytkownika kryptograficznego modułu HSM" w zakresie "/keys".

Narzędzie do tworzenia klucza odczytuje poświadczenia jednostki usługi ze zmiennych środowiskowych MHSM_CLIENT_ID i MHSM_CLIENT_SECRET.

  • MHSM_CLIENT_ID — musi być ustawiona na identyfikator aplikacji (klienta) jednostki usługi
  • MHSM_CLIENT_SECRET — należy ustawić hasło jednostki usługi (klucz tajny klienta)

Narzędzie do tworzenia kluczy losowo generuje nazwę klucza podczas tworzenia. Pełny identyfikator klucza usługi Azure Key Vault i nazwa klucza są drukowane w konsoli, aby zapewnić wygodę.

MHSM_CLIENT_ID="<service-principal-application-id>" \
MHSM_CLIENT_SECRET="<service-principal-password>" \
mhsm_p11_create_key --RSA 4K --label tlsKey

Key is generated successfully.
Managed HSM Key ID: https://myhsm.managedhsm.azure.net/keys/p11-6a2155dc40c94367a0f97ab452dc216f/92f8aa2f1e2f4dc1be334c09a2639908 \
Key Name: p11-6a2155dc40c94367a0f97ab452dc216f

Argument --label narzędzia do tworzenia klucza określa żądany CKA_LABEL dla wygenerowanych kluczy prywatnych i publicznych. Te atrybuty są zwykle wymagane do skonfigurowania obsługiwanych rozwiązań odciążania protokołu TLS (na przykład ustawienia konfiguracji protokołu SSL nginx "ssl_certificate_key").

Nazwa klucza jest wymagana, jeśli planujesz zaimplementować szczegółowy dostęp do kluczy.

Implementowanie bezkluszowego protokołu TLS

Istnieją dwa podejścia do generowania klucza i używania klucza dla protokołu TLS bez klucza: prostsze, bardziej permissywne podejście i szczegółowe podejście, które zapewnia lepsze zabezpieczenia. Podejścia różnią się w zakresie nakładu pracy nad implementacją i wymuszania zabezpieczeń.

Prostsze podejście

  1. Tworzenie jednostki usługi dla biblioteki odciążania PROTOKOŁU TLS (na przykład TLSOffload ServicePrincipal)
  2. Przypisz rolę "Zarządzany użytkownik kryptograficzny modułu HSM" do jednostki usługi odciążania PROTOKOŁU TLS w zakresie "/keys".
    az keyvault role assignment create --hsm-name ContosoMHSM \
    --role "Managed HSM Crypto User"  \
    --assignee TLSOffloadServicePrincipal@contoso.com  \
    --scope /keys
    
  3. Wygeneruj klucz z wymaganą etykietą, wykonując kroki opisane w temacie How to generate keys using the TLS Offload Library (Jak generować klucze przy użyciu biblioteki odciążania protokołu TLS).
  4. Konfigurowanie serwera TLS do używania biblioteki odciążania protokołu TLS zarządzanego modułu HSM jako biblioteki interfejsów PKCS#11
  5. Skonfiguruj serwer TLS (na przykład ustawienie konfiguracji protokołu SSL nginx "ssl_certificate_key") z etykietą klucza i poświadczeniami jednostki usługi ODciążania protokołu TLS

Podejście szczegółowe

  1. Utwórz użytkownika Administracja (na przykład TLSOffloadAdminUser) z następującą rolą:
    • Rola "Managed HSM Crypto Officer" w zakresie "/"
  2. Utwórz jednostkę usługi generowania kluczy (na przykład TLSOffloadKeyGenServicePrincipal) dla generowania klucza odciążania PROTOKOŁU TLS i przypisz następującą rolę:
    • Rola "Zarządzany użytkownik kryptograficzny modułu HSM" w zakresie "/keys".
  3. Tworzenie jednostki usługi dla odciążania protokołu TLS (na przykład TLSOffload ServicePrincipal)
  4. Użytkownik Administracja tworzy następującą definicję roli niestandardowej:
    az keyvault role definition create --hsm-name ContosoMHSM --role-definition '{ \
    "roleName": "TLS Library User Read Role", \
    "description": "Grant Read access to keys", \ 
    "actions": [], \
    "notActions": [], \
    "dataActions": ["Microsoft.KeyVault/managedHsm/keys/read/action"], \
    "notDataActions": []
    }'
    
  5. Wygeneruj klucz z wymaganą etykietą zgodnie z instrukcjami "Jak wygenerować klucze przy użyciu biblioteki odciążania PROTOKOŁU TLS". Podczas generowania kluczy użyj jednostki usługi generowania kluczy (na przykład TLSOffloadKeyGenServicePrincipal). Zanotuj etykietę klucza i nazwę klucza. Na przykład:
    • Etykieta klucza: tlsKey
    • Nazwa klucza: p11-6a2155dc40c94367a0f97ab452dc216f
  6. Administracja Użytkownik przypisuje następujące role do jednostki usługi odciążania PROTOKOŁU TLS
    • Rola "Rola odczytu użytkownika biblioteki TLS" w zakresie "/keys"
    • Rola "Zarządzanego użytkownika kryptograficznego modułu HSM" w zakresie "/keys/{key name}"
    az keyvault role assignment create --hsm-name ContosoMHSM  \
    --role " TLS Library User Read Role"  \
    --assignee TLSOffloadServicePrincipal @contoso.com  \
    --scope /keys
    
    az keyvault role assignment create --hsm-name ContosoMHSM  \
    --role "Managed HSM Crypto User"  \
    --assignee TLSOffloadServicePrincipal@contoso.com  \
    --scope /keys/p11-6a2155dc40c94367a0f97ab452dc216f
    
  7. Konfigurowanie serwera TLS do używania biblioteki odciążania protokołu TLS zarządzanego przez moduł HSM platformy Azure jako biblioteki interfejsów PKCS#11
  8. Skonfiguruj serwer TLS (na przykład ustawienie konfiguracji protokołu SSL nginx "ssl_certificate_key") z etykietą klucza i poświadczeniami jednostki usługi ODciążania protokołu TLS

Następne kroki