Требование на 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” | * |
Выходные данные этого скрипта будут выглядеть примерно так: Encrypted Password: 8x5X.K/YftXJQ
При использовании CHAP вместо PAP, все делается аналогичным образом, за исключением того, что используется файл /etc/ppp/chap-secrets, в командной строке команды pppd указывается require-chap и шифровка пароля с помощью crypt() не производится. Аутентификация CHAP в силу своей архитектуры не может обрабатывать шифрованные пароли.
В представленном примере аутентификация требуется и на клиентской машине и на сервере. Можно проводить аутентификацию только для одного из концов соединения. Просто замените require-{pap, chap} на noauth на том конце, на которого аутентификации быть не должно.