Опубликован: 21.11.2006 | Уровень: специалист | Доступ: платный
Лекция 6:

Протокол POP3

Аннотация: В данной лекции: описывается протокол POP3; показывается реализация POP3 в ОС Linux.

В этой лекции

  • Описание протокола POP3
  • Реализация POP3 в ОС Linux

В предыдущей лекции описывался процесс пересылки почтового сообщения пользователю удаленного компьютера с использованием протокола SMTP. В начале 80-х годов пользователь, которому предназначалось электронное письмо, должен был находиться за терминалом и быть зарегистрированным в системе, чтобы получить и прочесть электронное сообщение с помощью примитивной программы текстового процессора. Сегодня положение вещей в корне изменилось. Пользователи компьютеров хотят иметь свободу во времени и пространстве при чтении своей электронной почты; кроме того, они хотят это делать с помощью приятных графических интерфейсов. Если по каким-либо причинам пользователь не может быть допущен непосредственно на почтовый сервер под управлением ОС Linux для чтения своей почты в среде X Window, то наилучший выход в такой ситуации — организовать такому пользователю соединение с сервером по локальной сети. Тогда с помощью соответствующего клиентского программного обеспечения на локальном ПК пользователь сможет обращаться к своему почтовому ящику на сервере. Протокол, который позволяет считывать почтовые сообщения с удаленного почтового сервера, описан в RFC 1939 и назван протоколом почтового офиса Post Office Protocol (POP). В настоящее время используется версия 3 этого протокола, отсюда название — POP3.

Описание протокола POP3

Подобно протоколу SMTP (описанному в "Протокол SMTP" , "Протокол SMTP"), работа протокола POP3 также основана на использовании набора команд. Сервер POP3 прослушивает TCP-порт номер 110 на предмет запросов на установку соединения и отвечает на них, выдавая специальную строку-приглашение, которая сигнализирует о его готовности к приему команд. Один из методов убедиться в том, что на данном хост-компьютере запущен сервер POP3 — попытаться зайти с помощью telnet на порт 110. Если при этом вы получите соответствующее приглашение сервера POP3, значит, POP3-сервер работает на данном компьютере. В листинге 6.1 представлен пример такого сеанса.

1 [frank@shadrach frank]$ telnet localhost 110
2 Trying 127.0.0.1...
3 Connected to localhost.
4 Escape character is '^]'.
5 +OK POP3 localhost v7.59 server ready
6 QUIT
7 +OK Sayonara
8 Connection closed by foreign host.
9 [frank@shadrach frank]$
Листинг 6.1. Пример сеанса с клиентом POP3

В строке 1 показан пример вызова соединения с портом TCP 110 на локальном компьютере с помощью команды telnet. Строка 5 представляет собой приглашение, выдаваемое сервером POP3. В строке 6 клиентом задается POP3-команда завершить сеанс работы с сервером, а в строке 7 представлено прощальное сообщение, выдаваемое сервером POP3. По завершении сеанса сервер POP3 инициирует закрытие TCP-соединения. Как правило, клиент отреагирует на закрытие TCP-соединения.

Первое, что происходит при сеансе POP3, — это регистрация клиента на сервере. Существует несколько способов регистрации. После регистрации на сервере POP3 клиент посылает на сервер запрос с требованием проверить, имеются ли в почтовом ящике с соответствующим идентификатором пользователя сообщения. В функции протокола POP3 не входит обеспечение клиента возможностями манипулирования сообщениями внутри его почтового ящика. Протокол POP3 всего лишь посылает список имеющихся у него для клиента сообщений, и высылает каждое из них клиенту. Клиент же может производить операции над сообщениями, только после получения их к себе на локальный компьютер из почтового ящика.

Методы установления подлинности клиента в POP3

После того как клиент POP3 установил TCP-соединение с сервером, он должен идентифицировать себя. Это одновременно является подтверждением того, что сообщения посылаются именно тому пользователю, для которого они предназначены. Стандартная проверка подлинности пользователя в POP3 выполняется с помощью набора команд для идентификации пользователя и пароля. К сожалению, при регистрации на сервере передача идентификатора пользователя и пароля осуществляется в текстовом виде. Конечно, такой метод использовать опасно, особенно в тех случаях, когда при установлении соединения с удаленным сервером пакеты проходят через неизвестные сети. Устранить эти недостатки попытались в документе RFC 1734, где описывается более безопасный способ подключения к серверу POP3 посредством команды AUTH. В последующих разделах описываются оба метода проверки подлинности клиентов, а также третий, более новый метод под названием АPOP.

Команды USER/PASS

Комбинация команд USER/PASS — самая простая в реализации, но в то же время самая опасная с точки зрения безопасности. Каждый раз при соединении клиента с сервером POP3 с целью проверки почты по сети посылается его идентификатор пользователя и пароль в виде текста в формате ASCII. Это просто находка для хакера!

Формат этих команд следующий:

USER username
PASS password

В роли username выступает идентификатор пользователя для сервера POP3. Соответственно, параметр password означает пароль для этого идентификатора пользователя. В листинге 6.2 показан пример сеанса POP3 с применением комбинации USER/PASS.

1 [melanie@shadrach melanie]$ telnet localhost 110
2 Trying 127.0.0.1...
3 Connected to localhost.
4 Escape character is '^]'.
5 +OK POP3 localhost v7.59 server ready
6 USER melanie
7 +OK User name accepted, password please
8 PASS toybox
9 +OK Mailbox open, 0 messages
10 QUIT
11 +OK Sayonara
12 Connection closed by foreign host.
13 [melanie@shadrach melanie]$
Листинг 6.2. Пример регистрации клиента POP3 с использованием USER/PASS

В строке 6 клиент посылает команду USER со своим идентификатором пользователя в текстовом виде. В ответ сервер POP3 запрашивает пароль для этого пользователя. В строке 8 клиент посылает пароль на сервер. После того как получен пароль, производится сравнение комбинации идентификатор пользователя/пароль с имеющимися на сервере. Единственная защита сервера POP3 заключается в том, что сервер не возвращает ответ клиенту о неправильности идентификатора пользователя, а дожидается ввода пароля. Это исключает возможность подбора хакерами корректных идентификаторов пользователя для данного хоста POP3. В листинге 6.3 можно наблюдать разницу между реакцией на неправильный пароль для корректного идентификатора и на неправильный идентификатор пользователя.

1 [rich@shadrach rich]$ telnet localhost 110
2 Trying 127.0.0.1...
3 Connected to localhost.
4 Escape character is '^]'.
5 +OK POP3 localhost v7.59 server ready
6 USER rich
7 +OK User name accepted, password please
8 PASS hello
9 -ERR Bad login
10 USER baduser
11 +OK User name accepted; password please
12 PASS hello
13 -ERR Bad login
14 QUIT
15 +OK Sayonara
16 Connection closed by foreign host.
17 [rich@shadrach rich]$
Листинг 6.3. Пример попыток регистрации на сервере POP3

В строке 6 задано корректное имя пользователя, но в 8-й строке набран неправильный пароль. Ответ сервера POP3 в строке 9 вполне понятен и в пояснениях не нуждается. В строке 10 делается попытка подключиться к серверу с неправильным идентификатором пользователя, на что в строке 13 получен соответствующий ответ сервера POP3. Обратите внимание, что и в той, и в другой ситуации сервер сгенерировал одинаковое сообщение об ошибке. Это также препятствует подбору хакерами корректных идентификаторов пользователя с помощью обращения к серверу POP3. Конечно, имеется и обратная сторона медали: такие сообщения могут ввести администраторов почтовых систем в заблуждение при поиске неполадок.

Применение идентификатора пользователя и пароля открытым текстом при работе с POP3 становится еще более опасным, когда пользователь проверяет содержимое почтового ящика несколько раз в день (или в час). Большинство клиентских программ для работы с электронной почтой можно конфигурировать так, чтобы они обращались к почтовому ящику через определенные интервалы времени. Это подарок для хакера, так как при помощи сетевого анализатора он легко может получить идентификатор и пароль пользователя. Эти недостатки были в некоторой степени устранены с помощью команды APOP, описанной в RFC 1939.

Valentin Diduk
Valentin Diduk
Украина, одесса, кпи, 2010
Евгений Олабин
Евгений Олабин
Беларусь, Гродно