Linux 및 Windows용 PSRemoting: 사용 방법 안내

PowerShell가 지난 몇 년 동안 어떻게 변화했는지 중요한 점 중 하나는 Windows 이외의 기기와 상호 작용하는 다양한 방법을 채택하고 있다는 것입니다. 이러한 변경 사항 중 하나는 SSH를 통한 PSRemoting을 지원하는 것이었습니다. SSH를 통한 PSRemoting은 PSRemoting Linux를 사용할 수 있음을 의미합니다!

SSH와 Linux를 사용하여 PSRemoting을 설정하는 것은 약간의 설정이 필요하지만, 이를 통해 PowerShell을 사용하여 Linux 기기와 원활하게 상호 작용할 수 있습니다.

이 튜토리얼에서는 Windows 클라이언트가 PSRemoting을 통해 Linux 컴퓨터(CentOS)에 연결하고 그 반대로 연결하는 방법을 배우게 될 것입니다. 암호 인증서를 사용하여 인증하는 방법도 배울 것입니다.

관련 자료: PowerShell Remoting: The Ultimate Guide

사전 준비 사항

이 튜토리얼은 실습을 위한 것입니다. 따라하려면 미리 다음을 준비해야 합니다:

  • A Windows 10 build 1809 or greater machine. The tutorial will use Windows Server 2019 Standard as the remote server.
  • A Linux machine that supports PowerShell 7. The tutorial will use CentOS 8.
  • Linux 기기에서 sudo 권한 및 Windows 기기에서 로컬 관리자 권한이 필요합니다. 초기 설정 후 일부 권한은 취소될 수 있습니다.

PSRemoting을 통한 SSH 설정

먼저, Windows 클라이언트의 PSRemoting 클라이언트(PowerShell)를 구성해야 합니다. 이를 위해 PowerShell 7+와 OpenSSH를 설정하고 구성해야 합니다.

PowerShell 7+ 설치

먼저, PowerShell 7+을 설치하세요. 이 튜토리얼에서는 설치 방법을 다루지 않습니다. 자세한 내용은 아래 링크를 확인하세요.

OpenSSH 설치

또한 OpenSSH를 설치해야 합니다. OpenSSH는 PSRemoting이 원격 Linux 컴퓨터에 연결하기 위해 사용하는 패키지입니다. 아래와 같이 PowerShell을 사용하여 OpenSSH를 설치할 수 있습니다.

Windows 호스트가 클라이언트이거나 서버인지에 따라 설치할 Windows 기능이 달라집니다. Windows Server에서 Linux로 연결하는 경우 OpenSSH 클라이언트만 설치하면 되고, Linux에서 Windows Server로 연결하는 경우 OpenSSH 서버만 설치하면 됩니다.

아래 명령은 이름이 “OpenSSH”로 시작하는 모든 Windows 기능을 찾아서 설치합니다. 따라서 클라이언트와 서버 모두 설치됩니다.

Get-WindowsCapability -Online | Where-Object {$_.Name -like 'OpenSSH*'} | Add-WindowsCapability -Online

클라이언트만 설치하려면 Where-Object 스크립트 블록의 필터를 OpenSSH.Client*로 변경하고, 서버는 필터를 OpenSSH.Server*로 변경하면 됩니다.

관련 링크: SSH와 PowerShell을 사용한 시작하기

SSH 서버 시작

OpenSSH가 설치되면 Windows 방화벽이 포트 22에서 열리지만 OpenSSH 서버 서비스를 시작하지 않습니다. Windows Server에서 OpenSSH 서버를 시작하고 부팅 시 서비스를 자동으로 시작하려면 다음 PowerShell 명령을 실행하십시오.

Start-Service sshd
Set-Service sshd -StartupType Automatic

OpenSSH 구성 설정하기

다음 단계는 sshd_config 데몬 구성 파일을 수정하는 것입니다. 이 파일 안에서 먼저 암호 인증이 활성화되어 있는지 확인하고, 또한 PowerShell 서브시스템을 추가해야 합니다.

이 튜토리얼의 이 부분은 가장 쉬운 방법으로 암호를 사용하여 SSH 인증을 설정하는 방법입니다. 나중에 튜토리얼에서 인증서를 사용하여 SSH 인증을 설정하는 방법도 배우게 될 것입니다.

  1. 설정 파일을 좋아하는 텍스트 편집기로 열어서 C:\ProgramData\ssh\sshd_config에서 확인하세요.

2. 암호 인증이 활성화되어 있는지 확인하세요. PasswordAuthentication 줄이 맨 앞에 #로 주석 처리되어 있거나 yes로 설정되어 있는지 확인하세요.

Password Authentication

