setuid и setgid wotking только с 0 (root), я хочу, чтобы он работал с другим пользователем

#c #linux #guid #setuid #suid

Вопрос:

Я пытаюсь написать программу, которая запускает /bin/bash с правами пользователя smith,

 smith:x:1000:1000:Basket:/home/smith:/bin/bash
 

Я попробовал это:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main () {
        setgid(1000);
        setuid(1000);
        char command[50];
        strcpy( command, "/bin/bash" );
        system(command);
        return(0);
} 
 

и я использовал эту команду, чтобы установить владельца, группу и разрешения

 chown smith command
chgrp smith command
chmod  x command
chmod u s command
 

разрешения после команд:

 -rwsr-xr-x  1 smith smith   16840 Jun  6 17:11 command
 

и не сработало, я попробовал с root в качестве следующего:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main () {
        setgid(0);
        setuid(0);
        char command[50];
        strcpy( command, "/bin/bash" );
        system(command);
        return(0);
} 
 

и я использовал те же команды для разрешений и так далее, Но вместо смита я написал root, и я работал, и когда я запускаю его, я получаю оболочку как root.

Итак, как я могу сделать это с пользователем smith?

Комментарии:

1. Программы-оболочки Setuid/setgid на языке C, использующие сценарии оболочки и system() вызовы для выполнения других команд, практически невозможно выполнить без возникновения проблем с безопасностью, которые могут быть использованы…

2. Вам нужно установить gid вашей программы: chmod g s program так, чтобы это была программа setgid (я думаю , что команда верна). Затем в программе сделайте setgid(getegid()); setuid(geteuid());

Ответ №1:

Linux Просто Так Работает ™

Если бы любой пользователь волей-неволей мог стать другим пользователем, то у Linux вообще не было бы прав доступа.

Только процесс, запущенный с правами суперпользователя, может изменить свои действующие учетные данные.

Тем не менее, Linux предоставляет подробные учетные данные. Видеть:

 $ man 7 capabilities
 

за подробностями.

Лучшее решение синдрома «Я хочу быть корнем» — проверить sudo(8). Использование sudo(8) лучше, потому что:

  1. Вы можете контролировать, у кого есть власть.
  2. Вы можете контролировать, какие приложения может запускать этот пользователь.
  3. Вы даже можете назначить первые несколько действий командной строки, которые они должны выполнить.
  4. Запись вносится в журнал аудита, так что вы знаете, кого винить, когда они разбивают машину.

Ответ №2:

Я использовал эту команду, чтобы задать владельца, группу и разрешения

 chown smith command
chgrp smith command
chmod  x command
chmod u s command
 

Если вы используете бит SUID и / или SGID в режиме программы, то программе не нужно вызывать соответствующую функцию изменения идентификатора. Система автоматически запустит программу с идентификатором владельца (SUID) и / или группы (SGID). Из этого следует, что если вы используете этот подход для запуска под uid, отличным от root, то программа не должна пытаться вызывать функции изменения личности, так как это может сделать только программа, работающая с достаточными правами.

Таким образом, вашими основными (взаимоисключающими) вариантами являются следующие:

  • Используйте права собственности и режим (биты SUID / SGID) исполняемого файла, чтобы выбрать непривилегированное удостоверение для запуска программы от имени и избежать вызова setuid() или setgid() . Любой пользователь, у которого есть разрешение на выполнение программы, затем выполнит ее как назначенный пользователь / группа.
  • Используйте функцию setuid() и / или setgid() во время выполнения, чтобы установить идентификатор, под которым выполняется программа. Эти функции не будут работать, если программа запущена непривилегированным пользователем.
  • В Linux используйте подсистему возможностей, чтобы предоставить исполняемому файлу привилегию изменять свою личность пользователя. (Детали были бы больше, чем еще один полный ответ.)
  • Не делай этого вообще. Это может быть вашим лучшим вариантом. Программы Setuid рискованны, сценарии оболочки setuid гораздо более опасны, и ни один известный мне специалист по безопасности не примет такую программу, как ваша, которая позволяет произвольным пользователям запускать произвольные команды оболочки под другим именем.