Пользователи в Linux. Повышение пользовательских прав su или sudo.

Продолжаем знакомиться с типами пользователей и средствами администрирования в Linux. Сегодня я хочу рассказать о повышении прав обычного пользователя с помощью команд su и sudo.

Во всех UNIX-системах всегда существует пользователь с расширенными привилегиями, как правило это пользователь root, имеющий право на выполнение любых операций. Его свобода действий ничем не ограничена, в отличии от обычных пользователей имеющих ограничения в правах.

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

Назначение пользователю администраторских прав может привести к следующим проблемам.

  • Пользователь обладающий администраторскими правами может неправильно настроить систему, в связи с этим могут возникнуть технические проблемы и дыры в безопасности.
  • Пользователь обладающий администраторскими правами может запустить небезопасные службы.
  • Пользователь обладающий администраторскими правами может запустить  небезопасные почтовые вложения. Это больше актуально в Windows, хотя в Linux тоже есть вирусы.
  • Пользователь обладающий администраторскими правами может запустить небезопасные скрипты, программы или команды.
  • Малейшая опечатка в выполняемой команде, может удалить важные файлы или директории целиком, если работа идет с правами root.

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

Повышение пользовательских прав командой su

Давайте рассмотрим такую ситуацию, когда пользователю нужно установить некую программу, например wget.

[test@test2 ~]$ yum install -y wget
Загружены модули: fastestmirror
Для выполнения этой команды необходимы привилегии суперпользователя.

Все, приехали, для выполнения этой команды нужны привилегии суперпользователя. Что делать дальше? Далее можно воспользоваться так называемым повышением пользовательских прав. Для подобных целей существует команда su.

[test@test2 ~]$ su
Пароль: 
[root@test2 test]# 

Что-же произошло в процессе выполнения команды? При выполнении команды был запрошен пароль суперпользователя, после ввода пароля происходит подмена имени пользователя test на имя root, что дает пользователю право выполнять все действия от его имени.

Было [test@test2 ~]$, стало [root@test2 test]#. Теперь можно установить нужную программу или выполнить необходимую операцию, ради которой все это и было затеяно. Для возвращения назад используют команду exit.

[root@test2 test]# exit
exit
[test@test2 ~]$ 

После выполнения команды exit происходит возвращение в свое пользовательское окружение [test@test2 ~]$.

Существует еще один вариант выполнения команды - su -. При выполнении su - изменяется не только имя, но и рабочее окружение пользователя.

[test@test2 ~]$ su -
Пароль: 
Последний вход в систему:Сб фев 11 21:11:06 MSK 2017на pts/0
[root@test2 ~]# 

Были [test@test2 ~]$, стали [root@test2 ~]#. Грубо говоря стали пользователем root, до тех пор пока не будет выполнена команда exit и пользователь не вернется назад в свое окружение.

У некоторых читателей может появиться вопрос: Зачем это нужно, если обычный пользователь зная пароль root может входить напрямую, без всяких заморочек? Да может, зная пароль это не составит особого труда. Я описываю ситуацию когда root и обычный пользователь, это один и тот-же человек.

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

А как быть если пользователей много? Ведь это не есть хорошо, когда пароль root знает каждый из них. В том-то и дело что не каждый юзер знает пароль. Грамотный администратор не будет разбрасываться паролем направо и налево, а доверит его только проверенным пользователям. Пароль может знать каждый, но не каждый сможет его применить, этой привилегией обладает тот, кто входит в специальную группу пользователей.

В UNIX-системах существует так называемая группа wheel, только входящие в нее пользователи могли выполнять команду su. В последних версиях Linux любой пользователь может выполнять su по умолчанию, а раньше у них такой возможности не было. В старых версиях Linux и системе FreeBSD, команда su могла выполняться только после внесения пользователя в группу wheel администратором.

Подобную манипуляцию пользователями можно провернуть и в современных версиях Linux. Допустим что у нас есть два пользователя techlist_1 и techlist_2, по умолчанию не относящиеся к группе wheel.

[root@test2 ~]# id techlist_1
uid=1001(techlist_1) gid=1004(techlist_1) группы=1004(techlist_1)
[root@test2 ~]# id techlist_2
uid=1002(techlist_2) gid=1005(techlist_2) группы=1005(techlist_2)

Добавим пользователя techlist_1 в группу wheel, а techlist_2 оставим без изменений.

[root@test2 ~]# usermod -a -G wheel techlist_1
[root@test2 ~]# id techlist_1
uid=1001(techlist_1) gid=1004(techlist_1) группы=1004(techlist_1),10(wheel)
[root@test2 ~]# id techlist_2
uid=1002(techlist_2) gid=1005(techlist_2) группы=1005(techlist_2)

Отредактируем файл /etc/pam.d/su для возвращения возможности разделения пользователей, как в старых версиях Linux.

[root@test2 ~]# nano /etc/pam.d/su

Находим следующую строку и расскомментируем ее, уберем знак #, в начале строки:
#auth           required        pam_wheel.so use_uid
auth           required        pam_wheel.so use_uid

Сохраняем изменения и выходим.

Проверим как теперь пользователи смогут выполнять команду su. Сначала проверим входящего в группу wheel пользователя.

[techlist_1@test2 ~]$ su
Пароль: 
[root@test2 techlist_1]# exit
exit
[techlist_1@test2 ~]$ su -
Пароль: 
Последний вход в систему:Вс фев 12 04:49:44 MSK 2017на pts/1
[root@test2 ~]# 

Теперь второго, которого не добавляли в группу.

[techlist_2@test2 ~]$ su
Пароль: 
su: Доступ запрещен
[techlist_2@test2 ~]$ su -
Пароль: 
su: Доступ запрещен
[techlist_2@test2 ~]$

Что и требовалось доказать. Один пользователь выполняет команду su, а другой не может. Вот так может работать повышение пользовательских прав при помощи команд su и su -.

Повышение пользовательских прав командой sudo

Существует более современный способ повышения пользовательских прав с помощью команды sudo (substitute user and do - подменить пользователя и выполнить).

Sudo является программой системного администрирования, дающей возможность выполнять команды от имени root. Если для выполнения команды su все пользователи должны были знать пароль root, что само по себе небезопасно, то sudo его не требует. В sudo нужен пароль самого пользователя.

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

От имени root:
yum install -y wget

При помощи sudo:
sudo yum install -y wget

Sudo определяет пользователя сверяясь с настройками находящимися в файле /etc/sudoers, если пользователь внесен в sudoers, то команда выполняется. Если выполнить команду sudo от имени пользователя не внесенного в sudoers, то можно увидеть такую картину:

[test@test2 ~]$ sudo yum install -y wget
[sudo] password for test: 
test is not in the sudoers file.  This incident will be reported.

При попытке выполнить команду sudo, от имени пользователя test, выдается ответ что такого пользователя в файле sudoers не обнаружено. О событии создается запись в лог файле, также высылается электронное письмо root-пользователю с уведомлением о случившемся.

From root@test2.localdomain  Sat Feb 11 20:19:12 2017
Return-Path: <root@test2.localdomain>
X-Original-To: root
Delivered-To: root@test2.localdomain
Received: by test2.localdomain (Postfix, from userid 0)
        id CD2AF8051BC; Sat, 11 Feb 2017 20:19:12 +0300 (MSK)
To: root@test2.localdomain
From: test@test2.localdomain
Auto-Submitted: auto-generated
Subject: *** SECURITY information for test2 ***
Message-Id: <20170211171912.CD2AF8051BC@test2.localdomain>
Date: Sat, 11 Feb 2017 20:19:12 +0300 (MSK)

test2 : Feb 11 20:19:12 : test : user NOT in sudoers ; TTY=pts/0 ; PWD=/home/test ; USER=root ; COMMAND=/bin/yum install wget

Для того чтобы пользователь мог выполнять sudo, его надо внести в файл sudoers. Сделать это можно двумя способами.

Первый способ - внесение имени пользователя непосредственно в сам файл /etc/sudoers. Для изменения файла sudoers, требуется обладать правами root.

nano /etc/sudoers
 
Находим строку:
root    ALL=(ALL)	ALL
 
Добавляем под нее имя пользователя, которому будет разрешен доступ к sudo:
root    ALL=(ALL)	ALL
test    ALL=(ALL)	ALL
 
Сохраняем и выходим.

После того как пользователь будет внесен в список допущенных к использованию, он может выполнять команду sudo.

Вторым способом разрешить пользователям выполнять команду sudo, является внесение пользователя в группу wheel, точно так же как в случае с командой su.

Вносим пользователя в группу wheel:
usermod -a -G wheel techlist_1
 
Проверяем:
id techlist_1
uid=1001(techlist_1) gid=1004(techlist_1) группы=1004(techlist_1),10(wheel)
 
