Squild proxy with Digest HTTP Authentication

เมื่อเร็วๆ นี้ผมพบว่าเน็ตเวิร์คที่ตัวเองดูแลอยู่มี traffic ขาออกมากกว่าขาเข้าอย่างมากมาย มีช่วงหนึ่งที่มี traffic ขาออกประมาณ 7 MBits/s เป็นช่วงระยะเวลาประมาณ 3 ชั่วโมง ซึ่งผมนึกไม่ออกว่าที่นี่จะมีข้อมูลส่งออกอะไรที่มากมายขนาดนี้ คาดว่าคงมีผู้ใช้ละเมิดระเบียบการใช้งานเครือข่าย ซึ่งในที่สุดข้อสงสัยของผมเป็นจริงเมื่อผมตรวจพบว่ามีการใช้โปรแกรมประเภท peer-to-peer

ด้วยความสะดวกสบายในการใช้งานเครือข่าย เพราะมีห้องปฏิบัติการหลายห้องที่เปิดให้นักศึกษาเข้าใช้งานได้ตลอด 24 ชั่วโมง กอรปกับการเพิ่มความเร็วในการเชื่อมต่อกับอินเทอร์เน็ตที่เพิ่มขึ้น และความละเลยของภาควิชาในการควบคุมดูแลนักศึกษา ระเบียบการใช้งานเครือข่ายจึงเป็นแค่กระดาษที่ถูกแจกจ่ายไปแล้วก็ถูกเก็บเข้าแฟ้ม

เมื่อถูกละเลยผมจึงต้องเล่นบทโหด ด้วยการตามปิด switch port ของผู้ใช้งานที่สร้างปัญหา ซึ่งผู้ใช้งานตัวแสบก็ทำการย้ายที่ไปเรื่อยๆ ในที่สุดก็โดนทั้งห้องปฏิบัติการ นอกจากนี้ความอยากใช้งานเครือข่ายมาก (อยากรู้จริงๆ ว่าใช้อะไรกันนักหนา ถ้าไม่เล่นเกมส์กับดาวน์โหลดไฟล์) ก็เลยทำการละเมิดระเบียบอีกข้อด้วยการต่อเชื่อมเน็ตเวิร์คระหว่างห้องปฏิบัติการโดยพละการ และด้วยสายเน็ตเวิร์คไม่ยาวพอ ก็เลยทำการต่อสายให้ยาวขึ้นด้วยตัวเอง ซึ่งผมเห็นแล้วถึงกับพูดไม่ออกในความมักง่าย เพราะสายทองแดงทุกเส้นมีโอกาสช็อตกันหมด

ด้วยเหตุที่เกิดขึ้นนี้จึงต้องคุมเข้มผู้ใช้งานที่ขาดสติ ด้วยการตัดไม่ให้เชื่อมต่อออกไปข้างนอกได้โดยตรง โดยผู้ใช้งานจะต้องใช้ผ่าน proxy ที่มีระบบ authentication เท่านั้น เพื่อที่จะตรวจสอบ ควบคุม และติดตามการใช้งานได้สะดวกขึ้น

ทีนี้เรื่องของ browser authentication มันก็มี 2 แบบคือ Basic access authentication กับ Digest access authenication ตามที่ระบุไว้ใน RFC2617

เมื่อลองเปรียบเทียบกันแล้ว basic access authentication จะมีความปลอดภัยน้อยกว่าเนื่องจากมีการส่งข้อมูลแบบ plain text ส่วน digest access authentitication นั้นจะมีการทำ digest ของ username password URL และ nounce ด้วย ซึ่งจะช่วยทำให้การส่งข้อมูลระหว่างการ authenticate นั้นไม่ได้อยู่ในรูปแบบของ plain text เท่านั้น

ลองดูตัวอย่างการทำ HTTP authentication กับ PHP ได้ที่นี่ครับ

ทีนี้เจ้า Squid สามารถที่จะทำการ authentication ด้วยวิธี digest access authenticatio ได้เช่นกัน โดยในการ compile จะต้องระบุไปด้วยว่าจะใช้ authentication แบบ digest ด้วย ดังตัวอย่างต่อไปนี้ ถ้าไม่ระบุไปก็จะมีแต่ basic authentication เท่านั้น

CFLAGS="-O2 -march=i686 -funroll-loops" 
./configure 
--exec_prefix=/usr 
--bindir=/usr/sbin 
--libexecdir=/usr/lib/squid 
--localstatedir=/var 
--sysconfdir=/etc/squid 
--enable-dlmalloc 
--enable-gnuregex 
--enable-xmalloc-statistics 
--with-pthreads 
--enable-removal-policies="heap" 
--enable-storeio=diskd,ufs 
--enable-delay-pools 
--enable-cache-digests 
--enable-err-language=English 
--enable-poll 
--enable-linux-netfilter 
--enable-truncate 
--enable-auth="basic digest"

อ่านวิธีการติดตั้ง squid แบบ quickstart ได้ที่นี่ครับ มีคนเขียนวิธีการติดตั้งเอาไว้เยอะแล้ว ดังนั้นผมจะข้ามรายละเอียดส่วนนี้ไป

ทีนี้เนื่องจากเราต้องใช้โปรแกรมที่เป็น helper ในการอ่าน digest password ก็ต้องเข้าไปในไดเรกทอรี helpers/digest_auth/password ที่อยู่ภายใต้ไดเรกทอรีของ squid-2.5.STABLEXX ที่โหลดมา จากนั้นให้สั่ง combile และ copy digest_pw_auth ไปไว้ยังไดเรกทอรี libexecdir ที่กำหนดไว้ตอนสั่ง configuration ข้างบน (/usr/lib/squid) ดังตัวอย่างต่อไปนี้

# make
# cp digest_pw_auth /usr/lib/squid

ขั้นตอนต่อไปก็คือเพิ่มคำสั่งต่อไปนี้ใน squid.conf (จะมีส่วนของ auth_param อยู่)

auth_param digest program /usr/lib/squid/digest_pw_auth /etc/squid/digpass
auth_param digest children 5
auth_param digest realm Your Company Name
auth_param digest nonce_garbage_interval 5 minutes
auth_param digest nonce_max_duration 30 minutes
auth_param digest nonce_max_count 50
auth_param digest nonce_strictness off
auth_param digest check_nonce_count on
auth_param digest post_workaround off
acl authentication proxy_auth REQUIRED

และใส่ acl ของ authentication ไว้ในส่วของ acl ด้วย
http_access allow authentication
http_access allow localnet
http_access deny all

จากนั้นก็สร้างไฟล์ชื่อ digpass ในไดเรกทอรี /etc/squid (ระบุไว้ในคำสั่ง auth_param ข้างต้น) ซึ่งเป็นที่เก็บ username และ password ในรูปแบบของ username:password เช่น somchai:ilovemywife โดบให้แยก username และ password ของผู้ใช้ให้อยู่คนละบรรทัด

จากนั้นก็ restart sqiud แล้วเปลี่ยนบราวเซอร์ให้มาใช้ proxy ลองเปิดเว็บ ถ้าทุกอย่างถูกต้องก็จะมี popup ขึ้นมาให้ใส่ username และ password ครับ