运维编排场景系列----检测MFA功能状态

本文涉及的产品
系统运维管理,不限时长
简介: 应用场景 Multi-Factor Authentication (MFA)是一种简单有效的最佳安全实践方法,它能够在用户名和密码之外再额外增加一层安全保护。当一个主账号下拥有多个子账号时,为了检测主账号下的每个子账户是否开启MFA功能,需要每天或自定义时间去做定时检测,并将未开启MFA功能的用户发送给指定的钉钉用户。

应用场景

Multi-Factor Authentication (MFA)是一种简单有效的最佳安全实践方法,它能够在用户名和密码之外再额外增加一层安全保护。当一个主账号下拥有多个子账号时,为了检测主账号下的每个子账户是否开启MFA功能,需要每天或自定义时间去做定时检测,并将未开启MFA功能的用户发送给指定的钉钉用户。

解决方案

事件分解:

  1. 设置定时器。
  2. 获取主账号下所有子账号。
  3. 检测每个用户是否开启MFA功能并及返回未开启MFA功能的子账号。
  4. 将未开启MFA功能的子账号集中发送到指定的钉钉用户。

1.打开控制台,找到运维编排

1565003706926_e0d50d39_3648_406f_9d6f_97dd05fa5e4c
2.创建模版
1565003809905_9da5bdd4_21d8_4545_9506_0e84ff5d1e5a

根据以上的事件分解,可以为此方案创建为以下两个模版
模版一:
用于单独检测每个子账号的MFA的功能是否处于开启状态,自定义命名模版或者将此模版命名为:CheckMFAUserInfo

FormatVersion: OOS-2019-06-01
Outputs:
  User:
    Type: String
    Value: '{{ userName }}'
Parameters:
  userName:
    Description: The User Name.
    Type: String
  OOSAssumeRole:
    Description: The RAM role to be assumed by OOS.
    Type: String
    Default: OOSServiceRole
RamRole: '{{ OOSAssumeRole }}'
Tasks:
  - Action: 'ACS::CheckFor'
    Name: GetNoMFAUser
    Description: 'checking has not MFA Device '
    Properties:
      Service: RAM
      API: GetUserMFAInfo
      Parameters:
        UserName: '{{ userName }}'
      DesiredValues:
        - EntityNotExist.User.MFADevice
      PropertySelector: .Code

模版二:
获取主账号下的所有子账号,并将每个子账号传给【模版一】来做MFA功能(开/关)状态的检测,将所有未开启MFA功能的用户做聚合处理,统一发送给指定的钉钉用户。自定义命名模版或将此模版命名为:SendMFAUserInfo注意:当自定义命名【模版一】的名称时,需要将【模版一】的模版名称输入到【模版二】Tasks下的CheckUserMFATemplateName里面。

FormatVersion: OOS-2019-06-01
Outputs:
Parameters:
  Token:
    Description: DingTalk webhook to token.
    Type: String
  Expression:
    Description: Daily task execution time,for example:0 0 2 ? * *
    Type: String
  EndDate:
    Description: The task execution end date,for example:2019-08-02T08:06:49Z or 2019-08-02
    Type: String
  OOSAssumeRole:
    Description: The RAM role to be assumed by OOS.
    Type: String
    Default: OOSServiceRole
RamRole: '{{ OOSAssumeRole }}'
Tasks:
  - Name: DailyMFACheck
    Action: 'ACS::TimerTrigger'
    Description: Timer for executing task.
    Properties:
      Type: cron
      Expression: '{{ Expression }}'
      EndDate: '{{ EndDate }}'
  - Action: 'ACS::ExecuteAPI'
    Description: All users in the account
    Name: listUser
    Outputs:
      userName:
        Type: List
        ValueSelector: '.Users.User[].UserName'
    Properties:
      API: ListUsers
      Parameters: Null
      Service: RAM
  - Name: CheckUserMFA
    Action: 'ACS::Template'
    Description: Check if the user has an MFA Device.
    Properties:
      TemplateName: 'CheckMFAUserInfo'
      Parameters:
        userName: '{{ACS::TaskLoopItem}}'
    Outputs:
      userName:
        Type: String
        ValueSelector: User
    Loop:
      Items: '{{ listUser.userName }}'
      MaxErrors: 100
      Concurrency: 10
      Outputs:
        User:
          AggregateField: userName
          AggregateType: 'Fn::ListJoin'
  - Name: DingTalkNotify
    Action: 'ACS::Notify'
    Description: Send notification to DingTalk via webhook. Please refer https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq
      for details.
    Properties:
      NotifyType: WebHook
      WebHook:
        URI: 'https://oapi.dingtalk.com/robot/send?access_token={{ Token }}'
        Headers:
          Content-Type: application/json
        Content:
          msgtype: text
          text:
            content: 'These user has not MFA Device, UserName:{{ CheckUserMFA.User }}'

3.模版创建成功之后就可以创建执行了,此时仅需要执行模版二。

1564724631335_7e2c9cff_1410_4d6b_9d11_036b2decace3

