新版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()}
$1monthresults += ("<br>" + $AADapp.DisplayName) | Where {$EndDate -lt $(get-date).AddMonths()}
$2weeksresults += ("<br>" + $AADapp.DisplayName) | Where {$EndDate -lt $(get-date).Adddays()}
}

  最后把上一步获取的信息做一些格式化增强一下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', )
$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的更多相关文章

  1. 新版Azure Automation Account 浅析(一) --- 创建和Run As Account

    去年年底Azure中国的Automation Account悄悄做了升级.新版本不管从功能还是end user experience方面都让人耳目一新.如果说升级前只是一个运行脚本的小工具,升级后的A ...

  2. 新版Azure Automation Account 浅析(二) --- 更新Powershell模块和创建Runbook

    前篇我们讲了怎样创建一个自动化账户以及创建时候"Run As Account"选项背后的奥秘.这一篇针对在Azure自动化账户中使用Powershell Runbook的用户讲一下 ...

  3. Azure Automation (2) 定期删除存储账号中的文件

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. 本文是对笔者之前的文档Azure Backup (1) 将SQL ...

  4. Azure Automation (1) 入门

    <Windows Azure Platform 系列文章目录> 通过Azure Automation(自动化),开发人员可以自动完成通常要在云环境中执行的手动.长时间进行.易出错且重复性高 ...

  5. Step by Step 用Azure Automation 来开虚机(ARM)

    使用Azure Automation来自动化处理各种重复的耗时的云管理任务从而帮助云运维人员提升效率,帮助降低运营成本. 具体相关的介绍以及怎样利用Azure Automation来完成定期开关虚拟机 ...

  6. Azure Automation (3) 定期将某个Azure订阅下的所有虚拟机开关机

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. 在笔者之前的文章中,我们介绍了使用Azure Automation ...

  7. Azure Automation (4) 按照Azure虚拟机的机器名,设置开关机

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China服务. 在有的时候,我们不需要将所有的虚拟机进行开关机. 本文介绍的脚 ...

  8. 利用Azure Automation实现云端自动化运维(1)

    Azure Automation是Azure上的一个自动化工作流引擎,基于Powershell,来帮助用户简化,集成和自动化Azure上的运维工作,例如: 实现定时开关虚拟机,节约成本 实现定时创建删 ...

  9. Go Global 之怎样在全球Azure上使用Azure Free Account

    随着中国用户出海的越来越多,同学们自学Azure Global 功能的积极性也越来越高.怎样开启Azure Global 账号,有哪些Global Azure的功能可以免费使用,能不能用国内的信用卡和 ...

随机推荐

  1. ASP.NET没有魔法——ASP.NET MVC路由

    之前的文章中介绍了My Blog文章维护功能的开发,开发过程中使用Area的方法建立了用于维护文章的Controller.View和Model.但是无论代码怎么变对于浏览器来说都是通过一个url地址去 ...

  2. 算法-java代码实现堆排序

    堆排序 第7节 堆排序练习题 对于一个int数组,请编写一个堆排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2 ...

  3. SendCloud邮件中为什么会显示代发

    显示代发是发信的sender和发信人地址(from)不一致导致的. sender是SendCloud系统根据用户自设的发信域名生成的,目前是"随机地址@自有域名"做sender,所 ...

  4. ArrayList 源码详细分析

    1.概述 ArrayList 是一种变长的集合类,基于定长数组实现.ArrayList 允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时,其会通过扩容机制重新生成一个 ...

  5. 系列3|走进Node.js之多进程模型

    文:正龙(沪江网校Web前端工程师) 本文原创,转载请注明作者及出处 之前的文章"走进Node.js之HTTP实现分析"中,大家已经了解 Node.js 是如何处理 HTTP 请求 ...

  6. [知了堂学习笔记]_Jquery_Validate 表单校验的使用

    一.效果图: 二.JqueryValidate的好处 在做注册.或者类似以上的表单提交的时候,大家是不是都很烦那种,把数据拿到后台去判断, 可能经过了正则表达式之类的复杂判断,然后发现数据错误.接着通 ...

  7. python基础8之自定义模块、if __name__==__main__:解释

    一.自定义模块与使用 python模块说明:类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  8. Java进阶篇(五)——Java的I/O技术

    程序中,为了永久的保存创建的数据,需要将其保存在磁盘文件中,以便在其它程序中使用它们.Java的I/O技术可以将数据保存到文本文件.二进制文件甚至是ZIP压缩文件中,以达到永久性保存数据的要求. 本篇 ...

  9. python实现端口扫描器/DoS/DDoS

    整理github,梳理下Python小工具.以下是python实现的DoS/DDoS/端口扫描器(github). 一.DoS SYN Flood是当前最流行的DoS(拒绝服务攻击)与DdoS(分布式 ...

  10. python3 第十七章 - sequence(序列)

    之前我们在讲for循环语句时就提到过序列,那么什么是序列(sequence)? 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 —— 它的索引(位置),第一个索引是0,第二个索引 ...