sudo

Thank you for reading this post, don't forget to subscribe!

Бла­го­да­ря Sudo, вы може­те запу­стить неко­то­рые или все коман­ды как под root-ом. Когда Sudo уста­нов­лен (пакет: Sudo), вы може­те настро­ить его при помо­щи коман­ды 'visudo' под root-ом. В основ­ном он редак­ти­ру­ет (Vim по умол­ча­нию) /etc/sudoers, но это не реко­мен­ду­ет­ся делать вручную.

Непра­виль­ный син­так­сис, добав­лен­ный в этот файл, может пол­но­стью нару­шить рас­пре­де­ле­ние прав меж­ду поль­зо­ва­те­ля­ми. Пото­му для рабо­ты с этим фай­лом исполь­зу­ет­ся коман­да visudo. Коман­да visudo откры­ва­ет файл в обыч­ном тек­сто­вом редак­то­ре, но во вре­мя сохра­не­ния фай­ла про­ве­ря­ет его син­так­сис. Это поз­во­ля­ет избе­жать оши­бок в конфигурации.

Даль­ше пол­но­мо­чия опи­сы­ва­ют­ся строч­ка­ми вида:

  • Пер­вое поле зада­ёт имя поль­зо­ва­те­ля, к кото­ро­му нуж­но при­ме­нить дан­ное пра­ви­ло (в дан­ном слу­чае это demo).
  • Пер­вое ALL зна­чит, что пра­ви­ло будет при­ме­нять­ся ко всем хостам.
  • Вто­рое ALL зна­чит, что ука­зан­ный поль­зо­ва­тель может запус­кать коман­ды в сес­сии любо­го пользователя.
  • Тре­тье ALL зна­чит, что ука­зан­ный поль­зо­ва­тель может запус­кать коман­ды в любой группе.
  • Послед­нее ALL ука­зы­ва­ет, что эти пра­ви­ла нуж­но при­ме­нять ко всем командам.

Это зна­чит, что поль­зо­ва­те­ли root и demo могут запус­кать все коман­ды при помо­щи sudo, ука­зав свой пароль.

Параметры привилегий групп

%admin      ALL=(ALL) ALL
%sudo       ALL=(ALL:ALL) ALL

Послед­ние две стро­ки похо­жи на пара­мет­ры при­ви­ле­гий поль­зо­ва­те­лей, одна­ко они отве­ча­ют за пра­ва групп.

Име­на групп начи­на­ют­ся с символа %.

Как види­те, груп­па admin может выпол­нять любую коман­ду как любой поль­зо­ва­тель или хост. Ана­ло­гич­ные пра­ва име­ет груп­па sudo, одна­ко она так­же может запус­кать коман­ду как любая группа.

Создание алиасов

Файл sudoers мож­но более удоб­но струк­ту­ри­ро­вать при помо­щи раз­лич­ных алиасов

К при­ме­ру, мож­но создать три раз­ные груп­пы поль­зо­ва­те­лей с сов­ме­щён­ны­ми правами:

User_Alias      GROUPONE = user11, user12, user13
User_Alias      GROUPTWO = user21, user22, user23,
User_Alias      GROUPTHREE = user31, user32, user33

Име­на групп долж­ны начи­нать­ся с боль­шой бук­вы. После это­го мож­но дать поль­зо­ва­те­лям GROUPTWO пра­во на изме­не­ние БД apt-get:

GROUPTWO    ALL = /usr/bin/apt-get update

Если в пра­ви­ле не ука­зан поль­зо­ва­тель и груп­па, по умол­ча­нию sudo исполь­зу­ет root.

Затем мож­но раз­ре­шить поль­зо­ва­те­лям груп­пы GROUPTHREE выклю­чать и пере­за­пус­кать маши­ну; для это­го нуж­но создать али­ас команды:

Cmnd_Alias      POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE  ALL = POWER

Али­ас коман­ды POWER содер­жит коман­ды для отклю­че­ния и пере­за­пус­ка машины.

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

