คู่มือและสเปก

มี user แปลก ๆ โผล่ในเครื่อง DGX Spark / ASUS GX10 ลงใหม่แล้วก็ยังกลับมา: รับมือเครื่องถูกเจาะเบื้องต้น

คำถามจากลูกค้า: “ติดตั้งเครื่องแล้วมี 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: ปิดช่องทางก่อน แล้วค่อยลงเครื่องใหม่

เครื่องที่ถูกเจาะแล้ว การลงใหม่คือทางที่สะอาดที่สุด แต่ต้องทำตามลำดับนี้ ไม่อย่างนั้นจะถูกเจาะซ้ำเหมือนเดิม

  1. สำรองเฉพาะข้อมูล เช่นเอกสารและผลงาน อย่าคัดลอกสคริปต์ โปรแกรม หรือโฟลเดอร์ .ssh กลับมา โมเดลโหลดใหม่ได้
  2. ปิดทางเข้าจากอินเทอร์เน็ตที่เราเตอร์ ยกเลิก port forward และ DMZ ที่ชี้มาเครื่องนี้ ถ้าต้องใช้จากนอกสถานที่ ให้ใช้ VPN เช่น Tailscale แทนการเปิดพอร์ต
  3. ลงเครื่องใหม่ ตามบทความล้างเครื่องเริ่มใหม่ ระหว่างนี้ยังไม่ต้องต่อเครือข่าย
  4. ตั้งรหัสผ่านที่เดายาก อย่างน้อย 12 ตัว ไม่ใช้รหัสที่ใช้ที่อื่น
  5. ให้ 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 เดิมค้างไว้ระหว่างลอง ถ้าเข้าหน้าต่างใหม่ไม่ได้ จะได้แก้กลับทัน
  6. ระวังโปรแกรม AI ที่เปิดพอร์ตโดยไม่มีรหัส เช่น Jupyter, Ollama (พอร์ต 11434), ComfyUI (8188) หรือ Open WebUI ที่ลงเพิ่มทีหลัง
    หลายตัวรับคำสั่งจากใครก็ได้ที่เข้าถึงพอร์ตนั้น ถ้าไม่จำเป็นให้ตั้งให้รับเฉพาะในเครื่อง (localhost) หรือเปิดรหัสผ่านของโปรแกรมนั้น
    เช็คได้จากหัวข้อ “พอร์ตที่เปิดรับ” ในไฟล์ขั้นที่ 2 บรรทัดที่ขึ้นต้นด้วย 0.0.0.0 หรือ * คือพอร์ตที่เครื่องอื่นเข้าถึงได้
  7. เปลี่ยนรหัสและ token ทุกตัวที่เคยอยู่ในเครื่องเดิม เช่น token ของ Hugging Face, API key ของบริการ cloud AI และรหัสผ่านที่เคยพิมพ์หรือบันทึกไว้บนเครื่องนั้น ถือว่าหลุดไปแล้ว

ข้อควรรู้: firewall ในเครื่อง (ufw) กันพอร์ตของ docker ไม่ได้ เพราะ docker ตั้งกฎของตัวเองข้าม ufw การปิดที่เราเตอร์จึงสำคัญที่สุด

ส่งข้อมูลให้ทีมงานช่วยดู

ส่งไฟล์ ~/incident.txt จากขั้นที่ 2 พร้อมชื่อ user ที่เห็น และบอกว่าเครื่องต่อเน็ตแบบไหน (ผ่านเราเตอร์ในบริษัท, IP สาธารณะ, เปิดพอร์ตไว้หรือไม่) ผ่านหน้าติดต่อทีมงาน
เราจะช่วยดูว่าเข้ามาทางไหน และควรปิดอะไรเพิ่มก่อนนำเครื่องกลับมาใช้