1. 程式人生 > >新版Azure Automation Account 淺析(三) --- 用Runbook管理AAD Application Key

新版Azure Automation Account 淺析(三) --- 用Runbook管理AAD Application Key

解決 objectid 自動生成 ror powers exception true ask 公眾

新版Azure Automation Account 淺析(三) --- 用Runbook管理AAD應用的Key

前篇講過有一個面向公眾的Runbook庫,社區和微軟一直往其中加入新的Runbook,用戶可以下載也可以在直接在Azure Portal中導入。這樣大家都可以參考全世界範圍內工程師怎樣利用Runbook來解決工作中的難題,提高生產效率。https://gallery.technet.microsoft.com/scriptcenter/site/search?f[0].Type=RootCategory&f[0].Value=WindowsAzure&f[1].Type=SubCategory&f[1].Value=WindowsAzure_automation&f[1].Text=Automation

所以呢,如果這一篇還是寫用Runbook實現Azure 虛機自動開關機的話,估計就沒人看了。正巧前段時間客戶提了一個問題 ”為安全起見,在AzureAD註冊應用時候會選擇生成有效期為一年或者兩年的key。 那能不能在key過期前2個月就自動發email提醒開發運維團隊修改部署新key呢?每個應用在AD註冊的時間不相同,要用人力來管理幾十個應用的key的有效期不太現實”

技術分享圖片

這是一個典型的用Runbook可以幫助簡化工作流程提高運維效率的案例。我們以此為例來了解什麽場景可以用runbook,怎麽寫runbook,怎麽才能用好runbook。

需求梳理

  • 做為公司Azure環境的運維團隊,我需要一份自動生成的信息列表,其中包含在Azure AD註冊的所有應用的key是不是在2個星期內,1個月內,2個月內即將過期的信息
  • 做為公司Azure環境的運維團隊,我需要每星期都能收到email關於應用key過期最新狀態的通知

需求分析

這個Task的自動化可以分為2部分:

第一部分是讀取Azure AD內應用key信息,可以用Powershell AzureAD模塊來獲取,至於發送email 可以用powershell的SMTP 代碼,在Runbook裏有內嵌powershell的支持。

另外一部分是這段代碼必須可以每天固定時間段重復自動執行,用戶不需要額外配置一臺服務器來運行這段代碼。 那Runbook的Schedules通過在portal的簡單配置就可以實現這個需求

實現過程

  • 在automation account裏導入AzureAD模塊

技術分享圖片

  • 在automation account裏創建2個credential,一個是Azure AD的管理員登錄所用credential,我們會用這個來獲取AAD中應用的相關Key的信息。一個是發送key信息所用的email賬號的credential,通常這是運維團隊的team email信箱

技術分享圖片

可以看到在創建之後相關的密碼都是不可見非明文的,安全上沒有問題

  • 創建一個名為 aadappkeymanagement的runbook, 首先代碼需要讀取我們在上一步創建的兩個credential。 切記,這裏需要用到的powershell 命令是 Get-AutomationPSCredential而不是Get-AzureRMAutomationCredential。後一個的用法我們下篇automation account的automation中涉及。代碼如下:
$aadadmincredential = "aadadmin"

$opsteamemailcredential = "opsteamemail"
try
{
    $aadadmin=Get-AutomationPSCredential -Name $aadadmincredential
    $opsteamemail=Get-AutomationPSCredential -Name $opsteamemailcredential
 }
catch {
    if (!$aadadmin -or $opsteamemail)
    {
        $ErrorMessage = "Credential is not found."
        throw $ErrorMessage
    } else{
        Write-Error -Message $_.Exception
        throw $_.Exception
    }
}

  接著,我們連接Azure AD讀取key的信息並且把在2個星期/1個月/2個月內即將過期的應用記錄下來,存入各自的數組

Connect-AzureAD -Credential $aadadmin -AzureEnvironmentName AzureChinaCloud

$2monthsresults = @()
$1monthresults = @()
$2weeksresults = @()

