Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: bash скрипт с правами root от обычного пользователя  (Прочитано 37984 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Kotiara
Постоялец

ua
Offline Offline

« : 29-11-2012 18:42 » 

Доброго времени суток, помогите пожалуйста разобраться с такой ситуацией: сделал я bash скрипт для перезапуска Apache он должен выполнятся с root правами, но выполнять его должны непривилегированные пользователи.
Вот скрипт
Код:
#!/bin/bash

echo `id`
/etc/init.d/apache2 restart
Установил на него такие права
Владелец: root
Группа:      root
Владелец: rwx
группа:        --x
все:              --x
SUID x
SGID x
Запускаю из своей учетки получаю такой вывод:
kotiara@linux-grct:/usr/share/Apach-restart> ./Apach-restart.sh
uid=1001(kotiara) gid=100(users) группы=100(users),33(video)
./Apach-restart.sh: line 4: /etc/init.d/apache2: Отказано в доступе
Прочитал на одном форуме что вроде при выполнени bash скриптов SUID,SGID не учитываются, типа в целях безопасности, завернул это дело в C++:
Код:
#include <stdlib.h>


int main(int argc, char** argv)
{
    system("id");
    system("/etc/init.d/apache2 restart");

    return 0;
}

Права на бинарник выставил такиеже как на скрипт вывод получаю аналогичный:
kotiara@linux-grct:~/Документы/Мои программы/C++/Apache-restart/dist/Release/GNU-Linux-x86> ./apache-restart
uid=1001(kotiara) gid=100(users) группы=100(users),33(video)
sh: /etc/init.d/apache2: Отказано в доступе
Вопрос как заставить это работать? и без судо, по тому что есть мысль сделать аналогичный скрипт для другой цели и там его буду юзать уже не я а, просто пользователь которому судо давать не хочу, я даже на чтение скрипт специально запретил чтобы любопытные товарищи команды не подсмотрели.
К вопросу о моей системе openSUSE 12.2
uname -a
Linux linux-grct 3.4.11-2.16-desktop #1 SMP PREEMPT Wed Sep 26 17:05:00 UTC 2012 (259fc87) x86_64 x86_64 x86_64 GNU/Linux
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 29-11-2012 18:55 » 

Скрипт сам не является исполняемой программой. Процесс образует интерпретатор.

С бинарником: SUID/SGID установит EUID/EGID процесса равным владельцу/группе файла. У тебя это явно не root.

Административно правильнее будет использовать sudo. Можно разрешить запускать нужный скрипт даже без запроса пароля.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kotiara
Постоялец

ua
Offline Offline

« Ответ #2 : 29-11-2012 19:22 » 

С бинарником: SUID/SGID установит EUID/EGID процесса равным владельцу/группе файла. У тебя это явно не root.

Административно правильнее будет использовать sudo. Можно разрешить запускать нужный скрипт даже без запроса пароля.
Как я уже писал не горю желанием давать судо этому пользователю, плюс к тому он возможно будет не один проще ярлыков на бинарник налепить чем всем судо раздавать.
А вот права на файл у меня вроде правильные вот права на бинарник
kotiara@linux-grct:~/Документы/Мои программы/C++/Apache-restart/dist/Release/GNU-Linux-x86> ls -l
итого 12
-rws--s--x 1 root root 11802 нояб. 29 19:58 apache-restart
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 29-11-2012 19:49 » 

sudo позволяет дать право на запуск конкретной программы. Это не всеобъемлющее право.

А вот права на файл у меня вроде правильные вот права на бинарник

А это смущает.
« Последнее редактирование: 29-11-2012 19:51 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 29-11-2012 20:11 » 

Все верно: изменяются эффективные идентификаторы процесса, когда как информационные остаются теми же.

Код: (C) t1.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    printf(
        "UID: %u\nEUID: %u\nGID: %u\nEGID: %u\n",
        getuid(), geteuid(), getgid(), getegid()
    );
    return 0;
}

Сборка:

[rxl@home-gw su]$ gcc -Wall -o t1 t1.c

Тест на пользователе:

[rxl@home-gw su]$ ls -l
итого 12
-rwxrwxr-x 1 rxl rxl 5358 Ноя 30 00:08 t1
-rw-r--r-- 1 rxl rxl  232 Ноя 30 00:02 t1.c
[rxl@home-gw su]$ ./t1
UID: 500
EUID: 500
GID: 500
EGID: 500

Тест под root:

[rxl@home-gw su]$ su -c '/home/rxl/test/su/t1'
Пароль:
UID: 0
EUID: 0
GID: 0
EGID: 0

А с SUID/GUID выглядит вот так:

[rxl@home-gw su]$ ls -l
итого 12
-rws--s--x 1 root root 5358 Ноя 30 00:02 t1
-rw-r--r-- 1 rxl  rxl   232 Ноя 30 00:02 t1.c
[rxl@home-gw su]$ ./t1
UID: 500
EUID: 0
GID: 500
EGID: 0

info libc
Users and Groups
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kotiara
Постоялец

ua
Offline Offline

« Ответ #5 : 29-11-2012 20:31 » 

Переделал немного программу:
Код:
#include <stdlib.h>
#include <iostream>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char** argv)
{
    int uid=0,euid=0,gid=0,egid=0;
    uid=getuid();
    euid=geteuid();
    gid=getgid();
    egid=getegid();
    std::cout<<"uid="<<uid<<" euid="<<euid<<std::endl;
    std::cout<<"gid="<<gid<<" egid="<<egid<<std::endl;
    system("/etc/init.d/apache2 restart");
    //std::cin>>i;

    return 0;
}

Получаю такой вывод:
kotiara@linux-grct:~/Документы/Мои программы/C++/Apache-restart/dist/Release/GNU-Linux-x86> ls -l
итого 16
-rws--s--x 1 root root 12598 нояб. 29 22:24 apache-restart

kotiara@linux-grct:~/Документы/Мои программы/C++/Apache-restart/dist/Release/GNU-Linux-x86> ./apache-restart
uid=1001 euid=0
gid=100 egid=0
sh: /etc/init.d/apache2: Отказано в доступе
Может я чего то не понимаю или это какая то фишка opensuse?
Записан
Finch
Спокойный
Администратор

il
Online Online
Пол: Мужской
Пролетал мимо


« Ответ #6 : 29-11-2012 20:39 » 

У тебя стоит Selinux или подобная оболочка?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Kotiara
Постоялец

ua
Offline Offline

« Ответ #7 : 29-11-2012 20:47 » 

Finch
Библиотеки SELinux стоят точно, но не уверен что она активна так как у меня дополнительных прав в настройках не появилось ни в кедах ни в консоли, правда я не знаю может для ее использования нужно специальную команду вводить, я этим добром никогда не пользовался.
Записан
Finch
Спокойный
Администратор

il
Online Online
Пол: Мужской
Пролетал мимо


« Ответ #8 : 29-11-2012 20:53 » 

cat /etc/selinux/config
Что говорит?
Selinux вполне может зажимать права. Если в поле SELINUX стоит что либо, кроме disabled, значит он включен.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Kotiara
Постоялец

ua
Offline Offline

« Ответ #9 : 29-11-2012 20:57 » 

У меня по адреску /etc/selinux есть только файл semanage.conf если это поможет вот его содержимое:


# Authors: Jason Tang <jtang@tresys.com>
#
# Copyright (C) 2004-2005 Tresys Technology, LLC
#
#  This library is free software; you can redistribute it and/or
#  modify it under the terms of the GNU Lesser General Public
#  License as published by the Free Software Foundation; either
#  version 2.1 of the License, or (at your option) any later version.
#
#  This library is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#  Lesser General Public License for more details.
#
#  You should have received a copy of the GNU Lesser General Public
#  License along with this library; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
# Specify how libsemanage will interact with a SELinux policy manager.
# The four options are:
#
#  "source"     - libsemanage manipulates a source SELinux policy
#  "direct"     - libsemanage will write directly to a module store.
#  /foo/bar     - Write by way of a policy management server, whose
#                 named socket is at /foo/bar.  The path must begin
#                 with a '/'.
#  foo.com:4242 - Establish a TCP connection to a remote policy
#                 management server at foo.com.  If there is a colon
#                 then the remainder is interpreted as a port number;
#                 otherwise default to port 4242.
module-store = direct

# When generating the final linked and expanded policy, by default
# semanage will set the policy version to POLICYDB_VERSION_MAX, as
# given in <sepol/policydb.h>.  Change this setting if a different
# version is necessary.
#policy-version = 19
expand-check=0

Записан
Finch
Спокойный
Администратор

il
Online Online
Пол: Мужской
Пролетал мимо


« Ответ #10 : 29-11-2012 21:18 » 

Другой вариант
# selinuxenabled
# echo $?
Если ответом на вторую команду будет 0, Selinux включен, 1 выключен.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Kotiara
Постоялец

ua
Offline Offline

« Ответ #11 : 29-11-2012 21:22 » new

Моя система не знает команды selinuxenabled, зато предлагает ее поискать или установить если обнаружится такой пакет.))
Записан
Finch
Спокойный
Администратор

il
Online Online
Пол: Мужской
Пролетал мимо


« Ответ #12 : 29-11-2012 21:29 » 

Весело. Вот тут погуглил, FAQ как включить в OpenSUSE Selinux http://en.opensuse.org/SDB:SELinux

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

Не будите спашяго дракона.
             Джаффар (Коша)
Kotiara
Постоялец

ua
Offline Offline

« Ответ #13 : 29-11-2012 21:33 » 

Finch
Спасибо за ссылку сейчас пойду выбирать бубен по вкусу. Улыбаюсь
Записан
Finch
Спокойный
Администратор

il
Online Online
Пол: Мужской
Пролетал мимо


« Ответ #14 : 29-11-2012 21:37 » 

В своем FAQ они описывают примушества AppArmor над Selinux. Так что я думаю, скорее всего у тебя может стоять первое. http://en.opensuse.org/FAQ#How_does_it_compare_with_SELinux.3F
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Kotiara
Постоялец

ua
Offline Offline

« Ответ #15 : 29-11-2012 21:41 » 

Finch
Не я проверил пакеты AppArmor у меня не установлены вообще никакие, только часть библиотек SELinux
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 30-11-2012 04:06 » 

Я вообще-то не зря написал в конце поста, где читать дальше...

Код: (C)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    setuid(0);
    setgid(0);
    printf(
        "UID: %u\n"
        "EUID: %u\n"
        "GID: %u\n"
        "EGID: %u\n",
        getuid(),
        geteuid(),
        getgid(),
        getegid()
    );
    return 0;
}

Не шаманить и удивляться надо, а читать документацию. Ага
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kotiara
Постоялец

ua
Offline Offline

« Ответ #17 : 01-12-2012 18:09 » 

RXL
Спасибо за совет, помогло и главное я ведь видел эти функции в мануале просто я тогда давно не отдыхал, заклинило видать что должно быть так и никак иначе Улыбаюсь, даже не подумал что можно же uid привести в соответствие с euid. Здесь была моя ладья...
Вывод: нужно вовремя спать ложится.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 01-12-2012 18:21 » 

Перерабатывать вообще вредно. Улыбаюсь

В общем, как итог темы:
1. SUID/SGID запущенного бинарника влияют на «эффективные» EUID/EGID, давая процессу права другого пользователя, но не изменяют UID/GID. При fork() EUID/EGID нового процесса назначаются согласно UID/GID, наследованным от родительского процесса.
2. Скрипту нельзя назначить SUID/SGID и по этому внутри скрипта применяют runuser и т.п. утилиты для запуска еще одного скрипта или бинарника под указанным пользователем.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines