Пропустить навигацию.
Главная

Sudo в Ubuntu и не только

Аватар пользователя hawk

**********************************************
Данная статья - это кросспостинг с http://unixa.ru/.
Оригинал статьи ,доступен для прочтения здесь...
//H@wk!
**********************************************

По поводу использования Sudo в Ubuntu и отсутствие как такового рута - сказано много. Я лишь выскажу своё мнение. Sudo отличная утилита с помощью которой можно например дать права рута отдельному пользователю и только к примеру на выполнение одной единственной команды. Но в случае с UBUNTU не все так гладко, объясню чуть ниже. Что нужно было сделать, нужно создать пользователя на всех серверах UNIX (Ubuntu, Debian Lenny, FreeBSD) и дать ему права только на выполнение команды shutdown, вот сводка примеров того, что может sudo (файл настроек /etc/sudoerc):

=================

ПРИМЕРЫ

Ниже приведены примеры записей sudoers. Возможно, некоторые из них являются выдуманными. Сначала мы определяем свои псевдонимы:

# Определение псевдонимов пользователя
User_Alias FULLTIMERS = millert, mikef, dowdy
User_Alias PARTTIMERS = bostley, jwfox, crawl
User_Alias WEBMASTERS = will, wendy, wim

# Определение псевдонимов Runas (Выполнить как)
Runas_Alias OP = root, operator
Runas_Alias DB = oracle, sybase

# Определение псевдонимов машин
Host_Alias SPARC = bigtime, eclipse, moet, anchor :\
SGI = grolsch, dandelion, black :\
ALPHA = widget, thalamus, foobar :\
HPPA = boa, nag, python
Host_Alias CUNETS = 128.138.0.0/255.255.0.0
Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0
Host_Alias SERVERS = master, mail, www, ns
Host_Alias CDROM = orion, perseus, hercules

# Определение псевдонимов Cmnd (команд)
Cmnd_Alias DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\
/usr/sbin/restore, /usr/sbin/rrestore
Cmnd_Alias KILL = /usr/bin/kill
Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm
Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown
Cmnd_Alias HALT = /usr/sbin/halt, /usr/sbin/fasthalt
Cmnd_Alias REBOOT = /usr/sbin/reboot, /usr/sbin/fastboot
Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \
/usr/local/bin/tcsh, /usr/bin/rsh, \
/usr/local/bin/zsh
Cmnd_Alias SU = /usr/bin/su

Здесь мы переопределим некоторые встроенные значения по умолчанию. Мы хотим, чтобы sudo регистрировал события при помощи syslog(3), во всех случаях используя метод auth. Мы не хотим, что бы sudo читало лекции всем пользователям, и пользователь millert не должен указывать пароль. В добавок, на машинах в SERVERS Host_Alias мы держим дополнительный локальный файл журнала и удостоверимся, что мы регистрируем год в каждой строке файла журнала, так как записи журнала будут сохраняться в течение нескольких лет.

# Переопределяем встроенные значения по умолчанию
Defaults syslog=auth
Defaults:FULLTIMERS !lecture
Defaults:millert !authenticate
Defaults@SERVERS log_year, logfile=/var/log/sudo.log

Определение пользователя является частью, которая фактически определяет кто что может выполнять.

root ALL = (ALL) ALL
%wheel ALL = (ALL) ALL

Мы позволим супер-пользователю (root) и любому пользователю в группе wheel выполнить любую команду на любой машине от имени любого пользователя.

FULLTIMERS ALL = NOPASSWD: ALL

Системные администраторы занятые полный рабочий день (millert, mikef и dowdy) могут выполнить любую команду на любой машине без аутентификации.

PARTTIMERS ALL = ALL

Системные администраторы занятые не полный рабочий день (bostley, jwfox и crawl) могут выполнить любую команду на любом компьютере, но сначала должны себя аутентифицировать (так как в записи отсутствует тэг NOPASSWD).

