ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home ใช้ไฟล์ ~/.ssh/config ให้ SSH เข้าเซิร์ฟเวอร์ได้สะดวกขึ้น

ใช้ไฟล์ ~/.ssh/config ให้ SSH เข้าเซิร์ฟเวอร์ได้สะดวกขึ้น

เมื่อดูแลเซิร์ฟเวอร์หลายเครื่อง การพิมพ์ ssh -p 2222 -i ~/.ssh/id_ed25519_web [email protected] ทุกครั้งทั้งเสียเวลาและผิดง่าย ไฟล์ ~/.ssh/config บนเครื่องของคุณ (ฝั่ง Client) ช่วยให้ตั้งชื่อย่อให้แต่ละเซิร์ฟเวอร์ พร้อมเก็บผู้ใช้ พอร์ต และ Key ที่ต้องใช้ จากนั้นพิมพ์เพียง ssh web1 ก็เข้าได้ และชื่อย่อเดียวกันนี้ใช้ได้กับ scp, sftp, rsync และ git ด้วย

ไฟล์นี้เป็นการตั้งค่าของโปรแกรม OpenSSH Client จึงไม่ต้องแก้อะไรบนเซิร์ฟเวอร์ และไม่ต้องใช้สิทธิ์ sudo

สิ่งที่ต้องเตรียม

ขั้นตอนที่ 1: สร้างไฟล์และตั้งสิทธิ์

บน Linux และ macOS

mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/config
chmod 600 ~/.ssh/config

บน Windows ไฟล์อยู่ที่ C:\Users\ชื่อผู้ใช้\.ssh\config (ไม่มีนามสกุล) สร้างได้ด้วย PowerShell

New-Item -ItemType Directory -Force $HOME\.ssh
notepad $HOME\.ssh\config

ถ้า Notepad บันทึกเป็น config.txt ให้เปลี่ยนชื่อเอานามสกุลออก บน Linux และ macOS สิทธิ์ของไฟล์สำคัญ ถ้าผู้ใช้อื่นเขียนไฟล์ได้ SSH จะปฏิเสธด้วยข้อความ Bad owner or permissions

ขั้นตอนที่ 2: เพิ่มเซิร์ฟเวอร์เครื่องแรก

Host web1
    HostName 203.0.113.10
    User deploy
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_web
    IdentitiesOnly yes
คำสั่งความหมาย
Hostชื่อย่อที่คุณจะพิมพ์ ตั้งได้ตามใจ ไม่ต้องตรงกับชื่อเครื่องจริง
HostNameIP หรือโดเมนจริงของเซิร์ฟเวอร์
Userผู้ใช้ที่ใช้ Login
Portพอร์ต SSH
IdentityFileไฟล์ Private Key ที่จะใช้
IdentitiesOnly yesใช้เฉพาะ Key ที่ระบุ ไม่ลองทุก Key ใน ssh-agent ป้องกัน Error Too many authentication failures

บันทึกไฟล์แล้วทดสอบ

ssh web1

ควรเข้าเซิร์ฟเวอร์ได้ทันทีเหมือนพิมพ์คำสั่งเต็ม การเยื้องบรรทัดไม่มีผลต่อการทำงาน แต่ช่วยให้อ่านง่ายว่าค่าใดเป็นของ Host ไหน

ขั้นตอนที่ 3: เพิ่มหลายเครื่องและค่ากลาง

ตัวอย่างไฟล์ที่ใช้งานจริงกับ 3 เครื่อง พร้อมค่ากลางสำหรับทุกเครื่อง

Host web1
    HostName 203.0.113.10
    User deploy
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_web

Host web2
    HostName 203.0.113.11
    User deploy
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_web

Host db1
    HostName 10.0.0.5
    User admin
    ProxyJump web1

Host *
    IdentitiesOnly yes
    ServerAliveInterval 60
    ServerAliveCountMax 3
    AddKeysToAgent yes

หลักสำคัญที่ต้องรู้คือ SSH อ่านไฟล์จากบนลงล่าง และใช้ค่าแรกที่พบสำหรับแต่ละคำสั่ง ค่าที่ตั้งภายหลังจะไม่ทับค่าก่อนหน้า ดังนั้นให้วางบล็อกเฉพาะเครื่องไว้ด้านบน และวาง Host * ซึ่งเป็นค่ากลางไว้ท้ายสุดเสมอ ถ้าวาง Host * ไว้บนสุด ค่าในนั้นจะชนะค่าของทุกเครื่อง

Host รับได้หลายชื่อและรับ Wildcard เช่น Host web1 web2 หรือ Host *.example.com ใช้รวมค่าที่เหมือนกันได้

ขั้นตอนที่ 4: กัน SSH หลุดเมื่อไม่ได้ใช้งาน

Firewall หรือ Router ระหว่างทางมักตัดการเชื่อมต่อที่เงียบนานเกินไป ค่า ServerAliveInterval 60 ให้ Client ส่งสัญญาณเล็ก ๆ ไปทุก 60 วินาที และ ServerAliveCountMax 3 ให้ตัดการเชื่อมต่อเองถ้าไม่ได้รับคำตอบ 3 ครั้งติดกัน แทนที่จะค้างนิ่ง วิธีนี้ช่วยได้กับการหลุดจากการไม่ใช้งาน แต่ไม่ช่วยเมื่ออินเทอร์เน็ตขาดจริง ถ้ากำลังรันงานยาว ให้ใช้ tmux ร่วมด้วย

ขั้นตอนที่ 5: เข้าเครื่องหลัง Jump Host ด้วย ProxyJump

ในตัวอย่างข้างต้น db1 มีเฉพาะ IP ภายใน 10.0.0.5 ที่เข้าจากอินเทอร์เน็ตไม่ได้ ProxyJump web1 ทำให้ SSH เชื่อมต่อผ่าน web1 ก่อนแล้วต่อไปยัง db1 โดยอัตโนมัติ การยืนยันตัวตนกับ db1 ยังทำจากเครื่องของคุณ Private Key จึงไม่ต้องไปวางไว้บน web1

ssh db1

ขั้นตอนที่ 6: ทำ Port Forward สำหรับฐานข้อมูล

ถ้าต้องการเปิดโปรแกรมจัดการฐานข้อมูลบนเครื่องของคุณ เชื่อมต่อ MySQL บนเซิร์ฟเวอร์โดยไม่เปิดพอร์ต 3306 ออกอินเทอร์เน็ต ให้เพิ่มบล็อกนี้

Host web1-db
    HostName 203.0.113.10
    User deploy
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_web
    LocalForward 13306 127.0.0.1:3306

รัน ssh -N web1-db แล้วเปิดโปรแกรมให้เชื่อมต่อที่ 127.0.0.1 พอร์ต 13306 รายละเอียดการตั้งค่าในโปรแกรมอยู่ใน เชื่อมต่อฐานข้อมูลบนเซิร์ฟเวอร์ผ่าน SSH Tunnel ด้วย DBeaver

ขั้นตอนที่ 7: ใช้ชื่อย่อกับเครื่องมืออื่น

scp backup.sql web1:/home/deploy/
sftp web1
rsync -avz ./site/ web1:/var/www/example.com/
git clone web1:/home/deploy/repos/site.git

ทุกคำสั่งใช้ผู้ใช้ พอร์ต และ Key จากไฟล์ config โดยอัตโนมัติ ไม่ต้องใส่ -P หรือ -i อีก ดูการใช้ scp และ sftp เพิ่มเติมใน โอนไฟล์ระหว่างเครื่องด้วย scp และ sftp

ขั้นตอนที่ 8: แยกไฟล์ด้วย Include เมื่อมีเครื่องจำนวนมาก

ถ้าดูแลหลายโปรเจกต์ แยกไฟล์ตามลูกค้าหรือโปรเจกต์ได้ โดยใส่บรรทัดนี้ไว้บนสุดของ ~/.ssh/config (ต้องอยู่ก่อนบล็อก Host ใด ๆ)

Include ~/.ssh/config.d/*

จากนั้นสร้างไฟล์แยก เช่น ~/.ssh/config.d/project-a ที่มีบล็อก Host ตามรูปแบบเดิม

ตรวจสอบผลลัพธ์

ดูค่าที่ SSH จะใช้จริงกับชื่อย่อหนึ่งตัว โดยไม่ต้องเชื่อมต่อ

ssh -G web1 | grep -E '^(hostname|user|port|identityfile) '

ผลที่คาดหวังคือ hostname 203.0.113.10, user deploy, port 2222 และ Path ของ Key ที่ตั้งไว้ ถ้าค่าไม่ตรง แปลว่ามีบล็อกอื่นที่ตรงกับชื่อนี้ก่อน ให้ดูลำดับในไฟล์ และทดสอบการเชื่อมต่อจริงพร้อมรายละเอียดด้วย ssh -v web1

ปัญหาที่พบบ่อย

Bad owner or permissions on ~/.ssh/config

ไฟล์เขียนได้โดยผู้ใช้อื่น ให้รัน chmod 600 ~/.ssh/config และตรวจว่าเจ้าของไฟล์คือผู้ใช้ของคุณ บน Windows ให้ตรวจว่าไฟล์อยู่ในโฟลเดอร์โปรไฟล์ของคุณเองและไม่ได้แชร์สิทธิ์ให้ผู้ใช้อื่น

Too many authentication failures

ssh-agent มี Key หลายตัว และ SSH ลองทีละตัวจนเซิร์ฟเวอร์ตัดการเชื่อมต่อ ให้ใส่ IdentitiesOnly yes พร้อม IdentityFile ที่ถูกต้อง ถ้าเซิร์ฟเวอร์ติดตั้ง Fail2ban การล้มเหลวซ้ำอาจทำให้ IP ถูกแบนชั่วคราว ดู ป้องกันการเดารหัสผ่าน SSH ด้วย Fail2ban

ค่าที่ตั้งไว้ไม่มีผล

มักเกิดจากวาง Host * ไว้ด้านบน หรือพิมพ์ชื่อคำสั่งผิด (เช่น Hostname ถูก แต่ Host Name ผิด) ใช้ ssh -G ชื่อย่อ ตรวจค่าที่ได้จริง

ควรเก็บรหัสผ่านไว้ในไฟล์ config ได้หรือไม่

ไม่ได้ และไม่ควร OpenSSH ไม่มีคำสั่งสำหรับเก็บรหัสผ่าน ให้ใช้ SSH Key ที่มี Passphrase และให้ ssh-agent จำ Passphrase ไว้ระหว่างใช้งานด้วย AddKeysToAgent yes

หากทำตามขั้นตอนแล้วยังติดปัญหา สามารถติดต่อทีมงาน THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/ โดยแจ้งชื่อเซิร์ฟเวอร์ ระบบปฏิบัติการ คำสั่งที่ใช้ และข้อความ Error ที่พบ เพื่อให้ตรวจสอบได้รวดเร็วขึ้น

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security