Linux และการดูแลเซิร์ฟเวอร์ VPS
คู่มือภาคปฏิบัติสำหรับดูแลเซิร์ฟเวอร์ Linux จริง โดยถือว่าคุณมี VPS ของ Hostinger อยู่แล้ว และพาเดินครบทั้งเส้นทาง: เชื่อมต่อผ่าน SSH, หาทางในระบบไฟล์, จัดการไฟล์ สิทธิ์ และผู้ใช้, ติดตั้งซอฟต์แวร์, ควบคุมโปรเซสและเซอร์วิส, ทำงานกับเครือข่าย และปิดท้ายด้วยการล็อกเครื่องให้แน่นหนาด้วยกุญแจ SSH, ไฟร์วอลล์ และเช็กลิสต์เสริมความปลอดภัย ทุกคำสั่งอ้างอิงกับ VPS แบบ Debian/Ubuntu (ค่าเริ่มต้นที่ Hostinger ติดตั้งให้) ข้อความเชิงข้อเท็จจริงทุกข้ออ้างอิงจากแหล่งที่ระบุไว้ท้ายแต่ละหัวข้อ
01 / 12
รู้จัก Linux และการเชื่อมต่อ VPS
VPS เกือบทุกตัวรัน Linux เพราะฟรี เสถียร เขียนสคริปต์ควบคุมได้ และออกแบบมาสำหรับเซิร์ฟเวอร์ที่ไม่มีจอ คุณควบคุมมันทั้งหมดผ่านเชลล์แบบข้อความที่เข้าถึงด้วย SSH
Linux คืออะไรกันแน่
Linux คือเคอร์เนล — โปรแกรมแกนกลางที่คุยกับฮาร์ดแวร์ ส่วน “ดิสทริบิวชัน” (distro) คือการรวมเคอร์เนลนั้นเข้ากับตัวจัดการแพ็กเกจ เครื่องมือระบบ และค่าเริ่มต้นต่าง ๆ เซิร์ฟเวอร์บนอินเทอร์เน็ตส่วนใหญ่รัน Linux จึงเป็นเหตุผลที่คู่มือ VPS แทบทุกฉบับถือว่าใช้ Linux [1] บนเซิร์ฟเวอร์จะไม่มีหน้าจอเดสก์ท็อป คุณพิมพ์คำสั่งลงในเชลล์ (มักเป็น bash) แล้วระบบตอบกลับเป็นข้อความ
Debian และ Ubuntu
เทมเพลต VPS ของ Hostinger เป็นตระกูล Debian โดยค่าเริ่มต้น และ Ubuntu เป็นตัวเลือกที่พบบ่อยที่สุด ทั้งคู่ใช้ตัวจัดการแพ็กเกจ APT และ systemd ดังนั้นทุกคำสั่งในคู่มือนี้ใช้ได้กับทั้งสอง [2] ตรวจดูว่าใช้รุ่นใดด้วย `cat /etc/os-release`
กายวิภาคของพรอมป์เชลล์
| ส่วน | ตัวอย่าง | ความหมาย |
|---|---|---|
| user | root | คุณล็อกอินในชื่อผู้ใช้ใด |
| host | srv01 | ชื่อโฮสต์ของเครื่อง |
| path | ~ | ไดเรกทอรีปัจจุบัน (~ = โฮมของคุณ) |
| symbol | # vs $ | # = root (อำนาจเต็ม), $ = ผู้ใช้ทั่วไป |
พรอมป์อย่าง root@srv01:~# บอกว่าใคร อยู่ที่ไหน และมีอำนาจแค่ไหน
เชื่อมต่อผ่าน SSH ครั้งแรก
แผงควบคุมของ Hostinger จะแสดงไอพีของ VPS และรหัสผ่าน root เริ่มต้น (หรือให้ตั้งกุญแจ SSH ได้) จากเทอร์มินัลในเครื่องคุณเอง:
- 1เปิดเทอร์มินัล (macOS/Linux: Terminal; Windows: PowerShell หรือ Windows Terminal)
- 2รัน `ssh root@YOUR_SERVER_IP` แล้วกด Enter
- 3ครั้งแรกที่เชื่อมต่อ ให้พิมพ์ `yes` เพื่อยอมรับ fingerprint ของเซิร์ฟเวอร์
- 4ใส่รหัสผ่าน root จากแผงควบคุม Hostinger (จะไม่มีอะไรแสดงระหว่างพิมพ์ — เป็นเรื่องปกติ)
- 5ตอนนี้คุณอยู่ที่พรอมป์ `#` ล็อกอินเข้าเซิร์ฟเวอร์แล้ว [3][4]
เซสชัน SSH ครั้งแรก
อย่าใช้ชีวิตเป็น root
การล็อกอินเป็น root ใช้งานได้ แต่ root สามารถทำลายระบบได้ด้วยการพิมพ์ผิดครั้งเดียว และเป็นเป้าหมายอันดับหนึ่งของผู้โจมตี ในหัวข้อ “ผู้ใช้” คุณจะสร้างบัญชีผู้ใช้ทั่วไปที่มี sudo แล้วเลิกใช้ root โดยตรง ตอนนี้แค่จำไว้ว่าเป้าหมายคือทิ้ง root ไป
02 / 12
โครงสร้างระบบไฟล์และการนำทาง
Linux วางทุกอย่างไว้ในต้นไม้เดียวที่เริ่มจาก `/` (ไดเรกทอรีราก) — ไม่มีไดรฟ์ C: หรือ D: การรู้จักไดเรกทอรีมาตรฐานจะบอกได้ว่าไฟล์คอนฟิก ล็อก และไฟล์ของคุณเองอยู่ที่ไหน
ต้นไม้เดียว ทุกอย่างคือไฟล์
ต่างจาก Windows ตรงที่ Linux ไม่มีตัวอักษรไดรฟ์ ดิสก์ พาร์ทิชัน และอุปกรณ์จำนวนมากปรากฏอยู่ที่ใดที่หนึ่งภายใต้ `/` โครงสร้างนี้เป็นไปตาม Filesystem Hierarchy Standard เพื่อให้แอดมินรู้ว่าควรไปหาที่ไหนในทุกดิสโทร [1]
ไดเรกทอรีที่คุณจะได้ใช้จริง
| พาธ | เก็บอะไร | หมายเหตุ |
|---|---|---|
| / | รากของทุกสิ่ง | พาธอื่นทั้งหมดแตกออกจากตรงนี้ |
| /home | ไฟล์ของผู้ใช้ทั่วไป | บัญชีของคุณอยู่ใน /home/<ชื่อ> |
| /root | โฮมของผู้ใช้ root | ไม่ใช่ตัวเดียวกับ / |
| /etc | ไฟล์คอนฟิกของระบบ | sshd_config, nginx ฯลฯ — เป็นไฟล์ข้อความ [2] |
| /var | ข้อมูลที่เปลี่ยนแปลง | /var/log เก็บล็อก รวมถึงข้อมูลเว็บ |
| /tmp | ไฟล์ชั่วคราว | ถูกล้างเมื่อรีบูต |
| /usr | โปรแกรมที่ติดตั้ง | /usr/bin เก็บคำสั่งส่วนใหญ่ |
พาธสัมบูรณ์ vs พาธสัมพัทธ์
พาธสัมบูรณ์ (absolute) เริ่มจาก `/` และไม่กำกวม (`/etc/ssh/sshd_config`) ส่วนพาธสัมพัทธ์ (relative) อ่านจากตำแหน่งที่คุณอยู่ตอนนั้น มีทางลัดสามตัวช่วยประหยัดการพิมพ์: `~` คือโฮมของคุณ, `.` คือไดเรกทอรีปัจจุบัน และ `..` คือไดเรกทอรีแม่
การเคลื่อนที่ไปมา
| คำสั่ง | ทำอะไร |
|---|---|
| pwd | แสดงไดเรกทอรีที่คุณอยู่ |
| ls | แสดงรายการไฟล์ตรงนี้ |
| ls -lah | แสดงแบบยาว ทุกไฟล์ ขนาดอ่านง่าย [3] |
| cd /etc | ไปยังพาธสัมบูรณ์ |
| cd .. | ขึ้นไปหนึ่งระดับ |
| cd (หรือ cd ~) | กลับไปไดเรกทอรีโฮมของคุณ |
| cd - | กลับไปไดเรกทอรีก่อนหน้า |
การนำทาง
03 / 12
การทำงานกับไฟล์และไดเรกทอรี
การสร้าง คัดลอก ย้าย อ่าน และลบไฟล์คืองานประจำวันของการดูแลเซิร์ฟเวอร์ คำสั่งไม่กี่ตัวบวกกับการเปลี่ยนทิศทาง (redirection) และไปป์ (pipe) ครอบคลุมงานเกือบทั้งหมด
คำสั่งจัดการไฟล์หลัก
| คำสั่ง | ทำอะไร |
|---|---|
| mkdir dir | สร้างไดเรกทอรี (mkdir -p a/b/c สร้างทั้งพาธ) [1] |
| touch file | สร้างไฟล์ว่าง / อัปเดตเวลาแก้ไข |
| cp a b | คัดลอก a ไป b (cp -r สำหรับไดเรกทอรี) [2] |
| mv a b | ย้ายหรือเปลี่ยนชื่อ a เป็น b |
| rm file | ลบไฟล์ (rm -r สำหรับไดเรกทอรี) [3] |
| cat file | แสดงทั้งไฟล์ |
| less file | เลื่อนอ่านไฟล์ (กด q เพื่อออก) |
| head / tail file | 10 บรรทัดแรก / ท้าย (tail -f ตามแบบสด) |
| nano file | แก้ไขไฟล์ในโปรแกรมแก้ไขแบบง่ายบนเทอร์มินัล |
ลำดับงานทั่วไป
rm ไม่มีปุ่มย้อนกลับ
ไม่มีถังขยะ `rm -rf /path` ลบไดเรกทอรีและทุกอย่างข้างในอย่างถาวรและเงียบ ๆ ตรวจพาธให้ดีก่อนกด Enter และอย่ารัน `rm -rf` กับตัวแปรที่ยังไม่ได้ตรวจสอบ — `rm -rf $DIR/` เมื่อ $DIR ว่าง จะกลายเป็น `rm -rf /`
แก้ไขไฟล์ด้วย nano
`nano /etc/hostname` เปิดโปรแกรมแก้ไขที่ใช้ง่าย พิมพ์เพื่อแก้ไขได้เลย แถบล่างแสดงคีย์ลัดโดยที่ `^` หมายถึง Ctrl บันทึกด้วย Ctrl+O แล้ว Enter และออกด้วย Ctrl+X เป็นโปรแกรมแก้ไขที่ง่ายที่สุดสำหรับไฟล์คอนฟิกเมื่อเริ่มต้น
การเปลี่ยนทิศทางและไปป์
`>` ส่งผลลัพธ์ของคำสั่งไปเขียนทับลงไฟล์ ส่วน `>>` ต่อท้าย ไปป์ `|` ป้อนผลลัพธ์ของคำสั่งหนึ่งเข้าสู่คำสั่งถัดไป และ `grep` กรองบรรทัดตามแพตเทิร์น [4] สามตัวนี้รวมกันเป็นคำสั่งบรรทัดเดียวที่ทรงพลังสำหรับค้นล็อกและคอนฟิก
การเปลี่ยนทิศทางและไปป์
แบบฝึกหัด
- 1
คุณอยู่ใน /root จงเขียนคำสั่งเดียวเพื่อสร้างไดเรกทอรีซ้อน /root/app/logs ในขั้นตอนเดียว
›ดูเฉลย
คำตอบ: mkdir -p app/logs
วิธีทำ
-p สร้างไดเรกทอรีแม่ที่ขาดหายทุกระดับ และไม่ขึ้น error ถ้ามีอยู่แล้ว - 2
`cat file.txt > out.txt` กับ `cat file.txt >> out.txt` ต่างกันอย่างไร
›ดูเฉลย
คำตอบ: > เขียนทับ out.txt; >> ต่อท้ายลงท้ายไฟล์ out.txt
- 3
จงเขียนคำสั่งที่แสดงเฉพาะบรรทัดที่มีคำว่า 'error' ใน /var/log/syslog
›ดูเฉลย
คำตอบ: grep 'error' /var/log/syslog
04 / 12
สิทธิ์และความเป็นเจ้าของไฟล์
ทุกไฟล์มีเจ้าของ กลุ่ม และชุดสิทธิ์อ่าน/เขียน/รันสำหรับผู้ใช้สามจำพวก นี่คือรากฐานของความปลอดภัยบน Linux — ตั้งผิดก็ทำให้เซอร์วิสพังหรือเปิดเผยความลับ
โมเดล rwx
แต่ละไฟล์ให้สิทธิ์สามอย่าง — อ่าน (r), เขียน (w), รัน (x) — แก่ผู้ใช้สามจำพวก: เจ้าของ (user), กลุ่ม (group) และคนอื่นทั้งหมด (other) คำสั่ง `ls -l` แสดงเป็นสตริง 10 ตัวอักษร: ตัวอักษรบอกชนิดหนึ่งตัว ตามด้วย rwx สามชุด [3]
อ่านผลลัพธ์ของ ls -l
สิทธิ์แบบเลขฐานแปด (r=4, w=2, x=1)
| ฐานแปด | สัญลักษณ์ | หมายความว่า | ใช้ทั่วไปกับ |
|---|---|---|---|
| 644 | rw-r--r-- | เจ้าของแก้ไข คนอื่นอ่าน | ไฟล์ทั่วไป |
| 600 | rw------- | เจ้าของเท่านั้น | ความลับ, กุญแจส่วนตัว SSH |
| 755 | rwxr-xr-x | เจ้าของแก้ไข คนอื่นรัน | สคริปต์, ไดเรกทอรี |
| 700 | rwx------ | เจ้าของเท่านั้น เต็มสิทธิ์ | ไดเรกทอรีส่วนตัว |
| 777 | rwxrwxrwx | ทุกคนทำได้ทุกอย่าง | แทบไม่ควรใช้ — สัญญาณอันตราย |
เปลี่ยนสิทธิ์และเจ้าของ
- 1`chmod 600 secret.key` ตั้งสิทธิ์ตรงตัวด้วยเลขฐานแปด [1]
- 2`chmod +x script.sh` เพิ่มบิตรันเพื่อให้รันสคริปต์ได้
- 3`chown deploy file` เปลี่ยนเจ้าของ; `chown deploy:www file` ตั้งทั้งเจ้าของและกลุ่ม [2]
- 4`chmod -R 755 dir/` ใช้แบบเรียกซ้ำกับไดเรกทอรีและทุกอย่างข้างใน
sudo: ยืมอำนาจ root เพื่อคำสั่งเดียว
ผู้ใช้ทั่วไปรันคำสั่งระดับแอดมินด้วยการเติม `sudo` นำหน้า เช่น `sudo systemctl restart nginx` มันจะถามรหัสผ่านของคุณ รันคำสั่งเดียวนั้นในฐานะ root และบันทึกล็อกไว้ — ปลอดภัยกว่าการล็อกอินเป็น root มาก
แบบฝึกหัด
- 1
กุญแจส่วนตัว SSH ต้องอ่านและเขียนได้โดยเจ้าของเท่านั้น เลขฐานแปดคืออะไร และคำสั่งใดตั้งค่านี้กับ ~/.ssh/id_ed25519
›ดูเฉลย
คำตอบ: 600 — chmod 600 ~/.ssh/id_ed25519
วิธีทำ
เจ้าของ rw = 4+2 = 6, กลุ่ม 0, คนอื่น 0 → 600ถ้าเปิดมากกว่านี้ SSH จะปฏิเสธไม่ใช้กุญแจ - 2
โหมด 755 ให้สิทธิ์อะไร ทีละหลัก
›ดูเฉลย
คำตอบ: เจ้าของ rwx (7), กลุ่ม r-x (5), คนอื่น r-x (5)
วิธีทำ
7 = 4+2+1 (rwx)5 = 4+0+1 (r-x) - 3
ทำไม chmod 777 บนไดเรกทอรีเว็บจึงอันตราย
›ดูเฉลย
คำตอบ: มันยอมให้ผู้ใช้ใด ๆ (รวมถึงโปรเซสที่ถูกเจาะ) เขียนและรันไฟล์ในนั้นได้ ผู้โจมตีที่ได้ช่องทางเข้ามาเพียงเล็กน้อยก็ฝังโค้ดได้
05 / 12
ผู้ใช้ กลุ่ม และ sudo
การรันทุกอย่างเป็น root คือความผิดพลาดใหญ่ที่สุดของมือใหม่ ทางแก้คือบัญชีผู้ใช้ทั่วไปที่ยกระดับเป็น root เฉพาะเมื่อจำเป็นผ่าน sudo
root vs ผู้ใช้ทั่วไป
root (UID 0) ทำได้ทุกอย่าง รวมถึงความเสียหายที่ย้อนกลับไม่ได้ ผู้ใช้ทั่วไปถูกจำกัดอยู่กับไฟล์ของตัวเอง หลักการสิทธิ์น้อยที่สุด (least privilege) บอกว่า: ทำงานประจำวันในฐานะผู้ใช้ทั่วไป แล้วยืมอำนาจ root เพียงชั่วคราวผ่าน sudo [2][3]
สร้างผู้ใช้ sudo ของคุณเอง
รันคำสั่งเหล่านี้ในฐานะ root บน VPS ที่เพิ่งติดตั้งใหม่:
- 1`adduser deploy` — สร้างผู้ใช้และถามรหัสผ่าน [1]
- 2`usermod -aG sudo deploy` — เพิ่มผู้ใช้เข้ากลุ่ม sudo (`-aG` = ต่อท้ายเข้ากลุ่ม)
- 3`su - deploy` — สลับไปเป็นผู้ใช้ใหม่เพื่อทดสอบ
- 4`sudo whoami` — ควรแสดง `root` เป็นการยืนยันว่า sudo ใช้ได้
สร้างและทดสอบผู้ใช้
รู้ว่าคุณคือใคร
| คำสั่ง | บอกอะไร |
|---|---|
| whoami | ชื่อผู้ใช้ปัจจุบันของคุณ |
| id | UID, GID และกลุ่มที่คุณสังกัด |
| who / w | ใครอีกบ้างที่กำลังล็อกอินอยู่ตอนนี้ |
| groups deploy | ผู้ใช้นั้นอยู่ในกลุ่มใดบ้าง |
| passwd | เปลี่ยนรหัสผ่านของคุณเอง |
ทดสอบ sudo ก่อนเลิกใช้ root
ตรวจให้แน่ใจว่า `sudo whoami` คืนค่า root สำหรับผู้ใช้ใหม่ของคุณ ก่อน ที่จะออกจาก root หรือปิดการล็อกอิน root ถ้า sudo ตั้งค่าผิดและคุณล็อก root ไว้แล้ว คุณอาจเข้าเซิร์ฟเวอร์ของตัวเองไม่ได้อีก
06 / 12
ติดตั้งและอัปเดตซอฟต์แวร์
บน Debian/Ubuntu คุณติดตั้งซอฟต์แวร์จากแหล่ง (repository) ที่เชื่อถือได้ด้วย APT แทนการดาวน์โหลดตัวติดตั้งเอง APT จัดการ dependency และส่งอัปเดตความปลอดภัยให้
APT คืออะไร
APT (Advanced Package Tool) ดาวน์โหลดแพ็กเกจจากแหล่งทางการ — คลังซอฟต์แวร์ที่ผ่านการตรวจสอบและเซ็นลายเซ็น ปลอดภัยกว่าการดาวน์โหลดมั่ว ๆ เพราะแพ็กเกจถูกตรวจความถูกต้องและแพตช์จากศูนย์กลาง [1]
คำสั่ง apt ที่ใช้ประจำ (รันด้วย sudo)
| คำสั่ง | ทำอะไร |
|---|---|
| apt update | รีเฟรชรายการแพ็กเกจที่มีให้ [2] |
| apt upgrade | ติดตั้งอัปเดตของแพ็กเกจที่ติดตั้งไว้ |
| apt install nginx | ติดตั้งแพ็กเกจพร้อม dependency |
| apt remove nginx | ถอนแพ็กเกจ (เก็บคอนฟิกไว้) |
| apt purge nginx | ถอนแพ็กเกจและลบคอนฟิกด้วย |
| apt autoremove | ลบแพ็กเกจที่ไม่มีอะไรต้องใช้แล้ว |
| apt search word | ค้นแพ็กเกจด้วยคำสำคัญ |
อัปเดตเซิร์ฟเวอร์ (ทำสิ่งนี้ก่อน และทำสม่ำเสมอ)
- 1`sudo apt update` — ดึงดัชนีแพ็กเกจล่าสุด
- 2`sudo apt upgrade -y` — ติดตั้งอัปเดตทั้งหมดที่มี (`-y` ยืนยันอัตโนมัติ)
- 3รีบูตถ้ามีการอัปเดตเคอร์เนล: `sudo reboot`
อัปเดตและติดตั้ง
ให้แพตช์ความปลอดภัยไหลเข้าโดยอัตโนมัติ
ติดตั้ง `unattended-upgrades` เพื่อให้เซิร์ฟเวอร์แพตช์ความปลอดภัยเอง: `sudo apt install unattended-upgrades` แล้ว `sudo dpkg-reconfigure unattended-upgrades` ซอฟต์แวร์ที่ไม่ได้แพตช์คือช่องทางที่เซิร์ฟเวอร์ถูกเจาะบ่อยที่สุด [3]
07 / 12
โปรเซสและทรัพยากรระบบ
โปรแกรมที่กำลังรันทุกตัวคือโปรเซสที่มีหมายเลข PID การรู้วิธีดูว่ามีอะไรรันอยู่ กินทรัพยากรเท่าไร และจะหยุดอย่างไร เป็นสิ่งจำเป็นเมื่อเซิร์ฟเวอร์ช้าหรือเซอร์วิสมีปัญหา
ตรวจสอบโปรเซสและทรัพยากร
| คำสั่ง | แสดงอะไร |
|---|---|
| ps aux | ภาพรวมของโปรเซสที่รันอยู่ทั้งหมด [1] |
| top | มุมมองสดที่อัปเดตการใช้ CPU/RAM ตามโปรเซส [2] |
| htop | top แบบสีที่ใช้ง่ายกว่า (apt install htop) |
| free -h | RAM ที่ใช้ vs ว่าง แบบอ่านง่าย |
| df -h | พื้นที่ดิสก์ต่อระบบไฟล์ |
| du -sh * | ขนาดของแต่ละรายการในไดเรกทอรีปัจจุบัน |
| kill PID | ขอให้โปรเซสหยุด (สัญญาณ TERM) |
| kill -9 PID | บังคับฆ่าโปรเซส (สัญญาณ KILL) |
ค้นหาและหยุดโปรเซส
สัญญาณ: TERM vs KILL
`kill PID` ส่ง SIGTERM เป็นการขอให้โปรเซสเก็บกวาดและออกอย่างสุภาพ — ลองวิธีนี้ก่อนเสมอ ส่วน `kill -9 PID` ส่ง SIGKILL ที่โปรเซสดักจับหรือเพิกเฉยไม่ได้ มันหยุดทันทีแต่อาจทิ้งไฟล์ที่เขียนค้างไว้ [3] ใช้ -9 เฉพาะตอนที่โปรเซสค้างจริง ๆ
เมื่อดิสก์เต็ม
ดิสก์เต็มทำให้แทบทุกอย่างพัง `df -h` หาว่าระบบไฟล์ใดเต็ม; `du -sh /var/* | sort -h` หาตัวที่กินที่มากที่สุด ล็อกใน /var/log และแพ็กเกจเก่า (`apt autoremove`) เป็นตัวกินพื้นที่ที่พบบ่อย
แบบฝึกหัด
- 1
เซอร์วิสค้างอยู่ คำสั่งใดที่ควรลองก่อนเพื่อหยุดโปรเซส 4021 และคำสั่งใดใช้เป็นทางเลือกสุดท้าย
›ดูเฉลย
คำตอบ: ก่อน `kill 4021` (SIGTERM นุ่มนวล); ทางเลือกสุดท้าย `kill -9 4021` (SIGKILL บังคับ)
- 2
จงเขียนคำสั่งตรวจพื้นที่ดิสก์ที่เหลือในหน่วยที่อ่านง่าย
›ดูเฉลย
คำตอบ: df -h
แหล่งอ้างอิง
08 / 12
เซอร์วิสและล็อกด้วย systemd
โปรแกรมที่รันยาวนานอย่างเว็บเซิร์ฟเวอร์และ SSH ทำงานเป็นเซอร์วิสเบื้องหลังที่จัดการโดย systemd `systemctl` ควบคุมพวกมัน ส่วน `journalctl` อ่านล็อกของพวกมัน
systemd และยูนิต
systemd คือระบบ init ที่เริ่ม OS และคอยกำกับเซอร์วิส แต่ละเซอร์วิสอธิบายด้วย “ยูนิต” (เช่น `nginx.service`) คุณเริ่ม หยุด และเปิดยูนิตให้ทำงานด้วยเครื่องมือเดียวคือ `systemctl` [1]
จัดการเซอร์วิส (เช่น nginx)
| คำสั่ง | ทำอะไร |
|---|---|
| systemctl status nginx | รันอยู่ไหม? พร้อมล็อกล่าสุด |
| systemctl start nginx | เริ่มเดี๋ยวนี้ |
| systemctl stop nginx | หยุดเดี๋ยวนี้ |
| systemctl restart nginx | หยุดแล้วเริ่ม (ใช้คอนฟิกใหม่) |
| systemctl reload nginx | โหลดคอนฟิกใหม่โดยไม่ตัดการเชื่อมต่อ |
| systemctl enable nginx | เริ่มอัตโนมัติตอนบูต [3] |
| systemctl disable nginx | ไม่เริ่มตอนบูต |
ตรวจและรีสตาร์ตเซอร์วิส
อ่านล็อกด้วย journalctl
systemd เก็บล็อกไว้ที่ศูนย์กลาง `journalctl -u nginx` แสดงล็อกของเซอร์วิสหนึ่ง, `-e` กระโดดไปท้ายสุด และ `-f` ตามบรรทัดใหม่แบบสด [2] เมื่อเซอร์วิสไม่ยอมเริ่ม journal ของมันมักบอกเหตุผลเสมอ
ล็อก
09 / 12
เครือข่ายบนบรรทัดคำสั่ง
เซิร์ฟเวอร์มีประโยชน์ต่อเมื่อเข้าถึงได้ เครื่องมือเหล่านี้แสดงที่อยู่ของคุณ พอร์ตใดเปิดอยู่ และคุณติดต่อโฮสต์อื่นได้หรือไม่ — เป็นสิ่งแรกที่ตรวจเมื่อบางอย่างเชื่อมต่อไม่ได้
เครื่องมือเครือข่าย
| คำสั่ง | แสดง / ทำอะไร |
|---|---|
| ip a | อินเทอร์เฟซเครือข่ายและที่อยู่ IP ของคุณ [1] |
| ip route | ตารางเส้นทาง / เกตเวย์ปริยาย |
| ss -tulpn | พอร์ต TCP/UDP ที่ฟังอยู่และโปรเซสของมัน [2] |
| ping host | โฮสต์ตอบสนองไหม (Ctrl+C เพื่อหยุด) |
| curl URL | ดึง URL; ทดสอบเว็บเซอร์วิส [3] |
| curl -I URL | ดึงเฉพาะ HTTP response header |
| dig name | แปลงชื่อ DNS เป็นที่อยู่ |
| wget URL | ดาวน์โหลดไฟล์ |
ตรวจว่ามีอะไรฟังอยู่
พอร์ตและความหมาย
พอร์ตคือประตูที่มีหมายเลขบนเซิร์ฟเวอร์ของคุณ 22 คือ SSH, 80 คือ HTTP, 443 คือ HTTPS `ss -tulpn` แสดงทุกประตูที่เปิดอยู่และโปรแกรมที่อยู่เบื้องหลัง พอร์ตที่ฟังอยู่แบบไม่คาดคิดคือสัญญาณอันตรายด้านความปลอดภัยที่ควรสืบสวน
ทดสอบเว็บเซอร์วิสในเครื่อง
แหล่งอ้างอิง
10 / 12
กุญแจ SSH และการเสริมความปลอดภัยเซิร์ฟเวอร์ SSH
รหัสผ่านเดาได้ แต่กุญแจ SSH แทบเดาไม่ได้เลย การเปลี่ยนมาล็อกอินด้วยกุญแจอย่างเดียวและรัดกุม SSH daemon คือก้าวด้านความปลอดภัยที่ให้ผลสูงที่สุดบน VPS
ทำไมกุญแจดีกว่ารหัสผ่าน
คู่กุญแจ SSH ประกอบด้วยกุญแจส่วนตัว (เก็บเป็นความลับในเครื่องคุณ) และกุญแจสาธารณะ (วางไว้บนเซิร์ฟเวอร์) การล็อกอินพิสูจน์ว่าคุณถือกุญแจส่วนตัวโดยไม่ส่งมันออกไปเลย กุญแจที่แข็งแรงทนต่อบอตเดารหัสผ่านที่ถล่มทุกพอร์ต SSH สาธารณะ [4]
ตั้งค่าการยืนยันตัวด้วยกุญแจ
รันคำสั่งแรกบน เครื่องของคุณ ไม่ใช่บนเซิร์ฟเวอร์:
- 1`ssh-keygen -t ed25519 -C "you@example.com"` — สร้างคู่กุญแจสมัยใหม่; กด Enter เพื่อรับพาธปริยายและตั้งวลีรหัสผ่าน (passphrase) [2]
- 2`ssh-copy-id deploy@YOUR_SERVER_IP` — คัดลอกกุญแจสาธารณะไปยัง authorized_keys ของเซิร์ฟเวอร์
- 3`ssh deploy@YOUR_SERVER_IP` — ล็อกอินอีกครั้ง ควรไม่ถามรหัสผ่าน
- 4ยืนยันว่าล็อกอินด้วยกุญแจใช้ได้ ก่อน ปิดการใช้รหัสผ่านในขั้นถัดไป
สร้างและคัดลอกกุญแจ
รัดกุม /etc/ssh/sshd_config
แก้คอนฟิกของ SSH daemon ด้วย `sudo nano /etc/ssh/sshd_config` ตั้งสามตัวเลือกด้านล่าง แล้วใช้งานด้วย `sudo systemctl restart ssh` วิธีนี้ปิดการล็อกอิน root โดยตรงและปิดการยืนยันตัวด้วยรหัสผ่านทั้งหมด เหลือเฉพาะกุญแจเท่านั้นที่ใช้ได้ [1][3]
บรรทัดสำคัญใน sshd_config
เปิดเซสชันหนึ่งค้างไว้ระหว่างทดสอบ
ก่อนรีสตาร์ต SSH ด้วยค่าใหม่ ให้เปิดเทอร์มินัล ที่สอง แล้วล็อกอินด้วยกุญแจให้สำเร็จ ถ้าค่าใดล็อกคุณออก เซสชันที่เปิดค้างไว้จะช่วยให้แก้ได้ มิฉะนั้นคอนฟิกที่ผิดอาจทำให้เชื่อมต่อกลับไม่ได้ — และต้องใช้คอนโซลของ Hostinger เพื่อกู้คืน
11 / 12
ไฟร์วอลล์ด้วย UFW
ไฟร์วอลล์ตัดสินว่าโลกภายนอกเข้าถึงพอร์ตใดได้บ้าง UFW (Uncomplicated Firewall) เป็นหน้ากากที่ใช้ง่ายบน Ubuntu: ปฏิเสธขาเข้าทั้งหมดโดยปริยาย แล้วอนุญาตเฉพาะสิ่งที่จำเป็นอย่างชัดเจน
ปฏิเสธโดยปริยาย อนุญาตเป็นข้อยกเว้น
นโยบายไฟร์วอลล์ที่ดีบล็อกการเชื่อมต่อขาเข้าทั้งหมดโดยปริยาย แล้วเปิดเฉพาะพอร์ตที่เซอร์วิสของคุณใช้ UFW ทำให้สิ่งนี้เป็นคำสั่งอ่านง่ายไม่กี่บรรทัดแทนกฎ iptables ดิบ ๆ [1]
ตั้งค่า UFW อย่างปลอดภัย
ลำดับสำคัญมาก — อนุญาต SSH ก่อน เปิดใช้งานไฟร์วอลล์:
- 1`sudo ufw default deny incoming` — บล็อกขาเข้าทั้งหมดโดยปริยาย
- 2`sudo ufw default allow outgoing` — ให้เซิร์ฟเวอร์ติดต่อออกได้
- 3`sudo ufw allow OpenSSH` — คงการเข้าถึง SSH ของคุณไว้ (หรือ `ufw allow 22`)
- 4`sudo ufw allow 80,443/tcp` — อนุญาตทราฟฟิกเว็บถ้าคุณรันเว็บไซต์
- 5`sudo ufw enable` — เปิดไฟร์วอลล์
- 6`sudo ufw status verbose` — ยืนยันกฎ [3]
ไฟร์วอลล์สำหรับเว็บเซิร์ฟเวอร์ทั่วไป
คำสั่ง UFW ที่มีประโยชน์
| คำสั่ง | ทำอะไร |
|---|---|
| ufw status numbered | แสดงกฎพร้อมหมายเลขลำดับ [2] |
| ufw delete 2 | ลบกฎหมายเลข 2 |
| ufw allow from 1.2.3.4 | อนุญาตเฉพาะ IP ที่ระบุ |
| ufw deny 23 | บล็อกพอร์ต |
| ufw disable | ปิดไฟร์วอลล์ |
อนุญาต SSH ก่อนเสมอ ทุกครั้ง
ถ้าคุณรัน `ufw enable` โดยไม่มีกฎอนุญาต SSH (พอร์ต 22 หรือพอร์ตที่คุณกำหนดเอง) ไฟร์วอลล์จะตัดการเชื่อมต่อของคุณเองและคุณจะถูกล็อกออก ให้ `ufw allow OpenSSH` ก่อนเสมอ
12 / 12
เช็กลิสต์เสริมความปลอดภัย VPS
ความปลอดภัยคือชั้นป้องกันหลายชั้น ไม่ใช่สวิตช์เดียว รวมทุกอย่างจากหัวข้อก่อนหน้าเป็นเช็กลิสต์ที่ทำซ้ำได้ ซึ่งคุณรันบนเซิร์ฟเวอร์ใหม่ทุกตัว ทุกขั้นตอนไม่ยาก แต่การข้ามมันคือสิ่งที่ทำให้เซิร์ฟเวอร์ถูกเจาะ
แนวคิด: สิทธิ์น้อยที่สุดและพื้นผิวน้อยที่สุด
สองหลักการครอบคลุมความปลอดภัยเซิร์ฟเวอร์ส่วนใหญ่ สิทธิ์น้อยที่สุด (least privilege): ผู้ใช้และเซอร์วิสทุกตัวได้สิทธิ์เท่าที่จำเป็นเท่านั้น ไม่มากกว่านั้น พื้นผิวการโจมตีน้อยที่สุด (minimal attack surface): รันและเปิดเผยให้น้อยที่สุด — พอร์ตเปิดน้อยลง แพ็กเกจติดตั้งน้อยลง บัญชีน้อยลง [1]
เช็กลิสต์เสริมความปลอดภัยในชั่วโมงแรก
รันสิ่งเหล่านี้บน VPS ใหม่ทุกตัว ตามลำดับ:
- 1อัปเดตทุกอย่าง: `sudo apt update && sudo apt upgrade -y` [4]
- 2สร้างผู้ใช้ sudo ที่ไม่ใช่ root และใช้มันตั้งแต่นี้ไป (หัวข้อผู้ใช้)
- 3ตั้งค่าล็อกอินด้วยกุญแจ SSH แล้วปิดการล็อกอิน root และการยืนยันด้วยรหัสผ่าน (หัวข้อ SSH)
- 4เปิดไฟร์วอลล์ด้วย UFW อนุญาตเฉพาะ SSH และพอร์ตเซอร์วิสของคุณ
- 5ติดตั้ง Fail2Ban เพื่อแบนการล็อกอินที่ล้มเหลวซ้ำ ๆ อัตโนมัติ
- 6เปิดอัปเดตความปลอดภัยอัตโนมัติ (unattended-upgrades)
ติดตั้ง Fail2Ban (แบนผู้โจมตีแบบ brute-force)
Fail2Ban ในประโยคเดียว
Fail2Ban เฝ้าดูไฟล์ล็อก (เช่น /var/log/auth.log) และบล็อกชั่วคราวทุก IP ที่ล็อกอินล้มเหลวมากเกินไป หยุดบอตเดารหัสผ่านที่คอยตรวจสอบเซิร์ฟเวอร์สาธารณะทุกตัวอยู่ตลอด [2]
ป้องกันเป็นชั้น (defense in depth)
ไม่มีมาตรการเดียวที่เพียงพอ กุญแจทำให้รหัสผ่านไม่สำคัญ ไฟร์วอลล์ซ่อนพอร์ต Fail2Ban ชะลอผู้โจมตี และอัปเดตปิดช่องโหว่ที่รู้แล้ว ซ้อนกันทั้งหมดจะเปลี่ยนเป้าหมายที่ง่ายให้เป็นเป้าหมายที่ยาก [3] รันเช็กลิสต์นี้ซ้ำทุกครั้งที่สร้างเครื่องใหม่
ทบทวน
- 1
ระบุลำดับของสามขั้นตอนแรกในการเสริมความปลอดภัย และทำไมลำดับจึงสำคัญ
›ดูเฉลย
คำตอบ: 1) อัปเดตแพ็กเกจ, 2) สร้างผู้ใช้ sudo ที่ไม่ใช่ root, 3) ตั้งค่ากุญแจ SSH แล้วจึงปิดการล็อกอิน root/รหัสผ่าน คุณต้องมีผู้ใช้ sudo และล็อกอินด้วยกุญแจที่ใช้ได้ ก่อน ปิด root ไม่งั้นเสี่ยงล็อกตัวเองออก
- 2
ทำไมต้องอนุญาต SSH ใน UFW ก่อนรัน `ufw enable`
›ดูเฉลย
คำตอบ: การเปิดใช้งานแบบ default-deny โดยไม่มีกฎ SSH จะบล็อกพอร์ต 22 และตัดการเชื่อมต่อของคุณเอง ทำให้ถูกล็อกออกจากเซิร์ฟเวอร์
- 3
ในหนึ่งประโยค Fail2Ban เพิ่มอะไรนอกเหนือจากกุญแจ SSH และไฟร์วอลล์
›ดูเฉลย
คำตอบ: มันแบน IP ที่ยืนยันตัวล้มเหลวซ้ำ ๆ โดยอัตโนมัติ ตัดบอต brute-force และเสียงรบกวนในล็อก แม้กุญแจจะบล็อกพวกมันอยู่แล้วก็ตาม