control++ - консольная программа для настройки GNU+Linux системы, позволяющая
переключать режимы, каждый из которых определяется своим файлом ulimits, а также
своим набором описаний прав на файлы системы и запускаемым сценарием оболочки, а
также контролировать соответствие между параметрами установленного ранее режима
и текущим состоянием системы.

Написана на C++, имеет минималистический дизайн (зависит лишь от собственной
библиотеки). Распространяется по лицензии GPLv3.0.

===============================================================================

Содержание

    1 Принцип работы
    2 Настройка
        2.1 Основной режим
        2.2 Режим ULimits
        2.3 Режим прав на файлы
        2.4 Запускаемые сценарии
    3 Использование
        3.1 Коды возврата
    4 Ссылки

===============================================================================
1 Принцип работы

При запуске программы для переключения режима, например
control++ <название_режима>, которому соответствует вариант ограничений ulims_x,
вариант прав perm_y и сценарий sh_z, программа попытается скопировать файл
/etc/control++/ulimits/ulims_x в каталог /etc/security/limits.d/ (таким образом,
чтобы он имел наивысший приоритет среди уже имеющихся файлов ulimits),
попытается применить права на файлы в соответствии с описанием в
/etc/control++/permissions/perm_y и запустить сценарий
/etc/control++/permissions/sh_z/do. В случае невозможности осуществления
какой-либо из операций будет выведено сообщение об ошибке. Если какой-то из
параметров не указан (например, название сценария оболочки), то соответствующая
операция не будет выполняться.

При установке режима ограничений и прав формируются данные, обеспечивающие
возможность возврата к исходному состоянию при сбросе текущего режима. Также при
каждой установке режима сохраняется описание установленного режима. Файлы,
содержащие обозначенные данные, хранятся в /var/lib/control++ и никогда не
должны изменяться пользователем вручную. При каждой установке режима происходит
предварительный сброс текущего режима.

При проверке соответствия текущего состояния системы параметрам установленного
ранее режима осуществляется:

    Сравнение содержимого наиболее приоритетного ulimits-файла из каталога
/etc/security/limits.d/ с содержимым ulimits-файла, сохранённого при установке
данного режима;
    Сравнение текущих режимов всех файлов, затронутых установкой данного режима,
с текущим описанием прав, которое носит название установленного подрежима;
    Запуск test-сценария данного режима, при наличии такого сценария (его
отсутствие не считается ошибкой).

Если какой-то из файлов, перечисленных в описании прав для данного режима,
отсутствует в системе, то установка данного режима не будет считаться по этой
причине неуспешной. Также, при проверке соответствия режима, права
отсутствующего файла не считаются несоответствующими правам, указанным в
описании режима.

===============================================================================
2 Настройка

2.1 Основной режим

Параметры control++ определяются файлом ini-формата
/etc/control++/control++.conf. Данный ini-файл состоит из секций описания
каждого из режимов; Название секции соответствует названию режима; Каждая из
секций может состоять из определения варианта ограничений (ulimits), варианта
набора прав (permissions) и запускаемого сценария оболочки для данного режима
(scripts). Далее приведён пример описания режима под названием workstation,
который имеет тип ulimits под названием u_x, тип permissions под названием p_y
и запускаемый сценарий оболочки s_z/do:

    [workstation]
    ulimits = u_x
    permissions = p_y
    scripts = s_z

Все файлы настроек могут быть отредактированы вручную системным администратором
при настройке нужных конфигураций.

2.2 Режим ULimits

Файлы ulimits для каждого варианта ограничений находятся в
/etc/control++/ulimits/название_варианта.

2.3 Режим прав на файлы

Файлы с описанием набора прав являются файлами ini-формата и находятся в
/etc/control++/permissions/название_варианта. Описание прав может состоять из
следующих секций:

    file - секция, задающая права на файл, абсолютный путь которого определяется
значением path данной секции;
    dir - секция, задающая права на файлы каталога и всех содержащихся в нём
файлов (без учёта содержимого подкаталогов), абсолютный путь которого
определяется значением path данной секции;
        dir_r - вариация секции dir, задающая права не только на файлы каталога,
