윈도우 SSH 원격 접속(server,client)

김동한·2024년 10월 15일
1

CS

목록 보기
10/13
post-thumbnail


위의 사진을 클릭하면 Windows용 OpenSSH 설치를 할 수 있다. client와 server버전 모두 설치가 가능하다. 필자는 접속하려는 server pc와 접속하는 client pc 모두 window 운영체제였기 때문에 window용으로 설치했다.

필수조건

일단 아래의 조건을 충족해야한다.

  • Windows Server 2019 또는 Windows 10(빌드 1809) 이상을 실행하는 디바이스
  • PowerShell 5.1 이상.
  • 기본 제공 관리자 그룹의 멤버인 계정

그렇게 어렵진 않은것 같으나 server가 version이 충족이 안될까봐 겁나 powershell 관리자 권한으로 실행 후 아래의 명령어로 확인했다.

winver.exe
→ Windows 장치의 버전 세부 정보를 확인

version 이상없음!

$PSVersionTable.PSVersion
→ 주 버전이 5 이상이고 부 버전이 1 이상인지 확인

마찬가지로 version 이상 없음!

  • 다음 명령어는 출력은 기본 제공 관리자 그룹의 구성원일 때 True이(가) 표시된다.
    (New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

    마지막 조건도 이상없음을 확인!

Windows Server용 OpenSSH 설치

gui로 설치하는 방법도 있지만, powershell을 통해서 설치했다. 마찬가지로 관리자 권한으로 powerhsell을 실행 후 공식 홈페이지에서 알려주는대로 명령어를 입력하면 된다.

1. OpenSSH를 사용할 수 있는지 확인

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

만약에 둘다 설치가 안되어있다면, 아래를 출력한다.

Name  : OpenSSH.Client~~~~0.0.1.0
State : NotPresent

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent


올바르게 설치된다면 위와 같이 뜬다.

2. server 또는 client 구성요소 설치

# Install the OpenSSH Client
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

# Install the OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

위에서 NotPresent로 되어있다면 위의 두 명령어로 설치하면 된다. (무지 간단)

설치를 완료하면 위의 두 명령어 모두 아래의 출력을 반환한다

Path          :
Online        : True
RestartNeeded : False

3. OpenSSH 서버 시작 및 구성

# Start the sshd service
Start-Service sshd

# OPTIONAL but recommended:
Set-Service -Name sshd -StartupType 'Automatic'

sshd service를 시작할 수 있다. 아직 방화벽에 대한 설정은 하지 않았는데 이는 추후에 하도록 하자

4. 실행여부 확인

Get-Service sshd

위의 명령어를 통해서 ssh server가 실행중인지 확인할 수 있다.

아주 잘 돌아가고 있는 것을 확인할 수 있다.

client setting

SSH 원격 연결에서는 SSH키가 굉장히 중요하다. SSH키는 비대칭 키이다. 아래의 두가지 종류로 이루어져있다.

  • public key : 남에게 공개되는 key
  • private key : 통상적으로 나만 가지고 있는 key

ssh server와 client는 위와 같은 상황이 된다. client는 private,public 쌍을 생성한 후, public key를 server에 보내준다.

앞으로 접속할때, 자연스럽게 나만 가지고 있는 열쇠(private key)를 열쇠구멍(public key)에 넣어 문을 열듯 server에 접근할 수 있게 된다. 따라서, 원격 접속할 client pc에서 아래의 명령어로 SSH 키를 만든다.

ssh-keygen -t rsa -b 4096

위의 명령어를 통해서 id_rsa 파일과 id_rsa.pub 파일이 생긴다. 여기서 pub은 public의 약자이다.

참고로 key가 생성되는 위치는 사람마다 다르다. 나는 경로를 따로 지정하지 않고 enter키를 계속 눌러 default 경로에 저장했다. 아마 기본 경로는 C:\Users\사용자이름\.ssh에 생기나보다.

kdh@DESKTOP-2SLVNDE:/etc/gitlab$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kdh/.ssh/id_rsa):
Created directory '/home/kdh/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/kdh/.ssh/id_rsa
Your public key has been saved in /home/kdh/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:블라블라블라 kdh@DESKTOP-2SLVNDE
The key's randomart image is:
+---[RSA 4096]----+
|      ..+*BB*o .o|
|       o**B*+... |
|       .oB.o=..  |
|        =. ..o o.|
|       .S+.o..E o|
|        . ..o. ..|
|             ...o|
|              ooo|
|               oo|
+----[SHA256]-----+

결과는 대충 위와같이 나왔다.

무튼 이제 키를 만들었으니 간단하다! id_rsa.pub의 값을 그대로 복사해서 server에 입력하면 된다. .pub 확장자인데..어떻게 열지..? 어렵지않다. cat 명령어를 사용하면 파일 내부 내용을 확인할 수 있다.

kdh@DESKTOP-2SLVNDE:/etc/gitlab$ cat ~/.ssh/id_rsa.pub

을 실행하면 와르르르르 엄청 긴 비밀번호가 생성된다. 보통 ssh-rsa로 시작하는 것 같은데 전부다 비밀번호에 해당하니 모두 복사해두자. 이제 이 public key를 server pc에 설정해보자! (말만 설정이지 이것도 쉽다)

아차차 agent에 private key 등록을 해두자 마찬가지로 powershell에서 아래의 명령어를 실행해주면 된다.

Start-Service ssh-agent
ssh-add .\id_rsa (private key 경로)

를 통해서 agent에 private key를 등록해둘 수 있다. 확인은 아래의 명령어로 가능하다

ssh-add -l

Server 설정

public key 설정

server pc에서 C:\Users{사용자 이름} 아래에 .ssh 라는 폴더를 만든 뒤 그 안에 authorized_keys라는 파일을 만들어 이전에 복사해둔 public key를 넣어주면된다. 메모장으로 만들고 .txt 확장자를 지우며 authorized_keys로 이름 바꾸기 해도 된다.

server 권한 설정

.ssh폴더와 authorized_keys 파일의 권한을 설정해야 한다. 다른 사용자가 해당 key 파일에 접근할 수 없도록 한다. 아래의 두 명령어를 server powershell을 관리자권한으로 실행한 후 설정하면 된다.

icacls C:\Users\<사용자 이름>\.ssh /inheritance:r
icacls C:\Users\<사용자 이름>\.ssh\authorized_keys /inheritance:r

여기서 난 authorized_keys가 아래와 같은 오류 문구가 출력됐었다.

PS C:\Windows\system32> icacls C:\Users\User\.ssh\authorized_keys /inheritance:r
C:\Users\User\.ssh\authorized_keys: 액세스가 거부되었습니다.
0 파일을 처리했으며 1 파일은 처리하지 못했습니다.

그래서 아래의 명령어를 통해서 현재 사용자로 소유자를 변경하였다. 그 후 다시 권한을 설정해주니 됐다.

takeown /f C:\Users\User\.ssh\authorized_keys
icacls C:\Users\User\.ssh\authorized_keys /inheritance:r

그리고 수동으로 파일에 대해 읽기 및 쓰기 권한을 설정했다. 아래의 명령어를 사용했다.

icacls C:\Users\User\.ssh\authorized_keys /grant User:F

sshd_config 수정

그리고 실질적으로 제일 중요한 sshd_config 파일을 수정해야한다.

Port 32132
PubkeyAuthentication yes

로 config 파일을 수정했다. 제일 중요한 port번호와 public key로 authentication을 할까요? 인데 둘다 놀랍게도 주석처리가 되어있었다. 참고로 port번호는 필자가 정한 번호이다.

방화벽 설정

마지막으로 port번호 설정을 했으니! port에 대한 방화벽 설정을 해주었다. 마찬가지로 powershell 명령어로 진행했다.

New-NetFirewallRule -Name sshd -DisplayName "OpenSSH Server (sshd)" -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 32132

이전에 설정한 port번호를 사용하여 방화벽을 설정했다.

VScode 통한 접속


이제 마지막으로 접속이 잘 되는지 확인해보자. 위의 extension을 사용해야하니 깔아두자.

명령 팔레트를 ctrl+shift+p를 통해서 열어주면

위와 같이 호스트에 연결이 나온다. 만약 SSH 호스트 구성 파일이 있다면 아마 IP가 자동으로 뜰것이다. 아니라면

ssh -p portnumber user@server_ip

명령어를 입력하면 접속할 수 있다. 여기서 server_ip는 당연히 server에서 cmd를 열었을때 ipconfig를 통해 구한 ip값이고, user는 server pc의 사용자 이름이다. (컴터 켤때 나오는거 ㅇㅇ)
위와 같이 PC의 비밀번호를 입력하라고 뜨게 되는데 server pc의 비밀번호 입력하면 된다.

SSH 연결이 잘된 것을 확인할 수 있다.(IP주소는 가렸다..ㅎ)

후기

사실 뻘짓을 너무 많이해서 (Ubuntu랑 헷갈려서 삽질을 많이함) 고생 많이 하긴했는데 정리하고보니....별거아닌것 같기도! 무튼 원격 접속에 성공했다. 아래는 참고한 블로그나 사이트들인데 진짜진짜 너무너무 감사한분들이당 🙇‍♂️🙇‍♂️ (넙죽넙죽)

profile
(●'◡'●)

0개의 댓글