Google открыл наработки, связанные с защищённым сетевым протоколом PSP

Компания Google объявила об открытии спецификаций и эталонной реализации протокола PSP (PSP Security Protocol), применяемого для шифрования трафика между датацентрами. Протокол использует похожую на IPsec ESP (Encapsulating Security Payloads) архитектуру инкапсуляции трафика поверх IP, обеспечивая шифрование, криптографический контроль целостности и аутентификацию источника. Код реализации PSP написан на языке Си и распространяется под лицензией Apache 2.0.

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

В качестве транспорта для передачи данных используется протокол UDP. Пакет PSP начинается с заголовка IP, после которого следует заголовок UDP и затем собственный заголовок PSP с информацией о шифровании и аутентификации. Далее прикрепляется содержимое оригинального пакета TCP/UDP, которое завершается финальным блоком PSP с контрольной суммой для подтверждения целостности. Заголовок PSP, а также заголовок и данные инкапсулируемого пакета всегда аутентифицированы для подтверждения подлинности пакета. Данные инкапсулируемого пакета могут могут быть зашифрованы, при этом допускается возможность выборочного применения шифрования с оставлением части TCP-заголовка в открытом виде (при сохранении контроля подлинности), например, для предоставления возможности инспектирования пакетов на транзитном сетевом оборудовании.


PSP не привязывается к какому-то определённому протоколу обмена ключами, предлагает несколько вариантов формата пакетов и поддерживает использование разных криптоалгоритмов. Например, предоставляется поддержка алгоритма AES-GCM для шифрования и проверки подлинности (аутентификации) и AES-GMAC для проверки подлинности без шифрования непосредственных данных, например когда данные не представляют ценности, но нужно гарантировать, что они не были подменены во время передачи и именно те, что были отправлены изначально.

В отличие от типовых VPN-протоколов в PSP применяется шифрование на уровне отдельных сетевых соединений, а не всего канала связи, т.е. PSP использует отдельные ключи шифрования для разных туннелируемых UDP- и TCP-соединений. Подобный подход даёт возможность добиться более строгой изоляции трафика от разных приложений и обработчиков, что актуально при выполнении на одном сервере приложений и сервисов разных пользователей.

В Google протокол PSP применяется как для защиты собственных внутренних коммуникаций, так и для защиты трафика клиентов Google Cloud). Протокол изначально рассчитан на эффективную работу в инфраструктурах уровня Google и должен обеспечивать аппаратное ускорение шифрования в условиях наличия миллионов активных сетевых соединений и установки сотен тысяч новых соединений в секунду.

Поддерживается два режима работы – “stateful” и “stateless”. В режиме “stateless” ключи для шифрования передаются сетевой карте в дескрипторе пакета, а для расшифровки извлекаются из присутствующего в пакете поля SPI (Security Parameter Index) при помощи мастер-ключа (256-bit AES, хранится в памяти сетевой карты и заменяется каждые 24 часа), что позволяет экономить память сетевой карты и минимизировать информацию о состоянии шифрованных соединений, хранимую на стороне оборудования. В режиме “stateful” ключи для каждого соединения хранятся на сетевой карте в специальной таблице, по аналогии тем как реализовано аппаратное ускорение в IPsec.


PSP предоставляет своеобразную комбинацию возможностей протоколов TLS и IPsec/VPN. TLS подходил Google с точки зрения защиты на уровне отдельных соединений, но не устраивал из-за недостаточной гибкости для аппаратного ускорения и отсутствия поддержки UDP. IPsec обеспечивал независимость от протоколов и хорошо поддерживал аппаратное ускорения, но не поддерживал привязку ключей к отдельным соединениям, был рассчитан лишь на небольшое число создаваемых туннелей и имел проблемы с масштабированием аппаратного ускорения из-за хранения полного состояния шифрования в таблицах, хранимых на сетевой карте (например, для обработки 10 млн соединений требуется 5 ГБ памяти).

В случае PSP информация о состоянии шифрования (ключи, векторы инициализации, порядковые номера и т.п.) может передаваться в TX-дескрипторе пакета или в форме указателя на паять хост-системы, не занимая память сетевой карты. По данным Google ранее на шифрование RPC-трафика в инфраструктуре компании тратилось примерно 0.7% от вычислительной мощности и большой объём памяти. Внедрение PSP за счёт привлечения средств аппаратного ускорения позволило снизить этот показатель до 0.2%, сэкономив 0.5% общего энергопотребления.

Release. Ссылка here.