Lab 6: Network Security Infrastructure

เวลาที่ใช้: ~3–4 ชั่วโมง
สภาพแวดล้อม: Linux (Ubuntu 22.04 / Debian 12 แนะนำ), สิทธิ์ root หรือ sudo


วัตถุประสงค์ (Objectives)

เมื่อเสร็จสิ้น Lab นี้ นักศึกษาจะสามารถ:

  1. ใช้ nmap สแกนและวิเคราะห์ port / service ในเครือข่าย
  2. ใช้ Wireshark / tcpdump ดักจับและวิเคราะห์ traffic
  3. กำหนดกฎ Firewall ด้วย iptables และ ufw
  4. ตรวจสอบ log และป้องกัน brute-force ด้วย fail2ban
  5. ทดสอบ SSL/TLS certificate ด้วย openssl
  6. ตรวจสอบ network topology และ route ด้วยเครื่องมือ diagnostic

สภาพแวดล้อมและการเตรียมตัว (Environment Setup)

ความต้องการของระบบ

รายการ ข้อกำหนด
OS Ubuntu 22.04 LTS / Debian 12
RAM 2 GB ขึ้นไป
Network Interface อย่างน้อย 1 NIC
สิทธิ์ sudo หรือ root

ติดตั้ง Package ที่จำเป็น

sudo apt update && sudo apt upgrade -y
sudo apt install -y \
  nmap \
  tcpdump \
  wireshark \
  ufw \
  iptables \
  iptables-persistent \
  fail2ban \
  openssl \
  net-tools \
  traceroute \
  curl \
  wget \
  nginx \
  openssh-server

ตรวจสอบ IP Address ของเครื่อง

ip addr show
# หรือ
hostname -I

หมายเหตุ: บันทึก IP address ของเครื่องไว้ใช้ในแบบฝึกหัด เช่น 192.168.1.100


ส่วนที่ 1: Network Scanning ด้วย Nmap

ทฤษฎีสั้น ๆ

Nmap (Network Mapper) เป็นเครื่องมือ open-source สำหรับ network discovery และ security auditing ใช้ส่ง packet และวิเคราะห์ response เพื่อหา host ที่ active, port ที่เปิด, service และ OS ที่ใช้งาน

คำสั่งพื้นฐาน

# 1. สแกน host เดียว
nmap 192.168.1.1

# 2. สแกนแบบ verbose (แสดงรายละเอียด)
nmap -v 192.168.1.1

# 3. สแกน subnet ทั้งหมด
nmap 192.168.1.0/24

# 4. สแกน port เฉพาะ
nmap -p 22,80,443 192.168.1.1

# 5. สแกน port ทั้งหมด (1-65535)
nmap -p- 192.168.1.1

# 6. ตรวจสอบ service version
nmap -sV 192.168.1.1

# 7. ตรวจสอบ OS
sudo nmap -O 192.168.1.1

# 8. Aggressive scan (OS + version + script + traceroute)
sudo nmap -A 192.168.1.1

# 9. สแกนแบบ stealth (SYN scan)
sudo nmap -sS 192.168.1.1

# 10. บันทึกผลลัพธ์เป็นไฟล์
nmap -oN output.txt 192.168.1.1
nmap -oX output.xml 192.168.1.1

ตัวอย่าง Output และการวิเคราะห์

