glia

NGINX и американские санкции

И знаешь, Геральт, порой бывает так, что Очень Большое Зло схватит тебя за горло и скажет: «Выбирай, братец, либо я, либо то, которое чуточку поменьше...»

А.Сапковский, "Меньшее зло"

Контора, где я работаю, является американской. Соответственно, несмотря на то, что вся разработка нашей системы производится в Эстонии, крутится эта система на американских серверах и продаётся от имени нашего головного офиса, расположенного в Нью-Йорке. Поэтому соблюдение законодательства США является для нас весьма важным требованием.

И в один прекрасный день из юридического отдела "прилетела" очередная задача в рамках соблюдения этого самого законодательства, а именно: заблокировать доступ к нашему сервису из ряда стран, с которыми не дружит США. Куда, естественно, также относится и Крым, который всё никак не могут поделить. И приписка, что, мол, если не получится заблокировать точечно Крым, то можно блокировать всю Украину - клиентов у нас там всё равно нет.

Я поизучал вопрос и ответил следующее. Во-первых, хоть у нас и нет клиентов с Украины, а у наших клиентов, судя по логам, есть, и их это затронет. А во-вторых, если вам нужно стопроцентно и гарантированно заблокировать Крым, то блокировать придётся и Украину, и Россию - в противном случае всегда останется некий процент (до 7%) крымских айпишников, которые фильтр не отловит. Вам как надо: чтобы закон соблюдался или чтоб работало?

Наверху посовещались и решили, что погрешность в 7% их устроит. Тогда я взял страничку с геокодами Украины (по ISO Крым украинский и не волнует) и выписал коды собственно Крыма, а также находящегося на полуострове Севастополя. Вместе с прочими запретными регионами получилась следующая конфигурация в NGINX:

    geoip_country /GeoIP.dat;
    geoip_city /GeoLiteCity.dat;
    geoip_proxy ;
    map "$geoip_country_code:$geoip_region" $embargoed_region {
      default no;
      "UA:43" yes; # Crimea region
      "UA:40" yes; # Sebastopol City, part of Crimea
      "~^CU:.*$" yes; # Cuba
      "~^IR:.*$" yes; # Iran
      "~^SD:.*$" yes; # Sudan
      "~^SY:.*$" yes; # Syria
      "~^KP:.*$" yes; # North Korea
      "~^VE:.*$" yes; # Venezuela
    }

После чего добавил в конфигурацию сервера вставку, которая при запросе из данных регионов возвращает ошибку 451, которая как раз недавно была введена в стандарт RFC по случаю возникшей в последнее время моды на блокировку неугодных ресурсов или стран на государственном уровне:

  if ($embargoed_region = yes) {
    return 451;
  }

Чувствовал себя при этом премерзко. Вероятно, что-то подобное чувствует солдат, которому приказано стрелять в мирное население. И дело тут не только в Крыме.

Новая буква в адресной строке. Перевод сайта на HTTPS

Перевёл вчера сайт на HTTPS. Оказалось не так сложно, как я предполагал — на всё ушла пара часов. Функционально ничего не должно было измениться — ну, если не считать того, что я починил вход через Mail.Ru и Яндекс, который не работал уже давно, но обнаружил я это только в процессе тестирования HTTPS. Всю суть изменений иллюстрирует диалог с Юлей:
— Чем занимаешься? — спросила она, когда я ковырялся в настройках.
— Сайт перенастраиваю, — ответил я, не вдаваясь в подробности.

Через пресловутые пару часов я уже листал страницы своего блога, проверяя, всё ли работает. Юля спрашивает:
— А что ты сделал?
Показываю мышкой на адресную строку (уже сам понимая комичность ситуации):
— Видишь, вот тут буковка "s" появилась...

На деле вся суть изменения заключается в том, что теперь вся коммуникация с сайтом происходит по зашифрованному каналу. Ни мне, ни большинству моих посетителей это ровным счётом ничего не даёт, но тут, как обычно, приходится следовать моде, как и в случае с "дружественностью к мобильникам". Главным двигателем тренда является опять же Гугл, который пару лет назад пообещал начать "поражать в правах" (то есть понижать в поисковой выдаче) сайты, не использующие HTTPS.

На самом деле, меня бы и это не сподвигло почесаться, если бы не появление Letsencrypt — удостоверяющего центра, совершившего революцию в процедуре выдачи SSL-сертификатов (то есть того, без чего невозможно сделать у себя HTTPS). Сертификаты от Letsencrypt, во-первых, бесплатны, а во-вторых, процесс их получения и ротации полностью автоматизирован. Концепция начинает потихоньку завоёвывать Интернет, приводя к тому, что в последнее время держать сайт без HTTPS действительно стало моветоном :)

Так что я снова в тренде. Надеюсь, что всё по-прежнему работает, но если что отвалилось — вы знаете, куда писать :)

P.S. Кстати, в процессе настройки имел место забавный "побочный эффект": я впервые прочувствовал всю мощь OpenSource. Подробности, впрочем, интересны будет только айтишникам.