วันจันทร์ที่ 30 สิงหาคม พ.ศ. 2553

Linux, iptables : การแสดงลำดับของกฎของ iptables และการแทรกกฎไปที่บรรทัดที่ต้องการ

ระบบทีใช้ทดสอบ
OS : Ubuntu 8.04.4 LTS
Kernel Version : 2.6.24-28

ตัวอย่าง

การเรียกดูกฎของ iptables ในตาราง INPUT พร้อมให้แสดงลำดับที่ของกฎด้วย

root@server:~# iptables -nvL INPUT --line
Chain INPUT (policy DROP 48 packets, 4520 bytes)
num pkts bytes target prot opt in out source destination
1 348 25568 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 249 18956 ACCEPT all -- * * 172.17.12.0/24 0.0.0.0/0
3 0 0 ACCEPT all -- * * 192.168.0.0/24 0.0.0.0/0
4 0 0 ACCEPT all -- * * 192.168.10.0/24 0.0.0.0/0
5 0 0 ACCEPT all -- * * 192.168.200.0/24 0.0.0.0/0


ต้องการแทรกกฎ DROP บาง IP เข้าไปในแถวที่ 4 (ก่อน ACCEPT 192.168.10.0/24 )

root@server:~# iptables -I INPUT 4 -s 192.168.10.100 -j DROP

root@server:~# iptables -nvL INPUT --line
Chain INPUT (policy DROP 48 packets, 4520 bytes)
num pkts bytes target prot opt in out source destination
1 449 32676 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 250 19192 ACCEPT all -- * * 172.17.12.0/24 0.0.0.0/0
3 0 0 ACCEPT all -- * * 192.168.0.0/24 0.0.0.0/0
4 0 0 DROP all -- * * 192.168.10.100 0.0.0.0/0
5 0 0 ACCEPT all -- * * 192.168.10.0/24 0.0.0.0/0
6 0 0 ACCEPT all -- * * 192.168.200.0/24 0.0.0.0/0


ต้องการลบกฎแถวที่ 4 ตามตัวอย่างข้างบนออก

root@server:~# iptables - D INPUT 4

root@staff-fw:~# iptables -nvL INPUT --line
Chain INPUT (policy DROP 224 packets, 21764 bytes)
num pkts bytes target prot opt in out source destination
1 509 37952 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 276 23686 ACCEPT all -- * * 172.17.12.0/24 0.0.0.0/0
3 0 0 ACCEPT all -- * * 192.168.0.0/24 0.0.0.0/0
4 0 0 ACCEPT all -- * * 192.168.10.0/24 0.0.0.0/0
5 0 0 ACCEPT all -- * * 192.168.200.0/24 0.0.0.0/0

วันเสาร์ที่ 21 สิงหาคม พ.ศ. 2553

ค้นหา Serial Number หรือ Service Tag ของเครื่อง Server ผ่าน Command Line

ในการเก็บข้อมูล Serial number หรือ Service Tag (สำหรับ Dell) ของเครื่อง Server นั้น ส่วนมากจะแปะบอกไว้ที่เครื่อง ซึ่งถ้าเราอยู่ใกล้ ก็เดินไปดู แต่ถ้าอยู่ไกล เช่น อยู่ต่างจังหวัด หรือต่างประเทศ คงลำบากในการตามจด วันนี้จึงลองเสนอวิธีดู Serial number หรือ Service Tag ผ่าน Command Line (ได้ผลดีกับเครื่อง Brand name เช่น Dell, HP)

ระบบที่ใช้ทดสอบ FreeBSD, Ubuntu, CentOS

CentOS# dmidecode | more
--- ตัด output ---
System Information
Manufacturer: Dell Inc.
Product Name: PowerEdge 2950
Version: Not Specified
Serial Number: 2Gxxxxx <------ Dell Service Tag
UUID: 44454C4C-4700-104B-8036-B2C04xxxxxxx
Wake-up Type: Power Switch
SKU Number: Not Specified
Family: Not Specified
--- ตัด output ---


FreeBSD# dmidecode | more
SMBIOS 2.6 present.
123 structures occupying 3313 bytes.
Table at 0xDF7FE000.

Handle 0x0000, DMI type 0, 24 bytes
BIOS Information
Vendor: Hewlett-Packard
Version: P62
Release Date: 03/27/2009
Address: 0xF0000
Runtime Size: 64 kB
ROM Size: 8192 kB
---- ตัด output ------
System Information
Manufacturer: Hewlett-Packard
Product Name: ProLiant DL380 G6
Version: Not Specified
Serial Number: SGH926xxxx
UUID: 33343934-3932-4753-4839-32xxxxxxxxxx
Wake-up Type: Power Switch
SKU Number: 494xxx-xxx
Family: ProLiant
----- ตัด output ------

วันอาทิตย์ที่ 15 สิงหาคม พ.ศ. 2553

FreeBSD, SSH : block การเข้าถึงบริการ SSH โดยใช้ hosts.allow

ในกรณีที่เราพบว่าเครื่องให้บริการถูกโจมตีโดยความพยายามเดาสุ่มรหัสผ่าน ดังตัวอย่าง Log

Aug 16 11:12:09 FreeBSD sshd[20296]: Failed keyboard-interactive/pam for root from 172.17.12.51 port 55095 ssh2
Aug 16 11:12:10 FreeBSD sshd[20296]: error: PAM: authentication error for root from 172.17.12.51
Aug 16 11:12:10 FreeBSD sshd[20296]: Failed keyboard-interactive/pam for root from 172.17.12.51 port 55095 ssh2
Aug 16 11:12:10 FreeBSD sshd[20296]: error: PAM: authentication error for root from 172.17.12.51
Aug 16 11:12:10 FreeBSD sshd[20296]: Failed keyboard-interactive/pam for root from 172.17.12.51 port 55095 ssh2
Aug 16 11:12:18 FreeBSD sshd[20304]: error: PAM: authentication error for root from 172.17.12.51
Aug 16 11:12:18 FreeBSD last message repeated 3 times

จาก Log ก็เห็นว่าเครื่อง IP 172.17.12.51 พยายามที่จะเดา password เข้ามา ดังนั้นถ้าเราต้องการไม่ให้ IP ดังกล่าว สามารถทำอย่างนั้นได้อีก จึงจำเป็นต้องมีการ Block การเข้าถึง SSH ซึ่งอาจใช้ผ่าน Firewall เช่น ipfw ก็ได้

แต่ถ้ามี host ที่พยายามเข้าถึงเป็นจำนวนมาก การที่ block ผ่าน ipfw อาจเกิดความยุ่งยากในการจัดการ ดังนั้นจึงจะมาใช้วิธี block ผ่าน hosts.allow ของ FreeBSD แทน ดังนี้

สร้างไฟล์เก็บ IP Blacklist ดังตัวอย่าง

สร้างไฟล์ /root/sshd.blacklist

172.17.1.1 <---- block เป็นราย IP
172.17.12.0/255.255.255.0
<----- block ทั้ง Subnet /24 แก้ไขไฟล์ /etc/hosts.allow โดยหาแถวที่เขียนว่า ALL : ALL : allow แล้วเพิ่ม sshd : /root/sshd.blacklist : deny ไว้ข้างบน ดังนี้

sshd : /root/sshd.blacklist : deny
ALL : ALL : allow

ทำการ save ไฟล์ แล้วทดสอบการใช้งาน

ตัวอย่าง log ที่เกิดขึ้น

Aug 16 11:32:39 FreeBSD sshd[1041]: refused connect from 172.17.12.51 (172.17.12.51)

วันเสาร์ที่ 14 สิงหาคม พ.ศ. 2553

SSH : กำหนด Source IP ของแต่ละ Username ที่จะทำการ Login ผ่าน SSH

ในบางกรณีเราต้องการระบุว่า user ใด สามารถใช้งานได้จากที่ไหนได้บ้าง เช่น
admin1 ซึ่งมีสิทธิสูงในระบบ สามารถ Login ได้จากในหน่วยงานเท่านั้น
user1 ซึ่งมีสิทธแค่ User สามารถ Login ได้จากในหน่วยงาน และจากหน่วยภายนอกอื่นๆ ที่เป็นแบบ Static IP
www1 ซึ่งมีสิทธิจำกัด สามารถ Login ได้จากที่ไหนก็ได้

ดังนั้นในกรณีจะใช้ความสามารถของ OpenSSH เอง ดังนี้

ระบบที่ใช้ทดสอบ
OS : Ubuntu 9.10
OpenSSH : OpenSSH_5.1p1 Debian-6ubuntu2, OpenSSL 0.9.8g 19 Oct 2007

กำหนดให้
IP หน่วยงานเป็น 172.17.1.0/24
IP หน่วยงานอื่นๆ ที่เป็น Static IP 192.168.0.0/24

การ Config
แก้ไข /etc/ssh/sshd_config โดยเพิ่มดังตัวอย่าง

AllowUsers admin1@172.17.1.0/24 user1@172.17.1.0/24 user1@192.168.0.0/24 www1

จากนั้น save file แล้วทำการ restart service ของ sshd

server# /etc/init.d/ssh restart

ตัวอย่าง log ที่เกิดขึ้น กรณีที่ admin1 ทำการ login จาก network ที่ไม่ได้อนุญาต

Aug 15 22:30:08 server sshd[21613]: User admin1 from 10.0.0.102 not allowed because not listed in AllowUsers

ความหมายของ Log คือ

