白話講解函式計算中的角色授權

rsong發表於2018-12-18

前言

初次入坑函式計算的小夥伴,遇見的第一大攔路虎非RAM授權相關莫屬。開始玩玩hello world這種無關授權訪問其他阿里雲資源的時候,感覺 serverless 大法各種好,之後發現線上排查問題日誌的時候,第一次給service配置role的時候,雖然控制檯能成功配置,但是估計也是一臉懵逼。本文旨在用最淺顯的例子說明ram的基本概念,以及和函式計算之間的關係。

RAM

RAM 中的 2 個基本概念:

  • 使用者

    • 主賬戶(或稱root使用者)
    • 子使用者
  • 角色

先用一個通俗的例子來說明這兩個基本概念:

  • 您在阿里雲開通了賬號,購買阿里雲上的資源; 這個就類似於您建立了一個國家,國家有大有小(等價於你的阿里雲上資源多少), 主賬號就是國王您, 為了讓您的國家機器健康有效運轉,您開始放權,從任命三省六部大員直到九品芝麻官,這個時候,官員就對應子賬號, 官員(子使用者)的權利有大有小,就對應國王(主賬號)授予的官職大小。 此時無論國王(主賬戶)還是官員(子賬戶),都是物理意義上的人(真正的實體), 表現為有具體的身份證(Acesskey Id 和 Acesskey Secret),身份證與人繫結。
  • 角色不是實體,接著上面的例子,國家和國家之間需要交流合作, 假設您的國家是 A 國,如果 B 國想和 A 國合作, B 國派遣外交使節(B國的一個官員,對應B國子使用者)訪問 A 國, 這個時候,A 國需要給 頒發一個簽證,不然過不了海關, 就可以憑藉這個簽證,獲得一個臨時的 A 國國民身份進入A國,進行一些工作事項。 在這裡 簽證 可以理解為一個角色, 不是真正物理意義上的實體。 真正的實體通過簽證中授予的許可權,臨時扮演 A 國國民身份在 A 國幹一些事情。簽證的許可權有大有小並且有一定的時效性, 拿著不同的簽證,有可能是元首級別的交流待遇,也有可能只是去窮遊7天之內必須滾來回的DS。

具體詳情請參考 RAM 官方文件

函式計算中的RAM

函式中直接使用使用者

def handler(event, context):
    # 直接明文使用AK 訪問其他阿里雲資源,比如oss
    ...
    return "OK"

這種用法簡單粗暴,使用ak, 在上面說了,有ak的都是真正的實體使用者, 直接明文AK在程式碼中裸奔,怎麼看都不安全,於是演變成如下的程式碼片段:

def handler(event, context):
    ak_id = os.environ["AK_ID"]
    ak_secret = os.environ["AK_SECRET"]
    # 使用環境變數中ak訪問其他阿里雲資源
    # 環境變數有加密處理, 
    # https://help.aliyun.com/document_detail/69777.html
    ...
    return "OK"

這樣似乎看起來很安全了,但是如果一旦出現為了安全,定期更換AK情況,就不得不到處去手動函式中設定的環境變數…

函式中使用role

回到上面角色中的那個例子,您的阿里雲資源是 A 國, 函式計算的服務是 B 國, B 國和 A 國進行合作,A 國頒給 B 國大使 簽證(對應函式計算service配置的role), 這個時候 臨時扮演成 A 國國民對 A 國的資源進行一些訪問, 此時可以用如下注釋理解:

# -*- coding: utf-8 -*-

def handler(event, context):
  # context中的 creds 就是 `甲` 臨時扮演成的 A 國國民
  creds = context.credentials
  # creds 可以操作 A 國(也就是您自己的阿里雲)的資源
  # 這樣的話,您通過使用creds 就可以訪問您自己的阿里雲資源了
  # 不需要 ak 在程式碼中裸奔了
  ...
  
  return `OK`

所以:

  1. 如果您需要將您函式的日誌列印到您的 logstore 中進行除錯,需要至少授予 service 訪問您 logstore 的許可權,不然函式計算沒法把您函式執行的日誌 put 到您的lostore
  2. 如果您沒有給 service 配置 role, context.credentials為空
  3. 如果您想直接使用context.credentials訪問您自己的阿里雲資源,只需要給service中配置的role增加相應的許可權就行
  4. 強烈推薦儘量在函式計算中使用 context.credentials 來替換明文ak 的使用方法

總結

本文以一個簡單淺顯的例子說明函式計算和role之間的關係,以及解釋了函式計算中 service 中設定的 role 的意義,希望本文能給您撥開雲霧,如果還有不太理解的地方,歡迎大家留言反饋。


相關文章