Как установить и настроить постквантовый VPN OpenVPN

Как установить и настроить постквантовый VPN OpenVPN

Но самый любопыт­ный и интри­гующий пас­саж в отче­те ASC X9 сле­дующий. На момент пуб­ликации отче­та самый боль­шой кван­товый компь­ютер имел 72 кубита. Одна­ко, как ука­зыва­ют авто­ры отче­та, есть мне­ние, что более мощ­ные кван­товые компь­юте­ры сущес­тву­ют, но информа­ция о них не опуб­ликова­на. Авто­ры полага­ют, что могут сущес­тво­вать кван­товые компь­юте­ры при­мер­но со 100 кубита­ми!

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

Не­уди­витель­но, что в 2016 году Наци­ональ­ный инсти­тут стан­дартов и тех­нологий США (NIST) объ­явил кон­курс пост­кван­товых алго­рит­мов для стан­дарти­зации. Уже прош­ло два эта­па кон­курса, для учас­тия в треть­ем эта­пе отоб­рано семь основных алго­рит­мов и восемь аль­тер­натив­ных.

Как ожи­дает­ся, ито­ги треть­его эта­па будут под­ведены к середи­не 2022 года. Один‑два алго­рит­ма для обме­на клю­чами и для под­писи могут стать стан­дарта­ми для США. Не исклю­чен и чет­вертый этап, где могут быть выб­раны алго­рит­мы для при­мене­ния в спе­циаль­ных областях. Пока же работа идет: про­водят­ся семина­ры, пред­став­ленные алго­рит­мы дораба­тыва­ются, раз­рабаты­вают­ся и совер­шенс­тву­ются ата­ки на алго­рит­мы.

Постквантовый VPN

Од­новре­мен­но с алго­рит­мами спеш­но раз­рабаты­вают и при­ложе­ния, которые их реали­зуют. Раз­вива­ется и под­держи­вает­ся про­ект Open Quantum Safe (OQS). В его рам­ках соз­дана биб­лиоте­ка liboqs, вклю­чающая ряд пост­кван­товых алго­рит­мов (они при­веде­ны на схе­ме ниже). Биб­лиоте­ка интегри­рова­на в OpenSSL и некото­рые дру­гие при­ложе­ния.

В Microsoft запус­тили свой про­ект Post-quantum Cryptography и раз­рабаты­вают алго­рит­мы FrodoKEM, SIKE, Picnic и qTESLA, а так­же при­ложе­ния Post-Quantum Crypto VPN, Post-Quantum TLS и Post-Quantum SSH.

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

Как установить и настроить постквантовый VPN OpenVPN
Уп­рощен­ная струк­тура про­ектов, реали­зующих пост­кван­товые алго­рит­мы

Са­мый прос­той путь уста­новить пост­кван­товую OpenVPN — это взять готовые фай­лы у Microsoft. Есть вер­сии для Windows и для Linux.

В Linux архив мож­но рас­паковать пря­мо в корень фай­ловой сис­темы (на боевой сис­теме так делать не сто­ит, но для вир­туал­ки пой­дет):

# mv pq-openvpn-linux-staged.tar.gz /
# tar -xvf pq-openvpn-linux-staged.tar.gz

Ар­хив рас­паку­ется, раз­местив бинар­ник в /usr/local/openvpn и скрипт pq-openvpn.service в /etc/systemd/system.

Все нас­трой­ки пост­кван­товой OpenVPN ана­логич­ны обыч­ной OpenVPN, поэто­му я не буду слиш­ком рас­простра­нять­ся. Раз­ве что замечу, что в кон­фигура­цион­ном фай­ле сер­вера и кли­ента обя­затель­но необ­ходимо задать дирек­тиву ecdh-curve, ина­че обмен клю­чами будет клас­сичес­кий, а не кван­товый. Дефолт ecdh-curve p256_sikep434 (гиб­ридный алго­ритм пер­вого уров­ня крип­тостой­кос­ти), но его все рав­но нуж­но ука­зать.

На стра­нице microsoft/PQCrypto-VPN на GitHub ука­зано, что под­держи­вают­ся толь­ко алго­рит­мы Frodo и SIDH. Да, под­держи­вают­ся, но у меня кли­ент на Windows 10 c дирек­тивой в кон­фиге ecdh-curve frodo1344shake выда­ет ошиб­ку чте­ния памяти. Это, конеч­но, может быть свя­зано с кон­крет­ной кон­фигура­цией моей опе­раци­онной сис­темы, драй­верами или с осо­бен­ностя­ми материн­ской пла­ты. А вот с алго­рит­мами frodo1344aes, frodo976shake, frodo640shake и дру­гими это­го семей­ства, вклю­чая гиб­ридные алго­рит­мы, соеди­нение про­исхо­дит без замеча­ний. Экспе­римен­тируя, я поп­робовал раз­ные алго­рит­мы для обме­на клю­чами, в час­тнос­ти, работа­ют явно не заяв­ленные Microsoft гиб­ридные алго­рит­мы p521_firesiber, p521_ntru_hps4096821 (соот­ветс­твен­но, и чис­тые пост­кван­товые, без клас­сичес­кой кри­вой, тоже работа­ют).