foreach($AADapp in Get-AzureADApplication){

   $EndDate = (Get-AzureADApplicationPasswordCredential -objectid $AADapp.objectid).Enddate
   $2monthsresults += ("<br>" + $AADapp.DisplayName)  | Where {$EndDate -lt $(get-date).AddMonths(2)}
   $1monthresults += ("<br>" + $AADapp.DisplayName)  | Where {$EndDate -lt $(get-date).AddMonths(1)}
   $2weeksresults += ("<br>" + $AADapp.DisplayName)  | Where {$EndDate -lt $(get-date).Adddays(14)}
}

  最後把上一步獲取的信息做一些格式化增強一下email的可讀性,接著用smtpclient發送email。這裏用的是O365的信箱做email發送,SMTP server是‘smtp.office365.com‘, 端口是587

$EmailBody = @()

# Format the email body
$EmailBody += "<HTML><HEAD><META http-equiv=""Content-Type"" content=""text/html; charset=iso-8859-1"" /><TITLE></TITLE></HEAD>"
$EmailBody += "<BODY bgcolor=""#FFFFFF"" style=""font-size: Small; font-family: TAHOMA; color: #000000""><P>"
$EmailBody += "IT OPS Team "
$EmailBody += "<br>"
$EmailBody += "<br>"
$EmailBody += "<font face=‘arial‘ color=‘red‘>The following applications‘ key will expire in two weeks.</font> "
$EmailBody += ""
$EmailBody += ""
$EmailBody += "$2weeksresults "
$EmailBody += "<br>"
$EmailBody += "<br>"
$EmailBody += "<font face=‘arial‘ color=‘red‘>The following applications‘ key will expire in one month.</font>"
$EmailBody += "<br>"
$EmailBody += "<br>"
$EmailBody += ""
$EmailBody += ""
$EmailBody += "$1monthsresults"
$EmailBody += "<br>"
$EmailBody += "<br>"
$EmailBody += "<font face=‘arial‘ color=‘red‘>The following applications‘ key will expire in two months.</font> "
$EmailBody += ""
$EmailBody += ""
$EmailBody += "$2monthsresults"
$EmailBody += ""
$EmailBody += ""


$SMTPClient = New-Object Net.Mail.SmtpClient(smtp.office365.com, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($opsteamemail.username , $opsteamemail.password);
$mail = New-Object Net.Mail.MailMessage($opsteamemail.username, $opsteamemail.username, "Alert: some AAD application key will expire soon", $EmailBody)
$mail.isBodyHtml = $true
$SMTPClient.Send($mail)

 

  • 把上述代碼填寫到Runbook後,我們接著看一下怎麽用Runbook

技術分享圖片

寫完代碼,點擊Save。接下來需要測試一下我們的代碼。按順序點擊Test Pane 和Start.

Automation account的測試沙盒會運行剛剛保存的Runbook。我們的腳本裏有發送email這一段,測試完檢查一下信息,你會收到腳本發送的email。

技術分享圖片

技術分享圖片

腳本裏也可以加入debug輸出信息,運行時測試窗口會顯示這些信息。測試成功後,回到Runbook窗口,點擊’Publish’. 我們的Runbook就正式發布了。發布之後任何對於代碼的改動可以繼續通過點擊save-》test pane-》start進行測試而不影響已發布Runbook正常運行。有沒有一絲testing和production感覺啊 ?而且還是Azure managed testing 環境哦。

  • 接下來我們開始部署Runbook的自動運行

在發布好的Runbook主界面點擊‘Schedule’創建一個北京時間每周一上午10:30運行runbook的Schedule。當然,也可以設置成每小時,每天或者每月的schedule

技術分享圖片

好了,接下來每周一上班時候運維團隊就能收到email的通知,了解到AAD中application key是否將過期的匯總email了。有興趣的同學還可以接著試一下用runbook自動更新即將過期的Key。

另外,還可以在Automation account的job頁面查看一下每次自動執行runbook是否成功

技術分享圖片

總結

整個automation account的runbook就是寫完一段代碼上傳Azure配置好自動執行的Schedule,再沒有必要為了運行運維腳本而單獨維護一臺甚至多臺服務器了。而這個輕量級的無服務器化工具本身還集成了安全,源代碼集成,多環境測試,生產環境rollback等多項功能。

新版Azure Automation Account 淺析(三) --- 用Runbook管理AAD Application Key