jack CSNETS = ALL

Пользователь jack может выполнить любую команду на машинах с псевдонимом CSNETS (сети 128.138.243.0, 128.138.204.0 и 128.138.242.0). Из этих сетей только <128.138.204.0> имеет явную сетевую маску (в соответствии с CIDR) означающую сеть класса C. Для остальных сетей в CSNETS в случае соответствия будет использоваться сетевая маска машины.

lisa CUNETS = ALL

Пользователь lisa может выполнять любую команду на любой машине с псевдонимом CUNETS (сеть класса B 128.138.0.0).

operator ALL = DUMPS, KILL, PRINTING, SHUTDOWN, HALT, REBOOT,\
/usr/oper/bin/

Пользователь operator может выполнять команды ограничивающиеся простым обслуживанием. В данном случае таковыми являются резервное копирование, уничтожение процессов, система печати, выключение системы и любая команда в каталоге /usr/oper/bin/.

joe ALL = /usr/bin/su operator

Пользователь joe может выполнять только su(1) оператору.

pete HPPA = /usr/bin/passwd [A-z]*, !/usr/bin/passwd root

Пользователю pete разрешено изменять любой пароль, за исключением пароля супер-пользователя (root) на машинах HPPA. Учтите, что passwd(1) не воспринимает несколько имен пользователей подряд в одной командной строке.

bob SPARC = (OP) ALL : SGI = (OP) ALL

Пользователь bob может выполнять любые команды на машинах SPARC и SGI, как пользователь описанный в Runas_Alias в OP (root и operator).

jim +biglab = ALL

Пользователь jim может выполнить любую команду на машинах в сетевой группе biglab. Sudo знает, что biglab является сетевой группой из-за префикса +.

+secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser

Пользователи в сетевой группе secretaries должны как помогать в управлении принтерами, так и добавлять или удалять пользователей. Таким образом им позволено выполнять эти команды на всех машинах.

fred ALL = (DB) NOPASSWD: ALL

Пользователь fred может выполнять команды от имени любого пользователя в Runas_Alias DB (oracle или sybase), без указания пароля.

john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*

На машинах ALPHA пользователь john может выполнить su любому пользователю, за исключением супер-пользователя (root), но не имеет права задавать su(1) какие-либо флаги.

jen ALL, !SERVERS = ALL

Пользователь jen может выполнить любую команду на любой машине, за исключением машин в Host_Alias SERVERS (master, mail, www и ns).

jill SERVERS = /usr/bin/, !SU, !SHELLS

Для любой машины в Host_Alias SERVERS jill может выполнить любую команду в каталоге /usr/bin/, за исключением команд относящихся к Cmnd_Aliases SU и SHELLS.

steve CSNETS = (operator) /usr/local/op_commands/

Пользователь steve может выполнить любую команду в каталоге /usr/local/op_commands/, но только как пользователь operator.

matt valkyrie = KILL

На своей персональной рабочей станции, valkyrie, matt необходима возможность уничтожать зависшие процессы.

WEBMASTERS www = (www) ALL, (root) /usr/bin/su www

На машинах www, любой пользователь в User_Alias WEBMASTERS (will, wendy и wim), может выполнить любую команду как пользователь www (который является владельцем web-страниц) или просто su(1) к www.

ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\
/sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM

Любой пользователь может монтировать или размонтировать CD-ROM на машинах в Host_Alias CDROM (orion, perseus, hercules) без ввода пароля. Ввод этого несколько утомителен для пользователей, поэтому это первейший кандидат для включения в сценарий оболочки.

Взято из мануала к sudoerc на opennet.

=================

Согласно выше написанному, мне подходит срока:

operator       ALL = DUMPS, KILL, PRINTING, SHUTDOWN, HALT, REBOOT,/usr/oper/bin/

Меняю ее под свои нужды:

user       ALL = SHUTDOWN

