Wie verwende ich SFTP auf einem System, auf dem sudo für Root-Zugriff und SSH-Schlüssel-basierte Authentifizierung erforderlich ist?

26

Ich möchte SFTP verwenden können, um Dateien zu bearbeiten, für die Root-Berechtigungen erforderlich sind.

Ich verwende SSH-Schlüssel-basierte Authentifizierung - RSA-Schlüssel auf Smartcard.

Wenn das System sudo zum Ausführen von Befehlen auf Root-Ebene benötigt, wie kann ich das umgehen?

Kann ich eine Methode erstellen, um sudo nur für SFTP zu umgehen?

Gibt es eine Möglichkeit, die Sudo & Key-Authentifizierung beizubehalten?

Ich benutze Windows, um eine Verbindung zu Ubuntu herzustellen. Ich brauche das, um mit einem Mac zu arbeiten, der sich auch mit Ubuntu verbindet.

Ich verstehe, wie man SSH-Tunneling ausführt, um die Systemdienste zu verwalten. Derzeit verwende ich die Root-Benutzeranmeldung direkt, die Kennwortanmeldung ist jedoch deaktiviert. Ich habe nicht verstanden, wie man sudo und SFTP gleichzeitig benutzt. Es scheint eine bewährte Methode zu sein, sich als Nicht-Root-Benutzer anzumelden und dann sudo zu verwenden, da in den Protokollen aufgezeichnet wird, wer für jeden Befehl erweiterte Berechtigungen erhalten hat.

Sollte ich mich damit befassen, wenn ich die schlüsselbasierte Authentifizierung verwende, oder ist dies ein unbedeutender Unterschied in Bezug auf Sicherheit / Protokollierung? Es sieht so aus, als ob die Seriennummer des Benutzers in den Protokollen durch die schlüsselbasierte Authentifizierung erfasst wird, und der Root-Benutzer kann mehrere Schlüssel haben, um jeden Benutzer zu identifizieren. Dies scheint der gleiche Effekt zu sein, wie wenn ich sudo benutze. Liege ich falsch?

Bruce Kirkpatrick
quelle
2
Ich würde einfach das Root-Konto mit der schlüsselbasierten Authentifizierung direkt verwenden und überspringen sudo.
Martin von Wittich
1
"Es scheint eine bewährte Methode zu sein, sich als Nicht-Root-Benutzer anzumelden und dann sudo zu verwenden, da in den Protokollen aufgezeichnet wird, wer für jeden Befehl erweiterte Berechtigungen erhalten hat." - aber das ist nicht viel wert, weil jemand, der Root-Rechte erworben hat, die Protokolle trotzdem manipulieren kann.
Martin von Wittich
Wie viele Dateien?
Nils
1
Nur um zu bemerken, es gibt eine richtige Antwort von sftp -s "sudo / usr / lib / openssh / sftp-server" targethost.fqdn unten. Wenn sudo ein Kennwort erfordert, können Sie diesen einen bestimmten Befehl für nopasswd auf die Whitelist setzen.
Mikko Ohtamaa,

Antworten:

7

SFTP ist ein Befehlszugriff auf Dateioperationen mit den Einschränkungen des von Ihnen verwendeten Kontos. Sie müssen ssh verwenden, um mehr Verwaltungsvorgänge durchzuführen, und sudo und SFTP nicht gleichzeitig verwenden. Wenn Sie mit SFTP uneingeschränkt auf die gesamte Festplatte zugreifen möchten, verwenden Sie das Root-Konto. Auf jeden Fall können Sie sich mit root auf sftp und ssh gleichzeitig anmelden, wobei Sie zwei verschiedene Sitzungen verwenden.

Die Sicherheitsschlüssel verbessern die Sicherheit und vereinfachen die Protokollierung, da keine Tastatureingaben erforderlich sind. Nur hilft beim Einloggen, man kann für jeden Kontobenutzer mehrere Passwörter haben und hatte den gleichen Effekt.

EDIT: Ich habe vergessen: Sie können ein anderes Konto mit dem gleichen Effekt wie root erstellen, wenn Sie die Benutzer-ID auf 0 setzen, aber keinen Sinn haben, und auf die gleiche Weise gefährlich sind. Könnte etwas Verschleierung geben, wenn jemand versucht, sich wie root anzumelden, aber davon abgesehen hatte er nicht viel Sinn.

