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