1. 程式人生 > >Spring cloud 微服務安全解決方案

Spring cloud 微服務安全解決方案

Restful 的通訊安全有很多中解決方案,例如

    1. HTTP Basic Auth 認證
    2. Cooke / Session 認證
    3. Token 認證
    4. Oauth
    5. OpenID

等等

每一種方案都很成熟,這裡不依依解釋,如果不瞭解,請去搜索引擎查詢相關資料

這裡我談談在實施微服務專案中的心得,首先專案採用 Spring cloud 方案,Spring cloud 有自己的RestController 控制器,我們需要遵循他的規範開發,這就限制了很多傳統的認證加密方法不能應用到 Spring cloud中。

例如傳統restful 使用 POST 方式提交,POST 資料格式如下:
 name=Neo&age=23&md5=xxxxxxx  
然後做 token 校驗。

而 Spring cloud 使用 raw 格式的資料做POST提交,例如
@RequestMapping(value = "/member/create", method = RequestMethod.POST)  
public void create(@RequestBody Member member)
我們不想在Spring框架上做額外的改動,又想解決資訊的安全問題。

應用層加密與傳輸層加密,我更趨向傳輸層加密。

因為應用層加密也破壞了 Spring cloud的風格,應用層加是指通過非對稱金鑰將資料加密,然後通過POST傳送到伺服器端,伺服器端獲取資料後解密,在反序列化。這種做法有很多缺陷:

  1. 需要使用者自己處理加密與機密
  2. 加密資料通常需要BASE64編碼後傳輸,增加了資料體積。
  3. 不同語言間處理方式存在差異,略有不同。例如有些系統使用JKS格式的證書,有些使用PEM,P12 等等。需要開發者自己轉換,比較複雜。

而傳輸層加密由Web伺服器完成,與開發無關。

 

第一個階段採用 HTTP Basic Auth

這個方案簡單,實施起來最為方便,因為專案比較緊急,所以就採用了這個方案,這個方案既可以在運維方處理,也可以在開發方處理,對於 Spring boot 只需引入Spring Security 簡單配置,立即生效。

實現方式請參考:

Spring boot with Spring security

http://www.netkiller.cn/java/spring/boot/security.html

第二階段 HTTP Basic Auth + SSL

上面的方案適合在防火牆內部的伺服器間通訊,如果跨機房或者在廣域網上就不在安全了,通過嗅探器抓包,包括 http basic auth 的使用者和密碼,以及介面資料沒有安全可言。
為Web 伺服器增加 SSL 證書,可以解決資訊保安問提。

證書可以使用CA機構頒發的證書,也可以自己生成證書。

證書可以配置在Web伺服器上如Nginx, 實現方式請參考:
http://www.netkiller.cn/www/nginx/conf.html#http2

也可以配置在 Spring boot 中, 實現方式請參考:

Spring boot with HTTPS SSL

http://www.netkiller.cn/java/spring/boot/https.html

這個方案我們使用了很長一段時間,大家都不想再改動和優化現有的專案,可以滿足絕大部分使用者的需求.


第三階段 Oauth

由於需要為手機端提供 restful 服務,之前的方式已經不能滿足我們的需求,之前的方式更適合提供私有服務,不適合提供公共服務。所謂私有服務是指它的使用範圍限制在企業內部,或者事業部間共享服務,總的來說可以通過防火牆控制服務區域。

對於公共服務 OpenID/Oauth 更適合,我們不關心使用者地理位,終端裝置的情況。實現方式請參考:

實現方式請參考:

Spring boot with Oauth2

http://www.netkiller.cn/java/spring/boot/oauth2.html

第四階段,終極版誕生,SSL使用雙向認證

這樣就具備了:

    1. SSL 雙向認證
    2. HTTP Basic Auth 認證
    3. Oauth2 認證

這是我們最終的方案,雙向認證是伺服器與客戶端兩端都需要證書才能通訊。
App(IOS/Android) -->  SSL 雙向認證 --> SLB/Proxy --> Feign Client