gabrign
quelle
12

Der Aufruf des Subsystems mit sudo hat bei mir funktioniert.

An einen Ubuntu-Host zum Beispiel:

sftp -s "sudo /usr/lib/openssh/sftp-server" targethost.fqdn
Kiwi
quelle
2
Dies funktioniert nur, wenn Sie kein Passwort für sudo benötigen oder wenn Sie bereits ein sudo-Ticket haben und tty_tickets deaktiviert haben. Bei den meisten modernen Installationen ist beides nicht die Standardeinstellung.
Gepard
Dies ist ideal für Verbindungen zu Amazon Linux-Standardsystemen, auf denen Sie als Benutzer ec2-user eine Verbindung herstellen und sudo ohne Kennwort verwenden können. +1, danke! (Beachten Sie, dass der Befehl unter Amazon Linux etwas anders ist:. sudo /usr/libexec/openssh/sftp-server)
MarnixKlooster ReinstateMonica
Ich benutze diese Lösung ausgiebig, um mich als ein anderer Benutzer anzumelden, bei dem die direkte Anmeldung deaktiviert ist (für Prüfungs- und Protokollierungszwecke). Es ist eine Kleinigkeit, dass Tools wie ant dieses Subsystem nicht verfügbar machen. Ich würde jedoch raten, niemals sudo zu root zu machen, sondern einem anderen Benutzer mit ausreichenden Rechten, um das zu tun, was Sie benötigen. Das Problem ist, dass nicht alle Unix-Umgebungen gleich sind und sich das sftp-Subsystem an verschiedenen Orten befinden kann, wie von @MarnixKlooster
YoYo
Für Amazon Linux lautet der gesamte Befehl: "sftp -s" sudo / usr / libexec / openssh / sftp-server "targethost.fqdn"
johntellsall
7

Abgesehen von dem, was @MartinVonWittich in den obigen Kommentaren vorgeschlagen hat, können Sie nur für diese Aktivität ein dediziertes SSH-Schlüsselpaar einrichten und diese zur Root-Benutzerdatei hinzufügen, wobei der /root/.ssh/authorized_keysGültigkeitsbereich auf einen einzigen Befehl beschränkt wird.

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

Dies würde es einem anderen System mit dem entsprechenden Schlüssel für dieses Paar ermöglichen, SFTP in dieses System als Root einzuspielen. Sie haben immer noch eine Aufzeichnung dieser Verbindung in Ihren syslogund / oder secure.logDateien (vorausgesetzt, Ihre Distribution bietet diese Protokollierungsstufe).

ANMERKUNG : Jeder Benutzer, der mit dieser Methode auf den Server zugreift, verfügt über einen Cartes-Blanche-Zugriff. Verwenden Sie ihn daher mit Bedacht. Lesen Sie weiter und kombinieren Sie diese Funktion mit Chroot- und Nur-Lese-Zugriff, um strengere Einschränkungen und einen gezielten Zugriff auf bestimmte Speicherorte als Root zu erstellen.

Chroot & Readonly

Die andere Technik, die Sie hier ausnutzen könnten, wäre, die SFTP-Verbindung so einzuschränken, dass sie auf der Grundlage des verwendeten SSH-Schlüssels als Root an bestimmte Speicherorte geleitet wird. Weitere Informationen finden Sie in meiner Antwort auf diese Fragen und Antworten zu U & L mit dem Titel " Kennwortloses Backup mit SFTP einschränken ".

Sie können auch sftp-serverüber die Schalter -Rund steuern -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
quelle
Hmm, aber die Beschränkung des Befehls auf sftp-servermacht es nicht sicherer, oder? Wenn ein Angreifer Zugriff auf dieses Konto erhält, kann er sich mithilfe von SFTP problemlos eine Root-Shell geben. Daher ist die Befehlsbeschränkung aus Sicherheitsgründen ziemlich nutzlos :)
Martin von Wittich
@MartinvonWittich - nein, nicht in dem Beispiel, das ich aufgenommen habe. Das war mehr, um das Potenzial zu zeigen. Ohne die genauen Anwendungsfälle zu kennen, ist es schwierig, ein reales Beispiel zu zeigen. Es rootist nur schwierig, SFTP-Zugriff in irgendeiner Form zu gewähren, insbesondere, wenn es nicht in der Chroot-Phase ist.
slm
3

