rsync semua file mesin jarak jauh melalui SSH tanpa pengguna root?

68

Saya memiliki perintah ini untuk membuat cadangan mesin jarak jauh. Masalahnya adalah saya perlu hak root untuk membaca dan menyalin semua file. Saya tidak memiliki pengguna root yang diaktifkan untuk alasan keamanan dan menggunakan sudocara Ubuntu. Apakah saya perlu perpipaan keren atau sesuatu untuk melakukan ini?

rsync -chavzP --stats [email protected]:/ /media/backupdisk/myserverbackup/
perang merah
sumber
3
Cukup gunakan rootakun di tempat pertama. sudo, terutama dikombinasikan dengan NOPASSWDseperti yang direkomendasikan dalam komentar, tidak benar-benar meningkatkan keamanan mesin Anda.
Martin von Wittich

Jawaban:

89

Saya akan merekomendasikan bahwa Anda hanya menggunakan akun root di tempat pertama. Jika Anda mengaturnya seperti ini:

  • Konfigurasikan Anda sshd_configpada mesin target untuk PermitRootLogin without-password.
  • Gunakan ssh-keygenpada mesin yang menarik cadangan untuk membuat kunci pribadi SSH (hanya jika Anda belum memiliki kunci SSH). Jangan menetapkan frasa sandi. Google tutorial jika Anda memerlukan detail untuk ini, harus ada banyak.
  • Tambahkan konten /root/.ssh/id_rsa.pubmesin cadangan ke /root/.ssh/authorized_keysmesin target Anda.
  • Sekarang mesin cadangan Anda memiliki akses root ke mesin target Anda, tanpa harus menggunakan otentikasi kata sandi.

maka setup yang dihasilkan harus cukup aman.


sudo, terutama dikombinasikan dengan NOPASSWDseperti yang direkomendasikan dalam komentar, tidak memiliki manfaat keamanan hanya dengan menggunakan akun root. Misalnya saran ini:

tambahkan berikut ini ke /etc/sudoersfile Anda :rsyncuser ALL= NOPASSWD:/usr/bin/rsync

pada dasarnya tetap memberikan rsyncuserizin root. Anda bertanya:

@ MartinvonWittich Mudah mendapatkan shell root penuh karena rsyncdijalankan dengan sudo? Silakan berjalan [m] melalui itu.

Yah, sederhana. Dengan konfigurasi yang disarankan, rsyncusersekarang dapat dijalankan rsyncsebagai root tanpa diminta kata sandi. rsyncadalah alat yang sangat kuat untuk memanipulasi file, jadi sekarang rsyncusermemiliki alat yang sangat kuat untuk memanipulasi file dengan izin root. Menemukan cara untuk mengeksploitasi ini hanya membutuhkan waktu beberapa menit (diuji pada Ubuntu 13.04, membutuhkan dash, bashtidak berhasil):

martin@martin ~ % sudo rsync --perms --chmod u+s /bin/dash /bin/rootdash
martin@martin ~ % rootdash
# whoami
root
# touch /etc/evil
# tail -n1 /etc/shadow
dnsmasq:*:15942:0:99999:7:::

Seperti yang Anda lihat, saya telah membuat sendiri shell root; whoamimengidentifikasi akun saya sebagai root, saya dapat membuat file /etc, dan saya dapat membaca dari /etc/shadow. Eksploitasi saya adalah mengatur bit setuid pada dashbiner; itu menyebabkan Linux untuk selalu menjalankan biner itu dengan izin dari pemiliknya, dalam hal ini root.

Memiliki root sebenarnya tidak [disarankan] untuk alasan yang baik. - redanimalwar 15 jam yang lalu

Tidak, dengan ceroboh bekerja di sekitar akun root dalam situasi di mana sangat tepat untuk menggunakannya bukan untuk alasan yang baik. Ini hanyalah bentuk lain dari pemrograman pemujaan kargo - Anda tidak benar-benar memahami konsep di balik sudo vs root, Anda hanya secara membuta menerapkan keyakinan "root is bad, sudo is good" karena Anda pernah membacanya di suatu tempat.

