首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Squid + MySQL 實現代理伺服器用戶認證:Solaris 平台完整部署實戰

     編輯:MySQL 綜合教學

架構概覽

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

階段 1:系統帳號與權限規劃

# 建立服務帳號(無登入 Shell、無家目錄)
groupadd squid
useradd -g squid -d /dev/null -s /bin/false squid

groupadd mysql
useradd -g mysql -s /bin/false mysql

階段 2:MySQL 安裝與初始化 (Sun Companion CD 套件)

# 掛載光碟安裝
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

建立開機自啟腳本 (SMF 風格)

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

設定 Root 密碼

mysqladmin -u root password 'StrongRootPass2024!'

階段 3:Squid 安裝與基礎配置

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

核心 `squid.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

Squid 開機腳本

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

階段 4:mysql_auth 編譯安裝 (關鍵整合元件)

# 取得原始碼
gzip -d mysql_auth-0.6beta.tar.gz
tar xvf mysql_auth-0.6beta.tar
cd mysql_auth-0.6beta

修改 `Makefile` 關鍵變數

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

修改 `src/define.h`

#define CONFIG_FILE "/etc/mysql_auth.conf"
#define DEF_MYSQLD_SOCKET "/tmp/mysql.sock"

修改 `src/mysql_auth.conf`

mysqld_socket /tmp/mysql.sock

編譯安裝 (需 GCC 工具鏈)

/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

階段 5:Squid 整合 mysql_auth 認證

# 編輯 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

重新載入 Squid

/opt/sfw/squid/sbin/squid -k reconfigure

階段 6:客戶端驗證

客戶端類型設定範例
瀏覽器 (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`

關鍵避坑指南

  • ⚠️ **GCC 必裝**:`mysql_auth` 需 C 編譯器,Solaris 預設無 GCC,需從 Companion CD 安裝 `SFWgcc` `SFWgmake`
  • ⚠️ **LD_LIBRARY_PATH**:`mypasswd`/`mysql_auth` 運行時需找到 `libmysqlclient.so`,必須設定環境變數或 `crle -l /opt/sfw/mysql/lib/mysql`
  • ⚠️ **Socket 路徑一致性**:`my.cnf`、`mysql_auth.conf`、PHP/MySQL 客戶端皆需一致 (`/tmp/mysql.sock` 或 `/var/run/mysqld/mysqld.sock`)
  • ⚠️ **Squid 子進程數**:`auth_param basic children 5` 依並發調整,過少導致認證排隊、過多消耗記憶體
  • ⚠️ **憑證快取 TTL**:`credentialsttl 2 hours` 平衡安全性與效能,頻繁改密用戶需縮短

結語

Squid + MySQL + mysql_auth 以輕量級架構實現企業級代理認證,成本極低(全開源)、擴展性強(資料庫後端支援萬級用戶)。關鍵在於「編譯環境完備、動態庫路徑正確、Socket 路徑一致、子進程數調優」四大工程細節。現代替代方案可考慮 **Squid + LDAP/AD** 或 **Traefik/NGINX + OAuth2/OIDC** 實現零信任代理存取。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved