Bagaimana cara menggunakan SFTP pada sistem yang memerlukan sudo untuk akses root & otentikasi berbasis ssh?

26

Saya ingin dapat menggunakan SFTP untuk mengedit file yang memerlukan izin root.

Saya menggunakan otentikasi berbasis SSH Key - kunci rsa pada kartu pintar.

Jika sistem memerlukan sudo untuk melakukan perintah tingkat root, Bagaimana cara menyiasati ini?

Bisakah saya membuat cara memotong sudo hanya untuk SFTP?

Apakah ada cara untuk menjaga otentikasi sudo & kunci.

Saya menggunakan windows untuk terhubung ke Ubuntu. Saya perlu ini untuk bekerja dengan Mac yang terhubung ke Ubuntu juga.

Saya mengerti bagaimana melakukan SSH Tunneling ke admin layanan sistem. Saat ini, saya menggunakan login pengguna root secara langsung, tetapi login kata sandi dinonaktifkan. Saya tidak mengerti bagaimana menggunakan sudo dan SFTP pada saat yang bersamaan. Tampaknya menjadi praktik terbaik untuk meminta login sebagai pengguna non-root dan kemudian memerlukan penggunaan sudo karena log akan merekam siapa yang diberi hak yang lebih tinggi untuk setiap perintah.

Haruskah saya memusatkan perhatian pada hal ini ketika menggunakan otentikasi berbasis Kunci atau apakah ini perbedaan sepele dalam keamanan / pencatatan? Sepertinya otentikasi berbasis Key mencatat nomor seri pengguna di log, dan Anda dapat memiliki beberapa kunci untuk pengguna root untuk mengidentifikasi setiap pengguna. Ini sepertinya efek yang sama dengan menggunakan sudo kepada saya. Apakah aku salah?

Bruce Kirkpatrick
sumber
2
Saya hanya menggunakan akun root dengan otentikasi berbasis kunci secara langsung dan lewati sudo.
Martin von Wittich
1
"Tampaknya ini merupakan praktik terbaik untuk meminta login sebagai pengguna non-root dan kemudian memerlukan penggunaan sudo karena log akan mencatat siapa yang diberi hak yang lebih tinggi untuk setiap perintah." - tapi itu tidak banyak artinya, karena seseorang yang telah memperoleh hak akses root dapat mengutak-atik log.
Martin von Wittich
Berapa banyak file?
Nils
1
Hanya untuk mencatat ada satu jawaban yang benar dari sftp -s "sudo / usr / lib / openssh / sftp-server" targethost.fqdn di bawah ini. Jika sudo memerlukan kata sandi, Anda dapat memasukkan daftar putih perintah khusus ini untuk nopasswd.
Mikko Ohtamaa

Jawaban:

7

SFTP adalah akses perintah ke operasi file, dengan batasan dari akun yang Anda gunakan. Anda harus menggunakan ssh untuk melakukan lebih banyak operasi administratif, membuat penggunaan sudo dan SFTP yang mustahil dilakukan secara bersamaan. Jika Anda memerlukan akses ke seluruh disk tanpa batasan menggunakan SFTP, lakukan itu menggunakan akun root. Pokoknya Anda dapat membuat login dengan root pada sftp dan ssh pada saat yang sama, tentu saja, menggunakan dua sesi yang berbeda.

Kunci keamanan meningkatkan keamanan dan mempermudah pencatatan, tidak memerlukan input keyboard. Hanya membantu membuat login, Anda dapat memiliki beberapa kata sandi untuk setiap pengguna akun dan memiliki efek yang sama.

EDIT: Saya lupa: Anda dapat membuat akun lain dengan efek yang sama dari root jika Anda menetapkan id pengguna ke 0, tetapi tidak punya akal, berbahaya dengan cara yang sama. Bisa memberikan sedikit kebingungan jika seseorang mencoba login seperti root, tetapi selain itu, tidak masuk akal.

Gabrign
sumber
12

Memanggil subsistem dengan sudo bekerja untuk saya.

