Безопасность ваших юзеров: OAuth, SSL, P2P-чат с RSA, гейт в i2p

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

Шаг 1. Без регистрации


Если у пользователя нет учетной записи, то ее не сломают и не украдут. Основной функционал сайта должен быть доступен без регистрации. Если по каким-то причинам регистрация для некоторых пользователей нужна – используем OAuth по максимуму. Пусть у гугла с вконтакте голова болит от одинаковых паролей, а не у вас. Делается за пару часов по инструкции (тут много ).

Последствия такого шага: больше «одноразовых» профилей.
Шаг 2. Только SSL, только хардкор

В эпоху тотальных логов юзеры могут опасаться использовать ваш сайт только потому, что не хотят, что бы кто-то знал о том, какие именно страницы они просматривали, что они искали в вашем поисковике, какие статьи читали, какие сообщения на форуме оставляли. Особенно важно если у вас много разного (как у нас) контента. Решение простое – включаем https всем.
Бесплатный сертификат получаем например тут.
Берем с официального сайта свежий nginx, ставим, правим конфиги.
Пример конфига:
server {
        listen 80;
        listen 443 ssl;
        ssl_certificate ТУТ_ФАЙЛИК.pem;
        ssl_certificate_key ТУТ_ФАЙЛИК.key.decr;

       location /socket.io/ {
                proxy_pass ХОСТ:ПОРТ_где_крутится_signalmaster;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }

        location / { 

                # для тех кто вдруг не по https
                if ($ssl_protocol = "") {
                        rewrite ^   https://$server_name$request_uri? permanent;
                }

                proxy_pass http://rp_ups;  
        }

        server_name rospravosudie.com www.rospravosudie.com;
}

upstream rp_ups {
# тут наши апстрим-сервера для веба
}


Проверяем все ли работает.

У вас пропадут картинки со сторонних ресурсов, ролики ютуба и прочие, которые вы (или юзеры) размещали с указанием протокола доступа . Лечится достаточно просто – автозаменой http на https в текстах. Если сторонние ресурсы “не умеют ssl”, то картинки пропадут, поэтому лучше закэшировать их к себе заранее. Удобный хинт – всегда использовать // ссылки без указания протокола – по умолчанию браузер будет пытаться открывать их по текущему протоколу (https).

Так же потребуется обновить код счетчиков статистики – Google Analytics, Liveinternet и Яндекс.Метрика замечательно работают по ssl. Проблем с кодами AdSense не возникает, про Яндекс и другие системы – не пробовали.

Необычных последствий с индексацией поисковиками не наблюдается – и Google и Яндекс индексируют как раньше.

Результат: провайдеры не видят какой контент смотрят ваши посетители (и не только провайдеры). Продвинутые пользователи тихо радуются, остальные ничего не замечают.

Примечание: нагрузка на сервер возрастает незначительно, на единицы процентов, на уровне погрешности.

Шаг 3. Cryptico

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

Для сохранения конфиденциальности в общении между пользователями мы реализовали p2p-шифрование на клиентах (в браузере) и не сохраняем закриптованный текст (в идеале его надо пускать напрямую).

В чатах шифруем сообщения между пользователями с использованием RSA. Для этого используем например библиотеку cryptico (лежит на гитхабе github.com/wwwtyro/cryptico), ключи обновляем при каждом сеансе связи.

Чат работает на node.js и socket.io (примеры чатов есть на Хабре). Сигнальный сервер спрятан за nginx (свежий nginx умеет проксировать вебсокеты), через nginx же реализован ssl для сигнального сервера.

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

Шаг 4. Поднимаем зеркало в i2p


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

Пользователей TOR и I2P в рунете примерно одинаковое количество (около 15-20 тысяч ежедневных живых людей), TOR-юзеры справляются самостоятельно, поэтому имеет смысл поднять зеркало в I2P.

Делается это достаточно быстро, по инструкции (http://habrahabr.ru/post/158559/ и habrahabr.ru/post/97996/)

Примечание: не забудьте удалить все лишние javascriptы, коды статистики, вызовы чужих сервисов, картинок и т. д. и т. п. из кода «зеркальной версии», что бы не скомпрометировать случайно ваших посетителей. Разумеется, noscript должен быть установлен у каждого пользователя I2P, равно как и заблокирован доступ к внешним сайтам, но, как показывает практика, обратная ситуация встречается довольно часто.

Последствия: вы не понимаете, кто все эти люди?

В целом же шифрование — это легко и приятно!

В общем, призываем вас сделать рунет чуть-чуть более приватной зоной. Учитывая последние тенденции по внедрению DPI, 12-часового хранения трафика, блокировок без суда-и-следствия в борьбе за копирайт — может пригодится (надеюсь нет).

Попробовать чат можно на сайтике в профиле.
P.S. Конструктивные параноидальные предложения, критика и вопросы от «людей в шапочках из фольги» приветствуется.
P.P.S. Если знаете более надежные аналоги cryptico — пишите в комментарии.

upd. возрождение из небытия, не удивляйтесь :)

