2018 年 3 月

第 33 卷,第 3 期

本文章是由機器翻譯。

Azure - 利用 Azure Key Vault 來保護您的商業機密資訊

Srikantan Sankaran

Azure 金鑰保存庫是以雲端為基礎的服務,可讓組織安全地儲存敏感的商業資訊。它可讓您執行密碼編譯作業資料,並提供一個架構實作原則,可管制存取權的應用程式,以及應用程式使用的金鑰、 密碼或憑證儲存在它的 API 模型。Azure 金鑰保存庫提供支援各種不同的裝置平台與程式設計語言,可讓您選擇您慣用的語言,以及這些應用程式部署到 Azure 應用程式服務,做為受管理的 Web 應用程式 Sdk。若要讓組織內部和外部,Azure Active Directory (Azure AD) 使用者安全地這些商務應用程式與 Azure Active Directory B2C (Azure AD B2C) 提供周全的實作,以啟用驗證和授權以最少或沒有自訂程式碼的應用程式。在本文中,我將提供示範 Azure 金鑰保存庫如何使您組織的增強式的安全性的解決方案。

使用案例

中央的單位被負責實作解決方案,以發行、 追蹤和管理車輛的保險原則。哪個代理程式會從保險公司產生唯一的文件在收到訂單與付款的數列數字。這些公司,直接或透過其代理程式,將保險原則文件的數列數字為它們以 motorists 銷售。跨所有保險的公司文件的序號是唯一的。

方案的目標是要追蹤的文件的數列數字的生命週期。建立時,文件序列值會包含其數字和它已售出的保險的公司名稱。進一步到商務程序中,將會加入其他資訊,例如車輛註冊、 原則文件編號、 客戶及有效期間的保險原則的身分識別。這個記錄的所有版本必須加以都追蹤,包括所做的變更、 日期和時間的變更,並進行變更的應用程式的識別。

客戶應該能夠以電子方式存取原則,並下載的資訊安全地驗證並方便參考。

方案的架構

此解決方案會使用 Azure 金鑰保存庫來儲存文件序列的數字,以及相關聯的保險原則,內容做為密碼。為了增加安全性,會儲存為機密的資料會事先使用 Azure 金鑰保存庫中產生非對稱金鑰來加密。只有裸機最少必要資料保護和驗證每個原則取得中的密碼擷取,而其他支援資訊儲存在 Azure SQL Database。資料庫也會實作條件約束的資料,以確保,例如,已註冊的一種載具單一使用中原則數目,相同的原則數量,尚未用於多個記錄,以及其他等等。圖 1代表方案中使用的架構。

解決方案架構
圖 1 解決方案架構

我已在此解決方案中,使用的中央機構保險的公司和客戶購買保險政策和想要確定原則有效性法規授權單位的其他實作兩個入口網站應用程式。

系統管理員入口網站與客戶入口網站是 ASP.NET 2.0 核心 MVC 應用程式使用 Entity Framework 它第一次已儲存在 Azure 金鑰保存庫之後,Azure SQL Database 中儲存原則資料。.NET SDK for Azure Key Vault 用來執行資料,例如建立密碼和其版本以及加密和解密的密碼使用金鑰的密碼編譯作業。雖然客戶的外部使用者,使用 Azure AD B2C 自我註冊並登入客戶入口網站與 Azure AD 驗證使用者的系統管理員入口網站。

Azure AD 中的個別服務主體供管理和客戶的入口網站,並個別原則設定其存取權的鎖定為 Azure 金鑰保存庫中的作業。建立金鑰和密碼,以及效能的作業,例如加密和解密資料,可讓系統管理員入口網站原則。客戶入口網站中,相較之下,已指派允許只在上秘密的 「 取得 」 作業和 「 解密 」 上的作業擷取的密碼原則。這可確保個別應用程式不需要與 Azure 金鑰保存庫所需的存取權。

做為密碼,以在 Azure 金鑰保存庫中儲存的原則資料會先加密,提供額外的安全性。每次更新密碼,取得建立新的版本,並會保留舊版的資料。在金鑰保存庫,保存至符合法定法規遵循需求中執行的所有作業也會都保留稽核記錄。

儲存在 Azure 金鑰保存庫擷取密碼的屬性組合的原則開始和結束日期,用來確定此原則的有效性。標記和機密資料內容型別參數用來儲存保險原則相關的其他資訊。

下列程式碼片段示範如何加入做為密碼儲存的原則資料的屬性、 標記和內容類型:

