Xem ai đang đăng nhập VPS + lịch sử login (phát hiện hack sớm)

Tài liệu » Quản trị VPS - Server » Xem ai đang đăng nhập VPS + lịch sử login (phát hiện hack sớm)

Xem ai đang đăng nhập VPS + lịch sử login (phát hiện hack sớm)

TL;DR

Lo VPS bị hack mà không biết check ở đâu? 4 lệnh dưới giúp bạn xem ai đang online, lịch sử login 30 ngày, và đếm số lần brute force attack — phát hiện xâm nhập trong 1 phút.

  • 👤 Xem ai đang SSH ngay: w, who

  • 📜 Lịch sử login: last, lastlog

  • 🚨 Brute force attempts: lastb, /var/log/auth.log

  • 🛡 Auto-ban: fail2ban (cài 5 phút, chạy mãi)

  • 📱 Alert Telegram: script bash 30 dòng

Vì sao phải monitor login mỗi ngày?

VPS public IP = tự động bị scan port 22 (SSH) 24/7. Trung bình 1 VPS mới mỗi 5 phút có 1 lần thử password root. Không monitor = ngày nào đó bot brute force trúng.

Pain point thực tế:

  • 🔍 Không biết VPS đang có ai SSH → phát hiện chậm khi bị compromise

  • 💸 Trả tiền VPS để mining crypto cho hacker mà không hay

  • 📊 Log đầy “Failed password” mà không biết có nguy hiểm không

  • 🎯 Bị blacklist IP vì server gửi mail spam (hacker sử dụng VPS làm botnet)

Bài này dạy bạn 4 lệnh + 1 tool + 1 script để bảo vệ VPS — không cần kiến thức security chuyên sâu.

💡 Mẹo: Setup 1 lần fail2ban + alert Telegram là 9/10 attack tự fail, bạn ngủ ngon.

4 lệnh login monitor cần nhớ

Tóm gọn: Mỗi lệnh trả lời 1 câu hỏi cụ thể — không lặp lại nhau.

LệnhTrả lờiKhi nào dùng
wAi đang SSH lúc này + làm gìCheck nhanh hàng ngày
lastLịch sử login thành công 30 ngàyAudit sau nghi ngờ
lastlogLần login cuối của từng userTìm account đang bị dùng
lastbLịch sử login THẤT BẠIĐếm brute force attempts

Lệnh w — Xem ai đang online NGAY BÂY GIỜ

Tóm gọn: Lệnh 1 ký tự, đầy đủ info: user, IP, thời gian login, đang chạy gì.

w

Output:

 14:23:01 up 12 days,  3:42,  3 users,  load average: 0.45, 0.62, 0.58
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
ubuntu   pts/0    14.169.x.x       13:45    0.00s  0.05s  0.01s w
ubuntu   pts/1    14.169.x.x       14:10   13:42   0.04s  0.02s -bash
root     pts/2    103.241.x.x      02:30   12h11  20.5s   8.5s ./suspicious_script

3 dòng quan trọng:

  • USER — ai đang login

  • FROM — IP nguồn (so với IP của bạn để phát hiện lạ)

  • WHAT — đang chạy lệnh gì (👀 thấy ./suspicious_script = báo động đỏ)

⚠️ Warning: Phát hiện session từ IP lạ (vd IP nước ngoài 103.x trong khi bạn ở VN) + đang chạy script lạ = VPS đã bị compromise, ngắt mạng ngay.

Kill session đáng ngờ

# Lấy PID của shell từ output 'w'
ps -t pts/2 -o pid,comm
# Kill nguyên cây process của session
sudo pkill -KILL -t pts/2

Lệnh last — Lịch sử login 30 ngày

Tóm gọn: Audit ai đã từng login, từ IP nào, lúc nào.

last -F | head -20

Output:

ubuntu   pts/0  14.169.10.20   Mon May 12 13:45:01 2026 - still logged in
ubuntu   pts/1  14.169.10.20   Mon May 12 12:30:11 2026 - 12:48 (00:17)
root     pts/0  103.241.99.5   Mon May 12 02:30:00 2026 - 14:22 (11:52)
ubuntu   pts/0  14.169.10.20   Sun May 11 18:00:33 2026 - 19:30 (01:29)
reboot   system boot           Tue Apr 29 11:00:00 2026

Cột:

  • USER + TTY — ai login, qua kênh nào

  • FROM — IP nguồn

  • LOGIN time + duration

  • reboot rows = lúc VPS khởi động

Filter theo user

last -F ubuntu | head -10        # chỉ user ubuntu
last -F root | head -10          # chỉ root (PHẢI ÍT NHẤT CÓ THỂ)

