當前位置:
首頁 > 最新 > 應用程序安全

應用程序安全

隨著網路及雲的普及,應用程序的安全也越來越重要。本文從基本概念以及基本原理出發,對應用程序安全做了一個簡要清晰的總結。總的來說,應用程序的安全性從三個方面來保證:Authentication、Authorization以及Audit。

1、Authentication

應用程序安全首先要解決的就是身份驗證的問題。一般我們在使用一個應用程序之前,需要先登錄,證明自己的身份之後才能使用應用程序。直白的說,就是向別人證明「我就是我」

證明的方式有很多,最簡單的就是HTTP basic認證,其實也就是username+password的方式。一般在客戶端身份驗證之後,伺服器端就會給該客戶分配一個token,保存在cookie中,以後每次請求帶上該token即可。

客戶端採用REST介面請求時也可以直接帶上username和password,例如下面URL中username和password分別是benjamin和changme:

curl -X POST -u benjamin:changeme http://localhost:9200/_cat/indices?v

註:這是查詢elasticsearch中索引列表的REST請求

身份驗證必然涉及到用戶管理的問題。應用程序自己管理用戶自然沒什麼問題。例如我們要使用QQ,要先註冊一個帳號(也就是QQ號)並設置好密碼。該賬戶的信息存儲在騰訊的後台資料庫中,也就是說騰訊是自己管理用戶的帳號信息。

但對於很多應用來說,由應用自己管理用戶賬戶信息不太現實(這並不是說技術上不可行)。如果每個應用都自己管理用戶賬戶,而你手機上安裝了十幾個應用,那你豈不是要註冊十幾個帳號?而且註冊和登錄本身就是比較繁瑣的操作,很多用戶很可能一看到需要註冊就直接關閉甚至卸載應用了。所以比較常見的解決方案是使用可信第三方的身份驗證。比如直接使用QQ號就可以登錄一個應用,由騰訊為該用戶的身份及信用背書。

Authentication的另一個典型的場景就是SSO(Single Sign On),也就是單點登陸。當一個公司內有很多應用的時候,SSO就很有用。這裡就不展開說了。

JWT(JSON Web Token)也是很常見的一種身份驗證的方式。通常的場景是通過已有的帳戶(userid+password)獲取一個token。以後每次訪問就帶上這個token。而這個token一般是有時效限制的。例如下面請求中,token就在http header中。這裡也不展開說了。

curl -H "Authorization: Bearer eyJhbGciOiJIUzI1N......kpXVCJ9" -X POST -d @data.json http://localhost:8090/res/

身份驗證的方式還有很多,比如指紋識別等,這些都不是本文的重點。不管是什麼方式,Authentication要解決的問題都是相同的,都是要證明「我就是我」。

在雲時代,很多大公司都有自己的Authentication服務,也就是IDaaS(Identity as a Service)。

2、Authorization

Authentication的作用是驗證用戶的身份,而Authorization要解決的問題則是評估用戶的許可權。比如一個用戶通過了身份驗證,但該用戶只允許讀操作,那麼任何寫操作的請求都會被拒絕。

Authorization涉及到兩方面,首先是定義policy,也就是定義允許哪些用戶幹什麼,不允許哪些用戶幹什麼。其次就是許可權評估,也就是當一個用戶請求對某個資源做某個操作時,根據定義好的policy來評估是否允許此次操作。

Authorization的核心是Policy Model的設計。Policy Model的設計直接決定了Authorization的易用性。首先看一個policy的例子:

允許 benjamin 在9:00~17:00之間 閱讀 計算機書籍

通過上面的例子,可以抽象出一條Policy涉及到的幾個方面:

(1) 主體

主體就是定義「誰」。而每個主體可能包含很多身份標示,比如一個人的姓名、頭銜都是這個人的標示。上面例子中的benjamin就是主體的身份標示。用JDK裡面的概念來說,主體就對應Subject,身份標示則對應Principal,

java.security.Principal

(2) 資源

資源就是操作的對象,上面的例子中就是「計算機書籍」。

(3) 操作

操作就是執行的動作,上面的例子就是「閱讀」。

(4) 條件

條件就是對Policy生效的限制。上面的例子就是在「9:00~17:00」這個範圍內,policy才有效。

(5) 允許/拒絕

當以上都符合時,是允許還是拒絕執行操作。只有兩個選項:允許、拒絕。

這就是一個高度抽象的Policy Model。如果實現得足夠靈活的話,基本可以用來解決所有的許可權管理的應用場景。

雖然這裡說的都是應用層的許可權管理,但這套模型對於網路安全的許可權控制似乎也適用。通常網路安全的規則無非是對IP和Port訪問的各種限制,如果將source IP和source port理解成主體,destination IP和Port理解成resource,而將協議(TCP/UDP)看成是操作,那麼各種規則完全可以用上面的policy Model來定義。當然,具體實現的時候,需要將定義的Policy轉換成實際工作的規則,比如iptables等。

今年會有一個Authorization相關的開源項目推出,到時候我會再詳細介紹。

同樣有很多大公司在雲上提供Authorization服務,如AWS、阿里等。不過感覺阿里基本就是照抄AWS的設計,因為各種概念以及介面的定義幾乎與AWS一模一樣。

3、Audit

Audit就是審計。所有的操作都應該被記錄下來,以備審查。

--END--


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 零君聊軟體 的精彩文章:

TAG:零君聊軟體 |