Ověřování na základě klíčů v OpenSSH pro Windows
Platí pro Windows Server 2022, Windows Server 2019, Windows 10 (build 1809 a novější)
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, stává se zranitelným neautorizovanému vniknutí 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 klíče nebo privátního klíče, které nevyžadují použití hádaných hesel. OpenSSH obsahuje nástroje, které pomáhají podporovat ověřování založené na klíčích, konkrétně:
- ssh-keygen pro generování zabezpečených klíčů
- ssh-agent a ssh-add pro bezpečné uchovávání privátních klíčů
- scp a sftp ke bezpečnému kopírování souborů veřejných klíčů 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íčů s protokolem SSH. Pokud správu klíčů SSH neznáte, důrazně doporučujeme seznámit se s dokumentem NIST IR 7966 s názvem Zabezpečení interaktivní a automatizované správy přístupu pomocíSecure Shell (SSH).
Informace o párech 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ý". Soubory privátního klíče jsou ekvivalentem hesla a měly by zůstat chráněné za všech okolností. 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 může se sdílet bez ohrožení privátního klíče.
Ověřování na základě klíčů umožňuje serveru SSH a klientovi porovnat veřejný klíč uživatelského jména zadaného 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í může být implementováno s páry klíčů zadáním přístupového hesla při vygenerování páru klíčů. Další informace najdete v tématu generování uživatelského klíče. 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, a proto není schopná odchozího ověřování jako uživatel, je to záměrně.
Generování klíče hostitele
Veřejné klíče mají specifické požadavky na seznam ACL, které ve Windows se shodují pouze s povolením přístupu správcům a systému. Při prvním použití sshd se automaticky vygeneruje dvojice klíčů pro hostitele.
Důležitý
Nejdřív musíte mít nainstalovaný OpenSSH Server. Další informace najdete v tématu Začínáme sOpenSSH .
Ve výchozím nastavení je služba sshd nastavená tak, aby se spustila ručně. Pokud ho chcete spustit 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
# Now start the sshd service
Start-Service sshd
Vzhledem k tomu, že ke službě sshd není přidružený žádný uživatel, klíče hostitele se ukládají do složky 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. ssh-keygen.exe slouží ke generování klíčových souborů a je možno zadat algoritmy DSA, RSA, ECDSA nebo Ed25519. Pokud není zadán žádný algoritmus, použije se RSA. 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 následující příkaz z příkazového řádku PowerShellu nebo příkazového řádku v klientovi:
ssh-keygen -t ecdsa
Výstup příkazu by měl zobrazit následující výstup a nahradit "uživatelské jméno" 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):
Stisknutím klávesy Enter můžete přijmout výchozí hodnotu nebo zadat cestu nebo název souboru, ve kterém chcete, aby se klíče vygenerovaly. V tuto chvíli se zobrazí výzva k použití přístupového hesla k šifrování souborů privátního klíče. Nedoporučuje se používat prázdné heslo. Přístupové heslo pracuje se souborem klíče a poskytuje dvoufaktorové ověřování. V tomto příkladu necháme přístupové heslo 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 veřejného nebo privátního klíče ECDSA. Soubory .pub jsou veřejné klíče a soubory bez přípony jsou privátní klíče:
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
Mějte na paměti, že soubory privátního klíče jsou ekvivalentem hesla, které by měly být chráněny stejným způsobem, jakým chráníte heslo. K bezpečnému ukládání privátních klíčů v kontextu zabezpečení Windows přidruženého k vašemu účtu Windows použijte agenta ssh.. Pokud chcete spustit službu ssh-agent pokaždé, když se počítač restartuje, a pomocí příkazu ssh-add uložte privátní klíč, spusťte následující příkazy z příkazového řádku PowerShellu se zvýšenými oprávněními na vašem serveru:
# By default the ssh-agent service is disabled. Configure it to start automatically.
# Make sure you're running as an Administrator.
Get-Service ssh-agent | Set-Service -StartupType Automatic
# Start the service
Start-Service ssh-agent
# This should return a status of Running
Get-Service ssh-agent
# Now load your key files into ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ecdsa
Jakmile do klienta přidáte klíč ssh-agent, agent ssh automaticky načte místní privátní klíč a předá ho klientovi SSH.
Důležitý
Doporučujeme zálohovat privátní klíč do zabezpečeného umístění a pak ho odstranit z místního systému po jeho přidání do ssh-agenta. Privátní klíč nelze načíst z agenta, který poskytuje silný algoritmus, 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 uživatelský klíč, který byl vytvořen dříve, musí být obsah vašeho veřejného klíče (\.ssh\id_ecdsa.pub) umístěn na serveru 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í být umístěn na serveru do textového souboru s názvem authorized_keys
v C:\Users\uživatelské_jméno\.ssh\. Veřejný klíč můžete zkopírovat pomocí nástroje pro zabezpečený přenos souborů OpenSSH nebo pomocí PowerShellu k zápisu klíče do souboru.
Následující příklad zkopíruje veřejný klíč na server a nahradí "uživatelské jméno" vaším uživatelským jménem. Nejdřív musíte použít heslo pro uživatelský účet pro server.
# Get the public key file generated previously on your client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub
# Generate the PowerShell to be run remote that will copy 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 using the $remotePowerShell variable
ssh username@domain1@contoso.com $remotePowershell
Administrativní uživatel
Obsah vašeho veřejného klíče (\.ssh\id_ecdsa.pub) musí být umístěn na serveru do textového souboru s názvem administrators_authorized_keys
v C:\ProgramData\ssh\. Veřejný klíč můžete zkopírovat pomocí nástroje pro zabezpečený přenos souborů OpenSSH 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ému.
Následující příklad zkopíruje veřejný klíč na server a nakonfiguruje seznam ACL. Nahraďte uživatelské jméno svým uživatelským jménem. Nejdřív musíte použít heslo pro uživatelský účet pro server.
Poznámka
Tento příklad ukazuje kroky pro vytvoření souboru administrators_authorized_keys
. Tento soubor se vztahuje pouze na účty správce a musí být použit místo souboru uživatele v umístění profilu daného uživatele.
# Get the public key file generated previously on your client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub
# Generate the PowerShell to be run remote that will copy 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 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. Chcete-li zabránit chybám při udělování oprávnění k názvům skupin, lze na svém místě použít identifikátor zabezpečení (SID). Identifikátor SID lze načíst spuštěním 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í ukázkových příkazů PowerShellu se uživatel může připojit k hostiteli sshd z libovolného klienta, který má privátní klíč.