Заметки любителя экспериментов

Позднее Ctrl + ↑

Почта не ходит дальше 500 миль

В связи с обновлением сервера вспомнилась мне тут эта история, которую я читал лет 20, наверное, назад. Но «ремонт» почтового сервера мне живо напомнил её. Прошу прощение за оформление, просто скопипастил, форматировать было лень . Итак, расслабляемся...

Рассказ про пятисотмильную электронную почту
From **@.* Fri Nov 29 18:00:49 2002
Date: Sun, 24 Nov 2002 21:03:02 -0500 (EST)
From: Trey Harris
To: **-***@.*
Subject: The case of the 500-mile email (was RE: [SAGE] Favorite impossible
task?)

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

Несколько лет назад я работал в службе технической поддержки электронной почты университетского кампуса. Мне позвонил заведующий кафедрой статистики.

«У нас проблема с отправкой почты с кафедры»
Я: «В чем проблема?»

«Мы не можем послать электронную почту больше чем на 500 миль»

Я роняю чашку с кофе. «Повторите, пожалуйста?»

«Мы не можем отправить письмо адресатам, находящимся далее 500 миль отсюда», повторяет завкафедрой. «Точнее, 520. Но не дальше».

Я пытаюсь собраться с мыслями. Крыша начинает медленно меня покидать, но нельзя позволить крыше уйти в разговоре с завкафедрой. Даже завкафедрой статистики. «Хммм... Понимаете, принцип доставки электронной почты не зависит от расстояния. Почему Вы думаете, что не можете отправлять почту далее 500 миль?»

«Я не думаю, я знаю» — довольно жестким тоном заявляет завкафедрой.
«Когда мы впервые это заметили, несколько дней назад...»
«Вы ждали несколько ДНЕЙ?» — перебиваю я уже слегка дрожащим голосом — «и вы обходились без почты?»
«Нет. Мы могли отправлять письма, но...».
«Но не далее 500 миль, сэр? Но почему же Вы не позвонили раньше?»
«Ну, у нас не было достаточного количества данных до сегодняшнего дня».
Ну да. Кафедра статистики, как-никак. О Господи...
«Ну, так или иначе — я попросил наших геостатистиков разобраться...»

Так. Геостатистики.

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

«Я понял, сэр». Крыша-таки решила меня оставить. «Когда это началось? Вы сказали — несколько дней назад. Вы перенастраивали Ваши сервера в последнее время?»

«Да, приходили ребята от производителя, пропатчили сервер и перезагрузили его. Но я специально у них спросил — они говорят, что почты это никоим образом не коснулось».

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

Нууу... Для начала я залогинился на сервер их кафедры и отправил несколько пробных писем. Все это происходило в Северной Каролине, и все письма моментально вернулись ко мне в ящик. Ричмонд, Атланта, Вашингтон — сработало. Принстон (400 миль) — сработало.

Далее я попробовал послать письмо в Мемфис (600 миль). Отлуп.
Бостон, отлуп. Детройт, отлуп. Я открыл адресную книгу и начал пытаться сузить круги. Нью-Йорк (420 миль) — работает, Провиденс (580 миль) — отлуп.

У меня появились сомнения в собственной вменяемости. Я решил попробовать отправить письмо своему другу, живущему в Северной Каролине, но работающему с провайдером в Сиэттле.
Благодарю Тебя, Господи. Отлуп. Если бы оказалось, что прохождение писем зависит от того, где находится человек, их получающий — я бы сам, по собственной инициативе и с гордо поднятой головой пошел бы сдаваться санитарам.

Поняв, наконец, что завкафедрой не бредит, я решил посмотреть на sendmail.cf. Вполне нормальный sendmail.cf. Знакомый даже.

Я сравнил его diff’ом со стандартным sendmail.cf у меня на диске. Он не изменялся. Это был ровно тот же sendmail.cf, который я делал собственноручно.
Но опцию «FAIL_MAIL_OVER_500_MILES» я не включал, это точно.
Каюк. Ну что еще попробовать? telnet по 25-му порту на сервер этой гребаной кафедры.
Сервер радостно отвечает, как ему и положено — blah-blah-blah, я, говорит, SunOS.

Стоп-стоп-стоп... SunOS sendmail? Sun тогда поставлял со своей операционкой sendmail 5, хотя все нормальные люди уже работали с sendmail 8.
Поскольку я — все-таки неплохой администратор, почта у меня ходила под sendmail 8. Ну и опять-таки — поскольку я — человек, приученный к порядку, я переписал sendmail.cf с нормальными, понятными именами переменных и опций. Что с переменными и опциями делал sendmail 5, вы должны помнить.

