新版Azure Automation Account 淺析(三) --- 用Runbook管理AAD Application Key
新版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