Ein einfacher Ansatz, dem ich folgte, war, einfach sftp und die Dateien in einem Bühnenbereich mkdirabzulegen ( neues Verzeichnis, in dem Sie Berechtigungen auf dem Server haben) und dann ssh erneut, um die Dateien von dort mit sudo cpoder zum Ziel zu verschieben sudo mv.

Akshay Rathod
quelle
1

Ein ähnliches Problem bestand darin, dass ich vimdiff verwenden wollte, um Konfigurationsdateien auf einer Gruppe von meist ähnlichen Hosts mit cssh und sudo zu bearbeiten, und Sie möglicherweise in der Lage sind, meine Lösung an Ihren Workflow anzupassen.

Mit sudoedit (Teil von sudo) können Sie jeden Editor als normalen Benutzer zum Bearbeiten einer Datei verwenden, für die Sie keine Schreibberechtigung haben, und Sie können den Editor mit einer Umgebungsvariablen angeben. sudoedit kopiert die Datei (en), ruft den Editor mit den Namen der Kopie (n) auf und wartet, bis der Editor beendet ist. Anschließend kopiert sudoedit die geänderte Kopie dorthin zurück, wo sie war. Also habe ich einen 'Editor' erstellt, der nicht bearbeitet, sondern die Datei nur zur späteren Verwendung notiert und wartet, sowie einen Wrapper um vimdiff, der diesen Marker verwendet.

Die erste Datei ist ~ / .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;
}

Die Sekunde ist ~ / .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;

Mit cssh öffne ich eine Verbindung zu allen vier Hosts und verwende dann einen Befehl wie EDITOR=~/.bin/redit sudoedit /etc/conf/fileund In einem anderen Fenster führen Sie ~/.bin/redit1die Änderungen aus, speichern und beenden Sie das Programm, wechseln Sie zurück zu cssh und drücken Sie die Eingabetaste, um die Änderungen zu bestätigen und beenden Sie sudoedit (es sei denn, ich bearbeite mehr als eine Datei. In diesem Fall wechselt redit zur nächsten Datei in der Liste und Sie führen redit1 erneut für die nächste Datei aus.)

Da das, was Sie tun, weniger kompliziert ist, brauchen Sie redit1 nicht, da Sie nur mit einem Remote-Host arbeiten. Sie können Ihren SFTP-Editor einfach auf host verweisen: .var / redit / host oder gleichwertiges.

hildred
quelle
1

Ich verwende scp anstelle von (s) ftp und ändere die Shell sudo su -in WinSCP in Advanced \ SCP \ Shell, dies funktioniert jedoch nur mit dem scp-Protokoll.

SilentVoid
quelle
0

Für sftp: Wenn Sie über einen SSH-Shell-Sudo-Zugriff verfügen, können Sie Ihren Benutzernamen zur Root-Benutzergruppe in / etc / group hinzufügen und dieser Gruppe dann die Empfangsberechtigungen für die Ordner erteilen, auf die Sie zugreifen möchten.

physicsgeekn
quelle
Dies war mein erster Versuch und es funktioniert nicht. Ich habe einen Benutzer erstellt und zur rootGruppe hinzugefügt. Ich verbinde mich über sftp, kann aber trotzdem keine Dateien von Orten wie '/ etc' und so weiter herunterladen. Ich bin nicht sicher, ob ich etwas falsch mache, aber ich vermute, dass diese Antwort nicht funktioniert.
Pere
0

Sie können auf der Serverseite Folgendes in Ihre sshd_config-Datei einfügen:

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

Auf diese Weise erhält jeder, der über das NOPASSWD-Sudo-Recht verfügt, einen Root-SFTP-Zugriff.

János Konkoly
quelle
Was ist der SubsystemBefehl? Unter Ubuntu 16.04 erhalte ich "Befehl nicht gefunden"
inspiriert vom
Es ist kein Befehl, sondern ein Eintrag in / etc / ssh / sshd_config
János Konkoly
0

Das Hinzufügen dieser Zeile unter / etc / ssh / sshd_config war eine Korrektur für mich und kommentierte die vorhandene Subsystemzeile Subsystem sftp sudo -n true && sudo -n /usr/lib/openssh/sftp-server || /usr/lib/openssh/sftp-server

dann sudo systemctl sshd restart

Rakib Fiha
quelle