IAM 教學課程:使用 CloudFormation 範本建立 SAML 身分提供者 (IdP)
若要為 AWS 帳戶設定 SAML 聯合身分,需要建立 SAML 身分提供者 (IdP)。本教學課程說明如何使用 CloudFormation 範本建立 SAML IdP,該 IdP 能在 AWS 與外部 IdP 之間建立信任。
該範本會建立使用 IdP 中繼資料文件設定的 SAML IdP。然後,聯合身分 IAM 角色可以引用此 IdP,以允許來自外部 IdP 的已進行身分驗證之使用者存取 AWS 資源。
部署的資源包含使用 IdP 中繼資料文件和選用加密設定來設定的 SAML IdP。
必要條件
此教學課程假設您已備妥下列項目:
-
在本機電腦上安裝的 Python 3.6 或更新版本,以便執行本教學課程中用於格式化 IdP SAML 中繼資料 XML 檔案的 Python 命令。
-
外部 IdP 中儲存為 XML 檔案的 SAML 中繼資料文件。
使用 CloudFormation 建立 SAML IdP
若要建立 SAML IdP,需要建立 CloudFormation 範本,並使用它來建立包含 IdP 資源的堆疊。
建立範本
首先,建立 CloudFormation 範本。
-
在 範本 區段中,按一下 JSON 或 YAML 索引標籤上的複製圖示,以複製範本內容。
-
在新檔案中貼上範本內容。
-
在本機儲存檔案。
建立 堆疊。
接下來,使用剛儲存的範本來佈建 CloudFormation 堆疊。
-
造訪網址 https://console.aws.amazon.com/cloudformation
以開啟 CloudFormation 主控台: -
在堆疊頁面上,從建立堆疊功能表中選擇使用新資源 (標準)。
-
指定範本:
-
在必要條件下,選擇選擇現有範本。
-
在指定範本下,選擇上傳範本檔案。
-
選擇選擇檔案,導覽至範本檔案並選取它。
-
選擇下一步。
-
-
指定下列堆疊詳細資訊:
-
輸入堆疊名稱。
-
對於 IdentityProviderName,您可以將其留空,以根據堆疊名稱自動產生名稱,或輸入 SAML IdP 的自訂名稱。自訂名稱只能包含字母數字字元、句號、底線和連字號。
-
對於 IdentityProviderSAMLMetadataDocument,您需要將 SAML 中繼資料 XML 檔案格式化為單行,然後才能將其貼入此欄位。這是必要的,因為 CloudFormation 主控台要求透過主控台參數傳遞的 XML 內容必須格式化為單行。
使用下列 Python 命令來重新格式化 XML 檔案:
python3 -c "import sys, re; content=open(sys.argv[1]).read(); print(re.sub(r'>\s+<', '><', content.replace('\n', '').replace('\r', '').strip()))"saml-metadata.xml注意
IdP 的 SAML 中繼資料文件必須格式化為單行,才能用於主控台參數輸入。Python 命令會移除換行符號和多餘的空格,以建立所需的格式,同時保留所有原始內容和結構。
從 Python 命令複製輸出,並將其貼至 IdentityProviderSAMLMetadataDocument 欄位。
格式化的 SAML 中繼資料文件範例 (縮寫):
<?xml version="1.0" encoding="UTF-8"?><md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" entityID="https://portal.sso.example.com/saml/assertion/CompanyIdP"><md:IDPSSODescriptor WantAuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"><md:KeyDescriptor use="signing"><ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:X509Data><ds:X509Certificate>MIIDXTCCAkWgAwIBAgIJAJC1HiIAZAiIMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV...</ds:X509Certificate></ds:X509Data></ds:KeyInfo></md:KeyDescriptor><md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://portal.sso.example.com/saml/logout/CompanyIdP"/><md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat><md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://portal.sso.example.com/saml/assertion/CompanyIdP"/></md:IDPSSODescriptor></md:EntityDescriptor> -
對於其他參數,請接受預設值或根據需求輸入自己的值:
-
IdentityProviderAddPrivateKey:用於解密 SAML 聲明的選用私有金鑰
-
IdentityProviderAssertionEncryptionMode – 選用,為 SAML 聲明設定加密模式 (「已允許」、「必要」或留空)
-
-
選擇下一步。
-
-
設定堆疊選項:
-
在堆疊失敗選項下,選擇刪除所有新建立的資源。
注意
選擇此選項可避免堆疊建立失敗時,因資源刪除政策指定為保留而可能產生的資源費用。
-
接受所有其他預設值。
-
在功能下,勾選方塊以確認 CloudFormation 可能會在帳戶中建立 IAM 資源。
-
選擇下一步。
-
-
檢閱堆疊詳細資訊,然後選擇提交。
CloudFormation 建立堆疊。堆疊建立完成後,堆疊資源即可使用。您可以使用堆疊詳細資訊頁面上的資源索引標籤,來檢視帳戶中佈建的資源。
堆疊將輸出下列值,您可以在輸出索引標籤上檢視:
-
ProviderARN:已建立 SAML IdP 的 ARN (例如
arn:aws:iam::123456789012:saml-provider/CompanyIdP)。建立信任此提供者的角色時,您將需要此 ARN。 -
ProviderName:已建立 SAML IdP 的名稱 (例如,如果指定了自訂名稱,則為
CompanyIdP;或者如果使用了預設命名,則為my-saml-stack-saml-provider)。
這些輸出也會匯出,並允許其他 CloudFormation 堆疊使用 Fn::ImportValue 函數匯入。
驗證 SAML IdP
SAML IdP 建立後,您可以驗證其組態,並記下其 ARN,以供聯合身分角色使用。
-
前往 https://console.aws.amazon.com/iam/
開啟 IAM 主控台。 -
在導覽窗格中,請選擇 Identity providers (身分提供者)。
您應該會在清單中看到新建立的 SAML IdP。
-
選擇 IdP 名稱以檢視其詳細資訊。
在 IdP 詳細資訊頁面上,可以查看 SAML 中繼資料文件及其他組態詳細資訊。
-
記下詳細資訊頁面上顯示的提供者 ARN。
建立信任此 IdP 的聯合身分 IAM 角色時,您將需要此 ARN。
-
檢閱中繼資料文件,確保其與您從外部 IdP 提供的內容相符。
SAML IdP 現已準備就緒,可供聯合身分 IAM 角色使用。您可以建立信任此 IdP 的角色,以允許來自外部 IdP 的已進行身分驗證之使用者擔任這些角色和存取 AWS 資源。
清理:刪除資源
最後一個步驟是,刪除堆疊及其包含的資源。
-
開啟 CloudFormation 主控台。
-
在堆疊頁面上,選擇從範本建立的堆疊,然後選擇刪除,接著確認刪除。
CloudFormation 會啟動刪除堆疊及其包含的所有資源。
CloudFormation 範本詳細資訊
資源
本教學課程的 CloudFormation 範本會在帳戶中建立下列資源:
AWS::IAM::SAMLProvider:在 AWS 與外部 IdP 之間建立信任的 SAML IdP。
組態
範本包含下列可設定的參數:
-
IdentityProviderName – SAML IdP 的名稱 (留空以自動產生名稱)
範例:
CompanyIdP或EnterpriseSSO -
IdentityProviderSAMLMetadataDocument – 來自外部 IdP 的 SAML 中繼資料文件 (格式化為單行)
-
IdentityProviderAddPrivateKey:用於解密 SAML 聲明的選用私有金鑰
-
IdentityProviderAssertionEncryptionMode – 選用,為 SAML 聲明設定加密模式
CloudFormation 範本
將下列 JSON 或 YAML 程式碼儲存為個別檔案,以用作本教學課程的 CloudFormation 範本。