root не может установить ограничения процессам пользователя. Решение и обсуждение.

Сообщения
224
#1
Всем привет. Посмотрим, какие ресурсы есть у простого пользователя.

Код:
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-а. Смотрим оснастку:

Screenshot_20200209_155645.png

Ну, короче, из всех ресурсов, что мы видели по команде prlimit, root может ограничить пользователя только в памяти и количестве файлов (открытых ли, созданных ли, не разбирался)

...Пойдём по пути линукс. Нужные нам ограничения можно внести в файл /etc/security/limits.conf (синтаксис файла смотри внутри), например так:
user hard fsize 131072
user soft fsize 131072
После сохранения файла эти ограничения ДЕЙСТВИТЕЛЬНО будут действовать. До перезагузки. Потом из файла /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.

Bash:
        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 не перезаписывается при инициализации системы. Настройки ограничений сохраняются. Кто может лучше, пусть сделает лучше. Обсуждается.
 

oko

New member
Сообщения
1 257
#2
to суслик
А systemctl disable astra-ulimits-control и далее systemctl daemon-reload не пробовали? По-идее, вырубит этот "перезатирающий" сервис и не сломает ничего лишнего...
Модуль экстрасенсорики подсказывает, что такая "подстройка" перекочевала в Common Edition из Special Edition с целью сохранения единообразия. А в SE она появилась с целью устранения некоторых уязвимостей, позволяющих реализовать "логические бомбы" (попадалось нечто подобное в плановых обновлениях SE, включая рекомендации по ручной настройке limits)...
 
Сообщения
224
#3
to суслик
А systemctl disable astra-ulimits-control и далее systemctl daemon-reload не пробовали? По-идее, вырубит этот "перезатирающий" сервис и не сломает ничего лишнего...
systemctl daemon-reload необязательно, наверное, ибо:

Код:
man systemctl
...
       disable NAME...
...
           This command implicitly reloads the system manager configuration after completing the operation. Note that this command does not implicitly stop the units that are being disabled. If this is desired, either combine this command with the --now switch, or invoke the stop command with appropriate arguments later.
...
Вообще выглядит технично. Но на практике вот что происходит. На astra-ulimits-control.service удаляются ссылки там, то-сё, как и написано в мане. И опять файл /etc/security/limits.conf после инициализации, но на этот раз так:

#* hard fsize 50000000
#* soft fsize 25000000
#* hard nofile 4096
#* soft nofile 2048
#* hard nproc 2000
#* soft nproc 1000
#* hard core 0
Соответственно лимиты:
Код:
user@astra:~$ prlimit
RESOURCE   DESCRIPTION                                SOFT         HARD UNITS
AS         address space limit                неограничено неограничено байты
CORE       max core file size                            0 неограничено байты
CPU        CPU time                           неограничено неограничено секунд
DATA       max data size                      неограничено неограничено байты
FSIZE      max file size                      неограничено неограничено байты
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                   1024      1048576 files
NPROC      max number of processes                   15320        15320 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:~$
Сервис вырубили, отменяются и ограничения, как и заказывали. Я, кстати, поторопился, сказав в первом посте, что в файле /usr/sbin/astra-ulimits-control есть дублирующий код. Нет, там при переменной=enable значения записываются в умолчальные

Bash:
        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
а при переменной=disable они закомменчиваются, вот так:
Bash:
        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
Так что, похоже, нужно использовать способ, который нашёл я.

Модуль экстрасенсорики подсказывает, что такая "подстройка" перекочевала в Common Edition из Special Edition с целью сохранения единообразия. А в SE она появилась с целью устранения некоторых уязвимостей, позволяющих реализовать "логические бомбы" (попадалось нечто подобное в плановых обновлениях SE, включая рекомендации по ручной настройке limits)...
вот оно и нехорошо совсем.
 

mrEnst

New member
Сообщения
110
#4
наверное кто-то когда-то ломанул систему через эти лимиты, может уязвимость в ядре на эту тему есть|была, вот и тянется оттуда.
И что мешает эти ограничения записать в глобальный /etc/bash.bashrc или /etc/profile?
 
Сообщения
224
#5
наверное кто-то когда-то ломанул систему через эти лимиты, может уязвимость в ядре на эту тему есть|была, вот и тянется оттуда.
получается, сейчас простой пользователь может повесить систему и не слабо так повесить, поскольку руту запретили ограничивать его в ресурсах? Нормально устранили уязвимость, ничё не скажешь.

И что мешает эти ограничения записать в глобальный /etc/bash.bashrc или /etc/profile?
Код:
user@astra:~$ cat /etc/bash.bashrc
# System-wide .bashrc file for interactive bash(1) shells.
Код:
user@astra:~$ cat /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
как-то так. Первое сообщение читаем внимательно.
 

mrEnst

New member
Сообщения
110
#6
получается, сейчас простой пользователь может повесить систему и не слабо так повесить, поскольку руту запретили ограничивать его в ресурсах? Нормально устранили уязвимость, ничё не скажешь.



Код:
user@astra:~$ cat /etc/bash.bashrc
# System-wide .bashrc file for interactive bash(1) shells.
Код:
user@astra:~$ cat /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
как-то так. Первое сообщение читаем внимательно.
там стока букав! война и мир! когда это все читать?
 

mrEnst

New member
Сообщения
110
#8
дело твоё, конечно, но на фиг ты тут тогда нужен?
как-то грубовато прозвучало, тов. суслик.
Зачем я здесь - мне решать, а не Вам. Это раз.
Второе. Я здесь для себя, для людей, кому-то я могу помочь.
Третье. Интернет - свободное место, тут могут и на йу... послать.
 
Сообщения
224
#9
как-то грубовато прозвучало, тов. суслик.
Зачем я здесь - мне решать, а не Вам. Это раз.
Второе. Я здесь для себя, для людей, кому-то я могу помочь.
Третье. Интернет - свободное место, тут могут и на йу... послать.
оттого, что ты пыжишься, ты серьёзным дядькой не стнаешь. Пока что ты "наш пострел везде поспел", извини уж.
 
Сообщения
224
#11