Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Авторизация и PPP

С PPP каждая система может требовать, чтобы другой конец линии опознал себя, используя один из двух опознавательных протоколов. Это Password Authentication Protocol (PAP) и Challenge Handshake Authentication Protocol (CHAP). Когда связь установлена, каждый может запросить другой конец линии, чтобы опознать себя, независимо от того, является ли он вызывающим или вызываемым. Ниже я буду говорить о "клиенте" и "сервере", когда захочу сделать различие между системой опознания и аутенфикатором. PPP daemon может спрашивать о подлинности, посылая LCP-запрос конфигурации, опознающий желаемый протокол.

PAP против CHAP

PAP в основном работает как нормальная процедура входа в систему. Клиент опознает себя, посылая имя пользователя и пароль серверу, который сравнивает их с базой данных. Этот метод легко уязвим для посторонних наблюдателей, которые могут попытаться получить пароль, слушая последовательную линию.

CHAP не имеет этих недостатков. С CHAP аутенфикатор (сервер) посылает беспорядочно сгенерированную "challenge"-строку клиенту, наряду с именем хоста. Клиент использует имя хоста (hostname) для того, чтобы искать соответствующий шифр, объединяет его с challenge и шифрует строку, используя однонаправленную hash-функцию. Результат будет возвращен на сервер наряду с hostname клиента. Сервер теперь выполняет те же самые вычисления и опознает клиента.

Другая особенность CHAP то, что он не требует опознания клиента для опознания самого себя при запуске, но посылает challenge в определенные промежутки времени, чтобы удостовериться, не был ли клиент заменен злоумышленником, например, переключив телефонные линии.

Пакет pppd хранит секретные ключи для CHAP и PAP в двух отдельных файлах, называемых соответственно /etc/ppp/pap-secrets и /etc/ppp/chap-secrets. Записывая удаленный хост в один или другой файл, Вы имеете хороший контроль над CHAP или PAP.

По умолчанию pppd не требует установления подлинности удаленной машины, но соглашается опознавать себя, когда она запросит опознание. Так как CHAP намного более совершенен, чем PAP, pppd пробует использовать его всякий раз, когда это возможно. Если удаленная машина этого не поддерживает, или если pppd не может найти CHAP-шифр для удаленной системы в файле chap-secrets, он возвращается к PAP. Если он не имеет также и PAP-шифра, то связь закроется.

Это поведение может быть изменено. Например, когда дается ключевое слово auth, pppd требует, чтобы другой конец линии опознал сам себя. pppd согласится использовать CHAP или PAP для этого, как только будет имеет соответствующий шифр в базе данных CHAP или PAP соответственно. Имеются другие опции, чтобы включить или выключить частный опознавательный протокол, но я не буду описывать их здесь.

Если все системы, с которыми Вы работаете по PPP соглашаются опознавать самих себя, Вы должны поместить опцию auth в глобальный файл /etc/ppp/options и определить пароли для каждой системы в файле chap-secrets. Если система не поддерживает CHAP, добавьте запись к файлу pap-secrets. Таким образом, Вы можете удостовериться в том, что никакая неопознанная система не соединяется с Вашим хостом.

Следующие два раздела обсуждают два PPP файла шифров: pap-secrets и chap-secrets. Они размещены в /etc/ppp и содержат тройки клиентов, серверов и паролей, необязательно сопровождаемых списком адресов IP. Интерпретация клиента и сервера отлична для CHAP и PAP.

Файл для CHAP

Когда надо опознать себя с некоторым сервером, используя CHAP, pppd ищет в файле chap-secrets запись с именем клиента, равным локальному hostname, и именем сервера, равного удаленному hostname, посланному в CHAP Challenge. При требовании опознавания себя роли просто поменялись: pppd будет искать запись с именем клиента, приравненным к удаленному hostname (посланному в CHAP-ответе клиенту) и имя сервера, приравненное локальному хосту.

Типовой файл chap-secrets для vlager:

# CHAP secrets for vlager.vbrew.com
#
# client         server           secret                addrs
#---------------------------------------------------------------------
vlager.vbrew.com  c3po.lucas.com   "Use The Source Luke" vlager.vbrew.com
c3po.lucas.com    vlager.vbrew.com "arttoo! arttoo!"     c3po.lucas.com
*                 vlager.vbrew.com "TuXdrinksVicBitter"  pub.vbrew.com