Так-так-так... Картинка собиралась. Мне снова захотелось кофе.
Ребятки от Sun пропатчили операционку, но sendmail, в общем-то, тоже ее часть. Они удачно закрыли дыры, но sendmail снова стал 5, а не 8. Но в одном они были правы — sendmail.cf действительно никто не тронул. А какая разница, для восьмой версии он или для пятой?

Ну, короче говоря. Пятый (по крайней мере, в варианте Sun’а) — нормально отрабатывал sendmail.cf от восьмого. Рулсеты-то не изменились.
Но вот опции настройки, такие неприлично длинные — он считал чуть ли не комментариями. Клал на них. А откомпилирован он был без настроек по умолчанию.
И, как честный человек, не найдя чего-то в sendmail.cf, он устанавливал это в 0.

Одна из успешно установленных в ноль настроек — таймаут для соединения с удаленным SMTP — сервером. Поигравшись с этим сервером, я понял, что «ноль» по его мнению — это около трех миллисекунд.

Так. Ага...
Сетка наша уже в то время была на коммутаторах, и задержек практически не имела.
Задержки снаружи — это, в общем. Было понятно.

Ага. Скорость распространения электромагнитной волны.

ОООПС....
Умножаем время на скорость света, и получаем... и получаем...
558.84719

Пятьсот пятьдесят восемь миль.

Новая покупка

В конце прошлой недели вытащил из рюкзака свой паяльник на батарейках и с сожалением отметил, что у него сломалось жало. Точнее, его крепление. Оно стало шататься и перестало греться. Последнее было из-за того, что отломился контакт, это еще было поправимо. Но шатающееся жало я терпеть не могу, работа с таким крайне раздражает.
Немного погуглив, нашел в городе магазин, где продавался похожий паяльник, но с питанием от USB-порта. Как раз такой я и хотел, чтобы иметь возможность запитать его от, например, power bank и не покупать постоянно батарейки. Конечно, можно было использовать аккумуляторы, скажете вы, но все дело в том, что аккумуляторы слишком плотно входили в гнездо и, после закрытия крышки, просто не было нормального контакта, из-за чего паяльник просто не работал. Почему так происходило — без понятия.
В общем, съездил в магазин, приобрел новый паяльник, опробовал его и остался крайне им доволен. Также в голову пришла мысль снять жало со старого и использовать в новом — они идентичны. Только в старом паяльнике жало было «несъемным», а в новом — менялось за 10 секунд.
Осталось только подобрать какой-то пенал, вроде школьного, чтобы история со сломанным жалом не повторилась.

Обновление сервера

Событий за прошедшее время было множество, как интересных, так и не очень. Записывать сразу времени не было, а позже уже забывалось под слоем других. Поэтому шут с ними, опишу последние.

Вчера в обед, пообщавшись с поддержкой, решил обновить сервер до последней версии операционной системы. Среди интересных для меня нововведений был Apache и openssl. Обновление много времени не заняло, после чего я уехал немного поиграть. Вернулся, позанимался каким-то делами и спокойно залег спать.
Утро принесло несколько не очень приятных известий. Во-первых, перестала работать почта, только сыпала сообщениями о том, что не может доставить сообщения. Во-вторых, сайт также перестал работать. Отправка показаний уличного термометра тоже не осуществлялась. Короче говоря, многие вещи перестали работать. С почтой разобрался достаточно быстро, заработала. Все остальное отложил на более позднее время.
С Apache пришлось разбираться чуть дольше, но, в итоге, он тоже «сдался». Немного изменилась конфигурация, но несколько добавленных строк повысили уровень безопасности до нужного. Остальное — уже мелочи, потом разберусь.

Первая неделя работы

Должен отметить, что впечатления от новой пока что только положительные. От дома до работы добираюсь буквально минут за 10. Если раньше хотя бы успевал почитать в дороге, то теперь почти нет — только откроешь книгу, начинаешь читать — и уже пора выходить. Работы достаточно много, самой разной, но, в то же время, остается время на то, чтобы немного поэкспериментировать. Например, сейчас пытаюсь подобрать систему, которая позволяла бы мне проводить периодическую инвентаризацию техники. Перепробовав множество самых разных вариантов, остановился пока что на связке FusionInventory+GLPI. Она удобна тем, что является мультиплатформенной, основана на веб-интерфейсе, и доступна мне из любого места. Немного «запутанное» меню, но это — дело привычки.

Смена работы

