Linux

Как предоставить доступ нескольким системным администраторам Linux, работающим от имени пользователя root?

В нашей команде есть три опытных сисадмина Linux, которым приходится администрировать несколько десятков серверов Debian. Ранее мы все работали под правами root, используя аутентификацию с открытым ключом SSH. Но мы обсудили, что является лучшей практикой для этого сценария, и не смогли прийти к единому мнению.

Все открытые ключи SSH помещены в ~root/.ssh/authorized_keys2.

Преимущество: простота использования, пересылка SSH агентов работает легко, небольшие накладные расходы.

Недостаток: отсутствие аудита (вы никогда не узнаете, какой «root» внес изменения). 

Использование персонализированных учетных записей и sudo

Таким образом, мы могли бы входить в систему с персонализированными учетными записями, используя открытые ключи SSH, и использовать sudo для выполнения отдельных задач с правами root. Кроме того, мы можем дать себе группу «adm», которая позволит нам просматривать файлы журналов.

Преимущество: хороший аудит, sudo не позволяет нам слишком легко делать опасные действия.

Недостаток: переадресация SSH-агента ломается, это хлопотно, потому что почти ничего нельзя сделать не под рутом.

Использование нескольких пользователей с UID 0

Это очень уникальное предложение от одного из сисадминов. Он предлагает создать трех пользователей в /etc/passwd, имеющих UID 0, но разные имена входа. Он утверждает, что на самом деле это не запрещено и позволяет всем иметь UID 0, но при этом иметь возможность аудита.

Преимущество: переадресация агентов SSH работает, аудит может работать (не проверено), нет проблем с sudo.

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

Что бы вы предложили?

Ответ 1

Что касается третьей предложенной стратегии, то, кроме изучения опций useradd -o -u userXXX, я не знаком с запуском нескольких пользователей с одним и тем же uid. 

Мое первое замечание относительно первого варианта «Все открытые ключи SSH помещаются в ~root/.ssh/authorized_keys2» заключается в том, что если вы абсолютно не собираетесь работать на других системах, то, по крайней мере, часть времени вам придется работать с учетными записями пользователей и sudo.

Второе замечание заключается в том, что если вы работаете с системами, которые стремятся к соответствию HIPAA, PCI-DSS, или таким вещам, как CAPP и EAL, то вам придется работать с sudo, потому что:

Это промышленный стандарт, обеспечивающий индивидуальные учетные записи пользователей без рута, которые могут быть проверены, отключены, просрочены и т. д., обычно с использованием некоторой централизованной базы данных пользователей.

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

Поэтому я могу передать вам несколько фокусов, которые я использую для обхода опасных факторов sudo, о которых вы упомянули. Первая проблема заключается в том, что если вход root заблокирован с помощью PermitRootLogin=no или у вас нет root ключа ssh, то это делает SCP файлы чем-то вроде PITA.

Проблема 1: вы хотите передать файлы по scp с удаленной стороны, но они требуют root-доступа, однако вы не можете войти на удаленную систему как root напрямую.

Простое решение: скопировать файлы в домашний каталог, используя chown или scp.

ssh userXXX@remotesystem, sudo su - etc, cp /etc/somefiles to /home/userXXX/somefiles, chown -R userXXX /home/userXXX/somefiles, используйте scp для получения файлов с удаленного компьютера.

Более грамотное решение: sftp поддерживает флаг -s sftp_server, поэтому вы можете сделать что-то вроде следующего (если вы настроили беспарольный sudo в /etc/sudoers):

sftp  -s '/usr/bin/sudo /usr/libexec/openssh/sftp-server' \

userXXX@remotehost:/etc/resolv.conf 

 (вы также можете использовать этот обходной путь с sshfs, но я не уверен, что это сработает...)

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

Метод Port Forward Ninja:

Войдите на удаленный хост, но укажите, что удаленный порт 3022 (может быть любым свободным и не зарезервированным для администраторов, т. е. >1024) должен быть перенаправлен обратно на порт 22 на локальной машине.

[localuser@localmachine ~]$ ssh userXXX@remotehost -R 3022:localhost:22

Last login: Mon May 21 05:46:07 2019 from 123.123.123.123

 

Получите root обычным способом:

-bash-3.2$ sudo su -

[root@remotehost ~]# 

 Теперь вы можете передавать файлы по scp в другом направлении, избегая шага создания промежуточной копии файлов:

[root@remotehost ~]#  scp -o NoHostAuthenticationForLocalhost=yes \

 -P3022 /etc/resolv.conf localuser@localhost:~

localuser@localhost's password: 

resolv.conf                                 100%  

[root@remotehost ~]#  

Проблема 2: переадресация агентов SSH. Если вы загружаете корневой профиль, например, указывая оболочку для входа, необходимые переменные окружения для пересылки агента SSH, такие как SSH_AUTH_SOCK, сбрасываются, поэтому пересылка агента SSH «ломается» под sudo su -.

Половинчатый ответ:

Все, что должным образом загружает оболочку root, по праву сбросит окружение, однако есть небольшое обходное решение, которое можно использовать, когда вам нужны и права root, и возможность использовать SSH-агент одновременно.