4.模版传参,及点击下一步:确认创建。
1564743233768_749eca7b_72f1_4668_994a_ea65f0d72c17

参数介绍:
token:检测MFA功能(开/关)状态的信息报告所需接收用户的token。
expression:设置的定期执行时间,此处的设置参数方式如下所示(必须为UTC格式时间,参考云助手的设置定时执行命令,UTC时间在平常的基础上 -8h):
0 15 2 ?   每天上午10:15执行任务
0 0 2,6,8 ?  每天上午10:00点、下午14:00以及下午16:00执行任务
0 0/5 6 ? 每天下午14:00到下午14:55时间段内每隔5分钟执行任务
0 0/30 1-9 ?  每天上午09:00到下午17:00时间段内每隔半小时执行任务
0 10,44 4 ? 3 WED 每年3月的每个星期三下午14:10到14:44时间段内执行任务
0 15 2 ? * 6L 2002-2005  2002年至2005年每月最后一个星期五上午10:15执行任务

endDate:设置执行结束时间(必须为UTC格式的时间:2019-08-02T08:06:49Z  or 2019-08-02)

5.点击创建执行1564725633125_de555762_5c1b_43ea_aa97_8b12b561acd4

执行开始后,根据设置的expression来周期性的定时执行任务,以及endDate来结束任务。由于定时的周期执行,执行中的状态以及在endDate结束前,子任务如下所示:
1564726623493_6fefadf3_5d98_409a_8f4a_3db329986d77
6.任务执行成功后发送给钉钉用户的消息显示如下所示:
1564996825501_ed7127b1_a153_4088_9ca0_f549fdfa9ef9

7.在endDate结束之前,依然会有下一个定时执行。此时执行状态回到等待中,直到时间到达下一次定时此任务会根据定时继续执行。当到实际时间到达endDate时此执行结束。

总结

由以上举例可见,通过嵌套模版的方式去实现了周期性的定时的去执行检测用户的MFA功能的(开/关)状态,并发送钉钉通知,方便按自己需要来设置周期性的执行时间、结束时间及功能检测的目标。目前运维编排(OOS)处于内测中,欢迎试用提意见。


系列文章

主题文章

阿里云重磅发布云上自动化利器——运维编排OOS

最佳实践

玩转运维编排服务的权限:Assume Role+Pass Role

场景系列

运维编排场景系列----更新ECS镜像
运维编排场景系列-----给ECS实例自动打TAG
运维编排场景系列----从实例中拷贝文件到OSS
运维编排场景系列----给实例加到SLS机器组
运维编排场景系列----检测MFA功能状态
阿里云运维编排新功能:一键批量克隆ECS

相关文章
|
1月前
|
运维
【运维基础知识】用dos批处理批量替换文件中的某个字符串(本地单元测试通过,部分功能有待优化,欢迎指正)
该脚本用于将C盘test目录下所有以t开头的txt文件中的字符串“123”批量替换为“abc”。通过创建批处理文件并运行,可实现自动化文本替换,适合初学者学习批处理脚本的基础操作与逻辑控制。
146 56
|
1月前
|
运维 自然语言处理 开发者
作为一名运维人员,使用通义灵码个人版处理日常工作中的代码相关任务,极大地提升了我的工作效率。以下是我使用通义灵码的具体实践场景、效果和心得,以及相应的截图。
作为一名运维人员,我使用通义灵码处理日常工作中的代码任务,效率提升了30%。通义灵码帮助我快速理解复杂代码、生成准确的代码注释,并能从自然语言生成代码示例,大幅减少了代码编写和理解的时间。
57 3
|
2月前
|
机器学习/深度学习 人工智能 运维
|
6月前
|
存储 运维 关系型数据库
2024年最全ceph的功能组件和架构概述(2),Linux运维工程面试问题
2024年最全ceph的功能组件和架构概述(2),Linux运维工程面试问题
2024年最全ceph的功能组件和架构概述(2),Linux运维工程面试问题
|
3月前
|
存储 边缘计算 运维
边缘计算问题之OpenYurt 对边缘计算场景中的运维难题如何解决
边缘计算问题之OpenYurt 对边缘计算场景中的运维难题如何解决
39 1
|
3月前
|
运维 算法 应用服务中间件
运维系列.Nginx中使用HTTP压缩功能(一)
运维系列.Nginx中使用HTTP压缩功能(一)
69 1
|
3月前
|
运维 Shell Linux
运维专题.Docker功能权限(Capabilities)管理和查看
运维专题.Docker功能权限(Capabilities)管理和查看
113 1
|
3月前
|
运维 应用服务中间件 网络安全
运维系列.Nginx配置文件结构功能总结
运维系列.Nginx配置文件结构功能总结
66 0
运维系列.Nginx配置文件结构功能总结
|
3月前
|
运维 监控 测试技术
5个常见运维场景,用这几个Python脚本就够了!
5个常见运维场景,用这几个Python脚本就够了!
|
3月前
|
缓存 应用服务中间件 nginx
运维系列.Nginx中使用HTTP压缩功能(二)
运维系列.Nginx中使用HTTP压缩功能(二)
52 0