Inetd супер-сервер
Часто услуги предоставляются так называемыми демонами (daemons). Демон — это программа, которая слушает определенный порт и ожидает подключения. При установлении связи демон создает дочерний процесс для обработки этого соединения, в то время как основной процесс продолжает ожидать новых запросов.
В большинстве Unix-систем используется "супер-сервер", который создает сокеты для множества услуг и одновременно ожидает подключений к ним. При запросе к одной из этих услуг супер-сервер активирует соответствующий демон для обработки этого запроса. Обычно в роли такого супер-сервера выступает inetd (Internet Daemon). Он запускается при инициализации системы и настраивается с помощью файла /etc/inetd.conf. Некоторые тривиальные услуги, такие как chargen (генерация последовательности символов) или daytime (возвращение текущего времени), интегрированы прямо в inetd.
Запись в файле /etc/inetd.conf имеет следующий формат:
service type protocol wait user server cmdline
- service - имя услуги. Это имя должно соответствовать номеру порта, указанному в файле services.
- type - тип сокета: потоковый (stream, для протоколов, ориентированных на соединение, например TCP) или датаграммный (dgram, например для UDP).
- protocol - имя протокола передачи данных, который используется службой. Должно соответствовать имени протокола из файла протоколов.
- wait - опция, применяющаяся только к датаграммным сокетам. Значения: wait или nowait. Если указано wait, то inetd запустит только один экземпляр демона для данного порта. В противном случае он будет немедленно слушать порт после запуска демона. Эта опция полезна для "однопоточных" серверов, которые обрабатывают все входящие датаграммы и затем завершают работу. Большинство серверов RPC относятся к этому типу и должны указывать wait. "Многопоточные" серверы, позволяющие запускать неограниченное количество экземпляров одновременно, редко используются и должны указывать nowait. Для потоковых сокетов всегда следует использовать nowait.
Следует помнить о важности правильной настройки inetd, так как от неё зависит стабильность и безопасность работы многих сетевых услуг в системе.
- User — это учетная запись пользователя в системе, под которой будет запущена программа. Часто используется учетная запись root, но некоторые услуги могут использовать другие учетные записи. В целях безопасности рекомендуется применять принцип наименьших привилегий: если программа не требует повышенных прав для своей работы, ей не следует предоставлять таковые. Например, NNTP-сервер новостей обычно работает от пользователя news, в то время как менее привилегированные услуги, такие как tftp или finger, запускаются от пользователя nobody.
- Server — полный путь к программе сервера, которая будет выполнена.
- Cmdline — командная строка, с которой будет запущена программа сервера. Включает в себя аргумент 0, который обычно представляет собой имя команды. В некоторых случаях это может быть не имя программы, так как некоторые программы могут вести себя по-разному в зависимости от того, с каким именем они были вызваны.
Для внутренних услуг данное поле оставляется пустым.
Такое поведение часто обусловлено соображениями безопасности. Например, tftp (Примитивный Протокол Передачи Файлов) позволяет загружать любые файлы, доступные для чтения, без ввода пароля. Это может быть опасно, особенно для файла /etc/passwd, особенно если в системе не используются теневые пароли. TFTP часто используется клиентами без жесткого диска или X-терминалами для загрузки их операционной системы с сервера при старте. Если вам необходимо использовать tftpd, убедитесь, что у вас есть ограниченный доступ к каталогам, из которых клиенты будут загружать файлы, добавив имена этих каталогов в командную строку tftpd, как показано в примере.
Всегда следует тщательно настраивать и мониторить сетевые услуги с точки зрения безопасности, чтобы предотвратить возможные атаки и утечки данных.