Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Większość uwierzytelniania w środowiskach systemu Windows jest wykonywana z parą nazwy użytkownika/hasła, która dobrze sprawdza się w przypadku systemów, które mają wspólną domenę. W przypadku pracy w różnych domenach, takich jak między systemami lokalnymi i hostowanymi w chmurze, tego typu uwierzytelnianie staje się podatne na ataki siłowe.
Dla porównania środowiska systemu Linux często używają par kluczy publicznych/prywatnych do uwierzytelniania, które nie wymagają użycia haseł możliwych do odgadnięcia. Protokół OpenSSH zawiera narzędzia ułatwiające obsługę uwierzytelniania opartego na kluczach, w szczególności:
- ssh-keygen do generowania bezpiecznych kluczy.
- ssh-agent i ssh-add na potrzeby bezpiecznego przechowywania kluczy prywatnych.
- scp i sftp w celu bezpiecznego kopiowania plików kluczy publicznych podczas początkowego korzystania z serwera.
Ten dokument zawiera omówienie sposobu używania tych narzędzi w systemie Windows do rozpoczęcia korzystania z uwierzytelniania opartego na kluczach za pomocą protokołu Secure Shell (SSH). Jeśli nie znasz zarządzania kluczami SSH, zdecydowanie zalecamy zapoznanie się z dokumentem NIST IR 7966zatytułowanym Zabezpieczenia interaktywnego i zautomatyzowanego zarządzania dostępem przy użyciu protokołu Secure Shell (SSH).
Uwierzytelnianie oparte na kluczach w protokole OpenSSH dla systemu Windows działa z lokalnymi kontami systemu Windows i kontami usługi Active Directory (domena). Konta identyfikatorów Entra firmy Microsoft nie obsługują uwierzytelniania opartego na kluczach.
Note
Protokół Windows OpenSSH nie obsługuje dyrektyw AuthorizedKeysCommand i AuthorizedKeysCommandUser. Oznacza to, że nie można dynamicznie pobierać kluczy SSH z usługi Active Directory przy użyciu tych dyrektyw, jak to możliwe w systemie Linux. Aby uzyskać więcej informacji na temat obsługiwanych opcji konfiguracji, zobacz OpenSSH Server configuration for Windows Server and Windows (Konfiguracja serwera OpenSSH dla systemów Windows Server i Windows).
Pary kluczy
Pary kluczy odnoszą się do plików kluczy publicznych i prywatnych, które są używane przez niektóre protokoły uwierzytelniania.
Uwierzytelnianie za pomocą klucza publicznego SSH używa asymetrycznych algorytmów kryptograficznych do generowania dwóch plików kluczy — jednej prywatnej i drugiej publicznej. Każdy plik klucza prywatnego jest odpowiednikiem hasła i powinien być chroniony we wszystkich okolicznościach. Jeśli ktoś uzyskuje klucz prywatny, może zalogować się jako użytkownik na dowolnym serwerze SSH, do którego masz dostęp. Klucz publiczny jest umieszczany na serwerze SSH i może być udostępniany bez naruszania klucza prywatnego.
Serwer SSH i klient mogą używać uwierzytelniania opartego na kluczach, aby porównać klucz publiczny dla nazwy użytkownika podanej z kluczem prywatnym. Jeśli nie można zweryfikować klucza publicznego po stronie serwera względem klucza prywatnego po stronie klienta, uwierzytelnianie nie powiedzie się.
Uwierzytelnianie wieloskładnikowe można zaimplementować za pomocą par kluczy, wprowadzając hasło podczas generowania pary kluczy. Aby uzyskać więcej informacji, zobacz Generowanie klucza użytkownika. Podczas uwierzytelniania zostanie wyświetlony monit o podanie hasła. Hasło połączone z obecnością klucza prywatnego jest używane na kliencie SSH do uwierzytelniania użytkownika.
Important
Sesja zdalna otwarta za pośrednictwem uwierzytelniania opartego na kluczach nie ma skojarzonych poświadczeń użytkownika. W związku z tym sesja nie jest w stanie uwierzytelniać jako użytkownik podczas połączeń wychodzących. To zachowanie jest zgodnie z projektem.
Generowanie klucza hosta
Klucze publiczne mają określone wymagania dotyczące listy kontroli dostępu (ACL), które w systemie Windows są równoznaczne tylko z zezwoleniem na dostęp do administratorów i użytkownika systemowego. Przy pierwszym użyciu usługi sshd jest automatycznie generowana para kluczy dla hosta.
Important
Przed uruchomieniem poleceń w tym artykule należy zainstalować serwer OpenSSH. Aby uzyskać więcej informacji, zobacz Wprowadzenie do protokołu OpenSSH dla systemu Windows.
Domyślnie należy uruchomić sshd ręcznie. Aby skonfigurować go do automatycznego uruchamiania przy każdym ponownym uruchomieniu serwera, uruchom następujące polecenia w wierszu polecenia programu PowerShell z podwyższonym poziomem uprawnień na serwerze:
# Set the sshd service to be started automatically.
Get-Service -Name sshd | Set-Service -StartupType Automatic
# Start the sshd service.
Start-Service sshd
Ponieważ nie ma użytkownika skojarzonego z usługą sshd, klucze hosta są przechowywane w C:\ProgramData\ssh.
Generowanie klucza użytkownika
Aby użyć uwierzytelniania opartego na kluczach, należy najpierw wygenerować pary kluczy publicznych/prywatnych dla klienta. Możesz użyć ssh-keygen.exe, aby wygenerować pliki kluczy. Można określić następujące algorytmy generowania kluczy:
- Algorytm podpisu cyfrowego (DSA)
- Rivest–Shamir–Adleman (RSA)
- Algorytm podpisu cyfrowego krzywej eliptycznej (ECDSA)
- Ed25519
Jeśli nie określisz algorytmu, zostanie użyty Ed25519. Należy użyć silnego algorytmu i długości klucza, takiego jak ECDSA w tym przykładzie.
Aby wygenerować pliki kluczy przy użyciu algorytmu ECDSA, uruchom następujące polecenie w oknie programu PowerShell lub wiersza polecenia na kliencie:
ssh-keygen -t ecdsa
Dane wyjściowe polecenia powinny wyglądać podobnie do następujących wierszy, z tą różnicą, że username są zastępowane nazwą użytkownika:
Generating public/private ecdsa key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ecdsa):
Po wyświetleniu monitu możesz wybrać pozycję Wprowadź, aby zaakceptować domyślną ścieżkę pliku, lub określić ścieżkę lub nazwę pliku dla wygenerowanych kluczy.
Następnie zostanie wyświetlony monit o użycie hasła w celu zaszyfrowania plików kluczy prywatnych. Ogólnie rzecz biorąc, nie zalecamy używania pustego hasła, ponieważ hasło działa z plikiem klucza w celu zapewnienia uwierzytelniania dwuskładnikowego. Jednak w tym przykładzie można pozostawić puste hasło.
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]-----+
Teraz masz parę kluczy publicznych/prywatnych ECDSA w określonej lokalizacji. Plik pub jest kluczem publicznym, a plik bez rozszerzenia jest kluczem prywatnym:
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
Plik klucza prywatnego jest odpowiednikiem hasła i powinien być chroniony w taki sam sposób, jak w przypadku ochrony hasła.
Za pomocą ssh-agent można bezpiecznie przechowywać klucze prywatne w kontekście zabezpieczeń systemu Windows skojarzonym z kontem systemu Windows. Aby skonfigurować usługę ssh-agent do automatycznego uruchamiania przy każdym ponownym uruchomieniu komputera i użyć ssh-add do przechowywania klucza prywatnego, uruchom następujące polecenia w wierszu polecenia programu PowerShell z podwyższonym poziomem uprawnień na serwerze:
# 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 dodaniu klucza do usługi ssh-agent na kliencie usługa ssh-agent automatycznie pobiera lokalny klucz prywatny i przekazuje go do klienta SSH.
Important
Zalecamy utworzenie kopii zapasowej klucza prywatnego w bezpiecznej lokalizacji, a następnie usunięcie go z systemu lokalnego po dodaniu go do usługi ssh-agent. Nie można pobrać klucza prywatnego z agenta, gdy używany jest silny algorytm, taki jak ECDSA w tym przykładzie. Jeśli utracisz dostęp do klucza prywatnego, musisz utworzyć nową parę kluczy i zaktualizować klucz publiczny we wszystkich systemach, z którymi korzystasz.
Wdrażanie klucza publicznego
Aby użyć utworzonego wcześniej klucza użytkownika, należy umieścić zawartość klucza publicznego (\.ssh\id_ecdsa.pub) na serwerze w pliku tekstowym. Nazwa i lokalizacja pliku zależą od tego, czy konto użytkownika jest członkiem lokalnej grupy administratorów, czy konta użytkownika standardowego. W poniższych sekcjach omówiono zarówno użytkowników standardowych, jak i administracyjnych.
Użytkownik standardowy
Musisz umieścić zawartość klucza publicznego (\.ssh\id_ecdsa.pub) na serwerze w pliku tekstowym o nazwie authorized_keys w C:\Users\username\.ssh\. Klucz publiczny można skopiować przy użyciu narzędzia OpenSSH scp bezpiecznego transferu plików lub za pomocą programu PowerShell w celu zapisania klucza do pliku.
Możesz użyć następującego kodu, aby skopiować klucz publiczny na serwer. W ostatnim wierszu zastąp username nazwą użytkownika. Początkowo zostanie wyświetlony monit o wprowadzenie hasła dla konta użytkownika dla serwera.
# 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
Użytkownik administracyjny
Musisz umieścić zawartość klucza publicznego (\.ssh\id_ecdsa.pub) na serwerze do pliku tekstowego o nazwie administrators_authorized_keys w C:\ProgramData\ssh\. Klucz publiczny można skopiować przy użyciu narzędzia OpenSSH scp bezpiecznego transferu plików lub za pomocą programu PowerShell w celu zapisania klucza do pliku. Lista ACL tego pliku musi być skonfigurowana tak, aby zezwalała na dostęp tylko administratorom i użytkownikowi systemowemu.
Poniższy kod umożliwia skopiowanie klucza publicznego na serwer i skonfigurowanie listy ACL. W ostatnim wierszu zastąp username nazwą użytkownika. Początkowo zostanie wyświetlony monit o wprowadzenie hasła dla konta użytkownika dla serwera.
Note
W tym przykładzie przedstawiono kroki tworzenia pliku administrators_authorized_keys. Ten plik dotyczy tylko kont administratorów. Należy go użyć zamiast pliku specyficznego dla użytkownika w lokalizacji profilu użytkownika.
# 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
W przypadku nieanglojęzycznych wersji systemu operacyjnego należy odpowiednio zmodyfikować skrypt w celu odzwierciedlenia nazw grup. Aby zapobiec błędom, które mogą wystąpić podczas udzielania uprawnień do nazw grup, można użyć identyfikatora zabezpieczeń (SID) zamiast nazwy grupy. Identyfikator SID można pobrać, uruchamiając Get-LocalGroup | Select-Object Name, SID. Jeśli używasz identyfikatora SID zamiast nazwy grupy, musi być poprzedzona gwiazdką (*). W poniższym przykładzie grupa administratorzy używa identyfikatora 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"""
Te kroki umożliwiają wykonanie konfiguracji wymaganej do korzystania z uwierzytelniania opartego na kluczach za pomocą protokołu OpenSSH w systemie Windows.
Po uruchomieniu tych poleceń programu PowerShell można nawiązać połączenie z hostem sshd z dowolnego klienta, który ma klucz prywatny.