前段时间很多数据库因为没有做好权限控制暴露在外网被删然后遭勒索的事件,而类似的有些内网的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. Java面试03|并发及锁

    1.synchronized与Lock的区别 使用synchronized这个关键字实现的同步块有一些缺点: (1)锁只有一种类型 (2)线程得到锁或者阻塞 (3)Lock是在Java语言层面基于CA ...

  2. html to pdf

    C++ Library to Convert HTML to PDF html2pdf PrinceXML 收费 CutePDF Ghostscript PDFDoc VisPDF PDFDoc Sc ...

  3. F# 语法概览

    F#和C#的语法差别 语法上,F#和C#有两个主要差别: 用缩进而非花括号分隔代码块 用空白而非逗号分隔参数 F#常见语法元素 以下是F#代码中常见的语法元素 注释 // 这是单行注释 (* 这是多行 ...

  4. C++ 构造函数或析构函数调用虚函数

    构造函数和析构函数中的虚函数 在执行基类构造函数时,对象的派生类部分是未初始化的.实际上,此时对象还不是一个派生类对象. 为 了适应这种不完整,编译器将对象的类型视为在构造或析构期间发生了变化.在基类 ...

  5. Java设计模式之《享元模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6542449.html 享元模式:"享"就是分享之意,指一物被众人共享, ...

  6. 476. Number Complement

    题目 Given a positive integer, output its complement number. The complement strategy is to flip the bi ...

  7. Git-最简单的本地项目变成版本仓库,然后把内容推送到GitHub仓库

    (注:本文的前提是本地Git仓库和github仓库之间已经存在SSH key了,所以如果没有建立联系的小伙伴们请先建立联系) 具体操作: 一:把本地项目变成版本仓库 1.把本地的一个项目目录编程版本库 ...

  8. Django HTTP处理流程(自我总结)

    Django中由wsgi模块接管http请求,核心处理方法为get_wsgi_application,其定义如下: def get_wsgi_application(): ""&q ...

  9. 使用git克隆指定分支的代码

    今天想学习一下开源中国Android客户端的app源码,源码的Git地址:http://git.oschina.net/oschina/android-app,如下图所示: 由于Master主分支上没 ...

  10. 第一章 开发简单Java应用程序

    1. 什么是程序?     程序一词来自生活,通常指完成某些事务的一种既定方式和过程(一组有序指令的集合). 2. Java的三个领域? Java SE:java技术核心(指桌面应用程序)如:QQ.百 ...