но и на все содержащиеся в нём файлы с учётом содержимого подкаталогов
(рекурсивный обход дерева подкаталогов);
    list - секция, задающая права на файлы, список абсолютных путей которых
задан в текстовом файле, абсолютный путь которого определяется значением path
данной секции;
        list_r - вариация секции list, задающая права не только на файлы из
списка, но и на все файлы перечисленных в нём каталогов с учётом содержимого
подкаталогов;
            whitelist - вариация секции list_r, для которой устанавливаемый
режим файлов определён как ********* (* означает не менять данный бит режима),
при этом для всех остальных файлов базового каталога (см. base_dir далее)
устанавливается режим **-**-**-;
            blacklist - вариация секции list_r, для которой устанавливаемый
режим файлов определён как **-**-**-.

Помимо значения path для всех секций могут быть определены значения следующих
параметров:

    owner - название учётной записи владельца файла;
    group - название группы, к которой относится файл;
    mode - режим файла в формате rwxrwxrwx (например, rw-rw-rw- означает
разрешить всем чтение и запись, но запретить всем запуск данного файла;
rwx------ означает разрешить все действия владельцу файла и запретить все
действия всем остальным; Для того, чтобы не изменять какой-то бит режима,
следует использовать символ *, например r**r**r** означает разрешить всем
чтение файла и не менять остальные права).

Единственным необходимым параметром является path. При отсутствии определения
остальных параметров данные свойства файла не будут изменены.

Для секций dir и list (а также всех их вариаций) может быть определен
дополнительный параметр excluded_paths, определяющий набор каталогов, содержимое
которых (в том числе содержимое вложенных каталогов) не будет затронуто
применением прав, описанных данной секцией.

Для секций dir, dir_r и list_r, whitelist, blacklist может быть определен
дополнительный параметр mode_for_dirs, определяющий режим для каталогов,
затрагиваемых применением прав, описанных данной секцией (по-умолчанию режим
для каталогов определяется так же как для обычных файлов).

Для секций list, list_r, whitelist и blacklist может быть определен
дополнительный параметр base_dir, определяющий каталог, рассматриваемый при
применении данного режима прав как каталог верхнего уровня. Например, пусть в
секции whitelist параметру base_dir присвоено значение /home/your_home_dir/,
пусть в списке файлов, к которым должен быть применён данный режим, указаны два
пути - /d1/f1, f2 и пусть excluded_paths присвоено значение /d0, тогда при
установке данного режима файлы /home/your_home_dir/d1/f1 и
/home/your_home_dir/f2, станут исполняемыми, файлы каталога
/home/your_home_dir/d0 (включая содержимое вложенных каталогов) сохранят свой
режим, а все остальные файлы каталога /home/your_home_dir/ станут
неисполняемыми.

Значение параметра path секции list и производных от неё секций должно
представлять собой абсолютный путь к текстовому файлу, каждая строка которого
представляет собой абсолютный путь какого-либо файла системы, при этом допустимы
комментарии, обозначаемые комбинацией символов //. 

Пример описания набора прав:

    [file]
    path = ~/some_dir_1/some_file_1
    owner = some_user
    group = some_group
    mode = rwxrwx---

    [file]
    path = ~/some_dir_1/some_file_2
    mode = rw-rw----

    [dir_r]
    path = ~/some_dir_2/
    owner = some_user
    group = some_group
    mode = **x**x**x
    mode_for_dirs = r*xr*xr*x

    [list]
    path = ~/list_of_executables.txt
    excluded_paths = "/some_path/", "/some_other_path/"
    owner = some_user
    group = some_group
    mode = **x**x**-

    [blacklist]
    path = ~/some_blacklist.txt

    [whitelist]
    path = ~/some_whitelist.txt
    base_dir = /mnt/some_vol/
    excluded_paths = /some_path_inside_base_dir/

ВНИМАНИЕ - при установке прав для секции whitelist следует помнить, что при
наличии запускаемого сценария /etc/control++/scripts/<название_режима>/do у
режима данный файл сценария следует учесть в списке разрешённых для запуска
файлов, или изменить порядок действий в главном файле настроек (переместить
определение переменной scripts выше определения переменной permissions),
в противном случае возможна ситуация, при которой в результате установки режима
прав данный файл станет неисполняемым, что приведёт к невозможности завершения
установки данного режима. Для того, чтобы добавить в белый список все файлы
системы, являющиеся на данный момент исполняемыми, можно воспользоваться
следующей командой:

    find / -type f -executable > <путь_к_файлу_белого_списка>