При установлении PPP-связи с c3po, c3po просит vlager опознать себя, используя CHAP и посылая CHAP challenge. Затем pppd просматривает файл chap-secrets для записи с клиентской областью, приравненой к vlager.vbrew.com и областью сервера, приравненной к c3po.lucas.com, и находит первую строку, показанную выше. Затем производится CHAP-ответ из challenge string и шифра (Use The Source Luke) на машину c3po.

В то же самое время pppd составляет CHAP challenge для c3po, содержащую уникальную challenge string, и полностью квалифицированное доменное имя vlager.vbrew.com. В ответ c3po создает CHAP-ответ способом, который мы только что обсудили, и возвращает его vlager. Теперь pppd извлекает клиентский hostname (c3po.vbrew.com) из ответа и ищет в файле chap-secrets строку, соответствующую c3po как клиенту и vlager как серверу. Вторая строка задает pppd объединить CHAP challenge с паролем (arttoo! arttoo!), зашифровать результат и сравнить CHAР-ответом c3po.

Произвольное четвертое поле перечисляет адреса IP, которые допустимы для клиентов в первом поле. Адреса могут быть заданы в dotted quad notation или как имена машин, которые будут найдены через сервер имен. Например, если c3po запросил во время IPCP-переговоров использование IP-адреса, который не в этом списке, запрос будет отклонен, и IPCP будет выключено. В типовом файле, показанном выше, c3po будет ограничен использованием собственного адреса. Если поле адреса пусто, будут позволяться любые адреса. Задание тире (-) запрещает использование IP-адреса.

Третья строка в примере файла chap-secrets позволяет любому хосту установить связь PPP с vlager потому, что * в поле клиента или сервера соответствует любому hostname. Единственое требование: он знает пароль и использует адрес pub.vbrew.com. Запись с групповым символом для имен машин может появится где угодно в файле шифров, так как pppd будет всегда использовать наиболее подходящую запись, которая применима к паре сервер/клиент.

Нужно упомянуть способ, которым pppd находит имена машин: он ищет их в файле шифров. Как было объяснено выше, удаленное имя всегда передается в CHAP Challenge или в Response packet. Локальный hostname будет получен, если вызвать функцию gethostname(2). Если Вы установили имя системы в Ваше неквалифицированное hostname, то должны задать для pppd опцию domain:
# pppd -domain vbrew.com

Это добавит имя домена Brewery к vlager для всех действий по авторизации. Для локального имени интересны также опции usehostname и name. Когда Вы задаете локальный IP-адрес в командной строке, используя local: remote и имя local вместо IP-адреса, pppd использует его как локальный hostname.

Файл для PAP

Файл шифров PAP очень похож на тот, который используется CHAP. Первые два поля всегда содержат имена пользователя и сервера, третье поле хранит шифр PAP. Когда удаленная машина посылает запрос опознания, pppd использует запись, которая имеет поле сервера равное локальному hostname, и поле пользователя, равное имени пользователя, посланному в запросе. Когда опознание произойдет, pppd выберет шифр, который будет послан с полем пользователя, приравненным к локальному имени пользователя, и полем сервера, приравненным к удаленному hostname.

Образец файла шифров для PAP:
# /etc/ppp/pap-secrets
#
# user          server          secret          addrs
vlager-pap      c3po            cresspahl       vlager.vbrew.com
c3po            vlager          DonaldGNUth     c3po.lucas.com

Первая строка используется для того, чтобы опознать нас, когда мы соединяемся с c3po. Вторая описывает, как пользователь c3po должен опознавать себя при соединении с нами.

Имя vlager-pap в столбце имени пользователя мы посылаем на c3po. По умолчанию pppd выберет локальный hostname как имя пользователя, но Вы можете также определить различные имена, давая опцию user, сопровождаемую эти именем.

При выборе записи из файла pap-secrets для авторизации pppd должен знать имя удаленного хоста. Поскольку он не имеет способа нахождения такой информации, Вы должны точно определить его в командной строке, используя ключевое слово remotename, сопровождаемое соответствующим hostname. Например, используя вышеупомянутую запись для установления подлинности c3po, мы добавляем следующую опцию к командной строке pppd:
# pppd ... remotename c3po user vlager-pap

В четвертом поле (и всех следующих) Вы можете определить, какие адреса IP разрешены точно, как в файле шифров CHAP. Удаленная машина затем может запроситьь только адреса из этого списка. В типовом файле мы требуем, чтобы c3po использовал реальный адрес IP.

Заметьте, что PAP довольно слабый опознавательный метод, и лучше использовать CHAP, если это возможно. Я не буду здесь описывать PAP в деталях: если Вы заинтересованы в использовании PAP, то найдете больше сведений на pppd(8) man-странице.