⚠️ Pitfall: Thấy root login từ IP lạ → 100% bị hack. Disable root login ngay (sẽ hướng dẫn bài về SSH hardening).

Tìm login từ IP cụ thể

last -F | grep "103.241.99.5"

Đếm số lần IP đó login thành công.

Lệnh lastb — Brute force attempts (login THẤT BẠI)

Tóm gọn: Số dòng = số lần bot/hacker đã thử password sai. Càng cao = càng nguy hiểm.

sudo lastb -F | head -20

Output:

admin    ssh:notty    220.181.x.x    Mon May 12 14:00:11 2026 - 14:00:11 (00:00)
root     ssh:notty    180.76.x.x     Mon May 12 13:58:30 2026 - 13:58:30 (00:00)
test     ssh:notty    222.111.x.x    Mon May 12 13:55:22 2026 - 13:55:22 (00:00)
oracle   ssh:notty    103.x.x.x      Mon May 12 13:50:01 2026 - 13:50:01 (00:00)
postgres ssh:notty    61.177.x.x     Mon May 12 13:45:33 2026 - 13:45:33 (00:00)

Username admin, root, test, oracle, postgres = bot scan database default credentials.

Đếm tổng số attempt

sudo lastb | wc -l

Kết quả thường gặp:

  • < 100/ngày → bình thường, internet noise

  • 100-1000/ngày → trong target list, nên cài fail2ban

  • > 1000/ngày → đang bị focus attack, đổi port SSH ngay

Top 10 IP brute force nhiều nhất

sudo lastb | awk '{print $3}' | sort | uniq -c | sort -rn | head -10

Output:

    342 220.181.205.42
    287 180.76.15.30
    156 222.111.190.11
    ...

Có thể block thủ công IP top trong UFW:

sudo ufw insert 1 deny from 220.181.205.42

Bonus 1 — Setup fail2ban auto-ban brute force

Tóm gọn: Cài 5 phút, chạy mãi. 9/10 brute force attack sẽ tự bị ban sau 5 lần fail.

sudo apt install fail2ban -y    # Ubuntu/Debian
sudo dnf install fail2ban -y    # AlmaLinux/Rocky

sudo systemctl enable --now fail2ban

Tạo file config riêng cho SSH:

sudo tee /etc/fail2ban/jail.local > /dev/null <<'EOF'
[DEFAULT]
bantime = 24h
findtime = 10m
maxretry = 5

[sshd]
enabled = true
port = 22
logpath = /var/log/auth.log
EOF
sudo systemctl restart fail2ban

Tham số:

  • maxretry 5 — sai password 5 lần trong 10 phút → ban

  • bantime 24h — ban 24 giờ

  • findtime 10m — window đếm 10 phút

Check fail2ban đang ban ai

sudo fail2ban-client status sshd

