Участник:Edward Chernenko/GNU Identd
Материал из Википедии — свободной энциклопедии
- Это статья — общий обзор GNU Identd.
- Более подробная информация находится в статье /Документация.'
Содержание |
GNU Identd (читается гну́ идэнт дэ́) — это сервер, встроенный в ядро Linux в качестве модуля и реализующий протокол ident (RFC 1413). Был написан в 2006 году Эдуардом Черненко.
Схема работы ident
Начальные условия: на компьютере клиента работает identd. Клиент обращается к внешнему серверу, который умеет выполнять ident-проверку.
- Клиент посылает запрос.
- Перед посылкой ответа сервер спрашивает у клиентской машины по порту 113 имя пользователя, сделавшего запрос, и указывает номера портов соединения с обеих сторон.
- identd, слушающий порт 113, отправляет ответ.
- Сервер получает ответ и что-нибудь с ним делает (скажем, пишет в лог), после чего, в свою очередь, отсылает ответ клиенту.
Применение ident
- В IRC: некоторые IRC-сервера требуют обязательного ответа от identd на стороне входящего в сеть пользователя.
- Для фильтрации спама, исходящего с локального компьютера (например, на хостингах): программа sendmail спрашивает у identd, кто послал письмо, и приписывает к письму настоящее имя отправителя. Если «подписанное» письмо со спамом попадёт после этого на другой компьютер под тем же административным контролем, то локальный спаммер будет моментально выявлен и (впоследствии) заблокирован.
- Для аутентификации в пределах одного компьютера в тех ОС, в которых нет возможности проверить отправителя сообщения через UNIX-сокет (т. н. схема unix credentials).
Ограничения безопасности
- Никогда нельзя доверять данным, которые поступают от чужих ident-серверов (то есть тех, которые настраивали не вы), потому что они могут быть подделаны/скрыты. Ни в коем случае нельзя использовать identd для аутентификации по сети, даже в случае с доверенными клиентами, так как взлом клиентской машины приведёт к взлому доверяющего ей сервера (см. также межсистемное доверие).
- Иногда для клиента бывает нежелательным «светиться» в интернете. Примером того могут служить разные боты, работающие по какой-либо причине с привилегиями пользователя root. GNU Identd имеет возможность контролируемой суперпользователем маскировки (правила которой задаются через псевдофайл в файловой системе proc).
Особенности GNU identd
Демон GNU Identd запускает два потока. Один ожидает запросов со стороны клиентов, а другой следит за изменениями файла /etc/passwd (в котором во всех UNIX-системах хранится информация о пользователе) с помощью inotify. Таким образом, большую часть времени оба потока заморожены и не влияют на производительность системы в целом.
Демон хранит три хеш-таблицы. Одна — результат обработки /etc/passwd; её обновление происходит при пробуждении inotify-потока. Другая — данные о маскировках, заданных администратором, и третья — суммарная таблица (первые две таблицы, «сложенные» так, что маскировка всегда переписывает данные из /etc/passwd). Последние две таблицы отсортированы по алфавиту для удобства бинарного поиска.
В GNU Identd применяется очень быстрый парсер /etc/passwd, устойчивый ко многим ошибкам в самом файле. Кроме того, при синтаксическом разборе используется очень небольшое фиксированное количество памяти.
GNU Identd обходит многие интерфейсы, которые используются его многочисленными аналогами, работающими в userspace. Например, обычно информация о соединениях читается в псевдофайле /proc/net/tcp. Вместо этого GNU Identd напрямую просматривает хэш-таблицу соединений ядра, что даёт существенный прирост производительности (это критично в случае использования для подписывания писем, смотри выше).
Маскировка пользователей
Суперпользователь (root, UID 0) имеет доступ на запись в /proc/net/identd/hide. На данный момент демон понимает следующие команды (ниже примеры с пояснениями):
- 999 someuser
- маскирует пользователя с UID 999 как someuser.
- 999
- стирает ранее установленное правило маскировки для UID 999
- 999 :
- выдаёт ошибку HIDDEN-USER при запросе о владельце соединения, которым является UID 999.
Если маскировка не нужна, то её код можно исключить при компиляции модуля (есть соответствующая опция конфигурации ядра). Она будет отключена по умолчанию, если вы выключите поддержку procfs.
Часто задаваемые вопросы
- Почему есть только один поток обработки?
- Потому что ядро Linux — монолитное, то есть для его внутренних потоков не существует вытесняющей многозадачности. Соответственно, преимущество у многопоточных демонов уровня ядра проявляется только на многопроцессорных системах. Несколько потоков было бы целесообразно использовать в, например, HTTP-сервере (см. также Tux), но не в identd, время обработки запроса которым крайне мало́.
Плюсы и минусы
За. Производительность: существенно быстрее всех своих аналогов.
За. Безопасность: одни из самых устойчивых парсеров конфигурации.
За. Приватность: суперпользователь может маскировать некоторых пользователей, если это необходимо.
Против. Не даёт запустить другой identd на той же машине, так как занимает порт 113 и (пока) не может прекратить его прослушивание без выгрузки модуля (особенно критично, если GNU Identd встраивается непосредственное в ядро).
Аналоги
Протокол ident — это de-facto наиболее популярная тема для продвинутого «Hello, World» (то есть лучшее направление при серьёзном изучении программирования). В связи с этим, количество демонов, его реализующих, огромно. Ниже даны ссылки на наиболее распространённые и чаще всего используемые сервера такого класса.