Перезагружаем систему:
reboot

После перезагрузки системы, пользователь внесенный в группу wheel, сможет выполнять sudo.

Для того чтобы полностью сменить окружение пользователя на окружение root, используется команда sudo -i, что равносильно использованию команды su -

[test@test2 ~]$ sudo -i
[sudo] password for test: 
[root@test2 ~]# 

Возвращение в свое пользовательское окружение, происходит при помощи команды exit.

Каждый раз при использовании sudo, требуется ввод пароля пользователя. При вводе пароля, происходит обновление временной метки, что позволяет выполнять sudo без ввода пароля на протяжении некоторого времени. По умолчанию ввод пароля не требуется на протяжении пяти минут, после чего пароль опять будет затребован. Временной промежуток можно изменить при помощи опции timeout в файле sudoers. Существует возможность отключения ввода пароля.

Отключить ввод пароля для пользователей принадлежащих к группе wheel:

Открываем для внесения изменений:
nano /etc/sudoers
 
Находим строку:
# %wheel        ALL=(ALL)	NOPASSWD: ALL
 
Раскомментировать строку:
%wheel        ALL=(ALL)	NOPASSWD: ALL
 
 
Сохраняем изменения и выходим.

Отключить ввод пароля для пользователей добавленных вручную:

Открываем для внесения изменений:
nano /etc/sudoers
 
Находим строку с нужным пользователем:
test    ALL=(ALL)     ALL
 
Изменяем ее:
test    ALL=(ALL)     NOPASSWD: ALL
 
Сохраняем изменения и выходим.

Sudo гибкая в настройке и позволяет настроить множество различных параметров. Грамотный администратор знающий sudo может творить настоящие чудеса с пользователями.

Для просмотра руководства по настройке sudo, выполняется команда:

Посмотреть руководство sudo:
man sudoers
 
Выйти из руководства:
q
 
Посмотреть список дополнительных опций команды:
sudo -h

Ограничение доступа для root

После настройки sudo и назначения пользователям нужных прав, можно ограничить доступ к учетной записи root. Существует несколько способов защиты от входа под root и ограничения доступа к его учетной записи.

Изменение пользовательской оболочки root

Для предотвращения входа в оболочку root, достаточно отредактировать файл /etc/passwd, заменив оболочку /bin/bash на /sbin/nologin. Данный способ предотвращает доступ к учетной записи root, с помощью команд использующих оболочку и протокола ssh.

Открываем файл для редактирования:
nano /etc/passwd
 
Находим строку:
root:x:0:0:root:/root:/bin/bash
 
Заменяем /bin/bash на /sbin/nologin:
root:x:0:0:root:/root:/sbin/nologin

Пробуем подключиться по ssh от имени root.

Connecting to 192.168.1.210:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Last failed login: Sun Feb 12 06:13:22 MSK 2017 on pts/1
There was 1 failed login attempt since the last successful login.
Last login: Sun Feb 12 06:11:08 2017 from 192.168.1.2
This account is currently not available.

Connection closed by foreign host.

Disconnected from remote host(CentOS_Test_2) at 06:46:52.

Пробуем выполнить команду su от имени обычного пользователя.

[test@test2 ~]$ su
Пароль: 
This account is currently not available.
[test@test2 ~]$

Таким образом достигается полное запрещение доступа от имени root, так и выполнение команд от его имени другими пользователями. Администратор настроив свой аккаунт пользователя и наделив его необходимыми правами может обходиться sudo не прибегая к помощи root.

Запрет удаленного доступа для root

Данный способ запрещает удаленное подключение от имени root по протоколу ssh. Ограничение затрагивает только ssh доступ, все остальные команды: su - или su - продолжают работать.

Для этого вносят изменения в файл /etc/ssh/sshd_config

Открываем файл для редактирования:
nano /etc/ssh/sshd_config
 
Находим строку в разделе Authentication:
PermitRootLogin yes
 
Заменяем yes на no:
PermitRootLogin no
 
Перезапускаем ssh:
service sshd restart - в CentOS
service ssh restart - в Debian & Ubuntu

Запрет доступа root с консольных устройств

Для ограничения доступа к учетной записи root, администраторы также могут запретить вход с любых консольных устройств использующих tty. Для реализации этого ограничения требуется очистить файл /etc/securetty.

cat /dev/null > /etc/securetty

Файл очищается и применяются изменения. Сначала не помешает сделать бэкап файла.

Ответить:

Please enter your comment!
Please enter your name here