Windows용 OpenSSH의 키 기반 인증
적용 대상: Windows Server 2022, Windows Server 2019, Windows 10(빌드 1809 이상)
Windows 환경에서 대부분의 인증은 공통 도메인을 공유하는 시스템에서 잘 작동하는 사용자 이름-암호 쌍으로 수행됩니다. 온-프레미스와 클라우드에서 호스팅되는 시스템 사이와 같이 도메인 간 작업을 수행할 때는 무차별 암호 대입 공격에 취약해집니다.
이에 비해 Linux 환경은 일반적으로 공개 키/프라이빗 키 쌍을 사용하여 추측 가능한 암호를 사용할 필요가 없는 인증을 구동합니다. OpenSSH에는 특히 다음과 같은 키 기반 인증을 지원하는 데 도움이 되는 도구가 포함되어 있습니다.
- 보안 키 생성을 위한 ssh-keygen
- 프라이빗 키를 안전하게 저장하기 위한 ssh-agent 및 ssh-add
- 서버 초기 사용 중 공개 키 파일을 안전하게 복사하기 위한 scp 및 sftp
이 문서에서는 Windows에서 이러한 도구들로 SSH 키 기반 인증 사용을 시작하는 방법에 대한 개요를 제공합니다. SSH 키 관리에 익숙하지 않은 경우 "SSH(Secure Shell)를 사용한 대화형 및 자동화된 액세스 관리의 보안"이라는 NIST 문서 IR 7966을 검토하는 것이 좋습니다.
키 쌍 정보
키 쌍은 특정 인증 프로토콜에 사용되는 공개 키 및 프라이빗 키 파일을 나타냅니다.
SSH 공개 키 인증은 비동기 암호화 알고리즘을 사용하여 "프라이빗" 키와 "공개" 키라는 두 가지 키 파일을 생성합니다. 프라이빗 키 파일은 암호와 동일하며, 모든 상황에서 보호되어야 합니다. 누군가가 사용자의 프라이빗 키를 획득하면 해당 사용자가 액세스할 수 있는 모든 SSH 서버에 사용자로 로그인할 수 있습니다. 공개 키는 SSH 서버에 배치되며, 공유되더라도 프라이빗 키를 훼손하지 않습니다.
키 기반 인증을 사용하면 SSH 서버와 클라이언트에서 프라이빗 키에 대해 제공된 사용자 이름에 대한 공개 키를 비교할 수 있습니다. 클라이언트 쪽 프라이빗 키에 대해 서버 쪽 공개 키의 유효성을 검사할 수 없으면 인증이 실패합니다.
키 쌍이 생성될 때 암호를 입력함으로써 키 쌍으로 다단계 인증을 구현할 수 있습니다(아래의 사용자 키 생성 참조). 인증하는 동안 사용자에게 암호를 입력하라는 메시지가 표시됩니다. 암호는 SSH 클라이언트의 프라이빗 키와 함께 사용되어 사용자를 인증합니다.
Important
키 기반 인증을 통해 열린 원격 세션에는 연결된 사용자 자격 증명이 없으므로 사용자로 아웃바운드 인증을 수행할 수 없습니다. 이는 의도적으로 수행됩니다.
호스트 키 생성
공개 키에는 Windows에서 관리자 및 시스템에 대해서만 액세스를 허용하는 것과 동일한 특별한 ACL 요구 사항이 있습니다. sshd를 처음 사용할 때 호스트에 대한 키 쌍이 자동으로 생성됩니다.
Important
먼저 OpenSSH 서버를 설치해야 합니다. OpenSSH 시작을 참조하세요.
기본적으로 sshd 서비스는 수동으로 시작하도록 설정되어 있습니다. 서버를 다시 부팅할 때마다 시작하려면 서버의 관리자 권한 PowerShell 프롬프트에서 다음 명령을 실행합니다.
# Set the sshd service to be started automatically
Get-Service -Name sshd | Set-Service -StartupType Automatic
# Now start the sshd service
Start-Service sshd
sshd 서비스와 연결된 사용자가 없으므로 호스트 키는 C:\ProgramData\ssh 아래에 저장됩니다.
사용자 키 생성
키 기반 인증을 사용하려면 먼저 클라이언트에 대해 공개/프라이빗 키 쌍을 생성해야 합니다. ssh-keygen.exe는 키 파일을 생성하는 데 사용되며 DSA, RSA, ECDSA 또는 Ed25519 알고리즘을 지정할 수 있습니다. 알고리즘을 지정하지 않으면 RSA가 사용됩니다. 이 예제에서는 ECDSA와 같은 강력한 알고리즘과 키 길이를 사용해야 합니다.
ECDSA 알고리즘을 사용하여 키 파일을 생성하려면 클라이언트의 PowerShell 또는 cmd 프롬프트에서 다음 명령을 실행합니다.
ssh-keygen -t ecdsa
명령의 출력에서 다음 출력을 표시합니다(여기서 "username"은 사용자 이름으로 바뀜).
Generating public/private ecdsa key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ecdsa):
Enter 키를 눌러 기본값을 적용하거나 키를 생성할 경로 및/또는 파일 이름을 지정할 수 있습니다. 그러면 프라이빗 키 파일 암호화를 위해 암호를 사용하라는 메시지가 표시됩니다. 암호는 비어 있을 수 있지만 권장되지는 않습니다. 암호는 키 파일과 함께 사용되어 2단계 인증을 제공합니다. 이 예제에서는 암호를 비워둡니다.
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]-----+
이제 지정된 위치에 공용/프라이빗 ECDSA 키 쌍이 있습니다. .pub 파일은 공개 키이며 확장명 없는 파일은 프라이빗 키입니다.
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
프라이빗 키 파일은 암호화 동일하며, 암호와 동일한 방법으로 보호되어야 합니다. ssh-agent를 사용하여 프라이빗 키를 Windows 계정과 연결된 Windows 보안 컨텍스트 내에 안전하게 저장합니다. 컴퓨터가 다시 부팅될 때마다 ssh-agent 서비스를 시작하고 ssh-add를 사용하여 프라이빗 키를 저장하려면 서버의 관리자 권한 PowerShell 프롬프트에서 다음 명령을 실행합니다.
# 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
키가 클라이언트의 ssh-agent에 추가되면 ssh-agent에서 자동으로 로컬 프라이빗 키를 검색하여 SSH 클라이언트에 전달합니다.
Important
프라이빗 키를 안전한 위치에 백업한 다음에는 이를 ssh-agent에 추가한 후, 로컬 시스템에서 삭제하는 것이 좋습니다. 이 예제에서는 ECDSA와 같은 강력한 알고리즘이 사용되었음을 제공하는 에이전트에서 프라이빗 키를 검색할 수 없습니다. 프라이빗 키에 대한 액세스 권한이 손실되면, 새 키 쌍을 만들고 사용하는 모든 시스템에서 공개 키를 업데이트해야 합니다.
공개 키 배포
위에서 만든 사용자 키를 사용하려면 공개 키(\.ssh\id_ecdsa.pub)의 내용을 서버에 텍스트 파일에 배치해야 합니다. 파일의 이름과 위치는 사용자 계정이 로컬 관리자 그룹의 멤버인지 아니면 표준 사용자 계정인지에 따라 달라집니다. 다음 섹션에서는 표준 및 관리 사용자 모두에 대해 설명합니다.
표준 사용자
공개 키(\.ssh\id_ecdsa.pub)의 내용을 C:\Users\username\.ssh\라는 authorized_keys
텍스트 파일에 서버에 배치해야 합니다. OpenSSH scp 보안 파일 전송 유틸리티 또는 PowerShell을 통해 공개 키를 복사하여 해당 키를 파일에 쓸 수 있습니다.
아래 예제에서는 공개 키를 서버에 복사합니다(여기서 "username"은 사용자 이름으로 바뀜). 처음에는 서버의 사용자 계정에 대한 암호를 사용해야 합니다.
# 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
관리자
공개 키(\.ssh\id_ecdsa.pub)의 내용을 C:\ProgramData\ssh\라는 administrators_authorized_keys
텍스트 파일에 서버에 배치해야 합니다. OpenSSH scp 보안 파일 전송 유틸리티 또는 PowerShell을 통해 공개 키를 복사하여 해당 키를 파일에 쓸 수 있습니다. 이 파일의 ACL은 관리자 및 시스템에 대한 액세스만 허용하도록 구성해야 합니다.
아래 예제에서는 공개 키를 서버에 복사하고 ACL을 구성합니다(여기서 "username"은 사용자 이름으로 대체). 처음에는 서버의 사용자 계정에 대한 암호를 사용해야 합니다.
참고 항목
이 예제에서는 administrators_authorized_keys
파일을 만드는 단계를 보여 줍니다. 이는 관리자 계정에만 적용되며 사용자 프로필 위치 내의 사용자별 파일 대신 사용해야 합니다.
# 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
영어 이외의 지역화된 운영 체제 버전의 경우 그에 따라 그룹 이름을 반영하도록 스크립트를 수정해야 합니다. 그룹 이름에 대한 권한을 부여할 때 오류를 방지하기 위해 SID(보안 식별자)를 해당 위치에 사용할 수 있습니다. SID를 실행 Get-LocalGroup | Select-Object Name, SID
하여 검색할 수 있습니다. 그룹 이름 대신 SID를 사용하는 경우 앞에 별표(*)가 와야 합니다. 다음 예제 에서 Administrators 그룹은 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"""
이러한 단계에서는 Windows에서 키 기반 OpenSSH 인증을 사용하기 위해 필요한 구성을 완료합니다. 예제 PowerShell 명령이 실행되면 사용자는 프라이빗 키가 있는 클라이언트에서 sshd 호스트에 연결할 수 있습니다.