Некоторое время назад поступило мне предложение поработать в одной конторе. Работа предлагалась в виде дополнительного заработка, что меня немного не устраивало. Впрочем, как затем оказалось, конторе нужен был человек, который в первой половине дня находится в офисе, затем — по обстоятельствам. «Цена вопроса» оказалась несколько выше, чем я зарабатывал на тот момент. Поэтому было принято решение место работы сменить. Решающих факторов стало несколько:

  1. новое место работы расположено в 2 раза ближе к дому;
  2. зарплата, даже с учетом некоторых «вычетов», больше нынешней (как потом оказалось, даже больше планируемого увеличения з/п в ближайшее время моим текущим начальством);
  3. на работе нужно находиться, в основном, только в первой половине дня, остальное остается на твое усмотрение;
  4. меньше разъездов по всему городу, на которые, нужно сказать, уходило достаточно много времени и денег.

Сама по себе смена рабочего места — это своеобразная игра в «угадайку». В том смысле, что новый коллектив может тебя просто не принять, что-то не устроит тебя самого или еще чего может случиться. Хотя первый вариант у меня был только один раз — ну не вписывался я в уже давно сложившийся коллектив, хоть убейся. Ну да ладно, всякое бывает.

На новом месте оказалось нужным проходить мед. комиссию перед устройством, чего я не делал уже даже не помню сколько лет. Почти на всех местах работы от меня такого не требовали. Оглядываясь назад, я вообще не могу вспомнить, чтобы от меня требовали пройти комиссию. За исключением тех случаев, когда я искал работу при помощи службы занятости. На одном из мест тогда тоже это потребовали и я даже пошел «сдаваться» в поликлинику, но чуть позже поговорив с одним из сотрудников этой организации, отказался от предложения, заработав «штрафное очко» в ЦЗН.

Хорошо, нужно пройти комиссию — пройдем. Зашел в ближайшую к организации — офигенная очередь в регистратуру. Прикинув, что к окну я доберусь не раньше, чем через час, поехал домой — пообедать и заодно узнать про мед. комиссию в «своей» поликлинике. Зайдя в нее, узнал, что у меня есть как раз время покушать и вернуться сюда, ибо врач принимает с 15 до 16 часов. Съездил домой, вернулся, захожу в кабинет (кстати, заведующего терапевтическим отделением), говорю, что мне нужно нужно пройти осмотр для приема на работу. И тут врач меня огорошила заявлением, что в поликлинике сейчас отсутствуют два врача из списка и вернутся они из отпуска только через 2 недели. Но, нужно отдать ей должное, предложила несколько вариантов.

Пришлось возвращаться в предыдущую поликлинику. Очереди уже почти не было, поэтому до окна регистратуры добрался быстро. Узнал кого мне нужно пройти, сколько это будет стоить и что я, в принципе, успеваю сделать это за один день. Не учитывая тот момент, что мне еще нужно будет сделать фюорографию и посетить психиатра-нарколога в другом конце города. Чуть позже, покопавшись в интернете, понял, что итоговая сумма за прохождение мед. комиссии практически равна 2000 рублей. Достаточно чувствительная для меня на этот момент сумма.

Вернулся домой и начал искать в интернете где еще можно быстро, в течение рабочего дня, и, желательно, подешевле пройти медосмотр. Таких мест оказалось немного и примерно половина из них доверия не внушала. Поэтому с утра сел на телефон и начал обзванивать остальную половину. При этом отбросил в сторону те медицинские заведения, до которых из дома было долго добираться. В итоге остановился на фирме «ОптимаМед», один из филиалов которой располагается на правом берегу в районе цирка. Сумма за все составила чуть менее 1800 рублей, но пройти всех специалистов можно было часа за полтора, максимум. Что было вполне сопоставимо с суммой за медосмотр в поликлинике + психиатр + проезд. При этом нет никакой гарантии, что ты всех пройдешь за один день, ибо бабушки и очереди присутствуют в каждой поликлинике :-)

Приехал в указанный мед. центр, оплатил услуги, получил необходимые документы и список врачей и пошел их проходить. Начал с процедурного кабинета, сдав анализы крови и мочи. Затем пошел по остальным: офтальмолог, психиатр-нарколог, ЭКГ, флюорография и так далее. В каждом кабинете не задерживался более 10 минут. Заодно проконсультировался с врачами по интересующим меня вопросам. Отвечали достаточно охотно и ёмко.

