赞
踩
新钛云服已累计为您分享801篇技术干货
需求:随着应用服务业务证书的增多,人为手动登录azure平台查看证书繁琐、用户权限控制、容易忘记登录等等信息的风险,这时就要自动化管理来提高安全性与可靠性。
Azure AD 证书管理工具可以帮助自动化证书的续期和监控。
通过这个工具,您可以设置证书的到期提醒,并自动完成证书的续期流程。
该工具可以显示证书的详细信息,并提供证书的使用情况报告。
设置证书到期警报,提醒您证书即将到期。
编写自动化脚本,定期扫描并报告 Azure AD 中所有证书的状态。
01
Microsoft Entra ID服务授权
登录azure网站输入地址 https://portal.azure.cn 打开服务Microsoft Entra ID服务,进入到应用注册板块
在API权限模块添加配置权限
API/权限名称:Application.Read.All 和授权类型:应用程序
证书和密码位置生成1个新客户端密码,这个是为了api调用时提取所有服务证书时间信息。
02
Postman调用测试接口返回
1、获取access_token信息
POST请求地址https://login.partner.microsoftonline.cn/目录(租户) ID/oauth2/v2.0/token
client_id和client_secret是新客户端id与密码信息
2、通过access_token获取证书截止期限
提取json日志输出返回信息可以使用谷歌浏览器插件JSON-handle查看更加直观
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日志输出详情
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
2、Dashboard制作
制作1至60天到期数据信息和所有服务证书时间
3、SLS告警通知
证书监控告警通知配置
如有相关问题,请在文章后面给小编留言,小编安排作者第一时间和您联系,为您答疑解惑。
推荐阅读
推荐视频
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。