บทความนี้อธิบายวิธีการคอนฟิก Squid Proxy Server เพื่อให้ผู้ใช้งานต้องใส่ user, password ก่อนถึงจะใช้งานอินเตอร์เน็ตได้
โดยจะตรวจสอบ user, password กับ Local Password หรือไฟล์ /etc/passwd, /etc/shadow ผ่าน Linux PAM ที่อยู่บนเครื่อง Proxy Server เอง
ทดสอบบน Fedora 16 ติดตั้ง squid-3.2.0.12-1
ติดตั้งไฟล์ rpm จากแผ่นดีวีดีติดตั้ง
[root@fc16-64a ~]# mount /dev/cdrom /mnt/cdrom mount: block device /dev/sr0 is write-protected, mounting read-only
[root@fc16-64a ~]# cd /mnt/cdrom/Packages/ [root@fc16-64a Packages]# rpm -i squid-3.2.0.12-1.fc16.x86_64.rpm
มีหลายวิธีที่คอนฟิกให้ถาม user, password ก่อนใช้ proxy ได้ วิธีหนึ่งคือเพิ่มคอนฟิกออปชั่น auth_param basic มี 3 ขั้นตอนดังนี้
- ตั้งค่าคอนฟิกของ auth_param basic มีอยู่หลายค่า บรรทัดสำคัญคือ program ในที่นี้จะเลือกเป็น basic_pam_auth เพื่อให้ตรวจสอบกับ Linux PAM
- สร้าง acl เป็นชนิด proxy_auth ในตัวอย่างนี้ ตั้งชื่อ acl เป็น user_pam_auth
- สุดท้ายนำ acl ที่สร้างขึ้นไปผูกเงื่อนไขใน http_access เช่นในที่นี้ ยังคงอนุญาตให้เครื่องที่อยู่ใน localnet ใช้ proxy ได้ แต่ต้องใส่ user, password ก่อน
ตัวอย่างแก้ไขไฟล์ /etc/squid/squid.conf (แสดงเฉพาะส่วนที่แก้ไขจากดีฟอลต์คอนฟิกเท่านั้น)
[root@fc16-64a ~]# cat /etc/squid/squid.conf .... # # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS # auth_param basic children 5 auth_param basic realm Proxy Authentication auth_param basic credentialsttl 12 hours auth_param basic program /usr/lib64/squid/basic_pam_auth
acl user_pam_auth proxy_auth REQUIRED
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet user_pam_auth
...
ใช้คำสั่ง service หรือ systemctl เพื่อ start หรือ reload เซอร์วิส squid
[root@fc16-64a ~]# systemctl reload squid.service
ใช้คำสั่ง useradd เพิ่ม user สำหรับทดสอบ
[root@fc16-64a ~]# useradd -g users user1 [root@fc16-64a ~]# passwd user1 Changing password for user user1. New password: Retype new password: passwd: all authentication tokens updated successfully.
ทดสอบจาก Browser
คอนฟิก Browser ของเครื่องผู้ใช้ ให้ชี้มาที่ proxy แล้วลองเข้าเว็บดู จะมีหน้าจอให้ใส่ user, password ลองใส่ user ที่เพิ่งสร้างขึ้น
แม้จะพยายามใส่ user, password อย่างไร ก็ไม่สำเร็จ
ที่เป็นเช่นนี้เนื่องจาก basic_pam_auth ไ่ม่สามารถอ่านไฟล์ /etc/shadow ได้ จำเป็นต้องแก้ไขไฟล์นี้ให้เป็น setuid root
ใช้คำสั่ง chmod เพื่อแก้ไขไฟล์ให้เป็น setuid root
[root@fc16-64a ~]# ls -l /usr/lib64/squid/basic_pam_auth -rwxr-xr-x. 1 root root 15416 Sep 20 15:36 /usr/lib64/squid/basic_pam_auth
[root@fc16-64a ~]# chmod u+s /usr/lib64/squid/basic_pam_auth
[root@fc16-64a ~]# ls -l /usr/lib64/squid/basic_pam_auth
-rwsr-xr-x. 1 root root 15416 Sep 20 15:36 /usr/lib64/squid/basic_pam_auth
แต่การใช้ setuid root แบบนี้ ค่อนข้างอันตราย user ทั่วไป บนเครื่องเซิร์ฟเวอร์ สามารถรันโปรแกรมนี้แล้วตรวจสอบไฟล์ /etc/shadow ได้
วิธีที่จะพอป้องกันได้ คือให้เฉพาะ squid รันไฟล์นี้ได้เท่านั่้น ตัวอย่างเช่น
[root@fc16-64a ~]# chmod 750 /usr/lib64/squid/basic_pam_auth [root@fc16-64a ~]# chgrp squid /usr/lib64/squid/basic_pam_auth [root@fc16-64a ~]# ls -l /usr/lib64/squid/basic_pam_auth -rwxr-x---. 1 root squid 15416 Sep 20 15:36 /usr/lib64/squid/basic_pam_auth
[root@fc16-64a ~]# chmod u+s /usr/lib64/squid/basic_pam_auth
[root@fc16-64a ~]# ls -l /usr/lib64/squid/basic_pam_auth
-rwsr-x---. 1 root squid 15416 Sep 20 15:36 /usr/lib64/squid/basic_pam_auth
รีโหลดเซอร์วิสหลังแก้ไข
[root@fc16-64a ~]# systemctl reload squid.service
ลองใส่ user, password อีกครั้ง บน browser น่าจะใช้งานได้แล้ว
ข้อมูลอ้างอิง
- squid: basic_pam_auth
- คอนฟิก Squid Proxy Server
- คอนฟิก Squid Proxy Server ให้ตรวจสอบ user, password จาก LDAP