JWT — алерт когда срок токена кончается
Сервис подключается к стороннему API через JWT, токен живёт 24 ч и иногда продляется ручкой. Если забыл — пайплайн ломается в 3 утра.
Рецепт
#!/usr/bin/env python3
# /opt/jwt-expiry-check.py — runs from cron every 30 min
import base64, json, os, sys, time, urllib.request
TOKEN = os.environ['SVC_JWT'] # secret in env, not source
WARN_HOURS = 6 # alert when < N hours left
WEBHOOK = os.environ.get('HEARTBEAT_URL', '')
def decode_exp(token: str) -> int:
payload = token.split('.')[1]
payload += '=' * (-len(payload) % 4) # base64url padding
data = json.loads(base64.urlsafe_b64decode(payload))
return int(data.get('exp', 0))
exp = decode_exp(TOKEN)
left_hours = (exp - int(time.time())) / 3600
if left_hours < WARN_HOURS:
msg = f'JWT истекает через {left_hours:.1f} ч (exp={exp})'
if WEBHOOK:
urllib.request.urlopen(
urllib.request.Request(WEBHOOK,
data=json.dumps({'text': msg}).encode(),
headers={'Content-Type': 'application/json'}),
timeout=5)
sys.exit(2)
print(f'OK ({left_hours:.1f}h left)')
То же самое в Enterno.io
Замените cron + Slack на Enterno heartbeat с расписанием 30 мин и threshold-алертом — увидите историю «когда забыли продлить» рядом с другими мониторами, а не в потерянном Slack-сообщении.
Похожие рецепты
Сайт в HSTS preload-листе, но после рефакторинга nginx конфиг заголовок пропал. Через 3 месяца домен будет удалён из preload-листа. Нужен ежедневный чек.
Мисконфигурация name-server открыла AXFR на интернет — все ваши поддомены, MX, TXT (включая SPF DKIM ключи) видны атакующему. Ежедневный чек с алертом.
Атакующий упёрся в `limit_req_zone` — все легитимные запросы тоже начали получать 429. Логи показывают это, но никто не следит.