当前位置:   article > 正文

AZURE AAD证书最佳实践监控

AZURE AAD证书最佳实践监控

a2e83f5b106281c2451a6c63096d4e33.gif

 新钛云服已累计为您分享801篇技术干货

f41f88235344cf3d751b609c89834660.gif

需求:随着应用服务业务证书的增多,人为手动登录azure平台查看证书繁琐、用户权限控制、容易忘记登录等等信息的风险,这时就要自动化管理来提高安全性与可靠性。

  • Azure AD 证书管理工具可以帮助自动化证书的续期和监控。

  • 通过这个工具,您可以设置证书的到期提醒,并自动完成证书的续期流程。

  • 该工具可以显示证书的详细信息,并提供证书的使用情况报告。

  • 设置证书到期警报,提醒您证书即将到期。

  • 编写自动化脚本,定期扫描并报告 Azure AD 中所有证书的状态。

01

Microsoft Entra ID服务授权

登录azure网站输入地址 https://portal.azure.cn 打开服务Microsoft Entra ID服务,进入到应用注册板块

5774100772868324b7f2c41d2164004c.png

在API权限模块添加配置权限

API/权限名称:Application.Read.All 和授权类型:应用程序

2eb37b5ae50ef319eeb873bd94e73f0e.png

证书和密码位置生成1个新客户端密码,这个是为了api调用时提取所有服务证书时间信息。

074d52480d935660087b4f0765bba9b8.png

02

Postman调用测试接口返回

1、获取access_token信息

POST请求地址https://login.partner.microsoftonline.cn/目录(租户) ID/oauth2/v2.0/token

client_id和client_secret是新客户端id与密码信息

8d026a4dc950121dcc24bb481b2183aa.png

bd8f78ec6d4228e8d494452149debfd4.png

2、通过access_token获取证书截止期限

提取json日志输出返回信息可以使用谷歌浏览器插件JSON-handle查看更加直观

7f6f67f673eef3267e1a4996c3dcdc59.png

03

封装成CronJob跑任务输出LOG

1、编写Python脚本azure-aad_certdate.py文件

把步骤二Postman调用的信息封装成Python文件

  1. import re
  2. import requests
  3. import json
  4. import warnings
  5. from datetime import datetime
  6. warnings.filterwarnings("ignore") # 忽略所有警告
  7. #DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S' # 如果要日期也要时间,就把这一行取消注释
  8. DATETIME_FORMAT = '%Y-%m-%d' # 如果只要日期,就把这一行取消注释
  9. def get_applications_info():
  10. # 获取 access_token
  11. token_url = "https://login.partner.microsoftonline.cn/xxxxxxxx-xxxxx-xxxx-xxxxx-xxxxxxxxxxxxx/oauth2/v2.0/token"
  12. token_payload = 'grant_type=client_credentials&client_id=xxxxxxxxx-4c7d-xxxxxx-8beb-xxxxxxxxx&client_secret=xxxxxxxxxxxh0wbS~VxxxxxxxxxG4y&scope=https%3A%2F%2Fmicrosoftgraph.chinacloudapi.cn%2F.default'
  13. token_headers = {
  14. 'Content-Type': 'application/x-www-form-urlencoded',
  15. 'Cookie': 'fpc=Akixxxxxxxxnf-7exxxxxxxxxxxx; stsservicecookie=estsfd; x-ms-gateway-slice=estsfd'
  16. }
  17. token_response = requests.request("POST", token_url, headers=token_headers, data=token_payload)
  18. token_data = json.loads(token_response.text)
  19. access_token = token_data['access_token']
  20. # 使用 access_token 发起 GET 请求
  21. url = "https://microsoftgraph.chinacloudapi.cn/v1.0/applications"
  22. headers = {
  23. 'Content-Type': 'application/x-www-form-urlencoded',
  24. 'Authorization': f'Bearer {access_token}'
  25. }
  26. response = requests.request("GET", url, headers=headers).json()
  27. return response.get("value", [])
  28. def parse_time(time_str):
  29. # 正则表达式匹配三种时间格式
  30. pattern = re.compile(r'^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})(\.\d{1,6})?(Z)?$')
  31. match = pattern.match(time_str)
  32. if not match:
  33. return ''
  34. _, ms, z = match.groups()
  35. format_string = '%Y-%m-%dT%H:%M:%S'
  36. if ms:
  37. format_string += '.%f'
  38. if z:
  39. format_string += 'Z'
  40. return datetime.strftime(datetime.strptime(time_str, format_string), DATETIME_FORMAT)
  41. def format_data(values):
  42. nvalues = []
  43. for item in values:
  44. password_credentials = [
  45. dict(
  46. appId=item.get("appId"),
  47. displayName=item.get("displayName"),
  48. keyId=jtem.get("keyId"),
  49. type='passwordCredentials',
  50. startDateTime=parse_time(jtem.get("startDateTime")),
  51. endDateTime=parse_time(jtem.get("endDateTime"))
  52. )
  53. for jtem in item.get("passwordCredentials", [])]
  54. key_credentials = [
  55. dict(
  56. appId=item.get("appId"),
  57. displayName=item.get("displayName"),
  58. type='keyCredentials',
  59. keyId=jtem.get("keyId"),
  60. startDateTime=parse_time(jtem.get("startDateTime")),
  61. endDateTime=parse_time(jtem.get("endDateTime"))
  62. )
  63. for jtem in item.get("keyCredentials", [])]
  64. nvalues.extend(password_credentials)
  65. nvalues.extend(key_credentials)
  66. return nvalues
  67. def main():
  68. values = get_applications_info()
  69. nvalues = format_data(values)
  70. for item in nvalues:
  71. print(json.dumps(item))
  72. if __name__ == '__main__':
  73. main()