SecretAttributes attribs = new SecretAttributes
  {
    Enabled = true,
    Expires = DateTime.UtcNow.AddYears(1),
    NotBefore = DateTime.UtcNow.AddDays(1)
  };
IDictionary<string, string> alltags = new Dictionary<string, string>();
alltags.Add("InsuranceCompany", policydata.Inscompany);
string contentType = "DigitalInsurance";
SecretBundle bundle= await _keyVaultClient.SetSecretAsync(keyVaultUri, 
  policydata.Uidname,encrypteddata,alltags,contentType,attribs);

實作使用案例

讓我們探討實作解決方案所使用案例。基本步驟如下:

在購買保險公司的唯一代碼:在收到訂單保險的公司,中央哪個代理程式會使用系統管理員入口網站產生的文件序號清查,並將它們儲存為 Azure 金鑰保存庫中的機密資料。系統管理員入口網站在 Azure 金鑰保存庫中建立第一個版本的密碼,然後 Azure SQL Database 中建立的記錄。

原則產生:客戶購買一種載具,原則,從上一個步驟未指定的密碼時,所選程序和其他資訊,例如車輛註冊號碼、 客戶及產生的原則文件編號的有效期間的身分識別原則,會加入。在過程中,建立新版本包含這項額外資訊的原始密碼,也會更新 Azure SQL Database 中對應的記錄。

啟用的原則的客戶:一旦擷取到密碼原則的所有詳細資料,會傳送通知給客戶 (超出本文的範圍) 的指示啟用此原則。使用者可以自行註冊使用其社交認證或認證儲存在 Azure AD B2C 客戶入口網站上。當客戶登入入口網站時,原則詳細資料會顯示以及一個選項來啟動它。啟用,使用者會從入口網站下載的 QR 代碼,affixes insured 一種載具,其影像。

