SFTP Key
19 January 2022
การเพิ่มการใช้ private/public key มาใช้กับ sftp จะเป็นการเพิ่มความปลอดภัยในการรับส่งข้อมูล เพราะแทนที่จะใช้แค่ user name กับ password แล้ว ยังต้องเป็นเครื่องที่มี key ตรงกันด้วยจึงจะสามารถรับส่งข้อมูลระหว่างกันได้ จะไม่ลงในรายละเอียดในเรื่องนี้เพราะสามารถหาอ่านได้ทั่วไป
คราวนี้เวลาจะใช้งานจะต้องทำอย่างไรบ้าง ?
สิ่งแรกที่ควรระวังคือ (สำคัญมากกกกกกกกก)
1. user จะต้องสามารถใช้งานภายใน directory ของตัวเองเท่านั้น (restrict access)
2. user จะต้องสามารถใช้งานได้แค่ sftp เท่านั้น (no login)
3. จะต้องเป็นเครื่องที่ได้รับอนุญาตเท่านั้นจึงจะสามารถ sftp ได้
เครื่องมือที่จะใช้
1. sftp server ซึ่งปกติ linux ทั่วไปเปิดให้บริการไว้อยู่แล้ว
2. sftp client สามารถใช้ software ที่มีให้ download ทั่วไป เช่น winscp หรือจะใช้ command line ก็ได้
3. puttygen ใช้สำหรับสร้าง private/public key
เริ่มต้นเราก็มาสร้าง private/public key จากโปรแกรม puttygen กันก่อน โดยการเปิดโปรแกรมขึ้นมา แล้วกดปุ่ม Generate
หลังกดปุ่มแล้ว ต้องขยับลูกศร mouse เป็นเรื่อย ๆ ภายในช่องสี่เหลี่ยมนี้ด้วยถึงจะสามารถสร้าง key จนสำเร็จได้ 😄
พอสร้างเสร็จแล้วจะได้หน้าตาตามรูป
ถึงแม้ว่าเราจะเพิ่มความปลอดภัยโดยการใช้ private/public key แล้วก็ตาม เราก็ยังสามารถเพิ่มความปลอดภัยเพิ่มเติมได้อีกโดยการใส่ค่าในช่อง Key passphrase และ Confirm passphrase ซึ่งเวลาเรานำไปใช้งานใน 2 ช่องนี้ก็คือตัว password ที่ใช้ตอบเวลาระบบถาม แต่ในบทความนี้เราจะไม่ใช้นะครับ
จากนั้นเราจะมาสร้าง user ที่ server เพื่อใช้สำหรับให้ใช้ sftp เข้ามาวางข้อมูลที่เครื่อง
จากนั้นให้ log in ไปที่ user sftpuser แล้วสร้าง directory ชื่อ “.ssh” แล้วภายใน directory ให้สร้าง file ชื่อ “authorized_keys”
จากนั้นให้เรา copy public key จาก puttygen นำไปใส่ใน file “authorized_keys”
จากนั้นให้เรากดปุ่ม Save public key และ Save private key เอาไว้ที่เครื่อง โดยจะตั้งชื่อว่า key.pub สำหรับ public key และ key.ppk สำหรับ private key (ชื่อ และ นามสกุล ของ key จะตั้งชื่ออะไรก็ได้)
ถึงตรงนี้เราก็สามารถใช้งาน sftp โดยการใช้ร่วมกับ private/public key ได้แล้ว เราลองมาทดสอบดูกัน โดยจะใช้โปรแกรม winscp
ให้ใส่ชื่อเครื่อง หรือหมายเลข ip address ของเครื่องที่เป็น sftp server และชื่อของ user ที่จะใช้
จากนั้นให้กดที่ปุ่ม Advanced แล้วเลือกที่ Authentication ด้านซ้าย ส่วนในช่อง Private key file ด้านขวา ให้ใส่ private key file ที่เรา save ไว้ เสร็จแล้วกดปุ่ม OK
จากนั้นให้กดที่ปุ่ม Login
เนื่องจากเป็นการเข้าใช้งานครั้งแรก ให้กด Yes ผ่านหน้านี้ไป
หลังจากเข้าได้แล้ว ที่ตัว winscp จะเห็นด้านซ้ายเป็นเครื่องของเรา และด้านขวาจะเป็นของ server
มาลองผ่าน command line ที่เครื่อง linux กัน โดยเราจะแปลง key.ppk (private key file) เป็น pem file ก่อน โดยใช้คำสั่ง
puttygen key.ppk -O private-openssh -o key.pem
จากนั้นทดสอบ sftp ไปที่เครื่อง sftp server ด้วย user “sftpuser”
จะเห็นว่าเราสามารถเข้าใช้งาน sftp ผ่านทาง command line ได้แล้ว
ถึงตอนนี้เราก็สามารถใช้งาน sftp ด้วย private/public key ได้แล้ว แต่ถ้าจะให้ปลอดภัยจริง ๆ ตามข้อควรระวังที่บอกไว้ตอนต้นบทความ เราจะต้องทำแก้ไขค่าที่ตัว sftp server เพื่อเพิ่มความปลอดภัย
ถ้าลองใช้งานดูจะพบว่า user “sftpuser” ที่ใช้งาน sftp ที่เครื่อง sftp server นั้น สามารถเข้าถึง directory อะไรในเครื่องก็ได้ แม้กระทั่ง root directory “/”
ซึ่งก็จะทำให้สามารถเห็นโครงสร้าง เห็น file ต่าง ๆ ในเครื่อง ซึ่งจะทำให้เครื่องเราไม่ปลอดภัย หรือแม้กระทั่งสามารถ remote เข้าไปใช้งานในเครื่อง sftp server ของเราได้ด้วย 😟
คราวนี้เรามาดูวิธีป้องกันกันครับ ขั้นแรก ให้ทำการปิดการ login เข้า server ก่อน โดยใช้คำสั่ง
usermod sftpuser -s /sbin/nologin
เท่านี้ user “sftpuser” ก็ไม่สามารถ login เข้ามาที่ sftp server เราได้แล้ว
ต่อจากนั้นเราก็มาทำให้ user สามารถใช้ได้แต่ directory ที่เรากำหนดให้เท่านั้น ไม่ให้ไปวิ่งเล่นที่ไหนได้อีก โดยเราจะสร้างพื้นที่ขึ้นมาให้กับ user นั้นใช้งานโดยเฉพาะ แยกออกจาก /home (จะใช้ /home ก็ได้ แต่กลัวจะเต็มทีหลังเลยแยกออกมาเลยดีกว่า) ให้ชื่อว่า “/sftpdata/sftpuser” (/sftpdata/<user>)
โดยมีข้อบังคับว่าเจ้าของ directory นี้ต้องเป็น root เท่านั้น
จากนั้นให้สร้าง directory ภายใน /sftpdata/sftpuser เพื่อใช้เป็นพื้นที่ให้ user sftpuser ใช้งาน ตัวอย่างนี้ใช้ชื่อ directory ว่า exchange
โดย directory ที่สร้างให้ user sftpuser นี้จะต้องมี owner ของ directory เป็นของ user
จบขั้นตอนนี้ถือว่าการเตรียมพร้อมในส่วนของพื้นที่ใช้งานของ user sftpuser เป็นอันเรียบร้อย จากนั้นต้องไปแก้ไขค่า config ของ service ssh ต่อ
โดยให้แก้ไข file “/etc/ssh/sshd_config”
อันแรกให้หาคำว่า
Subsystem sftp /usr/lib/openssh/sftp-server
แล้วให้แก้ไขเป็น
Subsystem sftp internal-sftp
จากนั้นให้เพิ่มบรรทัดตามด้านล่างไว้ที่บรรทัดสุดท้าย
#Add this section to match for user "sftpuser"
Match user sftpuser
ChrootDirectory /sftpdata/sftpuser
X11Forwarding no
AllowTcpForwarding no
PermitTunnel no
AllowAgentForwarding no
ForceCommand internal-sftp
เสร็จแล้วให้ restart service ssh ด้วยคำสั่ง
systemctl restart sshd
จากนั้นลองทดสอบอีกครั้ง จะพบว่า user sftpuser จะใช้งานได้แค่ใน directory /sftpdata/sftpuser เท่านั้น ไม่สามารถออกไปดู หรือทำอะไรนอก directory ได้
และหากเรามี user หลาย ๆ คน เราก็สามารถสร้าง directory เพิ่ม และไปกำหนดใน file /etc/ssh/sshd_config แบบเดียวกันครับ
ส่วนของการป้องกันไม่ให้เครื่องที่ไม่ใช่เครื่องที่เราอนุญาตให้เข้ามาใช้งานเราก็ไปเพิ่มการปิดในส่วนของ firewall, security group, service account อีกชั้นนึง
เท่านี้เราก็จะสามารถใช้ sftp ได้อย่างปลอดภัยแล้วครับ
อ้างอิง : https://www.golinuxcloud.com/sftp-chroot-restrict-user-specific-directory/
เพิ่มเติม 21 January 2022
กรณีที่พบ error “Authentication refused: bad ownership or modes for file” ให้แก้ไข permission ของ “.ssh” ให้เป็น 700 และ “authorized_keys” ให้เป็น 600