Как использовать SFTP в системе, которая требует sudo для корневого доступа и аутентификации на основе ключей ssh?

26

Я хочу иметь возможность использовать SFTP для редактирования файлов, требующих прав root.

Я использую аутентификацию на основе ключа SSH - ключ rsa на смарт-карте.

Если системе требуется sudo для выполнения команд корневого уровня, как мне обойти это?

Могу ли я создать способ обхода sudo только для SFTP?

Есть ли способ сохранить аутентификацию sudo & key.

Я использую Windows для подключения к Ubuntu. Мне это нужно для работы с Mac, подключающимся к Ubuntu.

Я понимаю, как сделать SSH Tunneling для администрирования системных служб. В настоящее время я использую логин пользователя root напрямую, но пароль паролем отключен. Я не понимал, как использовать sudo и SFTP одновременно. Представляется целесообразным требовать входа в систему от имени пользователя без полномочий root, а затем требовать использования sudo, поскольку в журналах будет записываться, кому были предоставлены повышенные привилегии для каждой команды.

Должен ли я беспокоиться об этом при использовании аутентификации на основе ключей или это тривиальное различие в безопасности / ведении журнала? Похоже, что аутентификация на основе ключей записывает серийный номер пользователя в журналы, и вы можете иметь несколько ключей, чтобы корневой пользователь мог идентифицировать каждого пользователя. Кажется, это тот же эффект, что и использование sudo для меня. Я ошибся?

Брюс Киркпатрик
источник
2
Я бы просто использовал учетную запись root с аутентификацией на основе ключей напрямую и пропустил sudo.
Мартин фон Виттих
1
«Похоже, что рекомендуется входить в систему как пользователь без полномочий root, а затем использовать sudo, поскольку в журналах будет записываться, кому предоставлены повышенные привилегии для каждой команды». - но это не стоит много, потому что тот, кто приобрел привилегии суперпользователя, может все равно вмешиваться в журналы.
Мартин фон Виттих
Сколько файлов?
Нильс
1
Просто отметим, что ниже приведен один правильный ответ sftp -s "sudo / usr / lib / openssh / sftp-server" targethost.fqdn. Если для sudo требуется пароль, вы можете добавить эту конкретную команду в белый список для nopasswd.
Микко Охтамаа,

Ответы:

7

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

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

РЕДАКТИРОВАТЬ: Я забыл: вы можете создать другую учетную запись с тем же эффектом, что и root, если вы назначите идентификатор пользователя на 0, но не имеет никакого смысла, будучи таким же опасным. Может дать некоторую путаницу, если кто-то попытается войти в систему как root, но кроме этого, не было особого смысла.

gabrign
источник
12

Вызов подсистемы с помощью sudo работал для меня.

Для хоста Ubuntu, например:

sftp -s "sudo /usr/lib/openssh/sftp-server" targethost.fqdn
киви
источник
2
Это работает, только если вам не нужен пароль для sudo или если у вас уже есть билет sudo и отключен tty_tickets. На большинстве современных установок ни одна из них не используется по умолчанию.
Гепард
Это идеально подходит для подключений к системам Amazon Linux по умолчанию, где вы подключаетесь как пользователь ec2-user и можете использовать sudo без пароля. +1, спасибо! (Обратите внимание, что в Amazon Linux эта команда немного отличается:. sudo /usr/libexec/openssh/sftp-server)
MarnixKlooster ReinstateMonica
Я широко использую это решение для входа в систему как другой пользователь, для которого прямой вход отключен (для целей аудита и ведения журнала). К сожалению, такие инструменты, как муравей, не раскрывают эту подсистему. Тем не менее, я бы посоветовал никогда не выполнять sudo для root, а для другого пользователя с достаточными привилегиями, чтобы делать то, что вам нужно. Проблема, с которой приходится сталкиваться, заключается в том, что не все среды Unix одинаковы, и подсистема sftp может быть расположена в разных местах, как отмечено @MarnixKlooster
YoYo
Для Amazon Linux вся команда выглядит так: "sftp -s 'sudo / usr / libexec / openssh / sftp-сервер' targethost.fqdn"
johntellsall
7

