Ssh โดยไม่ต้องใส่ password (Public Key Authentication)

เชื่อว่าปัญหาพื้นฐานของ system admin คือการจำรหัสผ่านของ server ครับ
ยิ่งถ้ารับดูแลระบบให้ลูกค้าหลายๆ ราย ก็ยิ่งวุ่นวายเพราะแต่ละที่รหัสไม่เหมือนกันซักที่ ถ้ามีการเปลี่ยนรหัสผ่านก็ต้องแจ้งกันไปแจ้งกันมาอีก
แถมถ้าอยากเขียน script ให้มันต่อไปหา server เองหลายๆ ตัวได้ก็ต้องเขียนให้มัน login ssh อีก ยาก…

public key authentication ก็เลยเกิดมาเพื่อแก้ปัญหานี้ครับ

ส่วนประกอบสำคัญๆ คือ

  1. private key อยู่กับ client ที่เราจะใช้ ssh (บน windows ก็ putty / บน linux ก็คำสั่ง ssh)
  2. public key ใส่ไว้ใน ไฟล์ “~/.ssh/authorized_keys” (ไฟล์ .ssh/authorized_keys ใน HOME ของ user ที่เราจะใช้เข้า)

โดยวิธีการคือ

  1. สร้าง key ขึ้นมา
  • บน linux ใช้คำสั่ง ssh-keygen แล้วกด enter ผ่านไปได้เลย (ตอนมันถาม passphrase แนะนำให้ตั้งด้วยนะครับ แต่ถ้าใช้ใน script ก็ไม่ต้องตั้งก็ได้)
    จะได้ไฟล์มา 2 ไฟล์คือ ~/.ssh/id_rsa (private key) กับ ~/.ssh/id_rsa.pub (public key)

  • บน windows ใช้โปรแกรมชื่อ puttygen โหลดได้จากเว็บ http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
    วิธีการคือเปิดโปรแกรมขึ้นมา เจอหน้าจอประมาณนี้

    แนะนำให้แก้ number of bits ตรงมุมล่างขวาเป็น 2048 หรือ 4096 นะคัรบ เสร็จแล้วกดปุ่ม generate
    แล้วก็ลาก mouse มั่วๆ ตรงพื้นที่ว่างๆ กลางจอซักพักนึงจนมันขึ้นว่าเรียบร้อย จะได้หน้าจอแสดงผล public key กับช่องให้กรอกชือ่ key กับ passphrase ครับ
    (แนะนำให้)ตั้ง passphrase (รหัสผ่านสำหรับอ่าน private key) ให้เรียบร้อย แล้วกด save private key ครับ

  1. เอา public key ที่ได้ไปใส่ไฟล์ authorized_keys ของ server
    วิธีการคือ สร้าง folder “~/.ssh/” ก่อน แล้วเปิดไฟล์ “~/.ssh/authorized_keys” ขึ้นมา copy ข้อความที่เป็น public key (ขึ้นต้นด้วย ssh-rsa แล้วตามด้วยตัวอักษรมั่วๆ) แปะลงไปทั้งบรรทัด
    " ตรวจสอบให้แน่ใจว่ามันอยู่บรรทัดเดียวนะครับ " (กรณีใช้ nano แล้วเผลอตั้งให้มันตัดบรรทัด)

ไฟล์เดียวสามารถใส่หลายๆ key ก็ได้ (บรรทัดละ key)
ใครอยากให้ผมเข้า server ก็โหลด public key ผมไปได้เลยที่ http://icez.net/files/authkey.txt (ชื่อก็บอกว่า public key มันมีไว้แจกอยู่แล้ว)

  1. check permission ของ folder .ssh ให้ดีๆ ต้องเป็น 0700 เท่านั้น (พิมพ์ chmod 700 ~/.ssh/ ได้เลย)
    ส่วนไฟล์ authorized_keys มันเป็น public key อยู่แล้ว อ่านไปก็ไม่มีปัญหา

  2. ตั้งค่า client ให้เรียกใช้ไฟล์ private key

  • บน linux มันจะอ่านไฟล์ ~/.ssh/id_rsa อัตโนมัติครับ (ถ้าไม่ได้ไปแก้อะไร /etc/ssh/ssh_config นะ) หรือถ้าจะระบุที่อยู่ key เองก็สั่ง ssh -i /path/to/privatekey ก็ได้ครับ

  • ส่วน putty เข้าตามนี้ครับ เมนูด้านซ้าย connection > ssh > auth ติ๊กถูกตามรูปด้านล่าง ไม่ต้องเลือกไฟล์ private key ตอนนี้นะครับ เดี๋ยวจะให้ใช้อีกวิธีนึง ซึ่งมีของแถมด้วย

  • แก้เสร็จกลับไปหน้าแรก คลิกที่ default setting แล้วกดปุ่ม save ด้านขวาครับ

  • แล้วก็ไปโหลดโปรแกรมชื่อ Pageant จากเว็บ putty ( http://the.earth.li/~sgtatham/putty/latest/x86/pageant.exe )

  • สร้าง shortcut หาโปรแกรม Pageant (คลิกขวาที่ไฟล์ Pageant.exe แล้วกด create shortcut) แล้วคลิกขวาไฟล์ shortcut กด Properties
    ช่อง Target ที่เป็น “C:\Apps\pageant.exe” (สมมติ) ให้เว้นวรรเติม path เต็มๆ ของ private key ต่อท้ายไปด้วย เป็น
    "C:\Apps\pageant.exe" "C:\Users\icez\icez.ppk"
    แล้วลอง double click shortcut ที่สร้าง แล้วไปคลิกเปิดโปรแกรมจาก system tray ควรจะเจอหน้าจอประมาณนี้ ที่มี key ที่เราระบุไว้ขึ้นมาให้เรียบร้อย

  • เพื่อความสะดวก จับย้าย shortcut เมื่อกี้ไปไว้ใน Startup เลยครับ :slight_smile: ให้ pageant ทำงานตั้งแต่ตอนเปิดเครื่องเลย

  1. ลองใช้ putty ssh ดู ใส่แค่ user มันควรจะขึ้นมาแบบนี้ แล้วก็เข้าถึง shell เลย โดยที่เราไม่ต้องกรอกรหัสผ่านเลย :slight_smile:

  2. ของแถมจากข้อ 4 ที่ทำให้เรื่องยาว : เปิด filezilla กรอก host เป็น sftp://SERVER แล้ว “ใส่แค่ user” ดูครับ

ผมไม่ได้ลบรหัสผ่านออกนะครับ กรอกไปแค่นี้จริงๆ :slight_smile:

=====================================

อะไรคือ Pageant

  • Pageant เป็นตัวจัดการ private key ที่จะใช้ในการ SSH ในโปรแกรมตระกูล putty ทั้งหมดครับ (PuTTY, PSCP, PSFTP, and Plink)
  • แล้วก็ได้ filezilla แถมมาอีก 1 โปรแกรมด้วย
  • ช่วยให้เราไม่ต้องใส่ private key หรือรหัสผ่านในทุกโปรแกรมที่ว่ามา
  • แถมอีกอย่างคือ ตามที่บอกให้ตั้ง passphrase ตอนสร้าง private key ด้านบนนั้น ถ้าเราใช้ private key นี้ตามปกติ client จะถามรหัสผ่าน “ทุกครั้ง” ที่เรียกใช้ (ซึ่งก็ไม่ต่างกันกับต้องมานั่งกรอกรหัสผ่านเท่าไหร่)
  • แต่ถ้าใช้ Pageant โปรแกรมนี้จะถามรหัสผ่านเราตอนเปิดโปรแกรมครั้งแรก ครั้งเดียวเท่านั้น แล้วโปรแกรมนี้จะจัดการที่เหลือให้เองหมดเลยครับ

=====================================

ทำไมต้องใส่ Passphrase ให้ private key

  • ไฟล์ private key มันคือ “กุญแจ” ในการไขเข้าบ้าน เอ้ย server ของเราครับ
  • หมายความว่า ถ้าไฟล์ private key ถูกขโมย โจรก็สามารถเอา private key เราไป login เข้า server เราได้ทันทีโดยไม่ต้องรู้รหัสผ่าน สบายใจแฮ
  • ถ้าใส่ private key ที่มี passphrase ลงใน putty ตรงๆ เวลาเรา remote ทุกครั้งก็ต้องใส่ passphrase ใหม่ทุกครั้งครับ ซึ่งมันไม่สะดวก
  • ถ้าใช้ Pageant ครอบอีกที จะทำให้เมื่อเปิดโปรแกรม Pageant ต้องใส่รหัสผ่านเพื่ออ่าน private key ครั้งเดียว แล้วก็ใช้ login ได้เรื่อยๆ โดยไม่ต้องกรอก passphrase ใหม่จนกว่าจะปิด Pageant ครับ
  • ถ้าคอมถูกขโมยตอนปิดเครื่องอยู่ + โจรไม่รู้รหัสผ่านของ key ก็เอา key ไปใช้งานไม่ได้ (แต่ถ้าโดนไปตอนเปิดเครื่องอยู่ และโจรไม่ได้ปิดเครื่องก็ตัวใครตัวมัน)

ขอบคุณพี่ไอซ์สำหรับบทความดีๆมากครับ ละเอียดยิบเลยทั้งความสะดวกรวมถึงการรักษาความปลอดภัย :d5f02ecd:

ผมใช้วิธีนี้มาหลายปีแล้วครับ ปลอดภัยกว่าเข้า password ครับ. แต่ผมยัง งง ๆ ว่าถ้าเราเปิด public key กับ server แล้วให้มัน rsync กันนี่ไม่ทราบว่าต้องทำยังไงรึครับ.

rsync มันใช้ ssh ปกติครับ
ฝั่ง client ก็เรียก key ตามปกติ ถ้า private key ไม่ได้อยู่ใน .ssh/id_rsa ก็ระบุ path เองด้วยคำสั่ง rsync -e ‘ssh -i /path/to/privatekey’
key ก็ gen ด้วย ssh-keygen แหละฮะ