2019年4月30日 星期二

Athenz 基本運作概念與相關名詞

在 Athenz 權限系統中,有幾個比較重要的基本概念和名詞,簡單記錄一下。不過在那之前,因為 Athenz 的結構幾乎跟 AWS IAM 一樣,所以可以先討論一下 AWS IAM 的運作方式 [1],再回來看 Athenz 對應的概念。而且其實我覺得 AWS 的文件整體來說寫得比較好 XD。

AWS IAM 的運作方式

如果有使用過 AWS IAM 的話,就可以知道 AWS 的所有服務都是 API Resource,會以特定的 Amazon Resource Name(ARN)[2] 來表示,例如:

<!-- Elastic Beanstalk application version -->
arn:aws:elasticbeanstalk:us-east-1:123456789012:environment/My App/MyEnvironment

<!-- IAM user name -->
arn:aws:iam::123456789012:user/David

<!-- Amazon RDS instance used for tagging -->
arn:aws:rds:eu-west-1:123456789012:db:mysql-db

<!-- Object in an Amazon S3 bucket -->
arn:aws:s3:::my_corporate_bucket/exampleobject.png

當我們要讓某個使用者存取例如 S3 的資源的時候,我們必須讓這個使用者隸屬為某個 Role,讓他能夠「扮演」那個 Role。接著要在 Role 上面掛載(attach)對應的 Policy,其中 Policy 內容是允許該 Role 能夠對指定的資源進行指定的存取。以下述的例子來說,就是允許指定的兩個 Amazon 帳號能夠對 examplebucket 這個 S3 bucket 放檔案。

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddCannedAcl",
      "Effect":"Allow",
      "Principal": {"AWS": ["arn:aws:iam::111122223333:root","arn:aws:iam::444455556666:root"]},
      "Action":["s3:PutObject","s3:PutObjectAcl"],
      "Resource":["arn:aws:s3:::examplebucket/*"],
      "Condition":{"StringEquals":{"s3:x-amz-acl":["public-read"]}}
    }
  ]
}

Athenz 的基本概念

接下來回到 Athenz。Athenz 是一種 Role-based Access Control [3] 的系統,概念上跟上述的 AWS IAM 幾乎是一樣的。在 Athenz 當中,認證程序分為驗證(Authentication)和授權(Authorization)。其中驗證程序有兩個主要步驟,分別會用不同類型的票券來表示。票券有分成身份證以及通行證兩種,分別用來表示身份以及表示權限。首先系統需要先驗證訪客確實是某個系統認識的人(或者機器),此時會發一個 Principal Token 用來代表他通過驗證。接著當訪客要存取某個資源時,訪客會通過第二個驗證,取得 Role Token,此時就像是穿上角色扮演服一樣,例如穿上清潔工服,就被認為應該具備清潔工這個角色被授與的權限。

Athenz 的相關名詞

Athenz 的相關名詞可以參考 [4],這裡會簡單地介紹它們。

在 Athenz 當中也有 Principle 這個概念,Principle 是代表能夠在系統中進行操作的行為者(Actor)的統稱,可以由 User 或者 Service 來代表。其中,Service 可以由一群主機(或者 VM、微服務等)共同代表,共同代表的方式是讓它們都拿著相同的 Principle Token(NToken)或者 TLS Certificate。Service 和 User 在 Athenz 當中都會以 sub-domain 的形式來表達,不過 User 比較特別,有一個專屬的 Domain user 來代表,例如 user.john 代表 John 這個 User。

Role 是自定義的角色扮演服(咦?)。在 Athenz 當中,Role 本身並沒有帶著權限,但是穿著同樣的角色服,就會被認為是同一群人,會經由 Policy 的描述而具有相同的權限。當一個 Principle 想要裝飾成 Role 時,它需要提出 Role Token(RToken)來證明自己,Role Token 是由 Athenz 伺服器發出的 Token,代表 Athenz 認可這個 Principle 可以裝飾成這個 Role。


Data Model,截自 [4]

上圖中右側可以看到,Service 和 User 都可以被驗證成為 Principal,然後 Principal 可以裝飾成 Role。有了這些基礎以後,接著就回到 DomainPolicy

我們可以在 Domain 裡面建立 Policy,Policy 會包含 Role、Resource 和 Action,也就是代表接受或拒絕某個 Role 對某個 Resource 執行某個 Action

參考資料
  1. AWS Documentation » AWS Identity and Access Management » User Guide » What Is IAM? » Understanding How IAM Works
  2. AWS Documentation » General Reference » Amazon Resource Names (ARNs) and AWS Service Namespaces
  3. Role-based access control
  4. Athenz - Architecture- Data Model
  5. 如何製作 SSL X.509 憑證?