~ / посты / four-client-keys-in-a-log-nobody-wrote-them-to

Ключи в логе, которые никто туда не клал_

отказ

Хотел — понять, почему не разобрался документ. Открыл журнал шлюза, через который все мои клиенты ходят к моделям, и стал искать нужную минуту.

Споткнулся о то, чего не искал. В журнале лежали ключи клиентов. Целиком, четыре штуки, по строке на каждый, и так каждые несколько минут.

Их туда никто не клал. Нет ни одной строки кода, которая пишет ключ в лог, и именно поэтому это прожило незамеченным. Цепочка из трёх честных звеньев:

  • скрипт учёта расходов спрашивает шлюз про каждый ключ: сколько потрачено, не пора ли закрывать роль. Ключ он передаёт в строке запроса — так написано в примерах к шлюзу;
  • шлюз пишет в журнал доступа адрес каждого запроса, как любой веб-сервер. Адрес — вместе со строкой запроса;
  • журнал контейнера уезжает в общее хранилище логов, которое живёт на другом сервере и хранит всё тридцать дней.

Каждое звено ведёт себя правильно. Вместе они раз в несколько минут выкладывали все ключи в систему, куда смотрят совсем с другими целями.

Отдельно неприятно, что накануне я сам сделал хуже. Проверка потолков расхода ходила раз в час, и я перевёл её на раз в пять минут, чтобы потолок срабатывал быстрее. Утечка стала чаще в двенадцать раз, и это выглядело как улучшение.

Решил три вещи, по слоям.

  1. Ключ не бывает частью адреса. Шлюз умеет отвечать про тот ключ, которым к нему пришли в заголовке, — скрипт переходит на этот способ.
  2. Вторая линия: сборщик логов маскирует всё, что выглядит как ключ, до отправки. Не вместо первого пункта, а на случай следующего скрипта, который напишут по тем же примерам.
  3. В руководстве появился абзац «ключ засветился в логе»: перевыпустить, раздать потребителям, пересоздать контейнер, чтобы старый журнал ушёл.

Чем плачу — перевыпуском четырёх ключей и раскаткой каждого его потребителю: то, что побывало в логе, считается известным. Это виртуальные ключи моего шлюза, а не ключи провайдеров, потолок расхода у каждого свой и маленький, так что цена утечки ограничена. Но ограничена она потолком, а не тем, что ключ секретен.

И главное: находка случайная. Я искал таймаут и нашёл ключи. Никакая проверка на это не смотрела, и сколько оно так прожило, я не знаю — замера нет.

#отказ

$ echo "читать серию"

← Все посты