А зачем? У большинства - они единственные пользователи системы. У меня только подо мной можно войти (логин под рут залочен) и только я могу 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() для списка дополнительных.