Linux - статьи


Требование на PPP-аутентификацию


Теперь, когда мы доказали, что можем создать VPN, можем добавить еще безопасности, затребовав аутентификацию. Протокол PPP включает в себя методы аутентификации с помощью PAP (Password Authentication Protocol) - протокола аутентификации пароля, и CHAP (Challenge Handshake Authentication Protocol) - протокола аутентификации с предварительным согласованием вызова.

Аутентификация PAP открыто посылает секретные данные (пароль) по соединению, CHAP поступает иначе. В этом случае посылается измененный пароль и вызов от хоста. Поскольку наше PPP-соединение устанавливается через зашифрованное SSH-соединение, в данном случае нет причин предпочитать аутентификацию CHAP аутентификации PAP.

Чтобы быть абсолютно уверенным в том, что соединение установлено именно с той машиной, с которой нужно, можно сделать так, чтобы демон PPP требовал аутентификации на обоих концах соединения. Конечно, это уже несколько чересчур, поскольку проверка обеих конечных точек производится с помощью SSH: клиентская машина аутентифицируется – по идентификатору SSH, а сервер – по хостовому ключу SSH.

И все же, если вы хотите установить на вашем соединении PAP или CHAP -аутентификацию, нужно будет отредактировать соответственно файл /etc/ppp/pap-secrets или /etc/ppp/chap-secrets. Правильным выбором аргументов name, remotename и user команды pppd мы можем улучшить читаемость файлов /etc/ppp/{pap-secrets chapsecrets}.

Например, на клиентской машине будем использовать следующие аргументы pppd: debug require-pap show-password name vpn1-client \ user vpn1-client remotename vpn1-server

На сервере используем следующие аргументы: debug require-pap show-password name vpn1-server \ user vpn1-server remotename vpn1-client

На обоих хостах в файлах /etc/ppp/pap-secrets увидим следующее:



# Username Server Password ip_addrs
vpn1-server vpn1-client “somepw” *
vpn1-client vpn1-server “otherpw” *

Для дополнительной безопасности можно зашифровать пароль на требующей аутентификации машине с помощью команды crypt(). Иными словами, машине vpn1-client не нужно знать пароль машины vpn1-server и она может держать зашифрованный пароль в соответствующем поле. Следовательно, файл /etc/ppp/pap-secrets на клиентской машине будет выглядеть так:


# Username Server Password ip_addrs
vpn1-server vpn1-client “8x5X.K/YftXJQ” *
vpn1-client vpn1-server “someotherpassword” *
В качестве быстрого способа сгенерировать версию пароля с помощью crypt() можно предложить такой скрипт Perl: machine$ perl -e ‘print ( “Encrypted Password: “, crypt(“somepw”, “8x”), “\n”)’

Выходные данные этого скрипта будут выглядеть примерно так: Encrypted Password: 8x5X.K/YftXJQ

При использовании CHAP вместо PAP, все делается аналогичным образом, за исключением того, что используется файл /etc/ppp/chap-secrets, в командной строке команды pppd указывается require-chap и шифровка пароля с помощью crypt() не производится. Аутентификация CHAP в силу своей архитектуры не может обрабатывать шифрованные пароли.

В представленном примере аутентификация требуется и на клиентской машине и на сервере. Можно проводить аутентификацию только для одного из концов соединения. Просто замените require-{pap, chap} на noauth на том конце, на которого аутентификации быть не должно.


Содержание раздела