需求
一般如果从公网接入公司内网需要使用到vpn,但是有时候如果希望某些用户只能访问特定的网站,比如一个合作方的员工,接入了公司内网,我们只希望他能访问一些工时网站,不希望他能访问gitlab,等,如果要在每个系统中区分权限,会显得很麻烦,但我们可以通过http代理的形式,去控制这些用户,能请求哪些网站
架构图
原理
涉及技术
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准备
- ldap我选择的是windows server的AD域,安装也很简单,自行搜索即可
- 创建一个ldapreader用户,用于squid接入ldap
- 创建私人用户:peng
- 创建用户组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中,路径:
此处可以使用本地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,会提示需要登陆,输入密码后,如愿进入系统
但是如果我们使用非normal组的用户登陆就会出现无法访问的情况,符合预期
https安全性验证
我们准备两个站点,都经过squid代理,一个是http,一个是https
http站点抓包
可以看到用户的信息
https站点
数据是走隧道,而且原生数据就是https加密过的,所以看不到任何信息