Помимо того, что @MartinVonWittich предложил в комментариях выше, вы можете настроить выделенную пару ключей SSH только для этого действия и добавить их в /root/.ssh/authorized_keysфайл пользователя root, ограничив область действия одной командой.

# User backup's $HOME/.ssh/authorized_keys file
command="/usr/libexec/openssh/sftp-server" ssh-dss AAAAC8ghi9ldw== backup@host

Это позволило бы другой системе с соответствующим ключом к этой паре SFTP войти в эту систему как root. У вас все еще будет запись об этом соединении в ваших syslogи / или secure.logфайлах (при условии, что ваш дистрибутив обеспечивает этот уровень регистрации).

ПРИМЕЧАНИЕ. Любой, кто получит доступ к серверу в этом методе, получит доступ к карт-бланшу, поэтому используйте его с умом. Еще лучше продолжить чтение и объединить эту возможность с доступом к chroot и только для чтения, чтобы создать более жесткие ограничения и целевой доступ к определенным местоположениям в качестве пользователя root.

chroot & readonly

Другой способ, который вы могли бы использовать здесь, заключался бы в ограничении SFTP-соединения, чтобы оно было привязано к определенным местоположениям в качестве корневого, в зависимости от того, какой ключ SSH был использован. См. Мой ответ на эти вопросы и ответы под названием « Ограничить резервное копирование без пароля с SFTP » для получения более подробной информации.

Вы также можете управлять с sftp-serverпомощью переключателей -Rи -d.

 -d start_directory
         specifies an alternate starting directory for users.  The pathname 
         may contain the following tokens that are expanded at runtime: %%
         is replaced by a literal '%', %h is replaced by the home directory
         of the user being authenticated, and %u is replaced by the user‐
         name of that user.  The default is to use the user's home 
         directory.  This option is useful in conjunction with the 
         sshd_config(5) ChrootDirectory option.

 -R      Places this instance of sftp-server into a read-only mode.  
         Attempts to open files for writing, as well as other operations 
         that change the state of the filesystem, will be denied.
SLM
источник
Хм, но ограничение команды sftp-serverне делает ее более безопасной, не так ли? Если злоумышленник получает доступ к этой учетной записи, он может легко предоставить себе корневую оболочку, используя SFTP. Таким образом, ограничение команды довольно бесполезно с точки зрения безопасности :)
Мартин фон Виттих
@MartinvonWittich - нет, не в приведенном мной примере. Это было больше, чтобы показать потенциал. Не зная точных вариантов использования, трудно показать пример из реальной жизни. Предоставление rootдоступа к SFTP в любой форме - это просто проблема, особенно когда он не привязан к кешу.
СЛМ
3

Простой подход, который я использовал, состоял в том, чтобы просто sftp и поместить файлы в область рабочей области ( mkdirновый каталог, в котором у вас есть разрешения на сервере), а затем снова выполнить ssh, чтобы переместить файлы оттуда к месту назначения с помощью sudo cpили sudo mv.

Акшай Ратод
источник
1

У меня была похожая проблема в том, что я хотел использовать vimdiff для редактирования файлов конфигурации на группе в основном похожих хостов с помощью cssh и sudo, и вы сможете адаптировать мое решение к вашему рабочему процессу.

sudoedit (часть sudo) позволяет использовать любой редактор в качестве обычного пользователя для редактирования файла, для которого у вас нет разрешения на запись, и вы можете указать редактор с переменной среды. sudoedit копирует файл (ы), вызывает редактор с именами копии (ей) и ожидает выхода редактора, затем копирует измененную копию обратно туда, где она была. поэтому я создал «редактор», который не редактирует, просто отмечает файл для последующего использования и ждет, а также обертку вокруг vimdiff, которая использует этот маркер.