Спустя чуть более часа попал в кабинет терапевта. Пока ждал очереди к нему, сфотографировал на всякий случай ЭКГ, потому что периодически (крайне редко, но все же) бывает острая колющая боль в сердце. После терапевта получил заключение, что к данной работе годен и двинулся к новому месту работы.

На КПП получил постоянный пропуск, отдал документы в отдел кадров, проехался по территории завода с начальником охраны, чтобы получить представление об имеющейся схеме работы охраны и, по возможности, дать свои рекомендации в сфере компьютерного обеспечения всего этого хозяйства.

Работы, конечно, непочатый край, как говорится. Причем самой разнообразной и на достаточно «небольшой» территории — каких-то 10 квадратных километров :-) Хочется надеяться... Да просто хочется надеяться на лучшее! :-)

Реклама и AdBlock

Гениально, я считаю, жаль, что не каждый поймет: «нет смысла объяснять про adblock людям, которые каждый вечер по уши в телевизоре с рекламой каждые 20 минут»

Анонимайзеры и Content Security Policy

Продолжая мучить свой сервер, наткнулся на такой интересный «казус», который, впрочем, после некоторого размышления, стал вполне логичным.

Так как ранее была настроена связка nginx+Apache, но тогда я не стал настраивать модуль rpaf, который выдает «нормальный» адрес сервера в логах, а настроил только сейчас, то, конечно, пришлось его сразу тестировать. Для этого зашел на сайт HideMe, вбил адрес страницы, которая должна была показать мне адрес сервера, с которого я зашел (если модуль был настроен неправильно, то я увидел бы, скорее всего, адрес 127.0.0.1) и увидел... что стили оформления на сайте не работают. Это следствие использования CSP на моем сервере. Можно сказать, что это достаточно неприятно, но, если подумать, то мой сайт нигде не блокируется и никак не прячется, поэтому использовать анонимайзер при его посещении нет никакого смысла. Разве что только в том случае, если на каком-то предприятии по внутренним правилам запрещено посещать сайты и работникам не остается ничего, кроме как использовать анонимайзеры. Что, впрочем, крайне маловероятно :-)

Связка nginx+Apache

Немного почитав про эту связку, пришел к выводу, что стоит попробовать ее использовать. Установил nginx, перенастроил Apache таким образом, чтобы он работал только локально, затем настроил nginx таким образом, чтобы он все запросы отдавал Apache. Потом еще некоторое время пришлось повозиться с настройками nginx, но вуаля! Я добился-таки того, что все сайты, на которых я проводил тестирование своего сервера, выдали мне оценку «А+». Итак, что из «плюсов» мы имеем:

  • — возросла скорость загрузки сайта;
  • — уменьшилась нагрузка на Apache;
  • — статические данные теперь отдает nginx, динамические — формирует Apache;
  • — остались все «плюшки» .htaccess;
  • — возросла безопасность сервера.

Из «минусов»:

  • — теперь на сервере у меня два веб-сервера.

Чуть позже попробую конфигурацию с «голым» nginx, если его работа меня устроит, то, скорее всего, полностью перейду на него. Теперь что касается безопасности сервера (ну да, у меня маленький бзик на этот счет).

В связи с тем, что nginx, в отличие от Apache, поддерживает наборы шифрования ECDHE, появилась возможность их использовать. Также он поддерживает OCSP stapling, что позволяет немного ускорить загрузку страниц при работе через HTTPS.

Тестирование проводилось при помощи трех сайтов: SSL Analyzer от Comodo, Free SSL Server Test от High-Tech Bridge, ну и конечно незабвенный SSL Server Test от лаборатории Qualys SSL.

Первый ресурс позволяет провести быстрый тест наборов шифров и некоторых других параметров, он является самым быстрым из этих трех серверов. Удовлетворить его требования оказалось самым простым.

Затем тест проводился при помощи High-Tech Bridge. По скорость он является более медленным, но проверяет чуть больше параметров. В том числе на соответствие требованиям NIST (американский институт стандартов и технологий) и стандарта PCI DSS. Здесь пришлось немного попотеть, разыскивая наборы шифрования, которые, по его мнению, должны быть включены в список.

И под конец проверка шла при помощи Qualys SSL. Он является самым медленным из указанного списка, но выдает результаты практически по всем параметрам. Здесь пришлось поработать над несколькими пунктами, но и тут была одержана победа.

Если какие-то условия не удовлетворяли хотя бы один сайт, параметры редактировались и проверка начиналась заново. В итоге, все требования соблюдены:

  • — сервер работает только по протоколу TLS;
  • — слабые шифры удалены из списка;
  • — Perfect Forward Secrecy (PFS) работает со всеми более-менее новыми браузерами;
  • — поддерживаются HSTS и HPKP;
  • — поддерживается OCSP stapling;
  • — работает Content Security Policy;
  • — работает вся ранее настроенная в Apache защита от атак.