Не забывай, что пост­кван­товые алго­рит­мы в этой реали­зации PQCrypto-VPN работа­ют толь­ко для TLSv1.3, поэто­му в кон­фигах сер­вера и кли­ента сле­дует явно про­писать tls-version-min 1.3.

Раз­работ­чик утвер­жда­ет, что пос­ле соеди­нения есть толь­ко один метод удос­товерить­ся, что обмен клю­чами сос­тоял­ся с исполь­зовани­ем пост­кван­тового алго­рит­ма. На сер­вере в логе необ­ходимо най­ти group_id:

Control Channel: TLSv1.3, cipher TLSv1.3 TLS_CHACHA20_POLY1305_SHA256, group_id 1278 (post-quantum key exchange)
Пост­кван­товый алго­ритм обме­на клю­чами работа­ет!
Пост­кван­товый алго­ритм обме­на клю­чами работа­ет!

На скрин­шоте лога сер­вера эта строч­ка под­чер­кну­та. Вид­но, что пост­кван­товый алго­ритм обме­на клю­чами задей­ство­ван, о чем сви­детель­ству­ет стро­ка post-quantum key exchange, ина­че было бы NOT post-quantum key exchange. В дан­ном слу­чае group_id 1278 (NID OpenSSL) соот­носит­ся с обме­ном клю­чами, задан­ным в дирек­тиве кон­фига OpenVPN ecdh-curve p521_firesaber. То есть это гиб­ридный алго­ритм, сос­тоящий из клас­сичес­кого обме­на клю­чами по про­токо­лу Диф­фи — Хел­лма­на на эллипти­чес­кой кри­вой P-521 и пост­кван­тового механиз­ма инкапсу­ляции клю­ча FireSaber-KEM.

FireSaber-KEM соот­ветс­тву­ет пятому уров­ню крип­тостой­кос­ти и осно­ван на труд­ности решения модуль­ной задачи обу­чения с округле­нием (Module Learning with Rounding — MLWR), которая пред­став­ляет собой вари­ант задачи обу­чения с ошиб­ками (Learning With Erros — LWR). Она, в свою оче­редь, вос­ходит к крип­тогра­фии на решет­ках. Погова­рива­ют, что в NIST крип­тогра­фию на решет­ках любят боль­ше все­го.

Постквантовый OpenSSL

Па­ра слов об аутен­тифика­ции на сер­вере при помощи сер­тифика­тов. Это могут быть как клю­чевые пары, осно­ван­ные на клас­сичес­ких крип­тогра­фичес­ких алго­рит­мах, так и пост­кван­товые схе­мы, а так­же гиб­ридные. На стра­нице про­екта заяв­лены алго­рит­мы Picnic и qTESLA. Но мож­но задей­ство­вать и дру­гие алго­рит­мы, вклю­чен­ные в пост­кван­товый форк OpenSSL (QQS-OpenSSL).

Да­лее я рас­ска­жу, как уста­новить QQS-OpenSSL на Debian 8.9.0.

Для начала понадо­бят­ся зависи­мос­ти:

# apt install cmake gcc libtool libssl-dev make ninja-build git python3-pytest python3-pytest-xdist unzip xsltproc doxygen graphviz

Да­лее кло­ниру­ем код OQS-OpenSSL:

$ git clone --branch OQS-OpenSSL_1_1_1-stable https://github.com/open-quantum-safe/openssl.git OQS-OpenSSL

Кло­ниру­ем и уста­нав­лива­ем биб­лиоте­ку liboqs (ука­зав каталог с QQS-OpenSSL в чет­вертой коман­де):

$ git clone --branch main https://github.com/open-quantum-safe/liboqs.git
$ cd liboqs
$ mkdir build && cd build
$ cmake -GNinja -DCMAKE_INSTALL_PREFIX=/путь/до/OQS-OpenSSL/oqs
$ ninja
# ninja install

Пе­рехо­дим в каталог QQS-OpenSSL и запус­каем сбор­ку:

$ ./Configure no-shared linux-x86_64 -lm
$ make

Все. Даль­ше мож­но генери­ровать пост­кван­товые клю­чи и выпус­кать сер­тифика­ты.

Ес­ли есть пот­ребность при­менять алго­рит­мы под­писи, не вклю­чен­ные по умол­чанию, то до сбор­ки OQS-OpenSSL в фай­ле oqs-template/generate.yml необ­ходимо для это­го алго­рит­ма заменить false на enable и затем выпол­нить две коман­ды:

$ python3 oqs-template/generate.py
$ make generate_crypto_objects

Поп­робу­ем в качес­тве алго­рит­ма под­писи picnic_L1_UR. Во‑пер­вых, потому, что пос­ле дол­гой зимы — пик­ник, во‑вто­рых, потому, что в этом алго­рит­ме при­мене­но пре­обра­зова­ние Унру, которое пред­полага­ется стой­ким в модели кван­тового слу­чай­ного ора­кула.

