Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Redaktsia_4_UP_Linux_-_Osnovnaya_chast.doc
Скачиваний:
57
Добавлен:
06.11.2018
Размер:
2.02 Mб
Скачать

Virtual memory (kbytes, -V) unlimited

Рис. 2.1. Информация о ресурсах, выводимая командой ulimita

Аналогичная информация доступна для просмотра в виртуальных файлах limits, которые располагаются в нумерованных директориях, выделенных для каждого процесса в каталоге /proc (параграф о содержимом этого каталога следует ниже). В файле, имеющем вид таблицы, для каждого параметра задаются «жесткие» и «мягкие» лимиты. «Жесткие» лимиты задаются для всех пользователей, включая администратора. В рамках «жестких» пределов каждый пользователь может задавать для своих процессов «мягкие» ограничения, которые не должны выходить за обозначенные общими правилами границы.

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

cat /dev/zero > /tmp/abcd

позволяет создать в доступном общем каталоге файл неограниченных размеров.

Наличие в командном файле бесконечного цикла

while 1

mkdir 1

cd 1

touch 2

end

не только создает каталог бесконечной «глубины», но и путем создания множества пустых файлов истощает доступный ресурс индексных дескрипторов.

Десяток расточительных пользовательских процессов, порожденных командами типа

yes 12345 > /dev/null & ,

существенно замедлят выполнение полезных программ и сервисов.

Порождение процессов в цикле (возможное число процессов, которые может создать пользователь, хоть и не бесконечно, но довольно велико) может на некоторое время заблокировать администратору отображение самой информации о процессах, поскольку утилита psef будет непрерывно обновлять свои данные.

К счастью, с помощью вышеназванной команды ulimit есть возможность урезать аппетиты пользовательских программ как в отношении дискового пространства, так и в отношении количества создаваемых процессов. Лимит на максимальный размер файлов устанавливается командой

ulimitf 100 ,

после чего создание файла размером более 100 блоков (1 блок = 1024 байта) станет невозможным. Ограничитель на число открываемых процессом файлов задается указанием значения при параметре -n. Для того чтобы ограничить максимальное число процессов, запущенных одним пользователем со всех терминалов, следует исполнить команду

ulimit -u 10 ,

где величина -u указывает максимальное число процессов.

Нетрудно убедиться, что эти ограничения действуют только в текущем сеансе и только на экземпляр оболочки, обслуживающей конкретного пользователя в конкретной консоли. Для установления «жестких» ограничений на все сеансы и процессы, запущенные любым пользователем, администратор должен записать строки

ulimit -u 10

ulimit -n 50

ulimit -f 1000

в файл /etc/profile. Ограничения начнут действовать сразу после нового входа пользователя в систему, т. е. когда процесс login создаст сеанс пользователя и запустит процесс bash в рамках этого сеанса, а процесс bash считает все установочные значения из всех своих имеющихся конфигурационных файлов. Пользователям (кроме администратора) не удастся превысить или переустановить эти пределы.

В операционной системе по умолчанию запускается довольно много системных процессов и сервисов. Многие из них напрасно расходуют процессорное время и оккупируют оперативную память. Некоторые сервисы откровенно небезопасны по причине своей уязвимости. Специалисты рекомендуют администраторам избавляться от подобного «багажа». Вот краткий список сервисов сомнительной полезности:

  • portmap, rpc.mountd, rpc.nfsd – службы обеспечивают функционирование сетевой файловой системы NFS;

  • nmbd, smbd – службы реализуют аналог с сетевыми ресурсами ОС Windows*;

  • named – обеспечение службы доменных имен;

  • telnet, rlogin, rexec – небезопасные службы для сетевого управления компьютером;

  • finger, comsat, chargen, identd, echo – набор устаревших и небезопасных служб.

Все сущности в операционной системе имеют свои номера. Не являются исключением и процессы. Каждому из них система назначает уникальный 16-разрядный идентификатор (process identifier – PID). Таким образом, в системе может быть одновременно запущено большое число – 65536 процессов. Идентификационные номера присваиваются процессам по порядку, по мере их создания. Обычно первая сотня номеров присваивается системным процессам и демонам, поскольку они запускаются первыми. При завершении процесса система освобождает его идентификатор, но современные версии ОС в одном сеансе освобожденные номера повторно используют только после исчерпания доступного диапазона.

Процесс, запущенный другим процессом, называется дочерним (child) процессом или потомком. Соответственно созидающий процесс называется родительским (parent), родителем или просто – предком. Поэтому у каждого процесса наряду с идентификатором PID есть еще один числовой атрибут – PPID (Parent Process ID) – идентификатор родительского процесса.

Запускающий процесс создаёт своего «двойника», вызывая системную функцию fork: двойниками они являются по причине идентичности контекстов процессов, за исключением PID и PPID. Выполняя этот вызов, система создает дочерний процесс, являющийся почти полной копией родительского, но имеющий свой идентификатор PID и выполняющийся в собственном адресном пространстве. При этом родительский процесс ожидает завершения работы порождённого процесса. Для завершения работы процесса выполняется системный вызов exit. Полную самостоятельность порожденный процесс получает после выполнения системного вызова exec. Дочерний процесс сохраняет значение идентификатора родительского процесса PPID. «Родственники» могут взаимодействовать друг с другом посредством сигналов, функций межпроцессного взаимодействия, каналов и др.

Пользовательским процессам присваивается еще один идентификатор – UID – уникальный номер пользователя, который их запустил. Пользователь не может манипулировать логическими объектами непосредственно, и это делает за него программа. Обычные пользовательские программы имеют право делать только то, что разрешено их владельцу. Например, пользователь, запустивший процесс

lsla /root

в целях просмотра содержимого подкаталога администратора, получит сообщение permission denied. На самом деле отказ в доступе получил процесс, запущенный от имени пользователя. Но такой же процесс, запущенный с правами обладателя нулевого UID, будет выполнен успешно.

Процессы могут иметь так называемые эффективные идентификаторы пользователя EUID и группы EGID. Такие процессы порождаются исполняемыми файлами с установленным битом SUID или SGID. Эффективный идентификатор позволяет процессу выполнять действия не от имени пользователя, запустившего процесс, а от имени владельца файла. Данный механизм необходим для выполнения некоторых задач, например пользователю в ходе работы разрешается сменить собственный пароль, если минимальный срок действия старого пароля еще не истек. Если лишить пользователей таких прав, нагрузка на администратора возрастет многократно.

Смена пароля сопровождается вычислением его хэш-образа, который должен быть записан в недосягаемый и невидимый для пользователя файл /etc/shadow. Возникшее противоречие решается так: программа passwd, вычисляющая хэш-функцию введенного пароля и записывающая результат в теневой файл, выполняется не от имени пользователя, а от имени владельца утилиты – администратора. Аналогичными временными правами обладают процессы, порожденные при запуске таких утилит, как su, mount и некоторые другие.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]