А зачем? У большинства - они единственные пользователи системы. У меня только подо мной можно войти (логин под рут залочен) и только я могу sudo выполнять
просто смысл в том, что я не хочу вводить пароли, в том числе и для рута. также в системе обычные пользователи никак не должны повышать привелегии, т.е. обычный пользователь не должен иметь возможность стать рутом или каким-то другим пользователем.
на сколько понимаю, это не то. мне нужно чтобы если в компьютере уже есть одна клавиатура, подключение второй было бы невозможно.
Это именно то, даст гарантию что к твоему компьютеру подключена именно твоя клавиатура, и никакая чужая клава не подключится.
ЗЫ: лично PAM и tcpd считаю очень полезными и нужными.
Одна авторизация с плюшками, например в PAM есть поддержка CAP и не надо каждому приложению поддерживать свою авторизацию, можно слинковатся с libpam.
По уаналогии использование tcpd даст дополнительную фильтрацию и не надо каждому приложению писать поддержку сети, можно слинковатся с библиотеками tcpd.
Не только по серийному, можно фильтровать по всем параметрам с вывода:
``udevadm info -a -p /sys/bus/usb/devices/3-1`
Например предлагаю: производителя, модель, серийник, название продукта, класс. Можно добавлять и удалять свои параметры фильтрации подключаемых устройств.
Шелл оказывается в целях защиты от случайных ошибок откатывает setuid если обнаруживает его. В скрипте первую строку сделай #!/bin/sh -p чтоб он этого не делал.
А, ещё забыл. Если из этого скрипта будешь вызывать другие - они себе так же откатят setuid если у них не указано -p. Это поведение в целом можно убрать, если в программе-обёртке в начало вставить setuid(0);. Но тогда будет другая проблема: поскольку информацию про сделанный setuid мы затёрли, узнать из скрипта какой юзер его на самом деле запустил уже не получится. В итоге есть разные варианты с тем, прятать ли setuid и если прятать, то когда, а так же с тем. кто и когда будет проверять права юзера-запускателя на выполнение действия. Главное - что проверить надо раньше чем затирать инфу о юзере.
как оказалось, если в скрипте делать exec /bin/bash, то оно также откатывает setuid, даже если в самом скрипте указано -p. пришлось прописать setuid(0);
как мне теперь на C узнать какой юзер запустил программу-обёртку и как передать это в качестве аргумента скрипту?
ещё такой вопрос:
я хотел сделать программе-обёртке такие права для безопасности:
---Sr-x--- 1 root user 27 May 19 12:20 «suid_bash»
но программа не хочет запускаться от user, пока я не дам others права на чтение и исполнение, почему так?
третье число из getresuid() - это uid, на который было сделано переключение setuid-битом (он нужен для того чтоб setuid прога могла сначала понизить себе права до вызывателя а затем опять активировать повышенные, которые в нём запомнены)
setuid(), вызванный рутом, меняет все три числа. Чтобы менять только второе (не затирая информацию о setuid-бинарнике) есть сисколл seteuid().
Тебе проще всего вызвать getuid() а затем сделать setuid(0).
Передать аргументы, которых больше чем было изначально - немного муторно, т.к. придётся делать новый массив для них (в старом места под ещё один нет). Можно так:
но программа не хочет запускаться от user, пока я не дам others права на чтение и исполнение, почему так?
По хорошему достаточно ---S--x--- (я проверил).
Наверно потому что тот, кто пытается запустить, не состоит в группе «user». На всякий случай: настройки групп из /etc/passwd и /etc/group применяются только при логине и программами типа su, которые вручную их читают и применяют. Если ты переключался на юзера с помощью setuid-бинарника или с помощью сисколла setuid() то группы у него остаются те же что были до переключения. Если хочешь вручную прописывать группы то это делается через setgid() для основной и setgroups() для списка дополнительных.
Проблема в том, что приходится для всех дочерних скриптов тоже -p делать, не подходит.
По хорошему достаточно ---S--x--- (я проверил). Наверно потому что тот, кто пытается запустить, не состоит в группе «user»
Как оказалось, пришлось добавить user'a в группу user чтоб заработало. Странно, но раньше не сталкивался с таким, думал что user и так состоит по-умолчанию в своей дефолтной группе.
Но как оказалось, не факт, что мне нужна такая группа на обёртке (можно через ACL ограничить запуск только для user), т.к. оказалось нужно ещё чтобы группа рута тоже наследовалась. Но я попробовал повесить на обёртку sgid — не наследуется. Юзер (suid) наследуется, группа не наследуется, остаётся user. Не знаю почему, возможно где-то в системе настроил что-то для безопасности, пока не знаю куда смотреть. Пришлось прописать sg в скрипте.
Пока оставил первоначальный вариант обёртки + setuid(0);, группу user на обёртке + sg в скрипте. Работает.