Sdílet prostřednictvím


Ověřování na základě klíčů v OpenSSH pro Windows

Většina ověřování v prostředích Windows se provádí pomocí páru uživatelského jména a hesla, který funguje dobře pro systémy, které sdílejí společnou doménu. Když pracujete napříč doménami, například mezi místními a cloudovými hostovanými systémy, bude tento typ ověřování ohrožený útokem hrubou silou.

Ve srovnání s linuxovými prostředími se k ověřování běžně používají páry veřejného a privátního klíče, které nevyžadují použití odhadnutelných hesel. OpenSSH obsahuje nástroje pro podporu ověřování založeného na klíčích, konkrétně:

  • ssh-keygen pro generování zabezpečených klíčů.
  • ssh-agent a ssh-add pro bezpečné ukládání privátních klíčů.
  • scp a sftp k bezpečnému kopírování souborů veřejného klíče během počátečního použití serveru.

Tento dokument obsahuje přehled použití těchto nástrojů ve Windows k zahájení používání ověřování na základě klíčů v Secure Shellu (SSH). Pokud správu klíčů SSH neznáte, důrazně doporučujeme prostudovat dokument NIST IR 7966 s názvem Zabezpečení interaktivní a automatizované správy přístupu pomocí Secure Shellu (SSH).

Páry klíčů

Páry klíčů odkazují na soubory veřejného a privátního klíče, které používají určité ověřovací protokoly.

Ověřování pomocí veřejného klíče SSH používá asymetrické kryptografické algoritmy k vygenerování dvou souborů klíčů – jeden soukromý a druhý veřejný. Každý soubor privátního klíče je ekvivalentem hesla a za všech okolností by měl zůstat chráněný. Pokud někdo získá váš privátní klíč, může se přihlásit jako vy k libovolnému serveru SSH, ke kterým máte přístup. Veřejný klíč je to, co je umístěné na serveru SSH, a je možné ho sdílet bez ohrožení privátního klíče.

Server SSH a klient můžou použít ověřování na základě klíčů k porovnání veřejného klíče pro uživatelské jméno zadané s privátním klíčem. Pokud veřejný klíč na straně serveru nejde ověřit vůči privátnímu klíči na straně klienta, ověřování selže.

Vícefaktorové ověřování je možné implementovat pomocí párů klíčů zadáním přístupového hesla při vygenerování páru klíčů. Další informace naleznete v tématu Generování uživatelských klíčů. Během ověřování se uživateli zobrazí výzva k zadání přístupového hesla. Přístupové heslo v kombinaci s přítomností privátního klíče se používá v klientovi SSH k ověření uživatele.

Důležitý

Vzdálená relace otevřená prostřednictvím ověřování založeného na klíči nemá přidružené přihlašovací údaje uživatele. V důsledku toho není relace schopna provést odchozí ověřování jménem uživatele. Toto chování je záměrně.

Generování klíče hostitele

Veřejné klíče mají specifické požadavky na seznam řízení přístupu (ACL), které ve Windows umožňují přístup pouze správcům a uživatelům systému. Při prvním sshd použití služby se automaticky vygeneruje dvojice klíčů pro hostitele.

Důležitý

Před spuštěním příkazů v tomto článku musíte nainstalovat OpenSSH Server. Další informace naleznete v tématu Začínáme s OpenSSH pro Windows.

Ve výchozím nastavení je potřeba začít sshd ručně. Pokud ho chcete nakonfigurovat tak, aby se spouštěl automaticky při každém restartování serveru, spusťte na serveru následující příkazy z příkazového řádku PowerShellu se zvýšenými oprávněními:

# Set the sshd service to be started automatically.
Get-Service -Name sshd | Set-Service -StartupType Automatic

# Start the sshd service.
Start-Service sshd

Vzhledem k tomu, že ke službě sshd není přidružený žádný uživatel, jsou klíče hostitele uložené ve složce C:\ProgramData\ssh.

Generování uživatelského klíče

Pokud chcete použít ověřování založené na klíči, musíte nejprve pro klienta vygenerovat páry veřejného a privátního klíče. Můžete použít ssh-keygen.exe ke generování souborů klíčů a můžete zadat následující algoritmy generování klíčů:

  • Algoritmus digitálního podpisu (DSA)
  • Rivest–Šamir–Adleman (RSA)
  • Algoritmus digitálního podpisu eliptické křivky (ECDSA)
  • ED25519 řekl:

Pokud nezadáte algoritmus, použije se Ed25519. V tomto příkladu by se měl použít silný algoritmus a délka klíče, například ECDSA.

Pokud chcete vygenerovat soubory klíčů pomocí algoritmu ECDSA, spusťte na klientovi v okně PowerShellu nebo příkazového řádku následující příkaz:

ssh-keygen -t ecdsa

Výstup příkazu by měl vypadat jako následující řádky s tím rozdílem, že username se nahradí vaším uživatelským jménem:

Generating public/private ecdsa key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ecdsa):

Na příkazovém řádku můžete vybrat Enter , abyste přijali výchozí cestu k souboru, nebo můžete zadat cestu nebo název souboru pro vygenerované klíče.

Dále se zobrazí výzva k šifrování souborů privátního klíče pomocí přístupového hesla. Obecně nedoporučujeme používat prázdné heslo, protože přístupové heslo funguje se souborem klíče a poskytuje dvojúrovňové ověřování. V tomto příkladu ale můžete přístupové heslo nechat prázdné.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username/.ssh/id_ecdsa.
Your public key has been saved in C:\Users\username/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@LOCAL-HOSTNAME

The key's randomart image is:
+--[ECDSA 256]--+
|        .        |
|         o       |
|    . + + .      |
|   o B * = .     |
|   o= B S .      |
|   .=B O o       |
|  + =+% o        |
| *oo.O.E         |
|+.o+=o. .        |
+----[SHA256]-----+

Teď máte v zadaném umístění pár klíčů ECDSA veřejného a privátního. Soubor .pub je veřejný klíč a soubor bez přípony je privátní klíč:

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         6/3/2021   2:55 PM            464 id_ecdsa
-a----         6/3/2021   2:55 PM            103 id_ecdsa.pub

Soubor privátního klíče je ekvivalentem hesla a měl by být chráněn stejným způsobem jako heslo. Pomocí ssh-agent můžete bezpečně ukládat své privátní klíče v zabezpečeném kontextu prostředí Windows, který je přidružený k vašemu účtu systému Windows. Pokud chcete nakonfigurovat službu ssh-agent k automatickému spouštění při každém restartování počítače a použít ssh-add k uložení privátního klíče, spusťte na serveru ve zvýšeně oprávněném příkazovém řádku PowerShell následující příkazy:

# By default, the ssh-agent service is disabled. Configure it to start automatically.
# Run the following command as an administrator.
Get-Service ssh-agent | Set-Service -StartupType Automatic

# Start the service.
Start-Service ssh-agent

# The following command should return a status of Running.
Get-Service ssh-agent

# Load your key files into ssh-agent.
ssh-add $env:USERPROFILE\.ssh\id_ecdsa

Po přidání klíče do ssh-agent služby na vašem klientovi, ssh-agent služba automaticky načte místní privátní klíč a předá jej vašemu SSH klientovi.

Důležitý

Doporučujeme zálohovat privátní klíč do zabezpečeného umístění a po přidání do služby ho odstranit z ssh-agent Privátní klíč nelze načíst z agenta při použití silného algoritmu, například ECDSA v tomto příkladu. Pokud ztratíte přístup k privátnímu klíči, musíte vytvořit novou dvojici klíčů a aktualizovat veřejný klíč ve všech systémech, se kterými pracujete.

Nasazení veřejného klíče

Pokud chcete použít dříve vytvořený uživatelský klíč, musíte obsah veřejného klíče (\.ssh\id_ecdsa.pub) na server umístit do textového souboru. Název a umístění souboru závisí na tom, jestli je uživatelský účet členem místní skupiny správců nebo standardního uživatelského účtu. Následující části se týkají standardních i administrativních uživatelů.

Standardní uživatel

Obsah vašeho veřejného klíče (\.ssh\id_ecdsa.pub) musíte na server umístit do textového souboru s názvem authorized_keysC:\Users\username\.ssh\. Veřejný klíč můžete zkopírovat pomocí nástroje pro zabezpečený přenos souborů OpenSSH scp nebo pomocí PowerShellu k zápisu klíče do souboru.

Pomocí následujícího kódu můžete zkopírovat veřejný klíč na server. Na posledním řádku nahraďte username svým uživatelským jménem. Zpočátku se zobrazí výzva k zadání hesla pro uživatelský účet serveru.

# Get the public key file generated previously on your client.
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub

# Generate the PowerShell command to run remotely that copies the public key file generated previously on your client to the authorized_keys file on your server.
$remotePowershell = "powershell New-Item -Force -ItemType Directory -Path $env:USERPROFILE\.ssh; Add-Content -Force -Path $env:USERPROFILE\.ssh\authorized_keys -Value '$authorizedKey'"

# Connect to your server and run the PowerShell command by using the $remotePowerShell variable.
ssh username@domain1@contoso.com $remotePowershell

Administrativní uživatel

Obsah veřejného klíče (\.ssh\id_ecdsa.pub) musíte na server umístit do textového souboru s názvem administrators_authorized_keysC:\ProgramData\ssh\. Veřejný klíč můžete zkopírovat pomocí nástroje pro zabezpečený přenos souborů OpenSSH scp nebo pomocí PowerShellu k zápisu klíče do souboru. Seznam ACL v tomto souboru je potřeba nakonfigurovat tak, aby umožňoval přístup pouze správcům a systémovým uživatelům.

Pomocí následujícího kódu můžete zkopírovat veřejný klíč na server a nakonfigurovat seznam ACL. Na posledním řádku nahraďte username svým uživatelským jménem. Zpočátku se zobrazí výzva k zadání hesla pro uživatelský účet serveru.

Poznámka

Tento příklad ukazuje kroky pro vytvoření souboru administrators_authorized_keys. Tento soubor platí jenom pro účty administrátora. Musíte ho použít místo souboru specifického pro uživatele v umístění uživatelského profilu.

# Get the public key file generated previously on your client.
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub

# Generate the PowerShell command to run remotely that copies the public key file generated previously on your client to the authorized_keys file on your server.
$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""Administrators:F"" /grant ""SYSTEM:F"""

# Connect to your server and run the PowerShell command by using the $remotePowerShell variable.
ssh username@domain1@contoso.com $remotePowershell

V případě neanglických lokalizovaných verzí operačního systému musí být skript upraven tak, aby odpovídal názvům skupin. Pokud chcete zabránit chybám, ke kterým může dojít při udělení oprávnění k názvům skupin, můžete místo názvu skupiny použít identifikátor zabezpečení (SID). Identifikátor SID můžete načíst spuštěním příkazu Get-LocalGroup | Select-Object Name, SID. Pokud použijete identifikátor SID místo názvu skupiny, musí mu předcházet hvězdička (*). V následujícím příkladu používá skupina Administrators identifikátor SID S-1-5-32-544:

$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""*S-1-5-32-544:F"" /grant ""SYSTEM:F"""

Tyto kroky dokončete konfiguraci potřebnou k použití ověřování založeného na klíčích s OpenSSH ve Windows. Po spuštění těchto příkazů PowerShellu se můžete k hostiteli připojit z libovolného sshd klienta, který má privátní klíč.