Starting Nmap 7.93 ( https://nmap.org )
Nmap scan report for 192.168.1.1
Host is up (0.0012s latency).
Not shown: 995 closed ports
PORT    STATE SERVICE  VERSION
22/tcp  open  ssh      OpenSSH 8.9p1
80/tcp  open  http     nginx 1.22.0
443/tcp open  https    nginx 1.22.0
3306/tcp open mysql   MySQL 8.0.32

การวิเคราะห์ผล:

แบบฝึกหัด 1.1

เงื่อนไข: สแกนเครื่องของตัวเองและ gateway เครือข่าย

# ขั้นตอน 1: หา default gateway
ip route | grep default

# ขั้นตอน 2: สแกนเครื่องตัวเอง (localhost)
nmap -sV -O localhost

# ขั้นตอน 3: สแกน gateway
nmap -sV $(ip route | grep default | awk '{print $3}')

# ขั้นตอน 4: บันทึกผล
nmap -sV -oN ~/lab6_nmap_result.txt localhost

คำถามท้ายแบบฝึกหัด:

  1. port ใดบ้างที่เปิดอยู่บนเครื่องของคุณ?
  2. service ใดมีความเสี่ยงที่ควรปิด?
  3. version ของ OpenSSH ที่ใช้คืออะไร?

ส่วนที่ 2: Packet Capture ด้วย tcpdump และ Wireshark

ทฤษฎีสั้น ๆ

Packet Capture คือการดักจับ network packet เพื่อวิเคราะห์ traffic ช่วยให้เห็น protocol, payload, และพฤติกรรมของ traffic จริง

การใช้ tcpdump (Command Line)

# 1. ดู interface ที่มี
tcpdump -D
# หรือ
ip link show

# 2. ดักจับ traffic บน interface ที่กำหนด
sudo tcpdump -i eth0

# 3. จำกัดจำนวน packet
sudo tcpdump -i eth0 -c 100

# 4. กรอง traffic เฉพาะ port 80
sudo tcpdump -i eth0 port 80

# 5. กรองเฉพาะ HTTP GET request
sudo tcpdump -i eth0 -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

# 6. กรอง traffic จาก/ไป IP เฉพาะ
sudo tcpdump -i eth0 host 192.168.1.1

# 7. กรอง ICMP (ping)
sudo tcpdump -i eth0 icmp

# 8. บันทึกเป็น pcap file
sudo tcpdump -i eth0 -w ~/lab6_capture.pcap

# 9. อ่าน pcap file
tcpdump -r ~/lab6_capture.pcap

# 10. แสดง packet ในรูปแบบ ASCII
sudo tcpdump -i eth0 -A port 80 -c 20

การใช้ BPF Filter (Berkeley Packet Filter)

# กรอง TCP SYN packet (การเริ่ม connection)
sudo tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'

# กรอง DNS query
sudo tcpdump -i eth0 udp port 53

# กรอง traffic ระหว่าง 2 host
sudo tcpdump -i eth0 'src host 192.168.1.10 and dst host 192.168.1.20'

# กรอง ARP
sudo tcpdump -i eth0 arp

# กรอง HTTPS
sudo tcpdump -i eth0 port 443

ตัวอย่าง Output ของ tcpdump

14:32:01.123456 IP 192.168.1.10.52341 > 192.168.1.1.80: Flags [S], seq 1234567890, win 64240, options [mss 1460,...], length 0
14:32:01.124000 IP 192.168.1.1.80 > 192.168.1.10.52341: Flags [S.], seq 987654321, ack 1234567891, win 65535, length 0
14:32:01.124100 IP 192.168.1.10.52341 > 192.168.1.1.80: Flags [.], ack 1, win 64240, length 0

การอ่าน Flags:

แบบฝึกหัด 2.1: ดักจับ HTTP Traffic

เงื่อนไข: ต้องมี nginx ทำงานอยู่บนเครื่อง

# Terminal 1: เริ่มดักจับ
sudo tcpdump -i lo port 80 -A -c 50 -w ~/lab6_http.pcap &

# Terminal 2: สร้าง HTTP request
curl http://localhost/

# หยุดดักจับและวิเคราะห์
tcpdump -r ~/lab6_http.pcap -A | head -100

แบบฝึกหัด 2.2: ใช้ Wireshark (GUI)

# เปิด Wireshark (ต้องมี GUI)
sudo wireshark &

# หรือเปิดไฟล์ pcap ที่บันทึกไว้
wireshark ~/lab6_http.pcap

ขั้นตอนใน Wireshark:

  1. เลือก interface (eth0 หรือ lo)
  2. กด Start Capture (ปุ่มสีน้ำเงิน)
  3. ใช้ Display Filter กรอง traffic:
  4. คลิก packet เพื่อดูรายละเอียด
  5. Follow TCP Stream เพื่อดู conversation ทั้งหมด

ส่วนที่ 3: Firewall ด้วย iptables และ ufw

ทฤษฎีสั้น ๆ

Firewall ควบคุม traffic เข้า-ออกตามกฎที่กำหนด iptables เป็น low-level tool ที่ทำงานกับ Netfilter kernel module ส่วน ufw (Uncomplicated Firewall) เป็น frontend ที่ใช้งานง่ายกว่า

โครงสร้างของ iptables

Tables:   filter | nat | mangle | raw
Chains:   INPUT | OUTPUT | FORWARD | PREROUTING | POSTROUTING

คำสั่ง iptables พื้นฐาน

# ดูกฎทั้งหมด
sudo iptables -L -v -n

# ดูกฎพร้อมหมายเลข
sudo iptables -L --line-numbers

# ดู NAT table
sudo iptables -t nat -L -v -n

# ล้างกฎทั้งหมด (ระวัง!)
sudo iptables -F

การสร้างกฎ iptables

# === INPUT Chain (traffic เข้าเครื่อง) ===

# อนุญาต loopback
sudo iptables -A INPUT -i lo -j ACCEPT

# อนุญาต established connections
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# อนุญาต SSH (port 22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# อนุญาต HTTP
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# อนุญาต HTTPS
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# อนุญาต ICMP (ping)
sudo iptables -A INPUT -p icmp -j ACCEPT

# บล็อก IP เฉพาะ
sudo iptables -A INPUT -s 192.168.1.200 -j DROP

# บล็อก port 3306 จาก external (อนุญาตเฉพาะ local)
sudo iptables -A INPUT -p tcp --dport 3306 ! -s 127.0.0.1 -j DROP

# ปฏิเสธ traffic อื่นทั้งหมด (ต้องใส่เป็น rule สุดท้าย)
sudo iptables -A INPUT -j DROP

# === OUTPUT Chain (traffic ออกจากเครื่อง) ===

# อนุญาต DNS query
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT

# บล็อก traffic ออกไปยัง IP เฉพาะ
sudo iptables -A OUTPUT -d 192.168.1.200 -j DROP

Rate Limiting และ Anti-DDoS

# จำกัดการ ping (ป้องกัน ping flood)
sudo iptables -A INPUT -p icmp --icmp-type echo-request \
  -m limit --limit 1/s --limit-burst 4 -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

# จำกัดการ connect ใหม่ไปยัง port 80 (ป้องกัน SYN flood)
sudo iptables -A INPUT -p tcp --dport 80 --syn \
  -m limit --limit 25/s --limit-burst 50 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 --syn -j DROP

# บล็อก port scan
sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

บันทึกและโหลดกฎ iptables

# บันทึกกฎ
sudo iptables-save > /etc/iptables/rules.v4

# โหลดกฎกลับมา
sudo iptables-restore < /etc/iptables/rules.v4

# โหลดอัตโนมัติเมื่อ boot (ต้องติดตั้ง iptables-persistent)
sudo netfilter-persistent save

การใช้ ufw (Uncomplicated Firewall)

# เปิดใช้งาน ufw
sudo ufw enable

# ดูสถานะ
sudo ufw status verbose

# ปฏิเสธ traffic ทั้งหมด (default)
sudo ufw default deny incoming
sudo ufw default allow outgoing

# อนุญาต SSH
sudo ufw allow ssh
# หรือ
sudo ufw allow 22/tcp

# อนุญาต HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# อนุญาตจาก subnet เฉพาะ
sudo ufw allow from 192.168.1.0/24

# อนุญาตจาก IP เฉพาะไปยัง port เฉพาะ
sudo ufw allow from 192.168.1.10 to any port 3306

# บล็อก IP
sudo ufw deny from 192.168.1.200

# ลบกฎ
sudo ufw delete allow 80/tcp

# ดูกฎพร้อมหมายเลข
sudo ufw status numbered

# ลบกฎด้วยหมายเลข
sudo ufw delete 3

# ปิด ufw
sudo ufw disable

# Reset กฎทั้งหมด
sudo ufw reset

แบบฝึกหัด 3.1: ตั้งค่า Firewall พื้นฐาน

เงื่อนไข: ตั้งค่า firewall ให้อนุญาตเฉพาะ SSH, HTTP, HTTPS และ ping

# ขั้นตอน 1: ล้างกฎเดิม
sudo ufw reset

# ขั้นตอน 2: ตั้ง default policy
sudo ufw default deny incoming
sudo ufw default allow outgoing

# ขั้นตอน 3: อนุญาต services ที่จำเป็น
sudo ufw allow ssh
sudo ufw allow 'Nginx Full'

# ขั้นตอน 4: เปิดใช้งาน
sudo ufw enable

# ขั้นตอน 5: ตรวจสอบ
sudo ufw status verbose

# ขั้นตอน 6: ทดสอบ
nmap -p 22,80,443,3306,8080 localhost

ผลที่คาดหวัง:


ส่วนที่ 4: Intrusion Prevention ด้วย Fail2ban

ทฤษฎีสั้น ๆ

Fail2ban วิเคราะห์ log file และ ban IP ที่แสดงพฤติกรรม brute-force หรือ malicious โดยอัตโนมัติ ผ่านการสร้างกฎ iptables ชั่วคราว

โครงสร้างไฟล์ Configuration

/etc/fail2ban/
├── fail2ban.conf          # config หลัก (ไม่ควรแก้)
├── fail2ban.local         # override config (แก้ที่นี่)
├── jail.conf              # jail definitions หลัก
├── jail.local             # override jails (แก้ที่นี่)
├── filter.d/              # filter rules
│   ├── sshd.conf
│   ├── nginx-http-auth.conf
│   └── ...
└── action.d/              # ban actions
    ├── iptables.conf
    └── ...

การกำหนดค่า jail.local

# สร้างไฟล์ jail.local
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
# IP ที่ไม่ ban (whitelist)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

# ระยะเวลา ban (วินาที) — 3600 = 1 ชั่วโมง
bantime  = 3600

# หน้าต่างเวลาที่นับความพยายาม (วินาที)
findtime = 600

# จำนวนครั้งที่ fail ก่อน ban
maxretry = 5

# backend สำหรับอ่าน log
backend = systemd

# action เมื่อ ban
action = %(action_mwl)s

# ===== SSH Jail =====
[sshd]
enabled  = true
port     = ssh
filter   = sshd
logpath  = %(sshd_log)s
maxretry = 3
bantime  = 7200

# ===== Nginx Login Page =====
[nginx-http-auth]
enabled  = true
port     = http,https
filter   = nginx-http-auth
logpath  = /var/log/nginx/error.log
maxretry = 5

# ===== Nginx Botsearch =====
[nginx-botsearch]
enabled  = true
port     = http,https
filter   = nginx-botsearch
logpath  = /var/log/nginx/access.log
maxretry = 2

คำสั่ง Fail2ban

# เริ่ม / หยุด / ตรวจสอบ service
sudo systemctl start fail2ban
sudo systemctl stop fail2ban
sudo systemctl status fail2ban
sudo systemctl enable fail2ban

# ดูสถานะ jail ทั้งหมด
sudo fail2ban-client status

# ดูสถานะ jail เฉพาะ
sudo fail2ban-client status sshd

# ดู IP ที่ถูก ban
sudo fail2ban-client status sshd | grep "Banned IP"

# Unban IP
sudo fail2ban-client set sshd unbanip 192.168.1.200

# Ban IP ด้วยตนเอง
sudo fail2ban-client set sshd banip 192.168.1.200

# ตรวจสอบ filter
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

# Reload configuration
sudo fail2ban-client reload

ดู Log ของ Fail2ban

# Log หลัก
sudo tail -f /var/log/fail2ban.log

# ดู ban events
sudo grep "Ban " /var/log/fail2ban.log

# ดู unban events
sudo grep "Unban " /var/log/fail2ban.log

ตัวอย่าง Log Output

2024-01-15 14:23:45,123 fail2ban.filter [1234]: INFO    [sshd] Found 192.168.1.200 - 2024-01-15 14:23:45
2024-01-15 14:23:50,456 fail2ban.filter [1234]: INFO    [sshd] Found 192.168.1.200 - 2024-01-15 14:23:50
2024-01-15 14:23:55,789 fail2ban.filter [1234]: INFO    [sshd] Found 192.168.1.200 - 2024-01-15 14:23:55
2024-01-15 14:23:55,800 fail2ban.actions[1234]: NOTICE  [sshd] Ban 192.168.1.200

แบบฝึกหัด 4.1: จำลอง Brute Force และสังเกต Fail2ban

# Terminal 1: ติดตาม log แบบ real-time
sudo tail -f /var/log/fail2ban.log &
sudo tail -f /var/log/auth.log &

# Terminal 2: ตรวจสอบ fail2ban status ก่อน
sudo fail2ban-client status sshd

# จำลอง failed SSH login (จาก terminal อื่นหรือ VM อื่น)
# *** ทดสอบกับเครื่องเสมือนเท่านั้น ***
for i in {1..5}; do
  ssh invalid_user@127.0.0.1 2>/dev/null || true
  sleep 1
done

# ตรวจสอบหลังทดสอบ
sudo fail2ban-client status sshd
sudo iptables -L f2b-sshd -v -n

ส่วนที่ 5: SSL/TLS ด้วย OpenSSL

ทฤษฎีสั้น ๆ

SSL/TLS เป็น protocol เข้ารหัส communication ระหว่าง client และ server openssl เป็น command-line tool สำหรับสร้าง key, certificate, และทดสอบ SSL/TLS

สร้าง Self-Signed Certificate

# ขั้นตอน 1: สร้าง Private Key (RSA 4096-bit)
openssl genrsa -out server.key 4096

# ขั้นตอน 2: สร้าง CSR (Certificate Signing Request)
openssl req -new -key server.key -out server.csr \
  -subj "/C=TH/ST=Bangkok/L=Bangkok/O=University/CN=lab6.local"

# ขั้นตอน 3: สร้าง Self-Signed Certificate (valid 365 วัน)
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

# ทางลัด: สร้าง key + certificate พร้อมกัน
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt \
  -days 365 -nodes \
  -subj "/C=TH/ST=Bangkok/L=Bangkok/O=University/CN=lab6.local"

สร้าง CA (Certificate Authority) ของตัวเอง

# สร้าง CA Key
openssl genrsa -out ca.key 4096

# สร้าง CA Certificate (self-signed)
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt \
  -subj "/C=TH/ST=Bangkok/O=MyCA/CN=My Root CA"

# สร้าง Server Key และ CSR
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr \
  -subj "/C=TH/ST=Bangkok/O=MyServer/CN=lab6.local"

# สร้าง Extension file
cat > server.ext << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = lab6.local
DNS.2 = www.lab6.local
IP.1 = 127.0.0.1
EOF

# Sign Certificate ด้วย CA
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
  -CAcreateserial -out server.crt -days 365 -sha256 -extfile server.ext

ตรวจสอบและวิเคราะห์ Certificate

# ดูข้อมูล certificate
openssl x509 -in server.crt -text -noout

# ดูเฉพาะ subject และ issuer
openssl x509 -in server.crt -noout -subject -issuer

# ดูวันหมดอายุ
openssl x509 -in server.crt -noout -dates

# ตรวจสอบว่า key ตรงกับ certificate
openssl x509 -noout -modulus -in server.crt | openssl md5
openssl rsa -noout -modulus -in server.key | openssl md5
# ต้องได้ค่าเดียวกัน

# ทดสอบ SSL connection
openssl s_client -connect google.com:443

# ทดสอบ TLS version
openssl s_client -connect google.com:443 -tls1_2
openssl s_client -connect google.com:443 -tls1_3

# ตรวจสอบ SSL certificate ของ server
openssl s_client -connect lab6.local:443 -CAfile ca.crt

กำหนดค่า Nginx ด้วย SSL

# สร้าง directory เก็บ certificate
sudo mkdir -p /etc/nginx/ssl
sudo cp server.crt server.key /etc/nginx/ssl/

# แก้ไข nginx config
sudo nano /etc/nginx/sites-available/lab6-ssl
server {
    listen 443 ssl;
    server_name lab6.local;

    ssl_certificate     /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;

    # ปิด SSLv3 และ TLSv1/1.1 ที่ไม่ปลอดภัย
    ssl_protocols TLSv1.2 TLSv1.3;

    # กำหนด cipher ที่ปลอดภัย
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    # HSTS (HTTP Strict Transport Security)
    add_header Strict-Transport-Security "max-age=63072000" always;

    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

# Redirect HTTP → HTTPS
server {
    listen 80;
    server_name lab6.local;
    return 301 https://$host$request_uri;
}
# เปิดใช้งาน
sudo ln -s /etc/nginx/sites-available/lab6-ssl /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

ส่วนที่ 6: Network Diagnostic Tools

ทฤษฎีสั้น ๆ

เครื่องมือ diagnostic ช่วยตรวจสอบ connectivity, latency, routing, และปัญหา network

ping และ traceroute

# ping พื้นฐาน
ping -c 4 google.com
ping -c 4 192.168.1.1

# ping พร้อมกำหนด packet size
ping -c 4 -s 1400 google.com

# traceroute (เส้นทาง packet)
traceroute google.com

# traceroute แบบ TCP (bypass firewall บางตัว)
sudo traceroute -T -p 80 google.com

# mtr (ping + traceroute แบบ real-time)
mtr google.com
mtr --report google.com

netstat และ ss

# ดู connection ทั้งหมด (ss แนะนำ)
ss -tulpn

# ดูเฉพาะ TCP
ss -tp

# ดู port ที่กำลัง listen
ss -tlnp

# ดู established connections
ss -tnp state established

# ดู network statistics
ss -s

# netstat (แบบเก่า)
netstat -tulpn
netstat -an | grep ESTABLISHED

ตัวอย่าง Output ของ ss

Netid  State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process
tcp    LISTEN  0       128     0.0.0.0:22           0.0.0.0:*         users:(("sshd",pid=1234))
tcp    LISTEN  0       511     0.0.0.0:80           0.0.0.0:*         users:(("nginx",pid=5678))
tcp    ESTAB   0       0       192.168.1.100:22     192.168.1.10:54321 users:(("sshd",pid=9012))

dig และ nslookup (DNS)

# Query DNS record
dig google.com
dig google.com A
dig google.com MX
dig google.com NS
dig google.com TXT

# ใช้ DNS server เฉพาะ
dig @8.8.8.8 google.com

# Reverse DNS lookup
dig -x 8.8.8.8

# Query แบบสั้น
dig +short google.com

# ตรวจสอบ DNSSEC
dig +dnssec google.com

แบบฝึกหัด 6.1: Network Reconnaissance

เงื่อนไข: วิเคราะห์ network ของตัวเอง

# 1. ดู network interface ทั้งหมด
ip addr show

# 2. ดู routing table
ip route show

# 3. ดู ARP table
ip neigh show

# 4. ดู active connections
ss -tulpn

# 5. ตรวจสอบ DNS
dig +short $(hostname)

# 6. ตรวจสอบ open ports ด้วย nmap
sudo nmap -sV -p- localhost

# 7. บันทึกผลทั้งหมด
{
  echo "=== IP Addresses ==="
  ip addr show
  echo -e "\n=== Routes ==="
  ip route show
  echo -e "\n=== Listening Ports ==="
  ss -tlnp
  echo -e "\n=== Nmap Scan ==="
  nmap -sV localhost
} > ~/lab6_network_audit.txt

echo "บันทึกผลที่: ~/lab6_network_audit.txt"

ส่วนที่ 7: Scenario-Based Exercise (รวมทุกเครื่องมือ)

Scenario: ตรวจสอบและรักษาความปลอดภัย Web Server

สถานการณ์: คุณได้รับมอบหมายให้ตรวจสอบและ harden web server ใหม่

ขั้นตอนที่ 1: Initial Reconnaissance

# สแกน server เพื่อดู attack surface
sudo nmap -sV -A localhost -oN ~/step1_initial_scan.txt

# ดู services ที่กำลังทำงาน
sudo systemctl list-units --type=service --state=running

# ดู users ที่ login ได้
awk -F: '$7 != "/usr/sbin/nologin" && $7 != "/bin/false" {print $1}' /etc/passwd

ขั้นตอนที่ 2: ติดตั้งและกำหนดค่า Firewall

# Reset และตั้งค่า ufw ใหม่
sudo ufw reset
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status verbose

ขั้นตอนที่ 3: กำหนดค่า Fail2ban

sudo tee /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
bantime  = 3600
findtime = 600
maxretry = 5
backend  = systemd

[sshd]
enabled  = true
maxretry = 3
bantime  = 7200

[nginx-http-auth]
enabled  = true
port     = http,https
logpath  = /var/log/nginx/error.log
maxretry = 5
EOF

sudo systemctl restart fail2ban
sudo fail2ban-client status

ขั้นตอนที่ 4: เปิดใช้งาน SSL

# สร้าง self-signed cert สำหรับ testing
sudo openssl req -x509 -newkey rsa:2048 -keyout /etc/nginx/ssl/server.key \
  -out /etc/nginx/ssl/server.crt -days 365 -nodes \
  -subj "/C=TH/ST=Bangkok/O=Lab/CN=localhost"

sudo chmod 600 /etc/nginx/ssl/server.key

ขั้นตอนที่ 5: ดักจับและวิเคราะห์ Traffic

# ดักจับ 60 วินาทีหรือ 500 packet
sudo timeout 60 tcpdump -i lo -c 500 -w ~/step5_traffic.pcap 2>/dev/null &

# สร้าง test traffic
curl -s http://localhost/ > /dev/null
curl -sk https://localhost/ > /dev/null

# วิเคราะห์
wait
tcpdump -r ~/step5_traffic.pcap -n | head -30
echo "สรุป: $(tcpdump -r ~/step5_traffic.pcap 2>/dev/null | wc -l) packets"

ขั้นตอนที่ 6: Verify และ Final Scan

# สแกนอีกครั้งเพื่อเปรียบเทียบ
sudo nmap -sV localhost -oN ~/step6_final_scan.txt

# เปรียบเทียบ
diff ~/step1_initial_scan.txt ~/step6_final_scan.txt

# สรุปผล
echo "=== Security Summary ===" 
echo "Firewall: $(sudo ufw status | head -1)"
echo "Fail2ban: $(sudo fail2ban-client status | grep "Number of jail")"
echo "SSL Cert: $(openssl x509 -in /etc/nginx/ssl/server.crt -noout -dates 2>/dev/null | grep notAfter)"

ส่วนที่ 8: Security Hardening Checklist

นักศึกษาต้องตรวจสอบรายการต่อไปนี้และบันทึกผล:

#!/bin/bash
# security_check.sh — Lab 6 Security Checklist

echo "╔══════════════════════════════════════════╗"
echo "║   Lab 6 Security Hardening Checklist     ║"
echo "╚══════════════════════════════════════════╝"
echo ""

# 1. SSH
echo "[1] SSH Configuration"
grep -E "^PermitRootLogin|^PasswordAuthentication|^Port" /etc/ssh/sshd_config 2>/dev/null || echo "  ไม่พบ sshd_config"
echo ""

# 2. UFW
echo "[2] Firewall (UFW)"
sudo ufw status verbose 2>/dev/null
echo ""

# 3. Fail2ban
echo "[3] Fail2ban"
sudo fail2ban-client status 2>/dev/null
echo ""

# 4. Open Ports
echo "[4] Listening Ports"
ss -tlnp 2>/dev/null
echo ""

# 5. SSL
echo "[5] SSL Certificate"
[ -f /etc/nginx/ssl/server.crt ] && \
  openssl x509 -in /etc/nginx/ssl/server.crt -noout -subject -dates || \
  echo "  ไม่พบ certificate"
echo ""

echo "✓ Checklist เสร็จสิ้น"
# บันทึกและรัน script
chmod +x security_check.sh
sudo ./security_check.sh | tee ~/lab6_security_report.txt

สรุปและคำถามท้าย Lab

คำถามตรวจสอบความเข้าใจ

  1. Nmap: ความแตกต่างระหว่าง TCP SYN scan (-sS) และ TCP Connect scan (-sT) คืออะไร? เมื่อใดควรใช้แต่ละแบบ?

  2. Packet Capture: TCP Flags [S], [S.], [.] ใน tcpdump แทน step ใดของ TCP 3-Way Handshake?

  3. Firewall: หากต้องการอนุญาตให้เฉพาะ IP 192.168.10.5 เข้าถึง MySQL (port 3306) โดยบล็อก IP อื่นทั้งหมด จะเขียน iptables rule อย่างไร?

  4. Fail2ban: ความแตกต่างระหว่าง bantime, findtime, และ maxretry คืออะไร? และมีผลกระทบต่อ false positive อย่างไร?

  5. SSL/TLS: ความแตกต่างระหว่าง Self-Signed Certificate และ Certificate ที่ signed โดย CA ที่น่าเชื่อถือคืออะไร?

ผลงานที่ต้องส่ง (Deliverables)

รายการ ไฟล์ คะแนน
Nmap scan result lab6_nmap_result.txt 20
tcpdump capture lab6_http.pcap 20
Firewall config ufw status output 20
Fail2ban config /etc/fail2ban/jail.local 20
SSL Certificate info openssl x509 output 10
Security report lab6_security_report.txt 10

ภาคผนวก: Quick Reference

คำสั่ง Nmap ที่ใช้บ่อย

nmap -sV -O -A -p- TARGET    # Full scan
nmap -sn 192.168.1.0/24      # Ping sweep (host discovery)
nmap --script vuln TARGET     # Vulnerability scan

คำสั่ง tcpdump ที่ใช้บ่อย

tcpdump -i eth0 -nn -A port 80        # HTTP traffic
tcpdump -i eth0 'tcp[tcpflags]==0x02' # SYN packets only
tcpdump -i eth0 -w file.pcap          # บันทึกไฟล์

คำสั่ง iptables ที่ใช้บ่อย

iptables -L -v -n --line-numbers  # ดูกฎทั้งหมด
iptables -D INPUT 3               # ลบกฎที่ 3 ใน INPUT chain
iptables -I INPUT 1 -j ACCEPT     # เพิ่มกฎที่ตำแหน่ง 1

คำสั่ง fail2ban ที่ใช้บ่อย

fail2ban-client status [jail]     # ดูสถานะ
fail2ban-client set sshd unbanip IP  # ยกเลิก ban
fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf  # ทดสอบ filter

คำสั่ง openssl ที่ใช้บ่อย

openssl x509 -in cert.crt -text -noout     # ดู certificate
openssl s_client -connect host:443         # ทดสอบ SSL
openssl verify -CAfile ca.crt server.crt   # ตรวจสอบ cert chain