Output:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 12
|  |- Total failed:     8541
|- Actions
   |- Currently banned: 47
   `- Banned IP list:   220.181.x.x 180.76.x.x ...

Currently banned: 47 — fail2ban đang giúp bạn block 47 IP độc hại ngay lúc này.

Unban IP (vô tình ban nhầm)

sudo fail2ban-client set sshd unbanip 14.169.10.20

Bonus 2 — Alert Telegram khi có login mới

Tóm gọn: Mỗi khi ai SSH thành công, Telegram bot ping ngay. Phát hiện hack realtime.

Bước 1 — Tạo bot Telegram:

  1. Chat với @BotFather
  2. /newbot → đặt tên → nhận TOKEN
  3. Chat 1 tin nhắn cho bot, lấy chat_id ở:
    https://api.telegram.org/bot<TOKEN>/getUpdates

Bước 2 — Hook vào SSH login PAM:

sudo tee /etc/profile.d/ssh-alert.sh > /dev/null <<'EOF'
#!/bin/bash
# Chỉ alert khi SSH login (không alert local)
[ -z "$SSH_CLIENT" ] && return
TOKEN="<dán_token_của_bạn>"
CHAT_ID="<dán_chat_id>"
IP=$(echo "$SSH_CLIENT" | awk '{print $1}')
USER=$(whoami)
HOST=$(hostname)
TIME=$(date '+%Y-%m-%d %H:%M:%S')
MSG="🔐 SSH LOGIN: $USER@$HOST from $IP @ $TIME"
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
  -d "chat_id=$CHAT_ID" \
  -d "text=$MSG" > /dev/null &
EOF
sudo chmod +x /etc/profile.d/ssh-alert.sh

Log out → log in lại → kiểm tra Telegram. Mỗi lần SSH thành công sẽ có alert kèm IP + time.

💡 Mẹo: Customize thêm dòng cảnh báo nếu IP không phải IP nhà bạn (vd [ "$IP" != "14.169.x.x" ] && MSG="⚠️ $MSG").

Sai lầm phổ biến

  • Coi lastb 100+ entries là “đang bị hack” → không, đó là internet noise. Chỉ nguy hiểm khi maxretry chưa setup fail2ban.

  • Cho root login qua SSH password → bot brute force focus 100% vào user root. Sửa: disable PermitRootLogin trong /etc/ssh/sshd_config.

  • Quên kiểm w trước khi đi ngủ → có session đáng ngờ chạy cả đêm. Sửa: alias lh="last -F | head -10 && echo --- && w".

  • Cấu hình fail2ban bantime = 10m → bot quay lại sau 10p, vô dụng. Sửa: dùng 24h hoặc lâu hơn.

  • Setup alert Telegram nhưng quên test → 1 tháng sau phát hiện không nhận tin. Sửa: SSH thử ngay sau cài, verify nhận alert.

Routine 1 phút check security hàng ngày

# 1. Ai đang online?
w

# 2. Có ai login từ IP lạ trong 24h?
last -F | head -10

# 3. Tổng brute force hôm nay?
sudo lastb -s today | wc -l

# 4. fail2ban đang ban bao nhiêu IP?
sudo fail2ban-client status sshd | grep "Currently banned"

Lưu vào script vps-security:

sudo tee /usr/local/bin/vps-security > /dev/null <<'EOF'
#!/bin/bash
echo "═══ VPS SECURITY @ $(date '+%Y-%m-%d %H:%M') ═══"
echo ""
echo "▶ Online users:"
w | tail -n +2
echo ""
echo "▶ Last 5 logins:"
last -F | head -5
echo ""
echo "▶ Brute force today:"
echo "  $(sudo lastb -s today 2>/dev/null | wc -l) failed attempts"
echo ""
echo "▶ fail2ban:"
sudo fail2ban-client status sshd 2>/dev/null | grep -E "Currently failed|Currently banned"
EOF
sudo chmod +x /usr/local/bin/vps-security

Mỗi sáng gõ vps-security → full report 1 giây.

Key takeaways

  • w — ai đang SSH ngay bây giờ

  • last -F — lịch sử login 30 ngày (thành công)

  • lastb — lịch sử login THẤT BẠI (brute force)

  • fail2ban — auto-ban IP sau 5 lần fail

  • Telegram alert — realtime notification login mới

  • vps-security script — routine 1 lệnh mỗi sáng

Setup đủ 6 thứ này = 99% brute force tự fail, sếp ngủ ngon.

FAQ

Q: VPS mới mua đã thấy 50 attempts brute force trong 1 giờ — bình thường không?
A: Bình thường. IP public bị scan 24/7. Quan trọng là setup fail2ban + disable root login + đổi port 22 sang port khác (vd 2222).

Q: fail2ban có ban nhầm IP của tôi không?
A: Có thể nếu sếp gõ sai password 5 lần liên tiếp. Fix: dùng SSH key thay password (sai key không vào sshd jail), hoặc whitelist IP nhà:

[DEFAULT]
ignoreip = 127.0.0.1/8 14.169.10.20

Q: Có nên dùng port SSH khác 22 không?
A: . Đổi sang port 2200-65535 (random) giảm 90% brute force vì bot chủ yếu scan port 22 mặc định. Sửa trong /etc/ssh/sshd_configPort 2222sudo systemctl restart ssh.

Q: Alert Telegram có lộ TOKEN không?
A: Có nguy cơ nếu file /etc/profile.d/ssh-alert.sh rò rỉ. Best practice: lưu TOKEN trong /root/.telegram-env (chmod 600), source vào script.

Q: Có giải pháp monitor VPS toàn diện hơn không?
A: Có. Netdata (free, 50MB RAM) — web UI realtime + alert email/Slack. Hoặc Wazuh SIEM cho enterprise. Bài tiếp theo sẽ hướng dẫn cài Netdata trên VPS 1GB.

Cần VPS Linux để setup security stack?

VSIS có VPS Linux từ 99k/tháng (Ubuntu 24.04 LTS), preinstall fail2ban + ufw sẵn — chỉ cần SSH vào enable là chạy.

👉 Đăng ký VPS Linux: vsis.net/vps

📺 Xem video 60 giây tóm tắt: link Reels (sẽ cập nhật)

📖 Bài tiếp theo: “tail -f, journalctl, multitail — đọc log Linux như pro” — đăng Thứ 2 tuần sau.

Lên đầu trang