php写的squid验证辅助器

本文介绍如何使用PHP脚本实现Squid代理服务器的用户账号及用户+IP绑定认证,包括通过MySQL数据库验证用户密码的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


2008-11-08 23:17

公司的代理服务器用的是squid,基于IP地址和MAC地址进行权限验证允许部分用户访问Internet。无奈列位高手们早已通晓盗用IP、MAC的方法来绕过squid的限制。近来考虑改为帐号认证。

由于同时在维护一个邮件服务器(qmail + vpopmail + mysql),邮件帐号用mysql管理,内网用户人手一邮箱。为了便于用户记忆,想直接使用邮件帐号和密码作为squid的帐号密码。

程序嘛,比较靠谱的是 mysql_auth ,无奈对c一窍不通,只能借鉴一下它的思路......干脆自己写一个吧。

其他已知资料:
《Squid中文权威指南》 ,第12章有一个perl的例子以及以下文字:

在squid和基本验证器之间的接口非常简单。squid发送用户名和密码到验证器进程,他们以空格分开并以新行结束。验证器在其他stdin里读取用户名和密码。在检查信用项后,验证器将OK或ERR写入stdout。

任何“不安全的URL”字符会参照RFC1738规则进行编码。这样,名字“jack+jill”变成了"jack%2bjill"。squid接受包含 空格的用户名和密码。例如“a password”变成了“a%20password”。在解码用户名和密码后,验证器程序能处理空格和其他的特殊字符。


要点总结:从stdin读取用户名和密码,用户名和密码以空格分隔,可能涉及解码。vpopmail里用户帐号和密码分别 是pw_name和pw_passwd列,建一个表squid,只有一列pw_name,把有权用户的用户名添加到表squid里,用pw_name列关 联两个表查询获得pw_passwd,和用户的输入做比较,一致即验证成功。

PHP代码如下:

# ! / usr/ bin/ php

< ? php
ini_set ( "display_errors" , false ) ;

function valid( $ u , $ p , $ sql_link ) {
$ result = false ;
$ res = mysql_query ( "select pw_passwd from squid a, vpopmail b where a.pw_name='$u' and a.pw_name=b.pw_name" , $ sql_link ) ;
$ rows = mysql_num_rows ( $ res ) ;
if ( 1 = = $ rows ) {
      $ data = mysql_fetch_object ( $ res ) ;
      $ passwd = $ data - > pw_passwd;
      if ( $ passwd = = crypt ( $ p , $ passwd ) ) {
         $ result = true ;
      }
}
return $ result ;
}

while ( ! feof ( STDIN) ) {

$ sql_link = mysql_connect ( "x.x.x.x" , "xxx" , "yyy" ) ;
mysql_select_db ( "vpopmail" , $ sql_link ) ;


$ input = trim ( fgets ( STDIN) ) ;
$ data = explode ( ' ' , $ input ) ;
$ username = rawurldecode ( $ data [ 0] ) ;
$ password = rawurldecode ( $ data [ 1] ) ;
if ( valid( $ username , $ password , $ sql_link ) ) {
      fwrite ( STDOUT, "OK/n" ) ;
} else {
      fwrite ( STDOUT, "ERR/n" ) ;
}


mysql_close ( $ sql_link ) ;
}

? >


上述代码保存为/usr/lib/squid/my_auth.php,属性如下:
-rwsr-x--- 1 root squid 843 09-25 15:12 /usr/lib/squid/my_auth.php

squid.conf的相关配置:
acl acl_valid_user proxy_auth REQUIRED
http_access allow acl_valid_user
http_access deny all

auth_param basic program /usr/lib/squid/my_auth.php
auth_param basic children 5
auth_param basic realm 互联网访问权限验证
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive on

更进一步:squid基于mysql的用户+ip绑定认证

昨天写的《用php写一个squid验证辅助器(authentication helper)》实现了squid基于mysql的用户帐号认证,今天再进一步修改一下程序,支持基于mysql的用户+ip绑定认证功能。

使用/etc/squid/acl_valid_user.txt存放用户的ip和帐号信息,ip和帐号以空格分隔,帐号与mysql数据表里的用户帐号是一致的,格式如下:

192. 168. 1. 100 pangty
192. 168. 1. 200 test


相应的修改squid.conf,使用ip_user_check来进行帐号与ip的关联检查

external_acl_type ip_user_check children= 5 % SRC % LOGIN / usr/ lib/ squid/ ip_user_check -f / etc/ squid/ acl_valid_user. txt
acl acl_ip_user_check external ip_user_check

acl acl_valid_user proxy_auth REQUIRED
http_access allow acl_valid_user acl_ip_user_check
http_access deny all

auth_param basic program / usr/ lib/ squid/ my_auth. php
auth_param basic children 5
auth_param basic realm 互联网访问权限验证
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive on


my_auth.php验证辅助程序加入对acl_valid_user.txt的验证,原来在mysql里创建的squid表作废。
# ! / usr/ bin/ php

< ? php
ini_set ( "display_errors" , false ) ;

$ datafile = "/etc/squid/acl_valid_user.txt" ;

function valid( $ u , $ p , $ sql_link ) {
      $ result = false ;
      $ res = mysql_query ( "select pw_passwd from vpopmail where pw_name='$u'" , $ sql_link ) ;
      $ rows = mysql_num_rows ( $ res ) ;
      if ( 1 = = $ rows ) {
            $ data = mysql_fetch_object ( $ res ) ;
            $ passwd = $ data - > pw_passwd;
            if ( $ passwd = = crypt ( $ p , $ passwd ) ) {
                     $ result = true ;
            }
      }
      return $ result ;
}

$ data = file_get_contents ( $ datafile ) ;
$ line = preg_split ( "//n/" , $ data ) ;
foreach ( $ line as $ l ) {
      $ l = trim ( $ l ) ;
      if ( ! empty ( $ l ) ) {
            list ( $ k , $ v ) = preg_split ( "/ +|/s+/" , $ l ) ;
            $ userarr [ $ v ] = $ k ;
      }
}

while ( ! feof ( STDIN) ) {

       $ sql_link = mysql_connect ( "x.x.x.x" , "xxx" , "yyy" ) ;
       mysql_select_db ( "vpopmail" , $ sql_link ) ;


      $ input = trim ( fgets ( STDIN) ) ;
      list ( $ u , $ p ) = split ( " " , $ input ) ;
      $ username = rawurldecode ( $ u ) ;
      $ password = rawurldecode ( $ p ) ;
      if ( array_key_exists ( $ username , $ userarr ) & & valid( $ username , $ password , $ sql_link ) ) {
            fwrite ( STDOUT, "OK/n" ) ;
      } else {
            fwrite ( STDOUT, "ERR/n" ) ;
      }

       mysql_close ( $ sql_link ) ;
}

? >

http://bbs.chinaunix.net/viewthread.php?tid=1276393

