คำถามจากลูกค้า: “ติดตั้งเครื่องแล้วมี user แปลก ๆ ขึ้นมาเอง ลงใหม่ไปหลายรอบแล้ว ก็ยังกลับมาอีก”
ถ้าคุณไม่ได้สร้าง user นั้นเอง และไม่มีใครในทีมสร้าง ให้ถือว่าเครื่องถูกเจาะไว้ก่อน จนกว่าจะพิสูจน์ได้ว่าไม่ใช่
การที่ลงเครื่องใหม่แล้ว user กลับมาอีกบอกเราว่าช่องทางที่ผู้บุกรุกใช้ยังเปิดอยู่ โปรแกรมอัตโนมัติที่สแกนหาเครื่องบนอินเทอร์เน็ตจะเข้ามาซ้ำได้ภายในไม่กี่ชั่วโมง
เครื่องที่มี GPU แรงเป็นเป้าหมายยอดนิยมของคนที่ต้องการขโมยพลังประมวลผลไปขุดเหรียญ
บทความนี้เป็นขั้นตอนเบื้องต้นตามลำดับ อย่าเพิ่งลงเครื่องใหม่จนกว่าจะทำขั้นที่ 1–3 เสร็จ
ขั้นที่ 1: ตัดเครื่องออกจากเครือข่าย
ถอดสาย LAN และปิด WiFi ของเครื่อง ถ้ามีจอและคีย์บอร์ดต่อกับเครื่องให้ทำงานต่อจากหน้าเครื่อง
ถ้าเครื่องไม่มีจอ ให้ฝ่าย IT ตัดเครื่องออกจากอินเทอร์เน็ตที่เราเตอร์ แต่ยังให้เข้าจาก LAN ภายในได้
ขั้นที่ 2: เก็บข้อมูลไว้ดูว่าเข้ามาทางไหน
ใช้เวลาประมาณ 1 นาที ถ้าข้ามขั้นนี้แล้วลงเครื่องใหม่ หลักฐานจะหายหมด และเราจะไม่รู้ว่าต้องปิดช่องทางไหน
เปิด terminal แล้ววางคำสั่งนี้ทั้งก้อน ผลจะถูกเก็บในไฟล์ ~/incident.txt
{
echo "== เวลา"; date
echo "== user ทั้งหมด (uid 0 และตั้งแต่ 1000)"; awk -F: '$3==0 || $3>=1000 {print $1, $3, $6, $7}' /etc/passwd
echo "== กลุ่ม sudo"; getent group sudo
echo "== login ล่าสุด"; last -a | head -30
echo "== log การเข้าระบบ"; sudo zgrep -hE "new user|useradd|usermod|Accepted|Failed password|Invalid user" /var/log/auth.log* | tail -150
echo "== ssh key ที่อนุญาต"; sudo find /root /home -name authorized_keys -exec sh -c 'echo "$1"; cat "$1"' _ {} \;
echo "== งานตั้งเวลา"; for u in $(cut -d: -f1 /etc/passwd); do sudo crontab -l -u "$u" 2>/dev/null | sed "s/^/$u: /"; done; ls -la /etc/cron.d
echo "== service ที่เพิ่งเพิ่ม"; ls -lt /etc/systemd/system | head -20
echo "== พอร์ตที่เปิดรับ"; sudo ss -tulpn
echo "== IP ของเครื่อง"; ip -4 addr | grep inet
echo "== โปรแกรมที่ใช้ CPU มากสุด"; ps aux --sort=-%cpu | head -15
echo "== GPU"; nvidia-smi
echo "== docker"; docker ps -a
} > ~/incident.txt 2>&1; echo "บันทึกที่ ~/incident.txt แล้ว"
คัดลอกไฟล์นี้ออกมาเก็บไว้ (เช่นใส่ USB) ก่อนทำขั้นต่อไป
ขั้นที่ 3: อ่านผลเบื้องต้น
- user นั้นเป็นของระบบหรือเปล่า โปรแกรมบางตัวสร้าง user ของตัวเอง เช่น
ollamaหรือgnome-initial-setupพวกนี้มีเลข uid ต่ำกว่า 1000 และไม่มีสิทธิ์ login เป็นเรื่องปกติ
แต่ถ้า user แปลกมี uid ตั้งแต่ 1000 ขึ้นไป อยู่ในกลุ่ม sudo หรือมีเลข uid เป็น 0 (เท่ากับ root) ถือว่าผิดปกติแน่นอน - เข้ามาทาง ssh หรือเปล่า ถ้าในหัวข้อ “log การเข้าระบบ” มี
Failed passwordจาก IP ภายนอกจำนวนมาก แล้วตามด้วยAccepted passwordแปลว่ามีคนเดารหัสผ่าน ssh สำเร็จ ช่องทางนี้พบบ่อยที่สุด - เครื่องต่อกับอินเทอร์เน็ตตรงหรือเปล่า ถ้า IP ของเครื่องไม่ได้ขึ้นต้นด้วย
192.168.10.หรือ172.16.–172.31.แปลว่าเครื่องอยู่บนอินเทอร์เน็ตโดยตรง
ถ้าเป็น IP ภายใน ให้ฝ่าย IT เช็คว่าเราเตอร์ตั้ง port forward หรือ DMZ มาที่เครื่องนี้ไว้หรือไม่ - มีของฝังไว้หรือเปล่า ssh key ที่ไม่รู้จัก, งานตั้งเวลาแปลก ๆ, service ใหม่, โปรแกรมไม่รู้จักที่ใช้ CPU หรือ GPU เต็ม หรือ docker container ที่ไม่ได้สร้างเอง ล้วนเป็นสัญญาณว่าเครื่องถูกใช้งานโดยคนอื่น
ผู้บุกรุกที่ได้สิทธิ์ root แก้ log ได้ ถ้าไม่เจออะไรผิดปกติก็ยังไม่ได้แปลว่าเครื่องปลอดภัย
ขั้นที่ 4: ปิดช่องทางก่อน แล้วค่อยลงเครื่องใหม่
เครื่องที่ถูกเจาะแล้ว การลงใหม่คือทางที่สะอาดที่สุด แต่ต้องทำตามลำดับนี้ ไม่อย่างนั้นจะถูกเจาะซ้ำเหมือนเดิม
- สำรองเฉพาะข้อมูล เช่นเอกสารและผลงาน อย่าคัดลอกสคริปต์ โปรแกรม หรือโฟลเดอร์
.sshกลับมา โมเดลโหลดใหม่ได้ - ปิดทางเข้าจากอินเทอร์เน็ตที่เราเตอร์ ยกเลิก port forward และ DMZ ที่ชี้มาเครื่องนี้ ถ้าต้องใช้จากนอกสถานที่ ให้ใช้ VPN เช่น Tailscale แทนการเปิดพอร์ต
- ลงเครื่องใหม่ ตามบทความล้างเครื่องเริ่มใหม่ ระหว่างนี้ยังไม่ต้องต่อเครือข่าย
- ตั้งรหัสผ่านที่เดายาก อย่างน้อย 12 ตัว ไม่ใช้รหัสที่ใช้ที่อื่น
- ให้ ssh ใช้ key แทนรหัสผ่าน ค่าเริ่มต้นของ DGX OS เปิด ssh ให้ login ด้วยรหัสผ่านจากทุกเครื่อง
บนโน้ตบุ๊กของคุณ:ssh-keygen -t ed25519แล้วssh-copy-id ชื่อuser@IPเครื่อง
ลองssh ชื่อuser@IPเครื่องให้เข้าได้โดยไม่ถามรหัสก่อน แล้วบนเครื่อง DGX:
printf 'PasswordAuthentication no\nPermitRootLogin no\n' | sudo tee /etc/ssh/sshd_config.d/10-no-password.conf
sudo systemctl restart ssh
เปิดหน้าต่าง ssh เดิมค้างไว้ระหว่างลอง ถ้าเข้าหน้าต่างใหม่ไม่ได้ จะได้แก้กลับทัน - ระวังโปรแกรม AI ที่เปิดพอร์ตโดยไม่มีรหัส เช่น Jupyter, Ollama (พอร์ต 11434), ComfyUI (8188) หรือ Open WebUI ที่ลงเพิ่มทีหลัง
หลายตัวรับคำสั่งจากใครก็ได้ที่เข้าถึงพอร์ตนั้น ถ้าไม่จำเป็นให้ตั้งให้รับเฉพาะในเครื่อง (localhost) หรือเปิดรหัสผ่านของโปรแกรมนั้น
เช็คได้จากหัวข้อ “พอร์ตที่เปิดรับ” ในไฟล์ขั้นที่ 2 บรรทัดที่ขึ้นต้นด้วย0.0.0.0หรือ*คือพอร์ตที่เครื่องอื่นเข้าถึงได้ - เปลี่ยนรหัสและ token ทุกตัวที่เคยอยู่ในเครื่องเดิม เช่น token ของ Hugging Face, API key ของบริการ cloud AI และรหัสผ่านที่เคยพิมพ์หรือบันทึกไว้บนเครื่องนั้น ถือว่าหลุดไปแล้ว
ข้อควรรู้: firewall ในเครื่อง (ufw) กันพอร์ตของ docker ไม่ได้ เพราะ docker ตั้งกฎของตัวเองข้าม ufw การปิดที่เราเตอร์จึงสำคัญที่สุด
ส่งข้อมูลให้ทีมงานช่วยดู
ส่งไฟล์ ~/incident.txt จากขั้นที่ 2 พร้อมชื่อ user ที่เห็น และบอกว่าเครื่องต่อเน็ตแบบไหน (ผ่านเราเตอร์ในบริษัท, IP สาธารณะ, เปิดพอร์ตไว้หรือไม่) ผ่านหน้าติดต่อทีมงาน
เราจะช่วยดูว่าเข้ามาทางไหน และควรปิดอะไรเพิ่มก่อนนำเครื่องกลับมาใช้