Хотел — понять, почему не разобрался документ. Открыл журнал шлюза, через который все мои клиенты ходят к моделям, и стал искать нужную минуту.
Споткнулся о то, чего не искал. В журнале лежали ключи клиентов. Целиком, четыре штуки, по строке на каждый, и так каждые несколько минут.
Их туда никто не клал. Нет ни одной строки кода, которая пишет ключ в лог, и именно поэтому это прожило незамеченным. Цепочка из трёх честных звеньев:
- скрипт учёта расходов спрашивает шлюз про каждый ключ: сколько потрачено, не пора ли закрывать роль. Ключ он передаёт в строке запроса — так написано в примерах к шлюзу;
- шлюз пишет в журнал доступа адрес каждого запроса, как любой веб-сервер. Адрес — вместе со строкой запроса;
- журнал контейнера уезжает в общее хранилище логов, которое живёт на другом сервере и хранит всё тридцать дней.
Каждое звено ведёт себя правильно. Вместе они раз в несколько минут выкладывали все ключи в систему, куда смотрят совсем с другими целями.
Отдельно неприятно, что накануне я сам сделал хуже. Проверка потолков расхода ходила раз в час, и я перевёл её на раз в пять минут, чтобы потолок срабатывал быстрее. Утечка стала чаще в двенадцать раз, и это выглядело как улучшение.
Решил три вещи, по слоям.
- Ключ не бывает частью адреса. Шлюз умеет отвечать про тот ключ, которым к нему пришли в заголовке, — скрипт переходит на этот способ.
- Вторая линия: сборщик логов маскирует всё, что выглядит как ключ, до отправки. Не вместо первого пункта, а на случай следующего скрипта, который напишут по тем же примерам.
- В руководстве появился абзац «ключ засветился в логе»: перевыпустить, раздать потребителям, пересоздать контейнер, чтобы старый журнал ушёл.
Чем плачу — перевыпуском четырёх ключей и раскаткой каждого его потребителю: то, что побывало в логе, считается известным. Это виртуальные ключи моего шлюза, а не ключи провайдеров, потолок расхода у каждого свой и маленький, так что цена утечки ограничена. Но ограничена она потолком, а не тем, что ключ секретен.
И главное: находка случайная. Я искал таймаут и нашёл ключи. Никакая проверка на это не смотрела, и сколько оно так прожило, я не знаю — замера нет.
#отказ