Кван­товый слу­чай­ный ора­кул — схе­ма, при которой про­тив­ник может делать кван­товые (в супер­позиции) зап­росы слу­чай­ному ора­кулу. Это отли­чает­ся от более рас­простра­нен­ной клас­сичес­кой конс­трук­ции Фиата — Шамира (Fiat — Shamir transform, FS), которая исполь­зует­ся в алго­рит­мах picnic-L1-FS и ана­логич­ных.

Что каса­ется общей харак­терис­тики Picnic, то это алго­ритм, осно­ван­ный на крип­тогра­фичес­ком про­токо­ле доказа­тель­ства с нулевым раз­гла­шени­ем (Zero-knowledge proof, ZKP). Про­токол zk-SNARK того же семей­ства ZKP, что и Picnic, исполь­зует­ся в крип­товалю­те Zcash, которую раз­работ­чики позици­они­руют как наибо­лее ано­ним­ную, не поз­воля­ющую узнать ни сум­му тран­закции, ни отпра­вите­ля, ни получа­теля.

Итак, генери­руем клю­чи по алго­рит­му picnicl1ur и выпус­каем сер­тифика­ты. Для удобс­тва в катало­ге OQS-OpenSSL соз­дадим под­каталог CERTFICATES и выпол­няем обыч­ные для OpenSSL коман­ды, изме­нив толь­ко алго­ритм клю­ча:

$ apps/openssl genpkey -algorithm picnicl1ur -out CERTIFICATES/picnic_ca.key

$ apps/openssl req -x509 -key CERTIFICATES/picnic_ca.key -out CERTIFICATES/picnic_ca.crt -subj "/CN=Picnic CA" -days 100 -sha512 -config apps/openssl.cnf

Прос­матри­ваем сер­тификат:

$ apps/openssl  x509 -noout -text -in CERTIFICATES/picnic_ca.crt
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            45:fd:ea:12:2c:a5:e5:d9:a6:97:46:57:bb:ad:a6:41:f2:d6:e9:ee
        Signature Algorithm: picnicl1ur
        Issuer: CN = Picnic CA
        Validity
            Not Before: Apr 12 05:48:21 2021 GMT
            Not After : Jul 21 05:48:21 2021 GMT
        Subject: CN = Picnic CA
        Subject Public Key Info:
            Public Key Algorithm: picnicl1ur
                picnicl1ur Public-Key:
                pub:
                    02:a3:97:fc:dd:2f:5d:83:3c:91:53:bb:af:b1:7f:
                    75:f1:21:1d:78:e3:f9:ca:fb:3a:61:a5:09:fe:22:
                    d4:72:ac
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                82:AA:E9:CA:CB:63:4A:F4:78:AC:63:1F:F3:05:6D:64:B9:44:77:2E
            X509v3 Authority Key Identifier:
                keyid:82:AA:E9:CA:CB:63:4A:F4:78:AC:63:1F:F3:05:6D:64:B9:44:77:2E

X509v3 Basic Constraints: critical
            CA:TRUE
Signature Algorithm: picnicl1ur
     21:82:09:59:16:85:a6:68:52:08:68:a6:02:99:aa:a9:90:14:

Да­лее генери­руем клю­чи и выпус­каем сер­тифика­ты для сер­вера и кли­ентов. Для полез­ных рас­ширений сер­тифика­та сна­чала соз­дадим файл extensions при­мер­но с таким содер­жимым:

[server]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS = 192.168.3.5
[client]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth

И выпол­няем коман­ды для сер­вера:

$ apps/openssl req -new -newkey picnicl1ur -keyout CERTIFICATES/server.key -out CERTIFICATES/server.csr -nodes -subj "/CN=mysite.ru" -config apps/openssl.cnf -sha512
$ apps/openssl x509 -req -in CERTIFICATES/server.csr -out CERTIFICATES/server.crt -CA CERTIFICATES/picnic_ca.crt  -days 50 -CAkey CERTIFICATES/picnic_ca.key  -CAcreateserial -sha512 -extensions server -extfile extensions

Для сер­тифика­та кли­ента ана­логич­но, толь­ко пишем client вмес­то server.

Го­товые фай­лы PQCrypto-VPN алго­ритм picnicl1ur не под­держи­вает, поэто­му при­дет­ся соб­рать самому. Бла­го в Microsoft написа­ли скрипт build.py, который все дела­ет авто­мати­чес­ки. Необ­ходимые зависи­мос­ти ука­заны в начале это­го скрип­та.

Заключение

Пос­ле того как пост­кван­товые алго­рит­мы будут стан­дарти­зиро­ваны, во всем мире нач­нется переход на пост­кван­товую крип­тогра­фию. Бра­узе­ры будут переве­дены на пост­кван­товую крип­тогра­фию (в Google уже про­води­ли такой экспе­римент в Chrome Canary). Переход будет дол­гий и тру­доем­кий, поэто­му уже появи­лись пер­вые фир­мы, пред­лага­ющие помощь во внед­рении пост­кван­товой крип­тогра­фии, нап­ример PQShield при Оксфорд­ском уни­вер­ситете или рос­сий­ская QApp.

ВКонтакте
OK
Telegram
WhatsApp
Viber

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *