Pull to refresh

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

Reading time 4 min
Views 16K
Утопающие не собираются спасать себя самостоятельно, поэтому предлагаем вам сделать четыре простых шага к увеличению безопасности посетителей вашего сайта.
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 останутся получат пул энтропии, сгенерированный циклом из миллисекундного таймера.
Tags:
Hubs:
+32
Comments 7
Comments Comments 7

Articles