原則驗證:客戶或法規的授權單位可以驗證隨時使用 [原生的 Xamarin 應用程式,讀取 QR 代碼上一種載具,, 在其中,會被處理,與上一種載具,顯示原則的詳細資料的原則。這項驗證不需要網際網路連線,而且可以離線完成。當連接到網際網路時,就可以執行額外的驗證。原生應用程式會叫用 REST API 公開客戶入口網站 MVC 應用程式中,將資料傳遞從 QR 代碼。首先,API 會比對這項資料與 Azure SQL Database 中的資料和另外儲存在 Azure 金鑰保存庫中的機密資料。

解決方案的技術層面,

現在讓我們深入方案中使用的來源的程式碼和自動化指令碼。請記住,程式碼和共用此文件中的指令碼不是要作為完整的解決方案,也不一定它們一定要處理所有的驗證、 例外狀況或最佳作法可實際執行的應用程式需要。是為了而是要說明的技術領域的特定部分,或提供向開發單純的解決方案指引。

建立和設定 Azure 金鑰保存庫的 PowerShell 指令碼檔案 PrepareContosoAKV.ps1 和 PrepareContosousersAKV.ps1,隨附隨附的下載,可用來佈建及設定在本文中使用金鑰保存庫。以下是他們的完成:

  • 建立自我簽署憑證 (只能用在開發案例) 的系統管理員,並 custmer 入口網站 ASP.NET MVC 應用程式在 Azure AD 中建立服務主體時所使用的。
  • 指派給系統管理員入口網站的 Azure AD 中的服務主體的建立。設定此服務主體的存取原則允許建立和更新的金鑰和密碼,例如加密和解密作業的效能:
# Specify privileges to the vault for the Admin Portal application
Set-AzureRmKeyVaultAccessPolicy -VaultName $vaultName `
  -ObjectId $servicePrincipal.Id `
  -PermissionsToKeys all `
  -PermissionsToSecrets all
  • 指派給客戶的入口網站的 Azure AD 中的服務主體的建立。設定此服務主體所允許的存取原則取得金鑰和密碼,以及解密資料的作業:
# Specify privileges to the vault for the Customer Portal application
Set-AzureRmKeyVaultAccessPolicy -VaultName $vaultName `
  -ObjectId $servicePrincipal.Id `
  -PermissionsToKeys get,list,decrypt `
  -PermissionsToSecrets get,list
  • 請注意,建立使用 PowerShell,這些服務主體,也就使用 Azure App Service 中受管理的服務身分識別功能的替代方案。這實際上被建議。上的指引是指bit.ly/2BgB6mu如需詳細資訊。
  • 建立用於加密和解密的密碼金鑰。
  • 建立會儲存到 Azure SQL Database 的連接字串的密碼。(這可以直接在 Azure 入口網站中,可能是其他步驟。)

為了簡單起見,這個解決方案會使用單一金鑰保存庫,和的一組的所有保險的公司,代理程式,來加密和解密資料的索引鍵。在真實世界中,加入的隔離和安全性,不同的 Azure 金鑰保存庫執行個體應該建立每個保險的公司,並分組,例如區域或任何其他準則。這可確保其他人無法讀取,一個保險的公司所維護的資料,因為它們不會共用相同的加密金鑰。

請記住,Azure 金鑰保存庫中儲存密碼必須是大小不超過 25 KB。因此,若要避免過度膨脹,只有特定屬性的資料儲存在它,例如識別碼 (文件序列號碼),此原則秘密名稱、 使用者識別碼、 原則號碼和保險公司識別碼。在 Visual Studio 2017 方案 ContosoInsAuthorityAdminPortal.sln 實體 Insdata.cs 檔案包含這些屬性。其他屬性,例如有效開始和結束日期、 內容類型及等等,會儲存為金鑰保存庫中密碼的屬性。

組建系統管理員和客戶入口網站應用程式的下載管理員入口網站的原始碼 Visual Studio 2017 方案 ContosoInsAuthorityAdminPortal.sln 和 ContosoinsExtPortal.sln 客戶入口網站的程式碼,請參閱。

使用 ASP.NET Core 2.0 支援將 framework 服務的相依性插入所建立的系統管理員 」 和 「 客戶入口網站 — 例如 Entity Framework 整合和存取 Azure 金鑰保存庫 Api 的自訂服務模組-中啟動應用程式類別。

Visual Studio 2017 專案範本會提供周全與 Azure AD 整合,以便進行使用者登入和註冊的 Azure AD B2C 體驗加入入口網站應用程式的安全存取。

Azure SQL Database 的連接字串儲存在 Azure 金鑰保存庫和入口網站的 Web 應用程式,在開始擷取設定。

中的程式碼片段圖 2示範如何在 ASP.NET 2.0 核心中的相依性插入已加入 Entity Framework Azure AD 驗證以及用於存取提供者,Azure 金鑰保存庫服務 API 存取及讀取應用程式從 appsettings.json 檔案的組態資料。

圖 2 ASP.NET Core 2.0 MVC 應用程式中的相依性架構

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
  {
    //Adding the Azure AD integration for User authentication
    services.AddAuthentication(sharedOptions =>
    {
      sharedOptions.DefaultScheme =
        CookieAuthenticationDefaults.AuthenticationScheme;
      sharedOptions.DefaultChallengeScheme =
        OpenIdConnectDefaults.AuthenticationScheme;
    })
    .AddAzureAd(options => Configuration.Bind("AzureAd", options))
    .AddCookie();
    services.AddMvc();
// Add the Key Vault Service Client Connection to the Context Object
    AKVServiceClient servClient =
      new AKVServiceClient(Configuration["AzureKeyVault:ClientIdWeb"],
      Configuration["AzureKeyVault:AuthCertThumbprint"],
      Configuration["AzureKeyVault:VaultName"],­
      Configuration­["AzureKeyVault:KeyName"]);
    services.AddSingleton<AKVServiceClient>(servClient);
// Get the Connection string to Azure SQL Database
// from the secret in ­Azure Key Vault
    string connection = servClient.GetDbConnectionString();
// Add the Azure SQL Database Connection to the Context Object
    services.AddDbContext<ContosoinsauthdbContext>(options =>
      options.UseSqlServer(connection));
    services.AddOptions();
  }

Azure 金鑰保存庫的組態提供者,針對 ASP.NET Core 2.0 (bit.ly/2DfOXeq),以 NuGet 套件,可提供周全的實作來擷取應用程式開始在 Azure 金鑰保存庫中的所有密碼。不過,這項功能不是在方案中以避免載入所有不必要地在應用程式啟動,也就是保單機密資料的商務資料,以及其他機密的應用程式需要,例如可存取 Azure 的連接字串SQL 資料庫。一個金鑰保存庫執行個體用來儲存應用程式時,所需的所有連接字串和商務資料使用不同的金鑰保存庫執行個體時,無法使用這項功能。

應用程式服務建立的系統管理員和客戶的入口網站應用程式部署為 Azure App Service Web 應用程式在 Visual Studio 2017 中使用內建的工具。這兩個 Web 應用程式被裝載於單一的應用程式服務方案。

在開發期間,ASP.NET Core MVC 應用程式可以使用 Visual Studio 2017 本機部署。先前討論過的 PowerShell 指令碼執行時,會產生兩個數位憑證,其中每個入口網站應用程式。將.pfx 檔案加入至目前的使用者憑證存放區。這些會內嵌在 ASP.NET MVC 應用程式進行存取 Azure 金鑰保存庫 Api 的要求。這些憑證的指紋會加入至個別的 ASP.NET MVC 應用程式的 Visual Studio 2017 方案中的 appsettings.json 檔案。

在部署至 Azure App Service 應用程式時,您必須:

  • 從 Azure 入口網站,both.pfx 檔案上傳至 Azure 應用程式服務執行個體。
  • 這兩個系統管理員和客戶入口網站 Web 應用程式在 Azure 入口網站應用程式設定刀鋒視窗中建立項目 」 WEBSITE_LOAD_CERTIFICATES 」 並新增個別的.pfx 檔案的憑證指紋。

文件,網址是指bit.ly/2mVEKOq如需詳細資訊,在執行的步驟。

建立資料庫指令碼檔案,可用來建立資料庫方案是否可供下載,以及解決方案的這些其他成品。在資料庫上啟用透明資料加密 (TDE) 和稽核。

Azure AD 與 Azure AD B2C 租用戶建立中 Azure 訂用帳戶預設 Azure AD 租用戶用於身分識別提供者的中央存取管理員入口網站的公司內部的使用者。不同的 Azure AD 租用戶建立位置代表保險的公司使用者會註冊此訂用帳戶中。預設的 Azure AD 租用戶存取入口網站應用程式,這些使用者會新增為 guest 使用者。如果保險的公司都有自己的 Azure AD 租用戶,Azure AD B2B 可以用於同盟該租用戶與此訂用帳戶中的預設 Azure AD 租用戶。

從 Azure 入口網站中,Azure AD B2C 租用戶中建立 Azure 訂用帳戶並定義原則以允許存取客戶入口網站自行註冊的客戶。在 Azure AD B2C 組態的身分識別提供者區段,此租用戶中的本機帳戶設定為 「 使用者名稱 」,而不是電子郵件地址,並在使用者註冊的電子郵件驗證已停用,為了簡單起見。如需建立及設定原則和註冊登入體驗的指引的 Azure AD B2C 文件是指 (bit.ly/2n7Vro9)。

執行應用程式

若要讓您執行此方案,我提供了範例認證來登入 GitHub 儲存機制中的這篇文章與相關聯的系統管理員和客戶入口網站。

為了簡化解決方案的這篇文章,我未實作的保險的公司購買唯一程式碼中的步驟。相反地,系統管理員入口網站的使用者會直接執行下一個步驟中,在文件的數列數字,客戶資訊、 原則和一種載具,詳細資料中會擷取所有一次完成。

圖 3顯示系統管理員入口網站的登陸頁面-Contoso 保險。您可以登入管理入口網站使用保險的公司使用者的認證,並選取 [建立新輸入新的文件的詳細資料。文件的數列數字是自動產生的應用程式,並可以在 [新增] 或 [編輯項目表單中檢視。

在 Contoso 保險管理入口登陸頁面上的保險原則清單
圖 3 Contoso 保險管理入口登陸頁面上的保險原則清單

圖 4顯示不同的版本儲存為機密的保險原則資料。您也可以檢視其他資訊,例如內容類型、 標記和屬性。請注意,再儲存加密預備主密碼。

不同版本的 Azure 入口網站上所見,做為密碼,儲存的保險原則資料
圖 4 不同版本的 Azure 入口網站上所見,做為密碼,儲存的保險原則資料

如果您登入客戶入口網站時,您可以檢視所有已購買的保險原則並準備好進行啟用。[編輯原則] 頁面會提供啟動原則,然後更新 Azure SQL Database 中原則的狀態為 [作用中的選項。當原則啟動時,您可以使用 [下載原則選項,會產生的 QR 代碼原則資料。

圖 5下載 QR 代碼客戶入口網站上顯示的使用者體驗。也顯示是讀取從應用程式使用行動裝置上的 QR 代碼的 JSON 資料。原生應用程式掃描 QR 代碼,並顯示格式化在畫面上,進行簡單的離線驗證的原則詳細資料。

QR 代碼產生
圖 5 QR 代碼產生

額外的安全性可能會讓客戶入口網站正負號的 JSON 資料在 Azure 金鑰保存庫中使用的私用金鑰和產生的 QR 程式碼簽署的資料上實作。原生行動應用程式無法隨附之前驗證的裝置上顯示 JSON 資料,驗證已簽署的資料所需的公開金鑰。

客戶入口網站使用 javascript,可在 GitHub 上 QR 程式碼產生器bit.ly/2sa3TWy,以產生並顯示在入口網站上的 QR 代碼。

原則驗證

離線或上線,可以驗證原則。可以使用任何 QR 代碼 reader 應用程式,在行動裝置上,或使用原生的 Xamarin 應用程式執行離線驗證。掃描 QR 代碼之後,結果會顯示在方便使用的方式進行驗證。

相反地,圖 6在 MVC 應用程式,它會傳回驗證結果的布林值為應用程式開發介面會顯示驗證使用郵差工具 (getpostman.com) 傳送的要求。在此情況下,原則開始日期晚於目前的日期,驗證的結果為"false"。 Xamarin 應用程式用來登入,使用者會掃描並檢視 QR 代碼資料並提出要求,此 api,以執行線上的驗證。

REST API 呼叫,以驗證原則
圖 6 REST API 呼叫,以驗證原則

Azure 金鑰保存庫上的所有作業都可供都稽核和記錄檔已封存的法定規定的相容性。您可以啟用稽核,從 [設定] 刀鋒視窗在 Azure 入口網站中,Azure 金鑰保存庫服務執行個體。若要檢視記錄檔,瀏覽至記錄檔設定的 Azure 儲存體資源。您可以使用 Azure 入口網站中的角色型存取控制 (RBAC),以確保只有指定的使用者可以存取這項資訊。

Azure SQL Database 中的資料上的所有作業也可以都啟用稽核,然後從 [設定] 刀鋒視窗,在 Azure 入口網站的資料庫執行個體。透明資料加密的 Azure SQL Database 中的靜止資料依預設會啟用。

部署方案

如果您想要試用您自己這個方案,您可以從 GitHub 儲存機制下載的原始程式檔和指令碼bit.ly/2DRvwdh。您必須實作此解決方案的下列軟體:

  • Visual Studio 2017 預覽、 社群或企業版與更新 3
  • Azure 訂用帳戶
  • Windows PowerShell 指令碼編輯器
  • 郵差
  • JavaScript QR 程式碼產生器

若要部署您自己的訂用帳戶中的方案,您必須更新 appsettings.json 檔案中的組態項目之後執行 PowerShell 指令碼和 Azure 訂用帳戶中佈建其他資源。本文中所述的來源的程式碼和方案檔以及 GitHub 儲存機制中已提供這項作業的步驟。非常感謝 Bindu Chinnasamy 的 Microsoft CSE 小組建置方案隨附的文件的相關說明。

總結

Azure 金鑰保存庫會提供很有幫助、 有效率的平台,適用於企業安全地管理其機密的資訊,使用業界標準演算法和技術來執行密碼編譯作業。它可讓開發人員平台和語言,他們已經習慣使用 Sdk。這樣一來,搭配一組豐富的其他服務在 Azure 中,例如 Azure 應用程式服務,Azure AD 和 Azure B2C 以及精心設計工具提供的支援這些服務,可讓開發人員專注建置核心商務功能,因此可以大幅減少開發和部署的端對端解決方案所需的時間。

在這份文件延長,我將會示範如何在相同應用程式,不需要任何重大變更,可部署使用 Docker 容器和 Kubernetes Azure 容器服務。


Srikantan Sankaran是主體的技術推廣人員印度基礎班加羅爾超出一個商業夥伴團隊。他在印度許多 Isv 搭配運作,且可協助他們設計及部署他們在 Microsoft Azure 上的解決方案。連線到他處sansri@microsoft.com

非常感謝下列 Microsoft 技術專家檢閱這篇文章:Frank Hokhold,Bindu Chinnasamy
非常感謝 Frank Hokhold 檢閱這份文件。Frank 是從 Azure 金鑰保存庫團隊的開發人員經驗程式管理員。
感謝您還可以 Bindu Chinnasamy 來自 Microsoft 的 CSE 小組,以建置方案本文所附的說明。


MSDN Magazine 論壇中的這篇文章的討論