Як використовувати SFTP в системі, для якої потрібен sudo для доступу до кореня та аутентифікації на основі ключа ssh?


26

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

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

Якщо для виконання системи команд кореневого рівня потрібна система sudo, як мені це обійти?

Чи можу я створити спосіб обходу судо лише для SFTP?

Чи є спосіб зберегти автентифікацію sudo & key.

Я використовую Windows для підключення до Ubuntu. Мені це потрібно для роботи з Mac підключенням до Ubuntu.

Я розумію, як зробити тунелювання SSH для адміністрування системних служб. В даний час я використовую кореневе вхід користувача безпосередньо, але вхід пароля вимкнено. Я не розумів, як користуватися sudo та SFTP одночасно. Здається, найкраща практика вимагати входу в систему як некорінного користувача, а потім вимагати використання sudo, оскільки в журналах буде записано, хто отримав ескалаційні привілеї для кожної команди.

Чи повинен я займатися цим при використанні аутентифікації на основі ключа чи це дрібниця в безпеці / реєстрації? Схоже, аутентифікація на основі ключа записує серійний номер користувача в журнали, і ви можете мати кілька ключів для кореневого користувача, щоб ідентифікувати кожного користувача. Це здається таким же ефектом, як і використання судо для мене. Я помиляюся?


2
Я би просто скористався кореневим обліковим записом з аутентифікацією на основі ключа та пропустив sudo.
Мартін фон Віттіч

1
"Здається, найкраща практика вимагати входу як не-root користувача, а потім вимагати використання sudo, оскільки в журналах буде записано, хто отримав ескалаційні привілеї для кожної команди." - але це не варто багато, тому що хтось, хто придбав привілеї root, може все-таки підробити журнали.
Мартін фон Віттіч

Скільки файлів?
Нілс

1
Відзначимо, що є одна правильна відповідь sftp -s "sudo / usr / lib / openssh / sftp-server" targethost.fqdn нижче. Якщо sudo вимагає пароль, ви можете додати до списку цю одну конкретну команду для nopasswd.
Мікко Охтамаа

Відповіді:


7

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

Клавіші безпеки покращують безпеку та спрощують ведення журналу, не вимагаючи введення з клавіатури. Тільки допомагає здійснити вхід, ви можете мати кілька паролів для кожного користувача облікового запису і мали однаковий ефект.

EDIT: Я забув: ви можете створити інший обліковий запис з тим же ефектом, що і root, якщо призначити ідентифікатор користувача 0, але не мав жодного сенсу, будучи таким же чином небезпечним. Може дати деяку затуманення, якщо хтось спробує увійти, як root, але крім цього, не мав особливого сенсу.


12

Виклик підсистеми sudo працював на мене.

Наприклад, для хоста Ubuntu:

sftp -s "sudo /usr/lib/openssh/sftp-server" targethost.fqdn

2
Це працює лише в тому випадку, якщо вам не потрібен пароль для судового забезпечення, або якщо у вас вже є квиток на судо, і вимкнено tty_tickets. У більшості сучасних інсталяцій жоден з них не є типовим.
Гепард

Це ідеально підходить для підключення до стандартних систем Amazon Linux, де ви підключаєтесь як користувач ec2-користувач, і ви можете використовувати 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-server' targethost.fqdn"
johntellsall

7

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

# 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-з'єднання так, щоб воно було закріплено в конкретних місцях як root, на основі якого використовувався ключ SSH. Дивіться мою відповідь на цю запитання U&L під назвою: " Обмежте резервну копію без пароля 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.

Хм, але обмеження команди sftp-serverне робить її більш безпечною, чи не так? Якщо зловмисник отримає доступ до цього акаунта, він може легко надати собі кореневу оболонку за допомогою SFTP. Тож обмеження команд з точки зору безпеки досить марно :)
Мартін фон Віттіч,

@MartinvonWittich - ні, не в тому прикладі, який я включив. Це було більше, щоб показати потенціал. Не знаючи точних випадків використання, важко показати приклад реального світу. Надання rootдоступу до SFTP у будь-якій формі - це лише неприємності, особливо коли це не передбачено.
slm

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 (якщо я не редагую більше одного файлу. У такому разі перехід переходить до наступного файлу у списку, і ви знову запустите redit1 для наступного файлу.)

Оскільки те, що ви робите, менш складне, вам не потрібен redit1, оскільки ви працюєте лише з одним віддаленим хостом, ви можете просто вказати свого sftp-редактора на хост: .var / redit / хост або еквівалент.


1

Що я роблю, це використовувати scp замість (s) ftp, і змінити оболонку на sudo su -WinSCP, це в Advanced \ SCP \ Shell, але це працює лише з протоколом scp.


0

Для sftp: Якщо у вас є доступ до sudo оболонки ssh, ви можете додати своє ім'я користувача до кореневої групи користувачів у / etc / group, а потім надати цим дозволам групу rx папкам, до яких ви хочете отримати доступ.


Це була моя перша спроба, і вона не працює. Я створив користувача та додав його до rootгрупи, я підключаюсь через sftp, але все одно це не дозволить мені завантажувати файли з таких місць, як '/ etc' тощо. Я не впевнений, чи роблю щось не так, але підозрюю, що ця відповідь не працює.
Пер

0

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

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

Таким чином, той, хто має право на судо NOPASSWD, отримає кореневий доступ sftp.


Яка Subsystemкоманда? В Ubuntu 16.04, я отримую «команда не знайдена»
inspirednz

Це не команда, а запис у / etc / ssh / sshd_config
János Konkoly,

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.