(Не забудте создать пользователя user в системе!)
ВАЖНО! настройки начал с Debian Lenny, как известно встроенный root имеется. Так вот, захожу под этим пользователем и ввожу

sudo shutdown -r now

на что система говорит, данную команду может выполнить только root. Так вот!!!! в DEBIAN формат строки в sudoerc немного отличается и надо было прописать

user       ALL = /sbin/shutdown

ИМЕННО ТАК! после этого пользователь user в Debian Lenny смог выполнить команду

user       ALL = /sbin/shutdown

Остальные команды и операции в системе от имени рута ему запрещены, что и требовалось настроить.

Следующий этап, это настройка системы UBUNTU, все тоже самое. Создаю пользователя user и так как есть уже рабочая строка в sudoerc на Debian ее и добавляю в sudoerc

user       ALL = /sbin/shutdown

Сохраняю файл и выхожу и вот тут самое интересное, при попытке выполнить sudo любая команда от системного пользователя или от пользователя user я получаю ошибку в строке 23 (это добавленная строка). Что это значит, это значит, что раз в системе нет как такового рута я не смогу поправить файл sudoerc! не смогу выполнить ни одной команды требующей прав рута, даже выключить или перезагрузить корректно сервер не смогу. Ситуация в которой приходится править файл sudoerc, если это не домашний ПК, достаточно частая и достаточно часто получается такая незадача. Возможно кто то подумает что я драматизирую и что достаточно подойти к серверу, ребутнуть его, загрузится с лайв СД и делов то. Но что если сервер за 350 км? и все настройки выполняются удаленно через консоль SSH?
Меня спасло то, что root в системе был создан очень давно, пароль к сожалению не помнил, но смог сменить его через Webmin, который так же присутствовал на системе, иначе было бы худо.
После смены пароля зашел в систему уже рутом, через su и пароль рута, далее поправил файл sudoerc, в UBUNTU синтаксис строки не такой как в Debian и надо писать:

Cmnd_Alias     SHUTDOWN = /sbin/shutdown
 
user       ALL = SHUTDOWN

ИТОГ: Создавайте в системе полноценного ROOT, даже если вы им не пользуетесь, это спасет в непредвиденных ситуациях с ошибками в файле sudoerc или его порчей.

P.S. ... производите правки sudoerc с помощью специальной утилитой visudo, защита sudo и проверка синтаксиса обеспечены, возможно это сохранит вам немного нервов и позволит избежать вышеописанного.

Удачи!
H@wk!
/Охальников Олег/

Re: Sudo в Ubuntu и не только

Ман хороший, но дать право на shutdown юзеру можно было так:
chmod 751 /usr/bin/shutdown или если только одному юзеру надо дать такую привилегию,то

chown USER /usr/bin/shutdown
chmod 150 /usr/bin/shutdown

Как-то так...

Re: Sudo в Ubuntu и не только

Согласен, способов много. Был вариант создать веб страничку с кнопками, за авторизацией. Примерный код без кнопки:

<?php                                         
error_reporting(E_ALL);
var_dump(exec('whoami'));
?>

только вместо whoami пишем ssh + shutdown, дальше настраиваем между серверами ssh по ключам rsa к примеру чтобы без авторизации. В этом случае пользователю, который не сталкивался с никсами достаточно будет зайти в веб страничку и жмякнуть кнопку на ребут )))). К сожалению похоронил данную идею и выполнил через sudo.
К плюсам метода на судо можно отнесни дальнейшее расширение полномочий без особого гемороя, например надо чтобы этот ползователь по мимо shutdown мог выполнять и другие команды просто пишем:
user       ALL = SHUTDOWN,REBOOT,HALT,KILL
и так далее, согласно примеру
operator ALL = DUMPS, KILL, PRINTING, SHUTDOWN, HALT, REBOOT,/usr/oper/bin/
можно легко добавить все команды каталога /usr/oper/bin

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