squid 结合LDAP实施带认证的http代理

需求

一般如果从公网接入公司内网需要使用到vpn,但是有时候如果希望某些用户只能访问特定的网站,比如一个合作方的员工,接入了公司内网,我们只希望他能访问一些工时网站,不希望他能访问gitlab,等,如果要在每个系统中区分权限,会显得很麻烦,但我们可以通过http代理的形式,去控制这些用户,能请求哪些网站

架构图

image.png

原理

涉及技术

http隧道

http隧道具体原理较为简单,此处不再重复,自行谷歌即可,squid的http代理使用的就是此项技术,简单来说就是建立起一条tcp隧道,不管中间传输的是https协议,还是ftp协议的文件,代理都不关心,只负责传递数据包

pac脚本

用于控制浏览器行为,比如,想控制浏览器请求*.test.com站点,需要走代理,其他的走本机网络,具体写法此处也不展开,自行谷歌即可,可参考如下的改动就行了

var direct = "DIRECT;";
if (direct == "__DIR" + "ECT__") direct = "DIRECT;";
var proxy = "PROXY 1.1.1.1:9000;DIRECT;"; # 代理地址
var domains = {
        "test.com": 1 # 表示test.com走代理
};

var direct = 'DIRECT;';

var hasOwnProperty = Object.hasOwnProperty;

function FindProxyForURL(url, host) {
    var suffix;
    var pos = host.lastIndexOf('.');
    pos = host.lastIndexOf('.', pos - 1);
    while(1) {
        if (pos <= 0) {
            if (hasOwnProperty.call(domains, host)) {
                return proxy;
            } else {
                return direct;
            }
        }
        suffix = host.substring(pos + 1);
        if (hasOwnProperty.call(domains, suffix)) {
            return proxy;
        }
        pos = host.lastIndexOf('.', pos - 1);
    }
}

流程

  • 浏览器配置pac文件,将gridsum.com的请求引流至代理服务器
  • 代理服务器收到请求后,判断用户是否登录
  • 如果未登陆,则弹出登陆页面,并且判断用户权限
  • 比如A用户是域组Normal,但是Normal这个组没有请求iwork.gridsum.com的权限,
  • 那么就会驳回用户的请求,不建立http隧道

Squid配置

Squid安装使用

yum -y install squid即可,yum安装的已经包含了本例中所涉及到的ldap组件,所以不需要再很麻烦的去重新编译,而且squid编译时间至少15分钟
具体的配置语法,此处也不重复说明,都挺简单,百度即可

配置说明

Ldap准备

  1. ldap我选择的是windows server的AD域,安装也很简单,自行搜索即可
  2. 创建一个ldapreader用户,用于squid接入ldap
  3. 创建私人用户:peng
  4. 创建用户组normal

配置文件

auth_param basic program /usr/lib64/squid/basic_ldap_auth -R -b "dc=testproxy,dc=com" -D "cn=ldapreader,ou=Ops,dc=testproxy,dc=com" -w '123456' -f sAMAccountName=%s -h 10.202.80.11:389

external_acl_type ldap_group ttl=100 %LOGIN /usr/lib64/squid/ext_ldap_group_acl  -R -b "dc=testproxy,dc=com" -D "cn=ldapreader,ou=Ops,dc=testproxy,dc=com" -w '123456' -f "(&(objectclass=person)(sAMAccountName=%v)(memberOf=CN=%a,ou=Ops,dc=testproxy,dc=com))" -h 10.202.80.11:389
auth_param basic children 5 # 用于认证的进程数
auth_param basic realm Web-Proxy # 弹窗时窗口名
auth_param basic credentialsttl 1 minute # 用户ttl有效期,可以理解为,用户不操作后,多长时间从内存中踢出  
acl auth_user proxy_auth REQUIRED
acl test dstdomain work.test.com gitlab.test.com grafana.test.com # 给这几个站点起一个策略别名:test
acl normal_group external ldap_group normal # 给normal组的用户起一个别名:normal_group  
http_access allow normal_group test # 允许normal_group请求test的域名
http_access deny all # 其他的全部deny

效果

使用的时候需要将pac文件配置在ie中,路径:

image.png

此处可以使用本地pac,但是建议找一台web服务器,放在上面,因为,chrome是不支持加载本地pac的

场景1:

希望normal组的员工能请求work.test.com gitlab.test.com grafana.test.com 这几个站点,别的全部deny

acl test dstdomain work.test.com gitlab.test.com grafana.test.com
acl normal_group external ldap_group normal
http_access allow normal_group test # 允许normal_group

请求站点gitlab,会提示需要登陆,输入密码后,如愿进入系统


image.png

但是如果我们使用非normal组的用户登陆就会出现无法访问的情况,符合预期

https安全性验证

我们准备两个站点,都经过squid代理,一个是http,一个是https

http站点抓包

可以看到用户的信息


image.png

https站点

数据是走隧道,而且原生数据就是https加密过的,所以看不到任何信息

image.png

其他问题

你可能感兴趣的:(squid 结合LDAP实施带认证的http代理)