前段时间很多数据库因为没有做好权限控制暴露在外网被删然后遭勒索的事件,而类似的有些内网的web服务也会被开放到公网并且没有做任何权限控制的,这样也会有一定的风险。所以就决定写篇文章简单介绍一个小工具。

aProxy是做什么用的

例如我们有很多服务,例如Hadoop、Aerospke、Riak等,都会有一些监控的web界面,我们需要查看这些线上服务的情况,但是又不能完全将这些服务开放到外网,让别人看到,这时候我们可能的做法是通过拨VPN,或者是通过Nginx的BaseAuth验证,又或者是简单的本地绑定ip和host来访问,这些方法管理和维护起来都不方便;有些人为了方便甚至是完全开放到外网,谁人都可以自由访问。所以我们写了一个简单的小工具aProxy来解决这个问题。

下面有两个服务用于演示的,试着访问下面两个服务(转到登录界面时请点底部的Github登录):

aProxy通过设定upstream来做反向代理:

UpStream的地址通常我们使用内网地址,这样就不需要将服务开放到外网了。

对于资源的开放程度有三种类型:

  • Public: 完全开放,谁人都可以访问
  • Need Login:需要登录才可以访问
  • Need Authority:需要授权才可以访问

然后通过授权管理来开放特定的服务给特定的用户,aProxy的授权规则是基于email和URL的。

这里设定了两个服务,一个是只需登录就能访问的分布式的定时任务系统cronsun,一个是必须授权才能访问的Hadoop dfshealth服务,你们可以直接分别访问这两个地址就能感受到aProxy是个什么样的作用了。(登录界面请用底部的Github登录)

aProxy安装

安装aProxy可以选择从 https://github.com/shunfei/aproxy/releases 直接下载编译好的二进制文件:

tar xzvf aproxy-v0.-xxxx-xxx-xx.tar.gz
cd aproxy-v0.-xxxx-xxx-xx
cp conf/aproxy.toml.example conf/aproxy.toml

如果你熟悉go语言,也可以从源码编译:

cd $GOPATH/src
git clone https://github.com/shunfei/aproxy.git
cd aproxy
sh ./install.sh

运行aProxy

在运行aProxy之前,需要先准备好 MongoDB 和 Redis(其中MongoDB是用于配置存储,Redis用于session存储),然后修改conf/aproxy.toml里面相应的配置,就可以运行aProxy了:

./bin/aproxy -c conf/aproxy.toml

数据库里面现在是没有用户的,所以我们加一个用户到数据库里面:

./bin/adduser -c conf/aproxy.toml -action adduser -email yourname@gmail.com -pwd passwordxxx

接着将这个用户设置为Admin:

./bin/adduser -c conf/aproxy.toml -action setadmin -email yourname@gmail.com -adminlevel 

现在你可以访问 http://127.0.0.1:8098/-_-aproxy-_-/  并开始设置aProxy,开心的开始使用了。

aProxy的域名相关配置

aProxy的反向代理是基于域名配置的,而aProxy需要验证用户的登录情况则需要获取到登录后的cookie,所以aProxy的服务需要基于子域名来配置:

  • aproxy.domain.com
  • mongodb-mms.aproxy.domain.com
  • hadoop.aproxy.domain.com
  • aerospike.aproxy.domain.com

如上的域名列表,aproxy.domain.com 则用于aproxy的登录域名,其他的子域名则为相应服务的域名,这样当登录后,子域名(例如 hadoop.aproxy.domain.com)就可以读取到上一级域名的cookie数据,获取到登录状态。所以我们aProxy的Nginx配置大概如下:

server {
listen ;
server_name aproxy.domain.com *.aproxy.domain.com;
location / {
include proxy.conf;
# pass to aproxy
proxy_pass http://127.0.0.1:8098;
}
}

这样我们就可以设置一个泛域名解析 *.aproxy.domain.com 到这台Nginx服务器了。
然后还需要修改 conf/aproxy.toml 里面的和域名相关的配置:

loginHost = "http://aproxy.domain.com"
[session]
domain = "aproxy.domain.com"

和公司内部用户帐号系统集成

aProxy是基于golang写的,所以这需要你们对go语言有基本的了解。
aProxy提供了一个基于MongoDB存储的用户系统,不过很多时候我们希望和公司内部的帐号系统进行集成,方便员工使用。这时候我们就可以实现aProxy位于aproxy/module/auth/UserStorager的UserStorager的接口:

type UserStorager interface {
Login(email, pwd string) (*User, error)
GetByEmail(email string) (*User, error)
GetAll() ([]User, error)
// add new user.
// user.Pwd field has encrypted.
Insert(user User) error
Update(id string, user User) error
}