Runas_Alias     WEB = www-data, apache
GROUPONE    ALL = (WEB) ALL

Теперь любой поль­зо­ва­тель груп­пы GROUPONE может выпол­нять коман­ды в сес­си­ях поль­зо­ва­те­лей www-data или apache.

При­ме­ча­ние: Помни­те, что создан­ные ранее пра­ви­ла име­ют более высо­кий при­о­ри­тет в слу­чае кон­флик­та правил.

 

___________________

Мы можем поз­во­лить поль­зо­ва­те­лю или груп­пе поль­зо­ва­те­лей запус­кать толь­ко одну коман­ду или груп­пу команд. Давай­те вер­нем­ся к наше­му sudoers фай­лу. Нач­нем с alex и alisa, чле­нов груп­пы administrator. Если мы хотим, что­бы все поль­зо­ва­те­ли из группы"administrator" были в состо­я­нии запу­стить каж­дую коман­ду в каче­стве супер­поль­зо­ва­те­ля, мы долж­ны изме­нить наш пример:

Alex так же может выпол­нить супер­поль­зо­ва­тель­скую коман­ду, и alisa полу­чи­ла пра­во запус­кать Sudo, с теми же пра­ва­ми и со сво­им паро­лем. Если alex и alisa не чле­ны одной груп­пы, мы можем опре­де­лить псев­до­ним поль­зо­ва­те­ля в фай­ле sudoers:

Здесь мы опре­де­ли­ли али­ас под назва­ни­ем ADMINS, с чле­на­ми alisa и alex.

Тем не менее, мы не хотим, что­бы alex и alisa мог­ли запус­кать с пра­ва­ми супер­поль­зо­ва­те­ля любую про­гра­му. Мы хотим, что­бы они мог­ли запус­кать толь­ко 'updatedb'. Давай­те опре­де­лим коман­ду псевдоним:

Но это­го мало! Мы долж­ны ска­зать Sudo, что поль­зо­ва­те­ли, опре­де­лен­ные как ADMINS, могут запус­кать коман­ды задан­ные в LOCATE. Что­бы сде­лать это, мы заме­ним стро­ки с "%admin" на эти:

Это озна­ча­ет, что поль­зо­ва­те­ли вхо­дя­щие в али­ас ADMINS могут запус­кать все коман­ды в али­а­се LOCATE.

На этот раз, /etc/sudoers выгля­дит сле­ду­ю­щим образом:

В резуль­та­те alex и alisa могут запус­кать updatedb, как root, вве­дя свой пароль.

Если послед­нюю строч­ку в фай­ле изменить:

тогда alex и alisa смо­гут выпол­нить 'sudo updatedb' без вво­да пароля.

Мож­но доба­вить дру­гие коман­ды в команд­ный али­ас и более али­а­сов в пра­ви­ло. Напри­мер мы можем создать али­ас NETWORKING содер­жа­щий неко­то­рые сете­вые коман­ды типа: ifconfig, route или iwconfig:

 

Давай­те все это доба­вим в наш /etc/sudoers файл (с помо­щью visudo!). А так­же предо­ста­вим нашей ADMINS групе пра­ва на выпол­не­ние про­грамм и из али­а­са NETWORKING:

 

Про­вер­ка, авто­ри­зуй­тесь как alisa (или alex), и наберите:

Ответ дол­жен вер­нуть­ся быстро:

 

Теперь, тоже-самое но с Sudo:

 

Sudo часто исполь­зу­ет­ся для предо­став­ле­ния опре­де­лен­ным поль­зо­ва­те­лям частич­но­го досту­па к при­ве­ли­ги­ро­ван­ным коман­дам, что­бы они мог­ли выпол­нять огра­ни­чен­ные адми­ни­стра­тив­ные функ­ции. Одно из удобств Sudo в том, что все коман­ды запи­сы­ва­ют­ся в /var/log/secure. При­ве­ден­ный выше при­мер будет опи­сан строч­кой в журнале:

