control(8) [IMG]control(8) - фреймворк, написанный на обычном shell и позволяющий фиксировать и анализировать состояние системных объектов - например, бинарников и файлов конфигурации (например, привилегированных утилит вроде su(8)). С его помощью получается удобным способом вносить переживающие обновление пакета или просто сложные изменения <<одним росчерком>>; для администраторского ознакомления рекомендуются control(8), control-dump(8) и control-restore(8). Примеры для сисадмина: $ /usr/sbin/control su help public: Any user can execute /bin/su wheel: Any user can execute /bin/su, but only "wheel" group members can switch to superuser wheelonly: Only "wheel" group members can execute /bin/su restricted: Only root can execute /bin/su $ /usr/sbin/control mtr help public: Any user can execute /usr/bin/mtr netadmin: Only "netadmin" group members can execute /usr/bin/mtr restricted: Only root can execute /usr/bin/mtr Тем не менее полезнейшая (особенно в пересчёте на объём кода) вещь не жалует документацией собственно желающего улучшить свой пакет или систему созданием (и использованием) control-файлов; давайте попробуем восполнить этот недостаток здесь. Вкратце В библиотеку функций /etc/control.d/functions (размером 3947 байт на сейчас) входят используемые в /etc/control.d/facilities/* удобства: * new_fmode - конструктор <<рулилки правами>>; * new_subst - ... <<рулилки конфигом>>; * new_help - добавление человекопонимаемого комментария к режиму; * new_summary - ...ко всему control-файлу. Следует понимать, что объекты получаются двунаправленные: работает как направление режим=>права, так и обратное ему права=>режим; как режим=>конфиг, так и конфиг=>режим. Таким образом возможно не только задавать, но и проверять права, что особенно важно при обновлении пакетов - перед удалением предыдущей версии пакетными скриптами делается control-dump, а после разворачивания новой - control-restore. При этом для избежания промежутков времени с понижением защищённости (если речь о регулировании прав на SUID/SGID binaries, например) в пакете следует задавать предельно жёсткую конфигурацию, которую возможно ослабить уже средствами control в %post. Кстати о пакетах - примеры можно посмотреть в альтовских su, ping, mtr, samba... проще заглянуть в спеки, хотя если кто допишет, тоже спасибо new_fmode(name, perms, user, group) Для обеспечения двунаправленности ничего особенного не требуется, поэтому аргументы не нуждаются в особых разъяснениях - приведём пример: new_fmode restricted 700 root root зарегистрирует режим по имени "restricted", характеризующийся правами 0700 (-rwx------) root:root. На что - решается отдельно. new_subst(name, test, set) Вот с модификацией текстовых файлов сложнее - из аргумента, являющегося параметром для subst(1) (sed(1)), не вывести тест, определяющий, что была применена именно эта замена. Поэтому тест приходится писать тоже человеку и в виде параметра для egrep(1). Пример из /etc/control.d/facilities/su: new_subst public \ '^#auth[[:space:]]+required[[:space:]]+(/lib/security/)?pam_wheel\.so' \ 's,^\(auth[[:space:]]\+required[[:space:]]\+\(/lib/security/\)\?pam_wheel\.so\),#\1,' Здесь public - опять же название состояния (режим), вторая строка (второй аргумент) - это тест, а третья - руководство по достижению заданного состояния. Опять же, файл, к которому применяются то и другое, здесь не фигурирует. new_help(name, text) Очевидно: режиму сопоставляется (закавыченный) текст, который будет выведен по команде /usr/sbin/control NAME help [MODE] (при отсутствии указания режима - все зарегистрированные). new_summary(text) Ещё проще: единственный аргумент и сопоставляется команде control NAME summary. Пример: su В качестве сподручного образца приведу поддержку control в su-0.60-alt24 (исходный пакет - [IMG]SimplePAMApps). /etc/control.d/facilities/su: #!/bin/sh . /etc/control.d/functions CONFIG=/etc/pam.d/su BINARY=/bin/su new_subst public \ '^#auth[[:space:]]+required[[:space:]]+(/lib/security/)?pam_wheel\.so' \ 's,^\(auth[[:space:]]\+required[[:space:]]\+\(/lib/security/\)\?pam_wheel\.so\),#\1,' new_fmode public 4711 root root new_subst wheel \ '^auth[[:space:]]+required[[:space:]]+(/lib/security/)?pam_wheel\.so' \ 's,^#\(auth[[:space:]]\+required[[:space:]]\+\(/lib/security/\)\?pam_wheel\.so\),\1,' new_fmode wheelonly 4710 root wheel new_fmode restricted 700 root root new_help public "Any user can execute $BINARY" new_help wheel "Any user can execute $BINARY, but only \"wheel\" group members can switch to superuser" new_help wheelonly "Only \"wheel\" group members can execute $BINARY" new_help restricted "Only root can execute $BINARY" case "$*" in status|'') STATUS="`control_fmode "$BINARY" status`" || exit 1 if [ "$STATUS" = "public" ]; then control_subst "$CONFIG" status || exit 1 else test -z "$STATUS" || echo "$STATUS" fi ;; public|wheel) control_fmode "$BINARY" public || exit 1 control_subst "$CONFIG" "$*" || exit 1 ;; wheelonly|restricted) control_fmode "$BINARY" "$*" || exit 1 control_subst "$CONFIG" public || exit 1 ;; *) control_fmode "$BINARY" "$*" || exit 1 ;; esac %pre -n su %pre_control su %post -n su %post_control -s wheelonly su Вот используемые макросы из ALT Linux RPM: %pre_control if [ $1 -ge 2 ]; then /usr/sbin/control-dump fi %post_control if [ $1 -ge 2 ]; then /usr/sbin/control-restore else for facility in ; do /usr/sbin/control "$facility" public done fi Ссылки * Текущая версия этого документа http://www.freesource.info/wiki/ALTLinux/Sisyphus/devel/control * Типичная ошибка при добавлении поддержки control(8) http://www.freesource.info/wiki/AltLinux/Sisyphus/devel/control/TypicalErrors * #3426 (использование макросов в .spec) https://bugzilla.altlinux.org/show_bug.cgi?id=3426 * Кратко о control(8) для админа http://www.freesource.info/wiki/AltLinux/Sisyphus/admin/control