前段時間很多數據庫因為沒有做好權限控制暴露在外網被刪然后遭勒索的事件,而類似的有些內網的web服務也會被開放到公網並且沒有做任何權限控制的,這樣也會有一定的風險。所以就決定寫篇文章簡單介紹一個小工具。
aProxy是做什么用的
例如我們有很多服務,例如Hadoop、Aerospke、Riak等,都會有一些監控的web界面,我們需要查看這些線上服務的情況,但是又不能完全將這些服務開放到外網,讓別人看到,這時候我們可能的做法是通過撥VPN,或者是通過Nginx的BaseAuth驗證,又或者是簡單的本地綁定ip和host來訪問,這些方法管理和維護起來都不方便;有些人為了方便甚至是完全開放到外網,誰人都可以自由訪問。所以我們寫了一個簡單的小工具aProxy來解決這個問題。
下面有兩個服務用於演示的,試着訪問下面兩個服務(轉到登錄界面時請點底部的Github登錄):
- http://cronsun.aproxy.rtbdev.com/ui/ : 登錄后就能訪問
- http://hadoop.aproxy.rtbdev.com/ : 登錄后會提示沒有權限,還是無法訪問
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.1-xxxx-xxx-xx.tar.gz cd aproxy-v0.1-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 99
現在你可以訪問 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 80; 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 的實現。