2.4 Запускаемые сценарии

Файлы сценариев оболочки находятся в
/etc/control++/scripts/название_варианта/do. Также каталог
/etc/control++/scripts/название_варианта/ может содержать файлы undo и test для
выполнения действий обратных действиям сценария do и проверки действенности
сценария do соответственно.

===============================================================================
3 Использование

Как правило, осуществлять изменение прав на системные файлы, а также
осуществлять запись в каталог /etc/security/limits.d/ может только пользователь
root, поэтому для успешной работы control++ возможно будет необходимым запускать
его от пользователя root.

Установка режима:

    control++ <название_режима>

Сброс текущего режима (до версии 0.21.0 и начиная с версии 0.21.0
соответственно):

    control++ reset
    control++ --reset

Отображение списка доступных режимов (до версии 0.21.0 и начиная с версии 0.21.0
соответственно):

    control++ list
    control++ --list

Проверка соответствия состояния системы текущему режиму (до версии 0.21.0
и начиная с версии 0.21.0 соответственно):

    control++ status
    control++ --status

Отображение содержимого главного файла настройки (до версии 0.21.0 и начиная
с версии 0.21.0 соответственно):

    control++ conf
    control++ --conf

Отображение справочной информации (до версии 0.21.0 и начиная с версии 0.21.0
соответственно):

    control++ help
    control++ --help

Для включения режима упрощённого формата вывода следует передать
дополнительный флаг --plain | -p;

Для выключения режима подробного вывода следует передать флаг --verbose | -v;

Для принудительной установки режима (отмены диалогов подтверждения) следует
передать флаг --force | -f;

Для выключения проверки уникальности записей режима прав следует передать флаг
--nonuniq | -n.

3.1 Коды возврата

Код 1 возвращается в следующих случаях:

    Какой-то из конфигурационных файлов не может быть прочитан;
    Не получилось настроить программу в соответствии с конфигурационными
файлами;
    При проверке соответствия текущего состояния системы установленному режиму
(команда control++ status или
control++ [ulimits | permissions | scripts] status) было выявлено, что описание
режима было изменено, и пользователь отказался от продолжения проверки;
    При проверке соответствия текущего состояния системы установленному режиму
было выявлено несоответствие;
    Попытка установки режима (команда control++ <название_режима> или
control++ [ulimits | permissions | scripts] <название_индивидуального_режима>)
оказалась неуспешной.

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

===============================================================================
4 Нововведения версии 0.19.0

Начиная с версии 0.19.0 возможно устанавливать индивидуальный режим для
подконтрольной единицы (т.е. ulimits, permissions и scripts) отдельно от
основного режима, а также определять соответствие текущего состояния системы
данного режиму. Названия индивидуальных режимов соответствуют названиям
вариантов ulimits, permissions и scripts соответственно.

Установка режима для определённой подконтрольной единицы:

    control++ [ulimits | permissions | scripts]
<название_индивидуального_режима>

Восстановление состояния, существовавшего до установки индивидуального режима
определённой подконтрольной единицы (до версии 0.21.0 и начиная с версии 0.21.0
соответственно):

    control++ [ulimits | permissions | scripts] reset
    control++ [ulimits | permissions | scripts] --reset

Проверка соответствия состояния системы текущему индивидуальному режиму
определённой подконтрольной единицы (до версии 0.21.0 и начиная с версии 0.21.0
соответственно):

    control++ [ulimits | permissions | scripts] status
    control++ [ulimits | permissions | scripts] --status

===============================================================================
5 Ссылки

Проект на git.altlinux.org -
https://git.altlinux.org/people/alexey/packages/controlplusplus.git

libcontrol++ -
https://git.altlinux.org/people/alexey/packages/libcontrolplusplus.git

Подробное описание применения чёрных/белых списков -
https://www.altlinux.org/Control++:Blacklist/Whitelist

===============================================================================

https://www.altlinux.org/Control++

Copyright (C) 2017-2024 Alexey Appolonov