Di satu sisi, ada situasi di mana sudopasti merupakan alat yang tepat untuk pekerjaan itu. Misalnya, ketika Anda bekerja secara interaktif pada desktop Linux grafis, katakanlah Ubuntu, maka harus digunakan dengan sudobaik dalam kasus-kasus langka di mana Anda kadang-kadang membutuhkan akses root. Ubuntu sengaja memiliki akun root yang dinonaktifkan dan memaksa Anda untuk menggunakan sudosecara default untuk mencegah pengguna dari selalu menggunakan akun root untuk masuk. Ketika pengguna hanya ingin menggunakan misalnya browser web, kemudian masuk sebagai root akan menjadi hal yang berbahaya , dan karena itu tidak memiliki akun root secara default mencegah orang bodoh melakukan ini.

Di sisi lain, ada situasi seperti Anda, di mana skrip otomatis memerlukan izin root untuk sesuatu, misalnya untuk membuat cadangan. Sekarang menggunakan sudountuk bekerja di sekitar akun root tidak hanya tidak ada gunanya, itu juga berbahaya: pada pandangan pertama rsyncusertampak seperti akun biasa yang tidak terjangkau. Tapi seperti yang sudah saya jelaskan, akan sangat mudah bagi penyerang untuk mendapatkan akses root penuh jika dia sudah mendapatkan rsyncuserakses. Jadi pada dasarnya, Anda sekarang memiliki akun root tambahan yang sama sekali tidak terlihat seperti akun root, yang bukan merupakan hal yang baik.

Martin von Wittich
sumber
2
Penjelasan yang bagus. Apakah alasan lain untuk menggunakan sudo over root berada dalam situasi di mana banyak orang memiliki peran sysadmin di server? Dengan cara ini masing-masing dapat menggunakan kunci SSH mereka sendiri daripada berbagi kunci SSH root?
Nathan S. Watson-Haigh
2
@ NathanS.Watson-Haigh Anda dapat dengan mudah memasukkan semua kunci SSH ke dalam /root/.ssh/authorized_keys, atau bahkan membuat beberapa akun root dengan rumah yang berbeda sehingga setiap pengguna dapat memiliki shell, rumah, dan .ssh/authorized_keys:)
Martin von Wittich
2
Anda dapat membatasi kunci ssh hanya untuk mengizinkan perintah tertentu juga. Ide yang bagus, karena jika Anda mengotomatiskan sesuatu, Anda mungkin akan membuat kunci ssh ini tanpa frasa sandi apa pun, atau setidaknya itu dapat diakses sepanjang mesin dijalankan. (artinya root pada mesin itu memberikan akses ke root pada mesin lain.)
Peter Cordes
2
Kekhawatiran Martin tentang penggunaan sudo root adalah valid, tetapi tampaknya mereka dapat dikurangi dengan menetapkan parameter rsync yang tepat dalam file sudoers. Menurut halaman manual sudoers (5) di Ubuntu: "Jika suatu Cmnd telah mengaitkan argumen baris perintah, maka argumen dalam Cmnd harus sama persis dengan yang diberikan oleh pengguna pada baris perintah (atau cocok dengan wildcard jika ada) . " Jika file sudoers menentukan perintah rsync yang tepat dengan opsi yang tepat (termasuk sumber dan tujuan), maka tampaknya itu harus aman.
4
Satu pertimbangan yang tidak diajukan sebelumnya: sshdumumnya tidak mencatat kunci resmi mana yang digunakan untuk terhubung ke akun, jadi jika Anda terhubung saat bobitu sudo, Anda mendapatkan jejak audit yang lebih baik daripada jika Anda terhubung rootlangsung dengan bobkunci.
Coderer
71

Manfaatkan --rsync-pathopsi untuk membuat rsyncperintah jarak jauh dijalankan dengan sudohak istimewa. Maka perintah Anda harus berupa:

rsync -chavzP --rsync-path="sudo rsync" --stats [email protected]:/ .