upd2. немного информации из удаленных комментариев:

starius:
завести в профиле пользователя поле "torchat", чтобы стимулировать не только шифровать переписку (сайт это уже позволяет) но и скрывать от всех (включая сайт) факт переписки.

symbix:
if ($ssl_protocol = "") { rewrite ^ https://$server_name$request_uri? permanent; }
Это плохой способ. Правильно — примерно так:
server { listen 80; location / { return 301 rospravosudie.com$uri$is_args$args; } }
Хостнейм умышленно записан в явном виде, чтобы те, кто зашел, скажем, по ip-адресу, не пугались красной фигни. server_name же применим не всегда (если он в данной конфигурации гарантированно подходит — можно и его).

Hello1:
301 редирект тоже не верный способ. Его надо комбинировать с HSTS.
add_header Strict-Transport-Security max-age=31536000;
Тогда современные браузеры будут сами заменять все http на https для внутренних ссылок сайта.

ivlad:
RSA1024 по нынешним меркам недостаточно. Нужно использовать RSA2048. Кроме того, у вас не используются современные версии TLS — только 1.0 (и SSLv3). Вам стоит обновить nginx и openssl.

Lockal:
Сколько можно повторять: перестаньте придумывать свои алгоритмы и переделывать чужие, особенно, если вы разбираетесь в криптографии! Вот такой перл в Cryptico встречается несколько раз:
if(navigator.appName == «Netscape» && navigator.appVersion < «5» && window.crypto) {

Действительно, кому нужен нормальный пул энтропии ГСЧ, если navigator.appVersion < «5»? Пусть все пользователи последних версий Firefox, Chrome и IE останутся получат пул энтропии, сгенерированный циклом из миллисекундного таймера.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 7

    +3
    Побочный эффект – отсутствие истории сообщений.… Сообщения можно отправлять только в онлайн.


    Для многих ресурсов это плохо из-за того, что заинтересованные в переписке друг с другом пользователи в большинстве случаев не бывают одновременно в онлайне. Для переписки необходимо решение на основе GPG и плагина к браузеру типа Mailvelope. К сожалению, мне неизвестны простые решения такого типа, подходящие для домохозяек, зарегистрированных на сайтах для показа фотографий кошечек. Поэтому, решение проблемы конфиденциальности переписки, предложенное автором, может оказаться «лучшим из худших».
      0
      Для оффлайн-переписки было бы достаточно сделать хранилище недоставленных шифратов на стороне сайта. Perfect Forward Security пропадёт, к сожалению.

      Распределённое решение для оффлайн-переписки называется BitMessage.

      Кстати, откуда информация, что «заинтересованные в переписке друг с другом пользователи в большинстве случаев не бывают одновременно в онлайне»? Мне казалось, что разные чаты популярнее e-mail, особенно среди домохозяек.
        0
        Форумы, соц. сети и сайты типа Хабра — не чаты. ВК, Одноклассники, Фейсбук — сколько ваших контактов в онлайне вместе с вами? У меня в ФБ сейчас вот только 4 контакта из 59 находятся онлайн, в Одноклассниках — 2 из 60.
          0
          Форумы и сайты типа хабра, если рассматривать личные сообщения, ближе к e-mail, но социальные сети, как я понял, глядя на них со стороны, ближе к чатам, то есть большая часть диалогов происходит между людьми, находящимися онлайн одновременно. Диалоги вконтакте и в mail.ru-агенте выглядят на странице сайта как окошки чатов. Вконтакте предоставлял даже XMPP-API к своим чатам. Именно XMPP, а не почтовые протоколы.
      0
      А зачем старую-то в черновики убрали? И не вернули, а сделали новую? Недоумение.
        +1
        потому что возвращался из ридонли через песочницу, предыдущая версия была скрыта нло.
        +1
        Чтобы шифровать TCP-соединение, а не оффлайн-переписку, лучше RSA заменить на ECDSA. А для обмена ключами ECDH. У RSA слишком длинные ключи.

        Ещё один совет: использовать SSL Server Test. Результаты проверки rospravosudie.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.