Это позволяет получить своего рода профиль «химеры», который на самом деле не следует использовать, потому что это неприятный хак, но он полезен, когда вам нужно передать файлы SCP с удаленного хоста как root на другой удаленный хост.

В любом случае вы можете разрешить пользователю сохранять свои переменные ENV, установив следующее в sudoers:

Defaults:userXXX    !env_reset

это позволяет вам создавать гибридные среды входа в систему, например:

[localuser@localmachine ~]$ ssh userXXX@remotehost 

Last login: Mon May 21 12:33:12 2019 from 123.123.123.123

-bash-3.2$ env | grep SSH_AUTH

SSH_AUTH_SOCK=/tmp/ssh-qwO715/agent.1971

 

создать оболочку bash, которая запускает /root/.profile и /root/.bashrc, но сохраняет SSH_AUTH_SOCK.

-bash-3.2$ sudo -E bash -l

 Таким образом, эта оболочка имеет права root и root $PATH.

bash-3.2# id

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t

bash-3.2# echo $PATH

/usr/kerberos/sbin:/usr/local/sbin:/usr/sbin:/sbin:/home/xtrabm/xtrabackup-manager:/usr/kerberos/bin:/opt/admin/bin:/usr/local/bin:/bin:/usr/bin:/opt/mx/bin

 Вы можете использовать этот вызов для выполнения действий, требующих удаленного доступа к sudo root, а также доступа к агенту SSH, например, так:

bash-3.2# scp /root/.ssh/authorized_keys ssh-agent-user@some-other-remote-host:~

/root/.ssh/authorized_keys              100%  126     0.1KB/s   00:00    

bash-3.2# 

Ответ 2

Определенно, я бы использовал вариант 2.

  1. Это означает, что вы разрешаете доступ к SSH как root. Если эта машина каким-либо образом связана с внешней сетью это небезопасный вариант. Когда я запускал SSH через порт 22, мой VPS ежечасно получал множество попыток аутентифицироваться как root. У меня была базовая IDS, настроенная на регистрацию и запрет IP-адресов, которые делали несколько неудачных попыток, но они продолжали приходить. К счастью, я отключил доступ к SSH от имени пользователя root, как только у меня появилась собственная учетная запись и настроен sudo. Кроме того, в этом случае у вас практически нет аудиторского следа.

  2. Предоставляет root-доступ по мере необходимости. Да, у вас почти нет привилегий как у обычного пользователя, но это именно то, что вам нужно; если учетная запись будет взломана, вы захотите, чтобы ее возможности были ограничены. Вы также захотите, чтобы любой доступ суперпользователя требовал повторного ввода пароля. Кроме того, доступ к sudo можно контролировать через группы пользователей и ограничивать определенные команды, что дает вам больше контроля над тем, кто к чему имеет доступ. Кроме того, команды, выполняемые от имени sudo, могут записываться в журнал, что позволяет лучше отслеживать ситуацию, если что-то пошло не так. О, и не запускайте команду «sudo su –» сразу после входа в систему. Это очень плохая практика.

  3. Идея вашего сисадмина плоха. Машины *nix, вероятно, не помешают вам это сделать, но и ваша файловая система и практически все приложения ожидают, что каждый пользователь будет иметь уникальный UID. Если вы начнете идти по этому пути, я могу гарантировать, что вы столкнетесь с проблемами. Может быть, не сразу, но рано или поздно. Например, несмотря на красивые дружественные имена, файлы и каталоги используют номера UID для обозначения своих владельцев; если вы столкнетесь с программой, у которой есть проблема с дублированием UID, вы не сможете просто изменить UID в файле passwd, не прибегая к серьезной ручной очистке файловой системы.

Ответ 3

Вариант 3 это то, что первым пришло мне в голову. 

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

Минусы: каждый из админов постоянно будет root, поэтому ошибки могут быть катастрофическими.

Я бы хотел спросить, зачем вам нужно, чтобы все администраторы имели root-доступ. Все три предложенных вами метода имеют один явный недостаток: как только администратор запускает sudo bash -l или sudo su - или что-то подобное, вы теряете возможность отслеживать, кто что делает, и после этого ошибка может быть катастрофической. Более того, в случае возможного неправильного поведения это даже может закончиться гораздо хуже.

Вместо этого лучше пойти другим путем:

  1. Создайте своих администраторов как обычных пользователей.

  2. Решите, кто какую работу должен выполнять (управление apache/управление postfix и т. д.).

  3. Добавьте пользователей в соответствующие группы (например, добавьте «Мартин» в «postfix» и «mail», «amavis», если вы его используете, и т. д.).

  4. Исправьте права доступа (chmod -R g+w postfix:postfix /etc/postfix).

  5. Дайте только относительные права sudo: (visudo -> разрешить «Мартину» использовать /etc/init.d/postfix , /usr/bin/postsuper и т. д.).

Таким образом, Мартин сможет безопасно работать с postfix, и в случае ошибки или неправильного поведения вы потеряете только систему postfix, а не весь сервер.

Та же логика может быть применена к любой другой подсистеме, такой как apache, mysql и т. д.

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

Схожие статьи

Linux

Как объединить две статические библиотеки «ar» в одну

Linux

Как найти расположение MySQL my.cnf

Linux

Как безопасно соединить две сети через интернет?

Linux

Определение переменной с экспортом или без него