Client → Squid (Proxy) → mysql_auth (外部認證程式) → MySQL (用戶庫)
↑
認證協定: Basic Auth (RFC 2617)
環境:Solaris 10 x86、Squid 2.6/3.x、MySQL 5.0+、mysql_auth 0.6beta
# 建立服務帳號(無登入 Shell、無家目錄) groupadd squid useradd -g squid -d /dev/null -s /bin/false squid groupadd mysql useradd -g mysql -s /bin/false mysql
# 掛載光碟安裝 mount -F hsfs -o ro /dev/dsk/c1t0d0p0 /cdrom cd /cdrom/components/i386/Packages pkgadd -d ./ -s /var/spool/pkg SFWmysql SFWgcmn pkgadd SFWgcmn SFWmysql # 目錄權限 chown -R root /opt/sfw/mysql chgrp -R mysql /opt/sfw/mysql chown -R mysql /opt/sfw/mysql/var # 初始化資料庫 /opt/sfw/mysql/bin/mysql_install_db # 啟動服務 (背景) /opt/sfw/mysql/bin/mysqld_safe & # 複製配置範本 cp /opt/sfw/mysql/share/mysql/my-medium.cnf /etc/my.cnf # 編輯 /etc/my.cnf 加入:bind-address = 127.0.0.1
cp /opt/sfw/mysql/share/mysql/mysql.server /etc/init.d/mysql.server ln -s /etc/init.d/mysql.server /etc/rc3.d/S79mysql ln -s /etc/init.d/mysql.server /etc/rc0.d/K00mysql ln -s /etc/init.d/mysql.server /etc/rc1.d/K00mysql ln -s /etc/init.d/mysql.server /etc/rc2.d/K00mysql ln -s /etc/init.d/mysql.server /etc/rcS.d/K00mysql chown root:sys /etc/init.d/mysql.server /etc/rc3.d/S79mysql chmod 744 /etc/init.d/mysql.server /etc/rc3.d/S79mysql
mysqladmin -u root password 'StrongRootPass2024!'
pkgadd -d ./ -s /var/spool/pkg SFWsquid pkgadd SFWsquid cd /opt/sfw/squid/etc cp squid.conf.default squid.conf cp mime.conf.default mime.conf
http_port 192.168.0.1:3128 cache_mgr admin@yourdomain.com error_directory /opt/sfw/squid/share/errors/Simplify_Chinese dns_nameservers 202.99.160.68 202.99.168.8 visible_hostname proxy.yourdomain.com # 透明代理/加速器模式 (視需求啟用) httpd_accel_uses_host_header on httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on # 快取參數 (依記憶體調整) cache_mem 20 MB maximum_object_size 4096 KB minimum_object_size 0 KB maximum_object_size_in_memory 30 KB cache_swap_low 85 cache_swap_high 90 cache_dir ufs /opt/sfw/squid/var/cache 1000 16 256 cache_effective_user squid cache_effective_group squid # 權限控制 (稍後加入認證 ACL 取代) http_access allow all http_reply_access allow all icp_access allow all miss_access allow all
chown -R squid:squid /opt/sfw/squid/var /opt/sfw/squid/sbin/squid -z
cat > /etc/rc3.d/S78squid <<'EOF'
#!/sbin/sh
case "$1" in
start) /opt/sfw/squid/sbin/squid -s ;;
stop) /opt/sfw/squid/sbin/squid -k shutdown; pkill squid ;;
*) echo "Usage: $0 {start|stop}"; exit 1 ;;
esac
exit 0
EOF
chown root:sys /etc/rc3.d/S78squid
chmod 744 /etc/rc3.d/S78squid
ln -s /etc/rc3.d/S78squid /etc/rc2.d/K78squid
# 取得原始碼 gzip -d mysql_auth-0.6beta.tar.gz tar xvf mysql_auth-0.6beta.tar cd mysql_auth-0.6beta
CFLAGS = -I/opt/sfw/mysql/include -L/opt/sfw/mysql/lib/mysql INSTALL = /usr/ucb/install # 安裝目標調整 $(INSTALL) -o root -g sys -m 700 mypasswd /usr/local/bin/mypasswd $(INSTALL) -o squid -g squid -m 755 mysql_auth /usr/bin/mysql_auth $(INSTALL) -o squid -g squid -m 600 $(CONF) /etc/mysql_auth.conf $(INSTALL) -o squid -g squid -m 600 $(CONF) /etc/mysql_auth.conf.default
#define CONFIG_FILE "/etc/mysql_auth.conf" #define DEF_MYSQLD_SOCKET "/tmp/mysql.sock"
mysqld_socket /tmp/mysql.sock
/usr/ccs/bin/make /usr/ccs/bin/make install
cd scripts mysql -u root -p'StrongRootPass2024!' < create_script
# 設定動態庫路徑 (關鍵!) export LD_LIBRARY_PATH=/opt/sfw/mysql/lib/mysql:$LD_LIBRARY_PATH # 新增測試用戶 mypasswd testuser TestPass123 # Password record ADDED successfully. # 驗證認證 mysql_auth testuser TestPass123 # OK # 刪除用戶 mypasswd -d testuser
# 編輯 squid.conf 加入認證段落 (於 TAG: acl 區塊後) auth_param basic program /usr/bin/mysql_auth auth_param basic realm "Corporate Proxy Server" auth_param basic children 5 auth_param basic credentialsttl 2 hours acl authenticated proxy_auth REQUIRED http_access allow authenticated authenticate_ip_ttl 2 hours http_access deny all
/opt/sfw/squid/sbin/squid -k reconfigure
| 客戶端類型 | 設定範例 |
|---|---|
| 瀏覽器 (IE/Firefox/Chrome) | 代理:192.168.0.1:3128 → 彈出 Basic Auth 視窗輸入帳密 |
| FlashGet / IDM / wget / curl | 代理:192.168.0.1:3128 用戶:testuser 密碼:TestPass123 |
| Linux 環境變數 | `export http_proxy=https://testuser:TestPass123@192.168.0.1:3128` |
Squid + MySQL + mysql_auth 以輕量級架構實現企業級代理認證,成本極低(全開源)、擴展性強(資料庫後端支援萬級用戶)。關鍵在於「編譯環境完備、動態庫路徑正確、Socket 路徑一致、子進程數調優」四大工程細節。現代替代方案可考慮 **Squid + LDAP/AD** 或 **Traefik/NGINX + OAuth2/OIDC** 實現零信任代理存取。