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

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

 

前篇講過有一個面向公衆的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=Automationshell

 

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

這是一個典型的用Runbook能夠幫助簡化工做流程提升運維效率的案例。咱們以此爲例來了解什麼場景能夠用runbook,怎麼寫runbook,怎麼才能用好runbook。安全

 

需求梳理服務器

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

 

需求分析app

這個Task的自動化能夠分爲2部分:運維

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

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

 

實現過程ui

  • 在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等多項功能。

相關文章
相關標籤/搜索