Код-ревью Junior Секреты и управление ключами обновлено

Ревью: конфигурация сервиса на Python

Вопрос

Найдите проблемы обращения с секретами.

import logging, requests

DB_URL = "postgresql://app:Pr0dPassw0rd@db.internal:5432/shop"
PAYMENT_KEY = "sk_live_51HxQ2eLkdf83jdKq"

def charge(order):
    headers = {"Authorization": f"Bearer {PAYMENT_KEY}"}
    logging.info("charge request %s headers=%s", order.id, headers)
    r = requests.post("https://pay.example/charge", json=order.to_dict(), headers=headers, verify=False)
    if r.status_code != 200:
        logging.error("payment failed: %s %s", r.text, DB_URL)
    return r.json()

Коротко

Секреты из кода переезжают в хранилище, логгер маскирует чувствительные заголовки и строки подключения, проверка TLS никогда не отключается.

Что должен найти ревьюер

  1. Безопасностьстрока 3
    Пароль базы в коде: попадает в git, во все копии репозитория и окружения. Брать из хранилища секретов.
  2. Безопасностьстрока 4
    Боевой ключ платёжного провайдера в коде.
  3. Безопасностьстрока 8
    В лог пишутся заголовки с Bearer-токеном.
  4. Безопасностьстрока 9
    verify=False отключает проверку сертификата: ключ можно перехватить атакой посредника.
  5. Безопасностьстрока 11
    В лог ошибки попадает строка подключения к базе с паролем.

Разбор

Секреты из кода переезжают в хранилище, логгер маскирует чувствительные заголовки и строки подключения, проверка TLS никогда не отключается.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме