使用certbot续费letsencrypt证书触发告警问题

我们是使用cerbot来申请letsencrypt证书的,letsencrypt证书有效期只有3个月,过期前需要续期,通过certbot命令去定时续期,但是每次续期都会触发阿里云的AK告警。

问题:

周末收到短信告警,AK存在异常调用。

排查过程:

1.看着告警的时间点,发现是我通过certbot更新证书的时间点,更新证书的操作会调用alidns的api去添加和删除一个txt域名解析记录以供验证,怀疑是这个操作触发的,登录阿里云控制台,查看AK操作事件记录:

都执行成功了,按理说应该不会告警,所以提工单问阿里云的客服,客服说告警跟更新证书的操作没有关系,是因为调用了DescribeEndpoints的api接口,执行失败了导致的告警,登录阿里云控制台,查看AK操作事件记录,确实有Location类型(地理位置相关的产品)的DescribeEndpoints执行失败了,但是我没有调用过DescribeEndpoints的api接口啊,问阿里云的客服也不清楚。

2.阿里云客服说告警跟我更新证书的操作没有关系,但是我看这个告警时间点,调用DescribeEndpoints的api接口的时间点和我执行更新证书的操作时间点是一致的,而且有6条调用DescribeEndpoints的api接口的记录,跟我调用alidns的次数是一样的,应该就是这个操作触发的告警,继续提工单问阿里云工程师,有了新说法,说没有对外开放DescribeEndpoints的接口,导致的执行失败,说调用逻辑是从certbot程序发起的

但是我如果单独执行cerbot命令是不会触发调用DescribeEndpoints的api接口,只有加上调用alidns的api接口去添加txt解析等操作才会触发调用DescribeEndpoints的api接口,所以问题应该跟cerbot程序无关,alidns的api接口如下,也确实没有发现有调用DescribeEndpoints的api接口的操作:

3.查到网上有文章说只要通过阿里云的cli工具去调用api,都会先去调DescribeEndpoints接口去获取Endpoint:

尝试显式指定Endpoint看是否还会触发DescribeEndpoints接口:

到阿里云控制台查看AK事件操作记录,发现没有去调用DescribeEndpoints接口了。

解决办法:

修改alidns的脚本,指定Endpoint参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash

if ! command -v aliyun >/dev/null; then
echo "错误: 你需要先安装 aliyun 命令行工具 https://help.aliyun.com/document_detail/121541.html。" 1>&2
exit 1
fi

ALIYUN_DNS_ENDPOINT="alidns.cn-hangzhou.aliyuncs.com"

if [ $# -eq 0 ]; then
aliyun --endpoint $ALIYUN_DNS_ENDPOINT alidns AddDomainRecord \
--DomainName $CERTBOT_DOMAIN \
--RR "_acme-challenge" \
--Type "TXT" \
--Value $CERTBOT_VALIDATION
/bin/sleep 20
else
RecordId=$(aliyun --endpoint $ALIYUN_DNS_ENDPOINT alidns DescribeDomainRecords \
--DomainName $CERTBOT_DOMAIN \
--RRKeyWord "_acme-challenge" \
--Type "TXT" \
--ValueKeyWord $CERTBOT_VALIDATION \
| grep "RecordId" \
| grep -Eo "[0-9]+")

aliyun --endpoint $ALIYUN_DNS_ENDPOINT alidns DeleteDomainRecord \
--RecordId $RecordId
fi
Thank you for your accept. mua!
-------------本文结束感谢您的阅读-------------