3. PowerShell 서브시스템을 추가하세요. PowerShell 7의 경우 다음 줄을 추가하세요: Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo.

  • -sshs 옵션은 PowerShell 7이 SSH 내에서 서브시스템으로 실행되도록 합니다.
  • -NoLogo 옵션은 PowerShell이 시작될 때 저작권 정보를 숨기므로 SSH 세션을 시작할 때 예상치 못한 출력이 나타나지 않습니다.

4. 구성 파일을 저장하고 닫으세요.

5. sshd Windows 서비스를 재시작하세요. PowerShell을 사용하여 Restart-Service sshd를 실행하면 됩니다.

이제 PSRemoting over SSH를 사용하여 이 Windows Server에 접속(클라이언트)하고 연결(서버)할 수 있는 모든 구성이 완료되었어야 합니다.

PSRemoting over SSH를 위해 Linux (서버) 설정하기

다음은 비슷한 설정을 가진 Linux입니다. PowerShell을 설치하고 OpenSSH를 구성하는 방법입니다.

CentOS를 사용하기 때문에 다른 배포판을 사용하는 경우 일부 명령이 다를 수 있습니다.

PowerShell 7+ 설치

먼저 PowerShell 7을 설치하세요. 이 튜토리얼에서는 설치 방법을 다루지 않습니다. 대신 다음 링크를 확인하세요.

관련 링크: Windows, macOS 및 Linux에 PowerShell 7 다운로드 및 설치하는 방법

OpenSSH 구성

Windows Server와 마찬가지로 OpenSSH가 필요합니다. 하지만 Windows와 달리 OpenSSH가 이미 설치되어 있을 가능성이 높습니다. CentOS 8을 실행하는 이 튜토리얼에서는 Linux 머신이 기본적으로 클라이언트와 서버가 모두 설치되어 있지만, 아래 명령을 사용하여 확인할 수 있습니다.

rpm -qa openssh*

클라이언트와 서버가 설치되어 있다면 아래와 유사한 출력을 얻어야 합니다.

Configuring OpenSSH

SSH 구성 파일 구성하기:

  1. 다음 명령을 실행하여 sshd_config 파일을 엽니다: sudo vi /etc/ssh/sshd_config.

2. Windows Server와 마찬가지로 PowerShell 하위 시스템을 추가하기 위해 구성 파일에 아래 줄을 추가합니다.

Subsystem powershell /usr/bin/pwsh -sshs -NoLogo

3. vi를 종료하고 파일을 저장합니다.

4. 변경 사항을 적용하기 위해 ssh 데몬을 재시작합니다. 명령을 실행하세요: sudo systemctl restart sshd.

기본적으로 대부분의 경우 Password 및 PublicKey 인증이 활성화되어 있습니다. 여기에 추가할 필요가 없습니다.

Windows/Linux 간의 암호 인증을 통한 연결

Linux 및 Windows 기기에서 모든 설정을 완료한 후, 이제 그 작업을 실용적으로 활용해 보겠습니다. 이제 윈도우에서 리눅스로 연결하고 리눅스에서 윈도우로 연결하는 방법을 암호 인증을 사용하여 시도해 보겠습니다.

암호 기반 인증은 사용자 이름과 암호를 사용하여 SSH를 사용하는 것과 비슷한 모습과 느낌을 제공합니다.

연결 명령어

Windows에서 Linux로 또는 Linux에서 Windows로 PSRemoting over SSH로 연결을 테스트하기 위해 “임시” 세션과 Invoke-Command cmdlet을 사용하여 “지속적” 세션을 모두 사용해 보겠습니다.

관련 내용: Invoke-Command: 원격 코드 실행의 최고 방법

Invoke-Command를 사용하여 PSRemoting 연결을 테스트하려면:

  1. PowerShell 7 콘솔을 엽니다.

2. Invoke-Command cmdlet의 매개변수를 설정합니다. 이 경우 아래의 매개변수는 SRV1이라는 컴퓨터에 User라는 로컬 사용자 계정을 사용하여 연결합니다.

$SessionParams = @{
     HostName = SRV1
     UserName = user
     SSHTransport = $true
 }

3. 위의 매개변수를 splatting하고 스크립트 블록 내에서 명령을 실행하여 (Get-Process와 같은) Invoke-Command를 실행합니다.

관련: PowerShell Splatting: 무엇이며 어떻게 작동합니까?

Invoke-Command @SessionParams -ScriptBlock {Get-Process}

그런 다음 SRV1 컴퓨터에서 실행 중인 모든 프로세스 목록을 볼 수 있어야합니다.

또한 다음을 통해 상호 작용적으로 명령을 실행하고 연결할 수 있는 지속적인 연결을 설정할 수도 있습니다:

  1. 위의 매개변수를 제공하고 New-PSSession cmdlet에 전달합니다.

2. Enter-PSSession cmdlet을 사용하여 해당 세션에 대해 대화형으로 연결합니다.