Untuk host Ubuntu misalnya:

sftp -s "sudo /usr/lib/openssh/sftp-server" targethost.fqdn
Kiwi
sumber
2
Ini hanya berfungsi jika Anda tidak memerlukan kata sandi untuk sudo itu, atau jika Anda sudah memiliki tiket sudo dan menonaktifkan tty_tickets. Pada sebagian besar pemasangan modern, tidak ada yang standar.
Cheetah
Ini sangat cocok untuk koneksi ke sistem Amazon Linux default, di mana Anda terhubung sebagai pengguna ec2-user, dan Anda dapat menggunakan sudo tanpa kata sandi. +1, terima kasih! (Perhatikan bahwa di Amazon Linux, perintahnya sedikit berbeda:. sudo /usr/libexec/openssh/sftp-server)
MarnixKlooster ReinstateMonica
Saya menggunakan solusi ini secara luas untuk login sebagai pengguna lain di mana login langsung dinonaktifkan (untuk keperluan audit dan logging). Sangat kecil bahwa alat seperti semut tidak mengekspos subsistem ini. Namun, saya akan menyarankan untuk tidak melakukan sudo ke root, tetapi ke pengguna lain dengan hak istimewa yang cukup untuk melakukan apa yang Anda butuhkan. Masalah yang harus dihadapi adalah bahwa tidak semua lingkungan unix adalah sama, dan subsistem sftp dapat ditemukan di lokasi yang berbeda seperti yang dicatat oleh @MarnixKlooster
YoYo
Untuk Amazon Linux, seluruh perintahnya adalah: "sftp -s 'sudo / usr / libexec / openssh / sftp-server' targethost.fqdn"
johntellsall
7

Di luar apa yang disarankan @MartinVonWittich dalam komentar di atas, Anda dapat menyiapkan pasangan kunci SSH khusus untuk aktivitas ini dan menambahkannya ke /root/.ssh/authorized_keysfile pengguna root yang membatasi ruang lingkup mereka hanya untuk satu perintah.

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

Ini akan memungkinkan sistem lain dengan kunci yang sesuai untuk pasangan ini untuk SFTP ke sistem ini sebagai root. Anda masih memiliki catatan koneksi ini di file Anda syslogdan / atau secure.log(anggap distro Anda menyediakan level logging ini).

CATATAN: Siapa pun yang mengakses server dalam metode ini akan memiliki akses cartes blanche, jadi gunakan dengan bijak. Lebih baik terus membaca dan menggabungkan kemampuan ini dengan chroot dan akses hanya baca, untuk membangun batasan yang lebih ketat dan akses yang ditargetkan ke lokasi tertentu sebagai root.

chroot & hanya baca

Teknik lain yang dapat Anda manfaatkan di sini adalah dengan membatasi koneksi SFTP sehingga itu chroot ke lokasi tertentu sebagai root, berdasarkan pada kunci SSH yang digunakan. Lihat jawaban saya untuk T&J T&J ini berjudul: " Batasi cadangan tanpa kata sandi dengan SFTP " untuk detail lebih lanjut.

Anda juga dapat mengontrol sftp-servermelalui sakelar -Rdan -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
sumber
Hmm, tetapi membatasi perintah untuk sftp-servertidak membuatnya lebih aman, bukan? Jika penyerang mendapatkan akses ke akun ini, ia dapat dengan mudah memberikan dirinya sendiri root shell menggunakan SFTP. Jadi batasan perintah sangat tidak berguna dari sudut pandang keamanan :)
Martin von Wittich
@ MartinvonWittich - tidak tidak dalam contoh yang saya sertakan. Itu lebih untuk menunjukkan potensi. Tanpa mengetahui kasus penggunaan yang tepat sulit untuk menunjukkan contoh dunia nyata. Memberikan rootakses SFTP dalam bentuk apa pun hanya masalah, terutama ketika tidak di-chroot.
Slm
3

Pendekatan sederhana yang saya ikuti adalah hanya sftp dan meletakkan file pada area panggung ( mkdirdirektori baru di mana Anda memiliki izin di server) dan kemudian ssh lagi untuk memindahkan file dari sana ke tujuan dengan sudo cpatau sudo mv.

Akshay Rathod
sumber
1

Saya memiliki masalah yang sama yaitu saya ingin menggunakan vimdiff untuk mengedit file konfigurasi pada sekelompok host yang hampir sama, dengan cssh dan sudo dan Anda mungkin dapat menyesuaikan solusi saya dengan alur kerja Anda.

sudoedit (bagian dari sudo) memungkinkan Anda untuk menggunakan editor apa pun sebagai pengguna biasa untuk mengedit file yang Anda tidak memiliki izin untuk menulis dan Anda dapat menentukan editor dengan variabel lingkungan. sudoedit menyalin file, memanggil editor dengan nama-nama salinan dan menunggu editor keluar, kemudian menyalin salinan yang dimodifikasi kembali ke tempatnya. jadi saya membuat 'editor' yang tidak mengedit, hanya mencatat file untuk digunakan nanti dan menunggu dan pembungkus di sekitar vimdiff yang menggunakan penanda itu.

file pertama adalah ~ / .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;
}

yang kedua adalah ~ / .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;

Cara saya menggunakannya adalah saya menggunakan cssh untuk membuka koneksi ke semua empat host dan kemudian menggunakan perintah seperti EDITOR=~/.bin/redit sudoedit /etc/conf/filedan kemudian Dalam menjalankan jendela yang berbeda ~/.bin/redit1, buat perubahan, simpan dan keluar, kembali ke cssh dan tekan enter untuk melakukan perubahan dan keluar dari sudoedit (kecuali jika saya mengedit lebih dari satu file yang mana kasusnya memajukan ke file berikutnya dalam daftar dan Anda menjalankan redit1 lagi untuk file berikutnya.)

Karena apa yang Anda lakukan tidak terlalu rumit, Anda tidak perlu redit1 karena hanya bekerja dengan satu host jarak jauh, Anda bisa mengarahkan editor sftp Anda ke host: .var / redit / host atau yang setara.

Hildred
sumber
1

Apa yang saya lakukan adalah menggunakan scp bukan ftp, dan mengubah shell ke sudo su -dalam WinSCP ini dalam Advanced \ SCP \ Shell, tetapi ini hanya bekerja dengan protokol scp.

SilentVoid
sumber
0

Untuk sftp: Jika Anda memiliki akses sudo ssh shell, Anda dapat menambahkan nama pengguna Anda ke root usergroup di / etc / group dan kemudian berikan izin grup rx itu ke folder yang ingin Anda akses.

physicsgeekn
sumber
Ini adalah upaya pertama saya dan tidak berhasil. Saya membuat pengguna dan menambahkannya ke rootgrup, saya terhubung melalui sftp tetapi tetap saja tidak memungkinkan saya untuk mengunduh file dari lokasi seperti '/ etc' dan seterusnya. Saya tidak yakin apakah saya melakukan sesuatu yang salah tetapi saya menduga jawaban ini tidak berhasil.
Pere
0

Anda dapat menyisipkan ke file sshd_config Anda di sisi server:

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

Dengan cara ini siapa pun yang memiliki sudo NOPASSWD akan mendapatkan akses sftp yang telah di-root.

János Konkoly
sumber
Apa Subsystemperintahnya? Di Ubuntu 16.04, saya mendapatkan "perintah tidak ditemukan"
terinspirasinz
Ini bukan perintah tetapi sebuah entri di / etc / ssh / sshd_config
János Konkoly
0

Menambahkan baris ini di / etc / ssh / sshd_config adalah perbaikan bagi saya, dan mengomentari baris subsistem yang ada Subsystem sftp sudo -n true && sudo -n /usr/lib/openssh/sftp-server || /usr/lib/openssh/sftp-server

kemudian sudo systemctl sshd restart

Rakib Fiha
sumber