В общем все круто и я всем доволен :-) Кроме, разве что того момента, что теперь в этом плане мне делать нечего и скоро я опять начну скучать.

Повышение безопасности сервера при помощи заголовков

Для увеличения степени безопасности сервера понадобится добавить или удалить несколько заголовков, которые он отдает при запросе страниц. Я не буду подробно расписывать какой из них за что отвечает, ограничусь лишь кратким описанием.

  1. HTTP Strict Transport Security (HSTS) — позволяет форсировать HTTPS подключение.
  2. HTTP Public Key Pinning (HPKP)  — позволяет создать своеобразную «электронную подпись» для вашего сайта.
  3. X-Download-Options со значением «noopen» позволяет запретить открытие любых файлов с вашего сайта (например, документов в формате PDF), становится возможно только скачать их.
  4. X-Content-Type-Options со значением «nosniff» инструктирует Internet Explorer версии 8 не определять автоматически content-type, а использовать уже полученный.
  5. Еще один заголовок X-XSS-Protection со значением «1; mode=block» активирует встроенную защиту от XSS (Cross-Site Scripting, «межсайтовый скриптинг»).
  6. X-Frame-Options со значением «SAMEORIGIN» запрещает открывать страницы вашего сайта во фрейме на чужом сайте.
  7. Заголовок Set-Cookie должен указываться с параметрами HttpOnly и Secure. Это предотвратит XSS-атаки и защитит cookie от кражи при помощи скрипта javascript.
  8. В заголовке Server также должна быть указана минимальная информация о сервере. Например, просто Apache. Это не даст злоумышленнику получить дополнительную информацию о программном обеспечении, установленном на вашем сервере.
  9. По аналогичным причинам рекомендуется убрать заголовок X-Powered-By, если таковой присутствует.

И, как обычно, есть ресурсы, с помощью которых можно проверить насколько корректно вы указали эти заголовки. Первый из них — securityheaders.io, работает очень быстро, корректно указанные по его мнению заголовки выделяются зеленым цветом. Некоторые он не выделяет, но, думаю, что на них он просто не обращает внимание.

Второй ресурс — Redbot. В левой части страницы он показывает заголовки, которые он смог получить. В правой вкратце описывается действие заголовка, также значками выделяется корректность их указания. Стадия их получения почему-то немного затянута, на мой взгляд — около 1 минуты, будем надеяться, что это будет исправлено. Также есть возможность включить в запрос дополнительные параметры.

Если вы думаете, что я что-то пропустил, то пишите в комментариях.

Добавление в список HSTS Preloading

Как это ни странно, но время ожидания добавления в список HSTS Preloading после подачи заявки составило всего около 2-х недель. Возможно, что в Chrome добавление произошло и раньше, но я только вчера утром обновил Firefox на своем компьютере и чуть позже, в ходе внесения изменений в файл .htaccess, можно сказать случайно, запустил проверку на сайте ssllabs. Итогом стало то, что я заметил загоревшийся зеленым цветом Chrome в пункте HSTS Preloading. Порадовался этому факту и немного огорчился, что только один браузер включил меня в этот список. Психологически приготовился ждать еще какое-то время пока остальные тоже обновят его, но этот процесс особо не затянулся. Буквально через несколько часов я наблюдал картину, где все браузеры, кроме Tor, светились зеленым. Ну Tor меня особо никогда не интересовал — ну не верю я в его «неотслеживаемость» и прочие фишки, поэтому было некритично. Сегодня утром картина немного изменилась — информация по Tor стала недоступной. На текущий момент ситуация выглядит следующим образом:

Также наконец-то создал более-менее правильную политику Content Security Policy (CSP), которая позволила моему блогу нормально функционировать. Ранее проблема в ее включении заключалась в том, что картинки из сообщений просто исчезали, при этом я не получал никаких сообщений в Firebug. Также иногда сбивалась тема и переставали работать скрипты. Но, вроде как, разобрался и сейчас все функционирует нормально. Прогнал тестами через один из сервисов и был приятно удивлен, когда он выставил мне высшую оценку по безопасности, найдя все те технологии, которые я внедрил на свой сервер. Кстати, интерфейс у этого сервиса сильно напоминает ssllabs. Про него расскажу чуть позже.

Ранее Ctrl + ↓