___________________

Блокировка правил

Суще­ству­ет ряд спо­со­бов кон­тро­ля пове­де­ния и реак­ции sudo на вызов.

К при­ме­ру, коман­да updatedb в соче­та­нии с паке­том mlocate отно­си­тель­но без­вред­на. Что­бы обыч­ный поль­зо­ва­тель мог выпол­нять её с при­ви­ле­ги­я­ми супер­поль­зо­ва­те­ля, не вво­дя пароль, мож­но создать такое правило:

GROUPONE    ALL = NOPASSWD: /usr/bin/updatedb

Коман­да NOPASSWD зна­чит, что систе­ма не будет запра­ши­вать пароль. Так­же суще­ству­ет коман­да PASSWD, кото­рая отве­ча­ет за про­ти­во­по­лож­ное пове­де­ние и исполь­зу­ет­ся по умолчанию.

NOPASSWD рас­про­стра­ня­ет­ся на всё пра­ви­ло, если коман­да PASSWD не отме­ня­ет его. Напри­мер, стро­ка может выгля­деть так:

GROUPTWO    ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill

Ещё одна удоб­ная коман­да – NOEXEC, кото­рая исполь­зу­ет­ся для предот­вра­ще­ния опас­но­го пове­де­ния опре­де­лен­ных про­грамм. К при­ме­ру, неко­то­рые коман­ды, такие как less, могут вызы­вать дру­гие команды:

!command_to_run

Эта коман­да выпол­ня­ет любую коман­ду с при­ви­ле­ги­я­ми поль­зо­ва­те­ля, запус­ка­ю­ще­го less, а это может быть очень опасно.

Что­бы запре­тить такое пове­де­ние, мож­но исполь­зо­вать сле­ду­ю­щую строку:

username    ALL = NOEXEC: /usr/bin/less

Дополнительные сведения

В дан­ном раз­де­ле собра­ны раз­лич­ные полез­ные сове­ты по рабо­те с sudo.

Если вы ука­за­ли поль­зо­ва­те­ля или груп­пу в пара­мет­ре Run as, вы може­те выпол­нять коман­ды в сес­сии это­го поль­зо­ва­те­ля при помо­щи фла­гов -u и –g соответственно:

sudo -u run_as_user command
sudo -g run_as_group command

По умол­ча­нию sudo сохра­ня­ет учёт­ные дан­ные в одном тер­ми­на­ле на неко­то­рое вре­мя. Это озна­ча­ет, что в тече­ние это­го пери­о­да вам не при­дет­ся вво­дить пароль снова.

Если в целях без­опас­но­сти вы хоти­те сбро­сить этот тай­мер, исполь­зуй­те команду:

sudo -k

Что­бы узнать пра­ва поль­зо­ва­те­ля, введите:

sudo -l

Эта коман­да выве­дет все пра­ва, ука­зан­ные в фай­ле /etc/sudoers для дан­но­го пользователя.

Если обыч­ный поль­зо­ва­тель попы­та­ет­ся запу­стить коман­ду адми­ни­стра­то­ра без пре­фик­са sudo, коман­да не сра­бо­та­ет. Что­бы  избе­жать необ­хо­ди­мо­сти повтор­но­го вво­да коман­ды, исполь­зуй­те функ­цию bash, кото­рая повто­ря­ет команду:

sudo !!

Двой­ной вос­кли­ца­тель­ный знак повто­рит послед­нюю команду.

 

при нали­чии ошиб­ки вывод будет следующий:

[root@centos64 ~]# visudo
visudo: >>> /etc/sudoers: syntax error near line 113 <<<
visudo: >>> /etc/sudoers: syntax error near line 115 <<<
visudo: >>> /etc/sudoers: syntax error near line 113 <<<
What now?
Options are:
(e)dit sudoers file again
e(x)it without saving changes to sudoers file
(Q)uit and save changes to sudoers file (DANGER!)

What now? Q