root не может установить ограничения процессам пользователя. Решение и обсуждение.
Всем привет. Посмотрим, какие ресурсы есть у простого пользователя.
user@astra:~$ prlimit RESOURCE DESCRIPTION SOFT HARD UNITS AS address space limit неограничено неограничено байты CORE max core file size 0 0 байты CPU CPU time неограничено неограничено секунд DATA max data size неограничено неограничено байты FSIZE max file size 25600000000 51200000000 байты LOCKS max number of file locks held неограничено неограничено locks MEMLOCK max locked-in-memory address space 65536 65536 байты MSGQUEUE max bytes in POSIX mqueues 819200 819200 байты NICE max nice prio allowed to raise 0 0 NOFILE max number of open files 2048 4096 files NPROC max number of processes 1000 2000 processes RSS max resident set size неограничено неограничено байты RTPRIO max real-time priority 0 0 RTTIME timeout for real-time tasks неограничено неограничено микросекунд SIGPENDING max number of pending signals 15320 15320 signals STACK max stack size 8388608 неограничено байты user@astra:~$
Их можно изменять командами в консоли (user-ом ли, root-ом ли, сейчас неважно). Важно другое: все изменения, сделанные в консоли будут относиться к вновь порождённым процессам bash. То есть запустили в консоли процесс, а у него уже ограничения.
Зададимся вопросом, как сделать так, чтобы root мог ограничить процессы пользователя в ресурсах, но не только, которые порождены bash, а вообще любые? То есть чтобы пользователь входил в систему и не мог, например создать в текстовом редакторе файл больше определённого размера?
Посмотрим, какие возможности для этого есть у root-а. Смотрим оснастку:
Ну, короче, из всех ресурсов, что мы видели по команде prlimit, root может ограничить пользователя только в памяти и количестве файлов (открытых ли, созданных ли, не разбирался)
. Пойдём по пути линукс. Нужные нам ограничения можно внести в файл /etc/security/limits.conf (синтаксис файла смотри внутри), например так:
После сохранения файла эти ограничения ДЕЙСТВИТЕЛЬНО будут действовать. До перезагузки. Потом из файла /etc/security/limits.conf эти изменения исчезают.
Решение я нашёл, будет ниже. Оно непросто и в связи с этим вопрос некороткий. При инициализации системы выполняется код, который именно что затирает файл /etc/security/limits.conf. То есть строчку за строчкой, строчку за строчкой (строчки настройки, я имею ввиду) перезаписывает, приводя их в первозданный вид. Товарищи разработчики, вы до такой степени не доверяете root-у? То есть реально root не может ограничить пользователя в ресурсах. Я так понимаю, Орёл 2.12 это Debian, который Stretch? Так вот, в Stretch файл при инциализации не приводится к первоначальному виду. И нигде не приводится а у вас приводится.
. Есть версия SE. Там я не проверял, как это всё работает. Но и я не могу сказать, чтобы это решение было бы примлемым в SE версии. Да, в версии SE у root-а должны быть какие-то ограничения, наверное. Но не ограничения же на накладывание ограничений! (ещё раз, в SE не смотрел). А накладывание таких ограничений на root-а в CE— ну всё, собсно я уже сказал выше. Это у нас с вам, что за линукс тогда? Разработчикам предоагаю принять это как дружескую критику тем более, что до фига что хорошего могу сказать про Орёл 2.12
Почему всё так происходит.
Во время инициализации системы процесс systemd считывает это файл:
user@astra:~$ cat /etc/systemd/system/astra-ulimits-control.service [Unit] Description=control/Uncontrol ulimits for user After=rc-local.service [Service] Type=oneshot ExecStart=/usr/sbin/astra-ulimits-control [Install] WantedBy=astra-safepolicy.target user@astra:~$
И, согласно ему, выполняет скрипт /usr/sbin/astra-ulimits-control
Где строчка за сточкой затирается и восстанавливается файл /etc/security/limits.conf.
sed -e "/.*hard fsize/d" -i /etc/security/limits.conf sed -e "/.*soft fsize/d" -i /etc/security/limits.conf sed -e "/.*hard nofile/d" -i /etc/security/limits.conf sed -e "/.*soft nofile/d" -i /etc/security/limits.conf sed -e "/.*hard nproc/d" -i /etc/security/limits.conf sed -e "/.*soft nproc/d" -i /etc/security/limits.conf sed -e "/.*hard core/d" -i /etc/security/limits.conf echo "#* hard fsize 50000000" >> /etc/security/limits.conf echo "#* soft fsize 25000000" >> /etc/security/limits.conf echo "#* hard nofile 4096" >> /etc/security/limits.conf echo "#* soft nofile 2048" >> /etc/security/limits.conf echo "#* hard nproc 2000" >> /etc/security/limits.conf echo "#* soft nproc 1000" >> /etc/security/limits.conf echo "#* hard core 0" >> /etc/security/limits.conf
(весь код файла /etc/security/limits.conf не влез из-за ограничений)
1) Код не будет затираться, если параметр скрипта /usr/sbin/astra-ulimits-control имеет значения status или is-enabled. Можно передать такие значения скрипту /usr/sbin/astra-ulimits-control, не вопрос. Вопрос в том, как передать их правильно? Пока отпадает.
2) Восстановление идёт независимо о того, переменная первый параметр скрипта /usr/sbin/astra-ulimits-control имеет ПРОТИВОПОЛОЖНЫЕ значения, enable или disable (у меня enable). То есть и в том и в другом случае прописано восстановление /etc/security/limits.conf; (дублирование кода). Недоработка?
Чё зачем я разбираться не стал, а тут прочёл:
man systemd-system.conf . To disable a configuration file supplied by the vendor, the recommended way is to place a symlink to /dev/null in the configuration directory in /etc/, with the same filename as the vendor configuration file.
user@astra:~$ ls -l /etc/systemd/system/astra-ulimits-control.service* lrwxrwxrwx 1 root root 9 фев 9 18:18 /etc/systemd/system/astra-ulimits-control.service -> /dev/null -rw-r--r-- 1 root root 187 фев 1 21:51 /etc/systemd/system/astra-ulimits-control.service~ user@astra:~$
Файл /etc/security/limits.conf не перезаписывается при инициализации системы. Настройки ограничений сохраняются. Кто может лучше, пусть сделает лучше. Обсуждается.
Профили пользователя Bash
В данной статье рассматривается вопросы настройки и использования командной оболочки.
- Установка переменных во время входа в систему или при запуске оболочки.
- Написание bash-сценариев для часто используемых цепочек команд.
- Управление структурой каталогов для новых пользователей.
- Настройка корректных путей поиска команд.
Командная оболочка в Unix системах называется Shell – это командный интерпретатор, который используется во всех Unix подобных операционных системах. Оболочек огромное количество. Одной из основных оболочек является оболочка BASH или Bourne-again-shell (Еще одна оболочка Борна). Данная оболочка самая распространенная оболочка Unix, которая используется по умолчанию практически во всех дистрибутивах Linux. Все, о чем будет написано далее справедливо для большинства дистрибутивов Linux. Есть небольшой нюанс с Ubuntu.
Есть вот такая картинка по профилям. Значок ~ в данном случае означает домашнюю папку пользователя по умолчанию. Например, /home/john .
Существует папка /etc/profile в ней лежат настройки глобального профиля. Такой профиль, который будет применяться для всех пользователей на данной машине, которые запускают командную оболочку. Функционал у него достаточно большой, но в первую очередь он грузит все что есть в /etc/profile.d и настройки глобального пользователя /etc/bash.bashrc и /etc/bashrc . Получается так, что ищется файл bash.bashrc или bashrc файлы, т.к в разных дистрибутивах разные файлы и грузит то, что он нашел. В документации по Linux написано, если запускается инициализационный скрипт при входе в систему, т.е пользователь заходит в систему, то отрабатывает левая часть картинки, если запускается оболочка вне контекста пользователя, то правая часть.
Если пользователь залогинился в систему, то помимо того, что отрабатывает папка /etc/profile.d начинается проверка в домашнем каталоге пользователя наличие файлов ~/.bash_profile , ~/.bash_login , ~/.profile . В разных дистрибутивах по-разному называется локальный профиль пользователя. В Ubuntu файл ~/.profile просто ссылит на ~/.bashrc , который так же лежит в домашней папке пользователя. Т.е у нас по порядку инициализационный скрипт ищет, как указанно в левой части картинки. Точкой у Ubuntu обозначаются скрытые файлы.
Вот этот файл ~/.bashrc – это настройки конкретного пользователя, настройки оболочки. Файл /etc/bashrc – это настройки глобального пользователя, настройки для всех пользователей.
Суть процесса: оболочка bash используется, как интерактивная оболочка входа в систему. Данная оболочка вызывает команды из файла /etc/profile , если он существует. Далее она по порядку начинает обрабатывать файлы ~/.bash_profile , ~/.bash_login , ~/.profile . И еще есть такой файл в home директории ~/.bash_logout – он отрабатывает при выходе из системы, что следует из его названия.
Есть второй сценарий, использование интерактивной оболочки bash, без входа в систему, то читаются файлы /etc/bash.bashrc и /etc/bashrc .
Мы можем посмотреть, что происходит при запуске оболочки. Для начала найдем файл /etc/profile .
Из картинки мы видим, что данный файл грузит /etc/bash.bashrc , в некоторых дистрибутивах это просто /etc/bashrc . И затем он выполняет из папки /etc/profile.d/*.sh , т.е все скрипты. Об этом можно прочитать в комментарии, всего два действия.
Посмотрим файл cat /etc/bash.bashrc .
Данный файл определяет поведение командной строки, он определяет глобальный профиль пользователей. Все, что в нем указанно справедливо для всех пользователей. Данный файл запускает различные псевдонимы и глобальные функции, различные настройки.
В каталоге /etc , есть папка profile.d , в ней могут находиться различные скрипты и они будут запускаться.
Теперь посмотрим, что у нас в домашней папке, в ней лежат настройки конкретного пользователя, который работает в оболочке. Переходим в домашнюю директорию cd ~ , смотрим какие файлы там находятся.
Смотрим очередность запуска файлов и видим, что следующий файл, который запустится, будет ~/.profile . он содержит настройки конкретного пользователя. Посмотрим, что в нем есть cat ~/.profile .
В нем несколько переменных и он ссылит на файл ~/.bashrc . Это особенность Ubuntu. И в файле ~/.bashrc хранятся все настройки.
Он достаточно большой. В нем пишутся настройки истории, как происходит обновление, псевдонимы, цветовые настройки.
Можно посмотреть файл ~/.bash_logout .
В данном файле нет ничего особенного, просто, когда кто-то выходит экран в целях безопасности очищается.
Посмотрим, как создается структура каталогов для новых пользователей. Есть такая папка в /etc/skel/ . Если мы туда перейдем и посмотрим, что в ней находиться.
Как вы видите в папке есть несколько файлов. В ней содержится все, то что будет добавляться в домашнюю папку нового пользователя. Если мы хотим пользователю, что-то добавить в его домашнюю папку, мы можем создать в данной папке файл или директорию. И у всех новых пользователей данные папки или файлы будут появляться.