Aug 15 22:30:08 ---> วัน เวลาที่เกิด Log
server ---> ชื่อเครื่อง
sshd[21613]: ---> Log ที่เกิด เกิดจาก SSH Service โดยตัวเลขในวงเล็บคือ Process ID ที่ทำงาน
User admin1 from 10.0.0.102 not allowed ---> username ที่ชื่อว่า admin1 ที่มาจาก IP 10.0.0.102 ไม่ได้รับอนุญาต
because not listed in AllowUsers ---> เนื่องจากไม่ได้กำนดไว้ในส่วนของ AllowUsers (ในตัวอย่างจะอนุญาตให้มาจาก 172.17.1.0/24 เท่านั้น)

จากนั้นใน Log file ก็จะเกิด log การ log ที่บอกว่า

Failed password for invalid user admin1 from 10.0.0.102 port 64381 ssh2

ตามขึ้นมาอีกจำนวนหนึ่ง ขึ้นอยู่กับการกำหนด MaxAuthTries ว่าให้พิมพ์ Password ผิดได้กี่ครั้งต่อการ login 1 ครั้ง ทั้งนี้เนื่องจาก user ที่ทำการ login เข้ามา จะไม่รู้ว่าโดยจำกัดการเข้าถึงอยู่ โดยจะรู้ว่าเหมือนกำลังพิมพ์ password ผิดอยู่

วันอาทิตย์ที่ 8 สิงหาคม พ.ศ. 2553

FreeBSD : Bandwidth Monitor by bwm-ng

bwm-ng ใช้ตรวจสอบการใช้งาน Bandwidth แบบ realtime ครับ ดูดีทีเดียว

ระบบที่ใช้ทดสอบ FreeBSD 7.0-RELEASE-p2

FreeBSD# cd /usr/ports/net-mgmt/bwm-ng
FreeBSD# make install ; rehash

FreeBSD# bwm-ng

วันพฤหัสบดีที่ 5 สิงหาคม พ.ศ. 2553

Linux : คำสั่ง date กับการประยุกต์ใช้

ในบางครั้งอาจต้องมีการเขียน shell script เพื่อให้ทำงานบางอย่างที่มีส่วนเกี่ยววันที่ เช่น สร้างไฟล์ที่มีรูปแบบชื่อไฟล์ดังนี้

file.YYYY-MM-DD.txt เช่น log.2010-08-31.txt

ซึ่งบางที ส่วนของวันที่ที่สนใจ อาจไม่ใช่วันที่ปัจจุบัน อาจเป็นเมื่อวาน หรือ 10 วันที่แล้ว หรือพรุ่งนี้ หรืออีก 10 วันข้างหน้า เป็นต้น

ถ้าเป็นการสร้างไฟล์เองโดยผู้ใช้ก็คงไม่ยาก ก็แค่พิมพ์ แต่ถ้าเป็น Cron job หล่ะ เราอาจต้องบอกให้ script ให้รู้จักการหาวันที่รูปแบบที่เราต้องการก่อน โดยในที่นี้ผมจะใช้คำสั่ง date ใน Linux

ระบบที่ใช้ทดสอบ : Ubuntu 9.10

รูปแบบปกติ
komkit@moccona:~$ date <--- คำสั่งที่ใช้
Fri Aug 6 13:35:16 ICT 2010 <--- ผลลัพธ์ที่ได้ จะเป็นวันที่และเวลาปัจจุบัน

ต้องการให้อยู่ในรูปแบบ YYYY-MM-DD
komkit@moccona:~$ date +%F <--- คำสั่งที่ใช้
2010-08-06 <--- ผลลัพธ์ที่ได้ จะเป็นวันที่ปัจจุบันในรูปแบบ YYYY-MM-DD

ต้องการวันที่เมื่อวาน ในรูปแบบ YYYY-MM-DD
komkit@moccona:~$ date --date="yesterday" +%F <--- คำสั่งที่ใช้
2010-08-05 <--- ผลลัพธ์ที่ได้ จะเป็นวันที่เมื่อวานในรูปแบบ YYYY-MM-DD

ต้องการวันที่ 10 วันที่แล้วในรูปแบบ YYYY-MM-DD
komkit@moccona:~$ date --date="10 day ago" +%F <--- คำสั่งที่ใช้
2010-07-27 <--- ผลลัพธ์ที่ได้ จะเป็นวันที่เมื่อวานในรูปแบบ YYYY-MM-DD

ต้องการวันที่วันพรุ่งนี้ ในรูปแบบ YYYY-MM-DD
komkit@moccona:~$ date --date="tomorrow" +%F <--- คำสั่งที่ใช้
2010-08-07 <--- ผลลัพธ์ที่ได้ จะเป็นวันที่พรุ่งนี้ในรูปแบบ YYYY-MM-DD

ต้องการวันที่ 10 วันข้างหน้าในรูปแบบ YYYY-MM-DD
komkit@moccona:~$ date --date="10 day" +%F <--- คำสั่งที่ใช้
2010-08-16 <--- ผลลัพธ์ที่ได้ จะเป็นวันที่พรุ่งนี้ในรูปแบบ YYYY-MM-DD


ทีนี้ก็เอาไปประยุกต์ใช้แล้วแต่ความต้องการได้เลยครับ