первый файл ~ / .bin / redit

#!/usr/bin/perl -w
use strict;
use warnings;
use Sys::Hostname;
my $file = $ENV{HOME}.'/.var/redit/'.hostname();
sub cmkdir($){
    my $_=shift;
    mkdir $_ unless -d $_;
}
cmkdir $ENV{HOME}.'/.var/';
cmkdir $ENV{HOME}.'/.var/redit/';
foreach (@ARGV){
    my $fh;
    open $fh, '>', $file.'na' or warn;
    print {$fh} $_;
    close $fh;
    symlink $_, $file or die;
    print;
    <STDIN>;
    unlink $file or die;
    unlink $file.'na' or die;
}

второй ~ / .bin / redit1

#!/usr/bin/perl -w
use strict;
use warnings;
use Sys::Hostname;
my $h=hostname();
@ARGV=qw(host1 host2 host3 host4) unless @ARGV;
print join " ", qw(gvimdiff), $ENV{HOME}.'/.var/redit/'.$h, map {'scp://'.$_.'/.var/redit/'.$_} grep {$_ ne $h} @ARGV;
exec qw(gvimdiff), $ENV{HOME}.'/.var/redit/'.$h, map {'scp://'.$_.'/.var/redit/'.$_} grep {$_ ne $h} @ARGV;

То, как я их использую, я использую cssh, чтобы открыть соединение со всеми четырьмя хостами, а затем использую команду как EDITOR=~/.bin/redit sudoedit /etc/conf/fileи затем. В другом окне запуска ~/.bin/redit1внесите мои изменения, сохраните и выйдите, переключитесь обратно на cssh и нажмите enter, чтобы зафиксировать изменения. и выйдите из sudoedit (если только я не редактирую более одного файла, в этом случае redit переходит к следующему файлу в списке, и вы снова запускаете redit1 для следующего файла.)

Поскольку то, что вы делаете, является менее сложным, вам не нужно redit1 из-за работы только с одним удаленным хостом, вы можете просто указать свой редактор sftp на host: .var / redit / host или эквивалентный.

hildred
источник
1

Что я делаю, это использую scp вместо (s) ftp и меняю оболочку на sudo su -WinSCP, это в Advanced \ SCP \ Shell, но это работает только с протоколом scp.

SilentVoid
источник
0

Для sftp: Если у вас есть доступ sudo для оболочки ssh, вы можете добавить свое имя пользователя в корневую группу пользователей в / etc / group и затем предоставить этой группе разрешения rx для папок, к которым вы хотите получить доступ.

physicsgeekn
источник
Это была моя первая попытка, и она не работает. Я создал пользователя и добавил его в rootгруппу, я подключаюсь через sftp, но все равно он не позволяет мне скачивать файлы из таких мест, как «/ etc» и так далее. Я не уверен, что делаю что-то не так, но подозреваю, что этот ответ не работает.
Пере
0

Вы можете вставить в свой файл sshd_config на стороне сервера:

Subsystem sftp sudo -n true && sudo -n /usr/lib/openssh/sftp-server || /usr/lib/openssh/sftp-server

Таким образом, тот, кто имеет право NOPASSWD sudo, получит root-доступ к sftp.

Янош Конколи
источник
Какая Subsystemкоманда? В Ubuntu 16.04 я получаю «команда не найдена»
inspirednz
Это не команда, а запись в / etc / ssh / sshd_config
Янош Конколи
0

Добавление этой строки в / etc / ssh / sshd_config было исправлением для меня, и прокомментируйте существующую строку подсистемы Subsystem sftp sudo -n true && sudo -n /usr/lib/openssh/sftp-server || /usr/lib/openssh/sftp-server

тогда sudo systemctl sshd restart

Ракиб Фиха
источник