Create a persistent session
 $session = New-PSSession @SessionParams
 Connect interactively
 Enter-PSSession -Session $session

3. 위의 Enter-PSSession 명령을 실행한 후 사용자의 암호를 입력하라는 메시지가 표시됩니다. 인증을 완료한 후 PowerShell 내에서 다른 컴퓨터에 연결됩니다.

위의 명령 중 어떤 것도 일반적인 Credential 매개변수를 사용하여 사용자 이름과 암호를 제공하는 것을 요구하지 않습니다. 대신 SSHTransport 매개변수를 사용했습니다. SSH는 Windows에서 한 컴퓨터에서 다른 컴퓨터로 이동할 때 사용하는 Windows와 동일한 인증 프로세스를 사용하지 않으므로 PSCredential 객체를 해석할 수 없습니다.

관련: PowerShell Get-Credential cmdlet 및 자격 증명에 관련된 모든 것.

이 접근 방식을 사용하면 끊어진 세션도 활용할 수 있습니다.

공개 키 기반 인증 설정하기

비밀번호 기반 인증은 설정하기 쉽고 사용하기 간단하지만, 두 가지 문제가 있습니다.

  • 보안을 위해 수동으로 명령을 실행하지 않으면 인증할 수 없습니다.
  • 네트워크를 통해 비밀번호를 전송합니다.

비밀번호는 SSH 연결 내에서 암호화되지만, 서버는 평문으로 비밀번호를 받습니다. 서버가 어떤 방식으로든 침해당한다면 보안 문제가 발생할 수 있습니다.

공개/개인 키 생성

어떤 종류의 공개키 인증을 사용하든, 먼저 클라이언트에서 공개 키를 생성해야 합니다. 이 요구사항은 Linux와 Windows 모두에 적용됩니다.

Linux 또는 Windows 서버 기계에서:

  1. ssh-keygen을 실행하여 키 쌍을 생성합니다.

Linux에서 ssh-keygen을 실행하는 경우, 기본적으로 RSA 키 쌍이 생성됩니다. 많은 새로운 Linux 운영 체제에서는 기본적으로 RSA 키 쌍을 인증에 사용할 수 없도록 설정되어 있습니다. 이 경우를 수정하려면 ssh-keygen -t ed25519를 사용하세요.

2. 개인 키를 저장할 경로와 개인 키를 암호화할 패스프레이즈를 입력합니다. 인증 중에 비밀번호를 제공하지 않으려면 패스프레이즈를 비워 둘 수 있습니다.

3. Windows 전용: 아래 명령을 PowerShell에서 실행합니다. <프로필 경로>는 프로필 경로(아마도 C:\Users\사용자명)입니다.

Set-Service ssh-agent -StartupType Automatic
 Start-Service ssh-agent
 ssh-add .ssh\id_ed25519
 Remove-Item ~.ssh\id_ed25519

Windows의 OpenSSH 구현은 ssh-agent 서비스를 제공하여 사용자가 Windows 보안 컨텍스트 내에 개인 키를 저장할 수 있게 합니다. 이를 통해 SSH 개인 키를 ssh-agent에 가져와 파일 시스템에서 키를 삭제하여 더욱 안전하게 보호할 수 있습니다.

4. 이제 생성된 공개 키(<사용자 홈 디렉터리>\.ssh\id_ed25519.pub)를 연결하려는 서버로 복사합니다. Windows는 이 복사 작업을 위한 도구를 제공하지 않으므로 SCP를 사용하여 완료할 수 있습니다. 아래 명령을 실행하여 공개 키를 Linux 기기로 복사합니다.

scp C:\Users\Username.ssh\id_ed25519.pub username@ServerB:~/.ssh/authorized_keys

Linux에서 Windows로 복사하려면:

scp ~/.ssh/id_ed25519.pub administrator@ServerA:.ssh/authorized_keys

5. 로그인한 사용자의 암호를 입력합니다. 입력한 후 PowerShell/Bash가 키를 복사하고 원격 기기와의 연결이 끊어집니다.

공개 키 인증을 사용하여 Windows/Linux 간 연결

공개 및 개인 키를 설정한 후 Windows 및 Linux 간의 연결은 간단해집니다. 비밀번호를 사용한 인증과 거의 동일합니다.

Windows에서 공개 키로 연결하려면, 위의 연결 명령에 표시된대로 동일한 명령을 사용합니다. 하나의 차이점만 알아차릴 수 있을 것입니다; 자격 증명을 요청받지 않습니다.

아래는 연결 중에 발생하는 상황을 확인하기 위해 -v 스위치를 사용하여 Linux에서 Windows로 연결하는 예시입니다.

Example of connecting from Linux to Windows using the -v switch

Source:
https://adamtheautomator.com/psremoting-linux/