2、制作Dockerfile文件封装成镜像

#编译镜像

docker build -t xxxxxxx.xxxxxxxxx.cn/xxxxxx/azure-aad-certdate:v1 .

#推送镜像到镜像仓库

docker push xxxxxxx.xxxxxxxxx.cn/xxxxxx/azure-aad-certdate:v1

  1. FROM python
  2. ENV LANG=C.UTF-8
  3. ENV TZ=Asia/Shanghai
  4. RUN pip install pyyaml --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
  5. RUN pip install requests --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
  6. COPY azure-aad_certdate.py /opt/
  7. CMD ["sleep","999"]

3、封装的镜像编写成Cronjob yaml文件

命令执行kubectl  apply -f   azure_aad_certdate.yaml

  1. apiVersion: batch/v1beta1
  2. kind: CronJob
  3. metadata:
  4. name: azure-aad-certdate-monitor-server
  5. namespace: monitoring
  6. spec:
  7. schedule: "* 9 * * *"
  8. concurrencyPolicy: Forbid
  9. jobTemplate:
  10. spec:
  11. parallelism: 1 #作业的最大并行度,默认为1
  12. completions: 1 #期望的成功完成的作业次数,成功运行结束的Pod数量
  13. ttlSecondsAfterFinished: 600 #终止状态作业的生存时长,超期将被删除
  14. backoffLimit: 3 #将作业标记为Failed之前的重试次数
  15. activeDeadlineSeconds: 60 #作业启动后可处于活动状态的时长
  16. template:
  17. spec:
  18. containers:
  19. - name: azure-aad-certdate-monitor
  20. image: xxxxxxx.xxxxxxxxx.cn/xxxxxx/azure-aad-certdate:v1
  21. #imagePullSecrets:
  22. imagePullPolicy: Always
  23. command:
  24. - /bin/sh
  25. - -c
  26. - python /opt/azure-aad_certdate.py
  27. restartPolicy: OnFailure
  28. startingDeadlineSeconds: 300 #因错过时间点而未执行的作业的可超期时长

4、查看Cronjob输出pod日志

azure-aad-certdate-monitor-server pod的json日志输出详情

bc2cb4e4fec536bea63a8f7615636149.png

04

SLS配置监控

1、编写sls查询语法进行查询

#查询证书时间在0至30天之内到期的服务信息

((_namespace_ : monitoring and _container_name_: azure-aad-certdate-monitor))| select DISTINCT appId,displayName,type,startDateTime ,endDateTime,date_diff('day', date_parse(split(_time_, 'T')[1], '%Y-%m-%d'), date_parse(endDateTime, '%Y-%m-%d')) as days having days < 30 and days > 0 ORDER BY days ASC LIMIT 1000

7396966200722366bff7244144cd25f2.png

2、Dashboard制作

制作1至60天到期数据信息和所有服务证书时间

e78e39347983644077f5c668cac2111e.png

3、SLS告警通知

证书监控告警通知配置

61e71c40bd99b4349df3052fbf2843b5.png

如有相关问题,请在文章后面给小编留言,小编安排作者第一时间和您联系,为您答疑解惑。

    推荐阅读   

0d8d464570a71ec292b2e81d4c768f26.png

8338ced5c289ddd2e8517e0156956c2d.png

    推荐视频    

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/800962
推荐阅读
相关标签
  

闽ICP备14008679号