通常情况下对于集成公司内部的用户帐号系统的,我们并不需要使用aProxy来管理用户信息,所以我们只需实现接口的Login(email, pwd string) (*User, error)这一个方法就可以。
在实现了aproxy/module/auth/UserStorager接口后, 我们需要修改 aproxy/bin/main.go 里面的一些代码,使用你自己实现的用户存储接口:

//file: aproxy/bin/main.go
//delete this line:
// auth.SetUserStorageToMongo() //add this code, to register your own UserStorager to aproxy
auth.SetUserStorage(&yourUserStorage{})

如果想增加oAuth的登录验证,则实现 module/oauth/Oauther 接口就可以,具体可以参考loginservices/github 的实现。

aProxy: 带认证授权和权限控制的反向代理的更多相关文章

  1. Token认证登录以及权限控制

    IdentityServer4实现Token认证登录以及权限控制   相关知识点 不再对IdentityServer4做相关介绍,博客园上已经有人出了相关的系列文章,不了解的可以看一下: 蟋蟀大神的: ...

  2. IdentityServer4实现Token认证登录以及权限控制

    相关知识点 不再对IdentityServer4做相关介绍,博客园上已经有人出了相关的系列文章,不了解的可以看一下: 蟋蟀大神的:小菜学习编程-IdentityServer4 晓晨Master:Ide ...

  3. 使用nginx配置带有权限验证的反向代理

    环境:centos6u3 1.安装nginx (1)上传nginx nginx-1.14.0.tar.gz.可以从nginx官网下载http://nginx.org/en/download.html ...

  4. JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作

    1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...

  5. Shiro的认证和权限控制

    权限控制的方式 从类别上分,有两大类: - 认证:你是谁?–识别用户身份. - 授权:你能做什么?–限制用户使用的功能. 权限的控制级别 从控制级别(模型)上分: - URL级别-粗粒度 - 方法级别 ...

  6. 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示

    1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...

  7. JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理

    1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...

  8. 源码分析shiro认证授权流程

    1. shiro介绍 Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能: 认证 - 用户身份识别,常被称为用户“登录”: 授权 - 访问控制: 密码加密 ...

  9. shiro权限控制入门

    一:权限控制两种主要方式 粗粒度 URL 级别权限控制和细粒度方法级别权限控制 1.粗粒度 URL 级别权限控制 可以基于 Filter 实现在数据库中存放 用户.权限.访问 URL 对应关系, 当前 ...

随机推荐

  1. 调试时a标签禁止跳转方法

    a.setAttribute("onclick",'');

  2. C++设计模式:Template Method

    我使用过一个简单的后台服务框架.这个框架上手很容易,我只需要继承一个基类,同时实现,或重写(override)基类声明的几个接口(这些接口声明为虚函数,或者纯虚函数),然后调用基类定义好的run()函 ...

  3. spl之文件处理

    spl是php标准库的缩写 spl文件处理类库: SplFileInfo  //是一个类用以获取文件的各种信息SplFileInfo的所有方法如下 方法名            - ---   说明2 ...

  4. 1753: [Usaco2005 qua]Who's in the Middle

    1753: [Usaco2005 qua]Who's in the Middle Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 290  Solved:  ...

  5. jenkins-Couldn't find any revision to build. Verify the repository and branch configuration for this job

    参考解决方法: https://issues.jenkins-ci.org/browse/JENKINS-20502 原因分析:jenkins无法准确识别revision 操作方法: 在 branch ...

  6. ES4:ElasticSearch 使用C#添加和更新文档

    这是ElasticSearch 2.4 版本系列的第四篇: 第一篇:ES1:Windows下安装ElasticSearch 第二篇:ES2:ElasticSearch 集群配置 第三篇:ES3:Ela ...

  7. 【故障•监听】TNS-12518、TNS-00517和 Linux Error:32:Broken pipe

    [故障|监听]TNS-12518.TNS-00517和 Linux Error:32:Broken pipe 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱 ...

  8. pageRank算法 python实现

    一.什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google 产品经理),因为他是这个算法的发明者之一,还是google CEO( ...

  9. struts2(四) ognl表达式、值栈、actionContext之间的关系

    今天来说说ognl表达式在struts2中的运用. --wh 一.什么是Ognl? 通过百度百科查询到的解释,其中详细的说明了OGNL的作用. 下面我们就对OGNL这5个作用进行讲解 1.存取对象的任 ...

  10. cuda线程/线程块索引小结

    内建变量: threadIdx(.x/.y/.z代表几维索引):线程所在block中各个维度上的线程号 blockIdx(.x/.y/.z代表几维索引):块所在grid中各个维度上的块号 blockD ...