Windows11/10 OpenSSH Server Public Key authentication

ภาพรวมการทำงานที่ Client ใช้ ssh-keygen สร้าง Private + Public Key ขึ้นมา จากนั้นนำ Public Key ที่วางที่เครื่อง Server ในไฟล์ authorized_keys จากนั้นจะเป็นการทดสอบ Connect โดยมีขั้นตอน ดังนี้

How do you generate the SSH key pair

ใช้คำสั่ง ssh-keygen เพื่อสร้าง SSH key pair ตอน Run คำสั่ง ssh-keygen จะใช้ Algorithm RSA ซึ่งอาจจะไม่ปลอดภัยในปัจจุบันแล้ว ถ้าต้องการใช้ Algorithm อย่าง ED25519 ตอนสร้าง SSH key pair แก้ไขคำสั่ง ดังนี้

#Pattern
ssh-keygen -t <<Algorithm>>
#Example
ssh-keygen -t ed25519

โดยมันจะถาม Path ด้านล่าง ว่าให้เก็บที่ Path /home/<<YOUR_USERNAME>>/.ssh (C:\Users\<>/.ssh/) และชื่อไฟล์ id_rsa หรือ ถ้าใช้ ed25519 ก็จะเป็นชื่อไฟล์ id_ed25519

Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\<<YOUR_USERNAME>>/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

จากนั้นจะเป็นการกำหนด passphrase จะเป็นส่วนของ Password ที่ต้องใช้คู่กับ Key ถ้าไม่ต้องการกำหนดก็สามารถกด Enter ข้ามได้เลยครับ และรอระบบสร้าง public (.pub) และ private key ครับ โดยที่ทั้ง 2 ไฟล์นี้ ปกติแล้วจะถูกสร้างที่ Path C:\Users\<YOURUSERNAME>/.ssh

AlgorithmDefault Private Key NameDefault Public Key Name
RSAid_rsaid_rsa.pub
ed25519id_ed25519id_ed25519.pub
ตัวอย่างการใช้คำสั่ง ssh-keygen -t ed25519

NOTE: จาก Step ตรงนี้ ถ้าใครอยากได้ไฟล์ .ppk (PuTTY Private Key) สามารถใช้ตัว Putty มาช่วย Generate ได้ครับ โดยเอา Public Key (id_rsa.pub) มาสร้างครับ

ต่อไปวาง public key ที่เครื่องเป้าหมาย เพื่อต้องการเขื่อมต่อครับ โดยไฟล์สำหรับ Windows ที่ Path C:\programdata\ssh โดยมีที่วาง Public Key อยู่ 2 ไฟล์ ได้แก่

  • administrators_authorized_keys - สำหรับ user ในกลุ่ม administrator ครับ อ๋อ อย่างลืมกำหนดสิทธิให้ admin read/write เท่านั้นด้วยนะครับ
  • authorized_keys - สำหรับ user ทั่วไป

โดยในเคสนี้ ผมต้องการใช้ user ในกลุ่ม administrator เลยต้องสร้างไฟล์ administrators_authorized_keys ขึ้นมาครับ โดยอาจจะตัดแปะ public key (id_rsa.pub / id_ed25519.pub แล้วแต่ Algorithm ที่ใช้งานครับ) หรือจะใช้ scp โยนไฟล์ก็ได้ครับ

scp C:\Users\<<YOUR_USERNAME>>\.ssh\id_rsa.pub username@servername:C:\ProgramData\ssh\administrators_authorized_keys

หรือ ถ้าเครื่อง Client เป็น Linux จะใช้ ssh-copy-id ก็ได้ครับ

ssh-copy-id <user>@<<REMOTE-IP-OR-DOMAIN-NAME(FQDN)>>

NOTE:

  • administrators_authorized_keys ต้องกำหนดสิทธิให้ถูกต้องนะครับ ถ้าขี้เกียจ cd เข้าไป path C:\programdata\ssh แล้ว Run คำสั่ง ดังนี้
icacls administrators_authorized_keys /inheritance:r
icacls administrators_authorized_keys /grant SYSTEM:`(F`)
icacls administrators_authorized_keys /grant BUILTIN\Administrators:`(F`)
  • ส่วน authorized_keys ต้องกำหนดด้วย
icacls .\users\thisuser\.ssh\authorized_keys /inheritance:r
icacls .\users\thisuser\.ssh\authorized_keys /remove otheruser2

#otheruser2 คือ user ที่เข้าไม่ได้

Setup SSH Public Key authentication

ก่อนอื่นต้อง Setup OpenSSH Server ก่อนครับ ถ้ายังไม่ได้ Setup ดูที่ blog นี้เลย Install OpenSSH Server on Windows 11/10 ถ้าพร้อมแล้วลุยกันเลยครับ

  • เข้าไปที่ Path C:\programdata\ssh\ หาไฟล์ sshd_config
  • จากนั้น Edit sshd_config ขึ้นมา จากนั้นหา Config
    • PubkeyAuthentication กำหนดเป็น yes เพื่อบอกว่าใช้ key แล้วนะ
    • และ PasswordAuthentication กำหนดเป็น no เพื่อปิดการใช้ Password ครับ
PubkeyAuthentication yes
PasswordAuthentication no

และ Restart Service SSHD

Restart-Service sshd

Test SSH Public Key authentication

  • หลังจากเราปิด PasswordAuthentication ลอง ssh ดูแล้ว พบ Error Message ดังรูป
- สาย PuTTY
  • สำหรับใครที่เป็นสาย Putty แล้วใช้ PuTTY ประจำ ต้องแปลง Private Key ของเรา ให้อยู่ในรูปแบบ ppk (Putty Private Key) โดยใช้เครื่องมือ PuTTYGen
    - 1 กดปุ่ม Load เพื่อเลือกไฟล์ Private Key ที่เคยสร้างไว้ตอนต้นด้วย ssh-keygen
    - 2 จากนนั้นกด Save เพื่อให้มันสร้างตัวไฟล์ .ppk ขึ้นมาครับ
  • หลังจากได้ตัว PPK แล้ว นำไฟล์ PPK มาใส่ไว้ Program PuTTY ดังรูป
  • จากนั้นกด Open ใส่ชื่อ user จากได้ Session มาครับ โดย Default Shell เป็นตัว CMD
- สาย Windows Terminal
  • ตอนเรียกใช้ ssh เพิ่ม Path Private Key ใส่เข้าไปจาก Parameter -i
ssh -i <<PATH-TO-PRIVATEKEY>> <<USER>>@<<SERVER-IP>>

ssh -i C:\Users\Chatr\Work\key\id_dotnet56 invest@128.1.0.56

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts to your email.