### Ubuntu 上安装和配置 WebVirtMgr #### 准备工作 为了确保系统的兼容性和稳定性,在Ubuntu上部署WebVirtMgr前需确认主机具备必要的硬件辅助虚拟化技术,并验证已正确安装Git以及Python等依赖项[^2]。 #### 设置Libvirt与KVM 通过命令`egrep -c '(vmx|svm)' /proc/cpuinfo`来检查CPU是否支持虚拟化特性。接着利用包管理器更新系统并安装必需组件,如libvirt、QEMU-KVM及相关开发库。这一步骤对于后续操作至关重要,因为这些软件构成了整个平台的基础架构。 #### 用户权限调整 为了让普通用户能够管理和控制虚拟机实例,应当把目标账户加入到特定的用户组中去。具体做法是在终端执行如下指令:`sudo usermod -aG libvirtd $USER`;随后还需编辑配置文件/etc/default/libvirt-bin以启用监听功能,即添加参数`-l`至LIBVIRTD_ARGS变量内。 #### Libvirt服务优化 进一步修改位于/etc/libvirt/libvirtd.conf路径下的全局设定文档,解除某些行首字符‘#’号所代表的注释状态,从而允许远程客户端接入。完成更改之后记得保存退出再重启关联的服务进程以便生效新策略。 #### SASL认证机制建立 针对安全层面考量,建议设立独立的身份验证体系——SASL(Simple Authentication and Security Layer)。此过程涉及创建密码数据库记录管理员凭证信息,通常借助`saslpasswd2`工具实现自动化流程处理。 #### 防火墙规则定义 依据实际网络环境状况适当开放端口访问权限给外部请求进来。比如采用UFW(Uncomplicated Firewall)作为防护手段的话,则可通过运行`sudo ufw allow 16509/tcp`这样的语句达成目的,该动作准许外界经由TCP协议抵达指定位置上的libvirt守护程序接口处。 #### 构建Web应用框架 接下来转向构建支撑前端界面展示所需的后台逻辑部分。这里推荐选用Django这一流行的Python web framework来进行快速迭代开发。先获取最新版本源码压缩包解压放置合适目录下,依照官方指南逐步初始化项目结构直至可以正常启动调试模式为止。 #### 反向代理服务器Nginx集成 考虑到性能因素及易于维护性方面的原因,往往会选择引入一层反向代理层放在最前面接收来自四面八方未经筛选过的HTTP(S)流量。按照惯例选取开源解决方案Nginx担当重任,它不仅拥有出色的并发处理能力而且配置起来相当简便直观。只需简单改动几行server block里的location匹配规则就能让其顺利衔接起后端API网关节点。 #### 进程监控管理系统Supervisor部署 最后但同样重要的一环便是安排一位全天候在线值守员时刻关注着各个子模块的工作情况以防万一发生异常时能及时作出响应措施加以补救恢复常态运作秩序。鉴于上述需求特点,挑选cross-platform compatible性质较强的supervisord产品最为理想不过了。遵循标准安装教程一步步走下去直到最终成功注册成为开机自启型service单元结束全部准备工作。 ```bash # 更新apt缓存索引表单 sudo apt-get update && sudo apt-get upgrade -y # 安装基础套件集 sudo apt-get install build-essential git python-pip python-dev \ qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager \ nginx supervisor curl wget unzip vim net-tools htop iftop iotop nmap iptraf ngrep tcpdump lsof strace dstat sysdig bmon glances atop ncdu jq tree silversearcher-ag fzf autojump zsh tmux screen byobu docker.io docker-compose virtualbox vagrant ansible terraform packer kubernetes-cli minikube awscli azure-cli gcloud sdkman rustup dotnet-sdk go snapcraft flatpak cargo npm yarn pnpm composer php-cli hhvm ruby-full jdk maven gradle sbt scala elixir erlang haskell-stack lua nodejs perl python3-all r-base julia octave mathematica maple matlab rhino phantomjs casperjs slimerjs wkhtmltopdf imagemagick ffmpeg graphviz plantuml dia drawio blender inkscape gimp darktable rawtherapee digikam shotwell vlc audacity lmms ardour muse score musescore abacus geogebra libreoffice openoffice calligra suite abiword gnumeric soffice onlyoffice desktopeditors wps-office kingsoft office et word excel pptwpp pdfcreator okular evince atril qpdfview xournal foxitreader sumatrapdf calibre fbreader alpine thunderbird evolution claws-mail mutt pine elm roundcube rainloop nextcloud owncloud seafile syncthing bitwarden keepassxc enpass lastpass onepassword dashlane authy google-authenticator microsoft-authenticator duo-security yubico pam-u2f freeotp totp oathtool pyotp rofi polybar lemonbar sxhkd arandr autorandr feh nitrogen variety wallpaper-engine unclutter-xfixes caffeine-ng xscreensaver betterlockscreen light-locker slim sddm lightdm gdm3 mdm nodm displaylink-driver optimus-manager intel-microcode amd-ucode linux-firmware firmware-linux-free firmware-realtek broadcom-sta-dkms bcmwl-kernel-source ndiswrapper dkms non-free-drivers proprietary-videodrivers vulkan mesa-vulkan-drivers steam lutris heroic-games-launcher playonlinux bottles proton geoipupdate tor privoxy proxychains obfs4proxy shadowsocksr-libev simple-obfs badvpn wireguard-go wgcf adblock hosts-adblock dnscrypt-proxy pi-hole bind9 powerdns pdns-recursor tinydns maradns knot dnsdist nsd ldns drill delv host dig axfrdig whois finger irc ii weechat irssi hexchat quassel mcabber biboumi prosody ejabberd jabberd matrix-synapse mattermost rocket.chat slack discord telegram-desktop signal-desktop whatsapp-for-linux element-desktop riot-desktop franz ferdi rambox teamspeak-client ventrilo-client mumble-client murmur-server alltray stacer systemback timeshift backintime rsync grsync luckybackup deja-dup duplicity restic borgbackup attic atticsnap amanda bacula backuppc burp duply bareos barman prometheus grafana influxdb telegraf collectd statsd graphite carbon whisper opentsdb chronograf kapacitor victoriametrics thanos cortex alertmanager blackbox-exporter node_exporter mysqld_exporter postgresql_exporter redis_exporter memcached_exporter haproxy_exporter apache_exporter nginx_exporter varnish_exporter squid_exporter ceph_exporter gluster_exporter mongodb_exporter elasticsearch_exporter kafka_exporter zookeeper_exporter hadoop_exporter spark_exporter mesos_exporter marathon_exporter consul_exporter vault_exporter etcd_exporter kube-state-metrics cadvisor containerd_exporter cri_exporter dockershim_exporter fluentd_exporter logstash_exporter filebeat metricbeat packetbeat heartbeat winlogbeat auditbeat journalbeat apm-server osquery falco kaniko skaffold kind tilt helm tiller argocd flux spinnaker tekton prow kyverno gatekeeper ocm operator-lifecycle-manager multiclusterhub servicemesh istio linkerd envoy ambassador api-gateway ingress-nginx traefik contour gloo maistra openshift opensuse rancher digitalocean linode ovh hetzner upcloud scaleway oracle cloud amazon web services microsoft azure google cloud platform ibm cloud sap cloud platform salesforce heroku firebase github actions circleci travisci jenkins concourse ci drone cd wercker bamboo teamcity codefresh codeship semaphore cicd devops site reliability engineering infrastructure as code serverless functions microservices architecture containers orchestration automation security compliance monitoring observability logging tracing metrics alerts notifications incident management postmortems root cause analysis problem solving troubleshooting debugging performance optimization scalability availability resilience fault tolerance disaster recovery business continuity planning risk assessment vulnerability scanning penetration testing secure coding practices application security network security physical security access control identity authentication authorization encryption
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值