Jika sudodiminta kata sandi, Anda harus menghindarinya dengan menggunakan NOPASSWDhak istimewa dengan akun pengguna jarak jauh (tidak ada gunanya untuk root, mungkin masuk akal dalam kasus penggunaan lain), atau jika Anda tidak ingin melakukan itu:

  • Pastikan bahwa opsi tty_ticketsini dinonaktifkan untuk pengguna yang Anda gunakan, dengan menjalankan mis sudo visudo -f /etc/sudoers.d/local-rsync dan memasukkan:

    Defaults:your.username.for.rsync !tty_tickets
    
  • Pastikan bahwa opsi requirettyini dinonaktifkan untuk pengguna yang Anda gunakan - ini bisa dimatikan secara default. Metodenya sama seperti di atas.

  • Benih sudopassword pada mesin remote, dengan menjalankan mis ssh -t [email protected] sudo

M_dk
sumber
1
@scai kata sandi yang diminta kemungkinan besar adalah sudokata sandi, bukan sshkata sandi
umläute
2
@redanimalwar memungkinkan pengguna Anda sudo /usr/bin/rsynctanpa meminta frasa sandi; periksa man sudoersbagaimana melakukan ini; Anda mungkin ingin membuat pengguna cadangan tambahan untuk ini.
umläute
5
Untuk memungkinkan sudo /usr/bin/rsyncberjalan tanpa memerlukan kata sandi tambahkan yang berikut ke /etc/sudoersfile Anda : rsyncuser ALL= NOPASSWD:/usr/bin/rsyncIni akan memungkinkan pengguna rsyncuser (seperti yang disebutkan di atas akan lebih baik untuk membuat pengguna cadangan khusus) dengan nama pengguna yang Anda inginkan.
M_dk
4
@M_dk sekarang rsyncpada dasarnya selalu memiliki izin root; mungkin sangat mudah untuk mendapatkan shell root penuh di akun itu. Saya pikir lebih baik menggunakan akun root yang asli saja.
Martin von Wittich
1
Jawabannya sama sekali tidak berbicara tentang echo "password" | somethingsaya benar-benar tidak pernah menggunakan ini dan setuju dengan masalah keamanan yang datang dengan membiarkan eksekusi rsync (juga tidak disarankan di sini) tidak baik adalah buruk. Apa yang tty_ticketssebenarnya saya tidak tahu, tampaknya diperlukan dan masalah keamanan. Ini akan bekerja dengan aman tanpa mengubah apa pun dengan hanya menjalankan sodo di ssh dan kemudian menjalankan perintah, kan? Tetapi karena saya mengajukan pertanyaan itu untuk tujuan penulisan, saya sepenuhnya setuju bahwa ssh berbasis tanpa kunci adalah yang aman dan benar untuk dilakukan. Saya menerima jawaban Martins sebagai gantinya.
redanimalwar
17

Salah satu cara sederhana untuk melakukan ini adalah dengan menggunakan ssh-askpassprogram grafis sudo, ini menghilangkan fakta bahwa sudotidak terhubung ke terminal dan memungkinkan Anda untuk memasukkan kata sandi dengan aman:

rsync -chavzPe 'ssh -X' --stats \
  --rsync-path='SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A rsync' \
  [email protected]:/ .

Tentu saja ssh-askpassprogram harus diinstal di lokasi yang diberikan dan Anda harus menjalankan sesi X pada mesin yang sedang Anda kerjakan. Ada beberapa variasi pada ssh-askpassprogram yang juga berfungsi (versi Gnome / KDE). Juga sudoprogram penggantian grafis seperti gksuatau kdesudojuga harus bekerja.

Graeme
sumber
rsync --rsh='ssh -X' --rsync-path='gksudo -- rsync' user@host:/ .tidak bekerja rsync error: syntax or usage error (code 1) at main.c(1634) [server=3.1.1]. Oh, ubuntu mengirim gnome-ssh-askpass, tapi itu /usr/bin/ssh-askpass, bukannya /usr/lib/ssh/x11.... Jadi itu berhasil :)
Peter Cordes
1
Ini adalah salah satu solusi yang lebih baik karena tidak memerlukan konfigurasi ulang di ujung yang lain - hanya perlu askpass diinstal dan penerusan X diaktifkan, keduanya harus cukup umum.
David Gardner
1
Bekerja seperti pesona setelah menginstal ssh-askpass. Saya hanya harus mencari arti -chavzPe, akan bagus untuk menguraikan ini sebagai opsi lama.
krlmlr
Saya mencoba ini, tetapi prompt membuka pada mesin jarak jauh dan tidak diteruskan ke mesin lokal. X11Forwarding berfungsi meminta yang diharapkan, yang saya verifikasi dengan menjalankan xeyesmenggunakan SSH.
Joyce Babu
7

Jika pengguna Anda sudah memiliki hak sudo yang dilindungi dengan kata sandi, saya akan membiarkannya apa adanya dan hanya menambahkan bait untuk menggunakan rsync tanpa kata sandi:

%admin ALL=(ALL) ALL
%admin ALL= NOPASSWD:/usr/bin/rsync 
Gunnar Thielebein
sumber
5

Saya mengalami masalah ini hari ini dan menyelesaikannya tanpa perlu memodifikasi file konfigurasi atau memberikan izin tingkat root ke akun pengguna. Pengaturan khusus saya adalah bahwa pengguna Apada mesin fooharus menyalin semua direktori pengguna dari fooke mesin bardalam backupdirektori yang Adimiliki pengguna . (Pengguna Amemiliki hak sudo aktif foo.)

Perintah yang saya gunakan di bawah. Itu dipanggil oleh pengguna Adi /homedirektori pada foo.

sudo rsync -avu -e "ssh -i /home/A/.ssh/id_rsa -l A"  * B:/home/backup

Ini menjalankan rsync sebagai sudo sehingga semua direktori pengguna yang aktif foodapat diakses tetapi ia memberitahu rsync untuk menggunakan ssh untuk mengakses mesin barmenggunakan Akredensial pengguna. Kebutuhan saya sedikit berbeda dari pertanyaan di atas tetapi ini memungkinkan saya untuk dengan cepat mendapatkan cadangan dari semua direktori pengguna pada mesin tertentu yang saya kelola tanpa mucking dengan konfigurasi sistem.

Ken Anderson
sumber
2
Ini brilian. Saya lupa tentang -iopsi untuk ssh. Anda dapat menggunakan --rsync-path="sudo /usr/bin/rsync" jika Anda memiliki sudo pada mesin bar. Ini kemudian membaca sebagai root@foodan menulis sebagai root@bar, tetapi mentransfer melalui A@foo-> B@bar. Terima kasih!
ctbrown
Itu tidak akan melindungi pemilik (mis. Root), apakah saya benar?
Andris
3

Menjalankan rsync sebagai daemon pada mesin target memungkinkan Anda melakukan apa yang Anda inginkan.

Konstantin
sumber
1
Saya memutakhirkan jawaban ini, tetapi akan lebih baik dengan penjelasan bagaimana menjalankan daemon rsynch, dan bagaimana Anda menggunakannya dengan akses root.
Mike Lippert
rsync sebagai daemon tidak akan cocok dengan kasus ini, karena rsync akan menghapus izin root bahkan ketika dimulai sebagai root maka tidak semua file dapat ditransfer.
teissler
2

Solusi saya adalah menggunakan --rsync-path="sudo rsync"tetapi meminta kata sandi, solusi:

rsync -chavzP --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync"  [email protected]:/ .
Bulat
sumber
1
Biasanya bukan ide yang baik untuk memasukkan kata sandi ke dalam baris perintah satu baris; mereka menjadi terlihat di pohon proses, misalnya. Saya kadang-kadang mengganti kata sandi yang sebenarnya dalam jenis pernyataan ini dengan $( cat my_password.txt )yang sedikit lebih baik, tetapi biasanya lebih disukai untuk mengkonfigurasi izin di kedua ujung, dan / atau menggunakan kunci SSH, sedemikian rupa sehingga kata sandi tidak diperlukan pada CLI
JDS