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文件

import re
import requests
import json
import warnings
from datetime import datetime


warnings.filterwarnings("ignore")  # 忽略所有警告


#DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'  # 如果要日期也要时间,就把这一行取消注释
DATETIME_FORMAT = '%Y-%m-%d'  # 如果只要日期,就把这一行取消注释




def get_applications_info():
    # 获取 access_token
    token_url = "https://login.partner.microsoftonline.cn/xxxxxxxx-xxxxx-xxxx-xxxxx-xxxxxxxxxxxxx/oauth2/v2.0/token"
    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'
    token_headers = {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Cookie': 'fpc=Akixxxxxxxxnf-7exxxxxxxxxxxx; stsservicecookie=estsfd; x-ms-gateway-slice=estsfd'
    }


    token_response = requests.request("POST", token_url, headers=token_headers, data=token_payload)
    token_data = json.loads(token_response.text)
    access_token = token_data['access_token']


    # 使用 access_token 发起 GET 请求
    url = "https://microsoftgraph.chinacloudapi.cn/v1.0/applications"
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': f'Bearer {access_token}'
    }


    response = requests.request("GET", url, headers=headers).json()
    return response.get("value", [])




def parse_time(time_str):
    # 正则表达式匹配三种时间格式
    pattern = re.compile(r'^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})(\.\d{1,6})?(Z)?$')
    match = pattern.match(time_str)
    if not match:
        return ''
    _, ms, z = match.groups()
    format_string = '%Y-%m-%dT%H:%M:%S'
    if ms:
        format_string += '.%f'
    if z:
        format_string += 'Z'
    return datetime.strftime(datetime.strptime(time_str, format_string), DATETIME_FORMAT)




def format_data(values):
    nvalues = []
    for item in values:
        password_credentials = [
            dict(
                appId=item.get("appId"),
                displayName=item.get("displayName"),
                keyId=jtem.get("keyId"),
                type='passwordCredentials',
                startDateTime=parse_time(jtem.get("startDateTime")),
                endDateTime=parse_time(jtem.get("endDateTime"))
            )
            for jtem in item.get("passwordCredentials", [])]
        key_credentials = [
            dict(
                appId=item.get("appId"),
                displayName=item.get("displayName"),
                type='keyCredentials',
                keyId=jtem.get("keyId"),
                startDateTime=parse_time(jtem.get("startDateTime")),
                endDateTime=parse_time(jtem.get("endDateTime"))
            )
            for jtem in item.get("keyCredentials", [])]
        nvalues.extend(password_credentials)
        nvalues.extend(key_credentials)
    return nvalues




def main():
    values = get_applications_info()
    nvalues = format_data(values)
    for item in nvalues:
        print(json.dumps(item))




if __name__ == '__main__':
    main()

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

#编译镜像

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

#推送镜像到镜像仓库

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

FROM python
ENV LANG=C.UTF-8
ENV TZ=Asia/Shanghai


RUN pip install pyyaml  --upgrade -i  https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install requests --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY azure-aad_certdate.py   /opt/


CMD ["sleep","999"]

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

命令执行kubectl  apply -f   azure_aad_certdate.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: azure-aad-certdate-monitor-server
  namespace: monitoring
spec:
  schedule: "* 9 * * *"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      parallelism: 1      #作业的最大并行度,默认为1
      completions: 1      #期望的成功完成的作业次数,成功运行结束的Pod数量
      ttlSecondsAfterFinished: 600   #终止状态作业的生存时长,超期将被删除
      backoffLimit: 3                #将作业标记为Failed之前的重试次数
      activeDeadlineSeconds: 60      #作业启动后可处于活动状态的时长
      template:
        spec:
          containers:
          - name: azure-aad-certdate-monitor
            image: xxxxxxx.xxxxxxxxx.cn/xxxxxx/azure-aad-certdate:v1
            #imagePullSecrets:
            imagePullPolicy: Always
            command:
            - /bin/sh
            - -c
            - python /opt/azure-aad_certdate.py
          restartPolicy: OnFailure
  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

    推荐视频    

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值