Uzak makinedeki tüm dosyaları kök kullanıcı olmadan SSH üzerinden rsync?


68

Uzaktaki bir makineyi yedeklemek için bu komutu kullanıyorum. Sorun şu ki, tüm dosyaları okumak ve kopyalamak için kök haklarına ihtiyacım var. Güvenlik nedeniyle etkin bir kök kullanıcım yok ve sudoUbuntu yöntemini kullanıyorum. Bunu yapmak için biraz soğuk boruya mı ihtiyacım var?

rsync -chavzP --stats user@192.168.1.2:/ /media/backupdisk/myserverbackup/

3
Sadece rootilk önce hesabı kullanın . sudoözellikle NOPASSWDyorumlarda önerildiği şekilde bir araya geldiğinde, makinenizin güvenliğini gerçekten iyileştirmiyor.
Martin von Wittich

Yanıtlar:


88

İlk önce sadece root hesabını kullanmanızı öneririm. Eğer böyle ayarladıysanız:

  • sshd_configHedef makinede ayarlarınızı yapın PermitRootLogin without-password.
  • ssh-keygenBir SSH özel anahtarı oluşturmak için yedeği çeken makinede kullanın (yalnızca bir SSH anahtarınız yoksa). Bir şifre ayarlamayın. Google’la ilgili bir öğreticiye bunun için detaylar gerekiyorsa, bol miktarda olması gerekir.
  • /root/.ssh/id_rsa.pubYedekleme makinesinin içeriğini /root/.ssh/authorized_keyshedef makinenize ekleyin.
  • Artık yedekleme makinenizin, şifre doğrulama kullanmanıza gerek kalmadan hedef makinenize kök erişimi var.

o zaman ortaya çıkan kurulum oldukça güvenli olmalıdır.


sudoözellikle NOPASSWDyorumlarda önerildiği şekilde birleştirildiğinde, yalnızca root hesabını kullanmanın hiçbir güvenlik avantajı yoktur. Örneğin, bu öneri:

aşağıdakileri /etc/sudoersdosyanıza ekleyin :rsyncuser ALL= NOPASSWD:/usr/bin/rsync

temelde rsyncuserzaten kök izinleri verir . Sen sor:

Çünkü @MartinvonWittich Kolay tam kök kabuğu kazanmak için rsyncbirlikte yürütülen sudo? Lütfen [m] e [ile] arasında yürüyün.

Peki, basit. Önerilen yapılandırma ile, rsyncuserşimdi rsyncbir şifre sorulmadan root olarak çalışabilir. rsyncdosyaları işlemek için çok güçlü bir araçtır, bu yüzden şimdi rsyncuserkök izinleri ile dosyaları işlemek için çok güçlü bir araç var. Bundan yararlanmanın bir yolunu bulmak sadece birkaç dakikamı aldı (Ubuntu 13.04'te test edildi, gerektirir dash, bashişe yaramadı):

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:::

Gördüğünüz gibi kendime bir kök kabuğu yarattım; whoamihesabımı root olarak tanımlar, dosya oluşturabilir /etcve okuyabilirim /etc/shadow. Benim istismarım setuid bitini ikiliye koymaktıdash ; Linux'un bu ikiliyi her zaman sahibinin izinleriyle çalıştırmasına neden olur, bu durumda root.

Gerçek bir köke sahip olmak, iyi nedenlerden dolayı [tavsiye edilmez]. - redanimalwar 15 saat önce

Hayır, kök hesabın etrafında gizlice çalışmak, onu kullanmanın kesinlikle uygun olduğu durumlarda işe yaramaz. Bu, kargo kültü programlamasının sadece bir başka şeklidir - sudo-root'un arkasındaki kavramı gerçekten anlamıyorsunuz, sadece “root kötü, sudo iyi” inancını kör bir şekilde uyguladığınız için bir yerde okudunuz.

Bir yandan, sudokesinlikle iş için doğru aracın olduğu durumlar var . Örneğin, etkileşimli bir grafik Linux masaüstünde çalışırken, Ubuntu diyelim, o zaman kullanmak zorunda sudokalmanız, bazen kök erişimine ihtiyaç duyduğunuz nadir durumlarda iyidir. Ubuntu kasıtlı olarak devre dışı bırakılmış bir kök hesaba sahip ve sudokullanıcıların giriş yapmak için sadece her zaman root hesabını kullanmalarını önlemek için varsayılan olarak kullanmaya zorlar . ve bu nedenle, varsayılan olarak bir kök hesaba sahip olmamak, aptal insanların bunu yapmasını önler.

Öte yandan, otomatik bir betiğin bir şey için kök izinleri gerektiren, örneğin bir yedekleme yapmak için sizinki gibi durumlar vardır. Şimdi sudoroot hesabı etrafında çalışmak sadece anlamsız değil, aynı zamanda tehlikelidir: ilk bakışta rsyncusersıradan imtiyazsız bir hesap gibi gözüküyor. Ancak, daha önce de açıkladığım gibi, daha önce rsyncusererişim kazanmış olsaydı, bir saldırganın tam erişim hakkı kazanması çok kolay olurdu . Bu yüzden, temel olarak, artık hiç bir kök hesabına benzemeyen bir ek kök hesabınız var, ki bu iyi bir şey değil.


2
Güzel açıklama. Root üzerinde sudo kullanmanın başka bir nedeni de, bir sunucuda birden fazla kişinin sysadmin rolü olduğu durumda mı? Bu yolla her biri, kök SSH anahtarını paylaşmak yerine kendi SSH anahtarlarını kullanabilir mi?
Nathan S. Watson-Haigh,

2
@ NathanS.Watson-Haigh, tüm SSH anahtarlarını kolayca yerleştirebilir /root/.ssh/authorized_keys, hatta farklı evlerde birden fazla kök hesap oluşturabilir, böylece her kullanıcının kendi kabuğuna, evine ve başkalarına sahip olabilir .ssh/authorized_keys:)
Martin von Wittich

2
Ssh tuşlarını da yalnızca belirli komutlara izin vermekle sınırlayabilirsiniz. Kesinlikle iyi bir fikir, çünkü eğer bir şeyi otomatikleştiriyorsanız, bu ssh anahtarlarını herhangi bir parola olmadan ya da en azından bir makine çalışırken her zaman erişilebilir durumda olacaksınız. (Bu makinedeki kök, diğer makinelerde kök erişimine izin verir.)
Peter Cordes

2
Martin'in sudo root kullanmayla ilgili kaygıları geçerlidir, ancak sudoers dosyasındaki rsync parametrelerinin tam olarak belirlenmesiyle hafifletilebilecekleri görülmektedir. Ubuntu'daki sudoers (5) man sayfasına göre: "Eğer bir Cmnd komut satırı argümanlarını ilişkilendirdiyse, o zaman Cmnd'deki argümanların kullanıcı tarafından komut satırında verilenlerle tam olarak eşleşmesi gerekir (veya varsa joker karakterlerle eşleşmesi gerekir). ." Sudoers dosyası, kesin seçeneklerle (kaynak ve hedef dahil) kesin rsync komutunu belirtirse güvenli görünmesi gerekir.

4
: Bir göz daha önce yetişmiş değil sshdgenel olarak gelmez değil anahtar bir hesaba bağlanmak için kullanılan yetkili olan giriş yaptığınız olarak bağlarsanız bobo zaman sudo, size giriş bağlamanız durumunda daha iyi bir denetim izi olsun rootdoğrudan bob'ın tuşu.
Kodlayıcı

71

--rsync-pathRemote rsynckomutu sudoayrıcalıklarla çalıştırmak için bu seçeneği kullanın . Öyleyse emriniz, örneğin:

rsync -chavzP --rsync-path="sudo rsync" --stats user@192.168.1.2:/ .

Sizden sudobir şifre NOPASSWDisterse, uzak kullanıcı hesabına bir ayrıcalık kullanarak (root için anlamsız, diğer kullanım durumlarında anlam ifade edebilir) veya bunu yapmak istemiyorsanız, bundan kaçınmanız gerekir.

  • Kullandığınız tty_ticketskullanıcı için, örneğin çalıştırıp sudo visudo -f /etc/sudoers.d/local-rsync girerek seçeneğin devre dışı bırakıldığından emin olun :

    Defaults:your.username.for.rsync !tty_tickets
    
  • Kullandığınız requirettykullanıcı için seçeneğin devre dışı bırakıldığından emin olun - varsayılan olarak kapalı olabilir. Yöntem yukarıdaki ile aynıdır.

  • Tohum sudoörneğin çalıştırarak, uzaktan makinede şifreyi ssh -t user@192.168.1.2 sudo


1
@scai, istenen sudoşifre, şifre değil büyük olasılıkla sshşifredir
saat

2
@redanimalwar, kullanıcıdan sudo /usr/bin/rsyncbir şifre sormadan kullanıcıya izin verir ; man sudoersbunun nasıl yapılacağını kontrol edin ; bunun için fazladan bir yedekleme kullanıcısı oluşturmak isteyebilirsiniz.
08

5
sudo /usr/bin/rsyncŞifre gerektirmeden çalışmasına izin vermek için /etc/sudoersdosyanızı aşağıdakilere ekleyin : rsyncuser ALL= NOPASSWD:/usr/bin/rsyncBu, kullanıcı adının bulunduğu rsyncuser kullanıcısına izin verir (yukarıda belirtildiği gibi özel bir yedekleme kullanıcısı oluşturmak en iyisidir).
M_dk

4
@M_dk şimdi rsyncher zaman temel olarak kök izinlerine sahip; Bu hesapta tam bir kök kabuğu elde etmek muhtemelen çok kolaydır. Bence ilk önce gerçek kök hesabı kullanmak daha iyi.
Martin von Wittich

1
Hiçbir şekilde konuşma cevabı echo "password" | somethingaslında bunu hiç kullanmadım ve rsync'in (burada da önerilmemiştir) aniden infaz edilmesine izin vermenin getirdiği güvenlik sorunlarına katılıyorum. Ne tty_ticketsAslında hiçbir fikrim var, gerekli görünüyor ve bir güvenlik sorunu. Bu sadece ssh üzerinde sodo çalıştırarak ve sonra da komutu doğru çalıştırarak hiçbir şey tweak olmadan güvenli bir şekilde çalışırdı? Ancak bu senaryoyu kodlama amaçları için sorduğumdan, pw'siz anahtar tabanlı ssh'nin güvenli ve doğru yapmak olduğuna tamamen katılıyorum. Bunun yerine Martins cevabını kabul ettim.
redanimalwar 07:15

17

Bunu yapmanın basit bir yolu, grafiksel ssh-askpassprogramın kullanılmasıdır; sudobu sudo, terminale bağlı olmayan bir gerçeği ortaya çıkarır ve şifreyi güvenli bir şekilde girmenize izin verir:

rsync -chavzPe 'ssh -X' --stats \
  --rsync-path='SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A rsync' \
  user@192.168.1.2:/ .

Elbette ssh-askpassprogram verilen yere kurulmalı ve üzerinde çalıştığınız makinede bir X oturumu çalıştırıyor olmalısınız. ssh-askpassProgramda da çalışması gereken birkaç değişiklik var (Gnome / KDE versiyonları). Ayrıca bir grafik sudodeğiştirme programı gibi gksuya kdesudoda çalışması gerekir.


rsync --rsh='ssh -X' --rsync-path='gksudo -- rsync' user@host:/ .çalışmıyor rsync error: syntax or usage error (code 1) at main.c(1634) [server=3.1.1]. Oh, Ubuntu gnome-ssh-askpass gemisini kullanıyor, ama onun /usr/bin/ssh-askpassyerine /usr/lib/ssh/x11.... Öyleyse işe yaradı :)
Peter Cordes

1
Bu, diğer uçta herhangi bir yeniden yapılandırma gerektirmediğinden daha iyi çözümlerden biridir - sadece her ikisi de oldukça yaygın olması gereken askılı geçişi ve X yönlendirme özelliğini etkinleştirmelidir.
David Gardner,

1
Kurduktan sonra bir cazibe gibi çalışır ssh-askpass. Sadece anlamını aramak zorunda kaldım -chavzPe, bunları uzun seçenekler olarak dile getirmek harika olurdu.
krlmlr

Bunu denedim, ancak istem uzak makinede açılıyor ve yerel makineye yönlendirilmiyor. X11Forwarding, xeyesSSH kullanarak çalıştırarak doğruladığım, beklenen bir çalışma .
Joyce Babu

7

Eğer kullanıcı zaten bir parola ile korunmuş sudo ayrıcalıklarına sahipse, onları olduğu gibi tutacağım ve sadece parola olmadan rsync kullanmak için bir stanza ekleyeceğim:

%admin ALL=(ALL) ALL
%admin ALL= NOPASSWD:/usr/bin/rsync 

5

Bugün bu soruna rastladım ve yapılandırma dosyalarını değiştirmeden veya kullanıcı hesaplarına kök düzeyinde izinler vermeden bu sorunu çözdüm. Özel kurulumum A, makinedeki kullanıcının , footüm kullanıcı dizinlerini foomakineye , kullanıcının sahip olduğu barbir backupdizinde kopyalaması gerektiğiydi A. (Kullanıcının Aüzerinde sudo ayrıcalıkları var foo.)

Kullandığım komut aşağıda. Bu kullanıcı tarafından başlatıldığı Aiçinde /homedizine foo.

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

Bu, rsync komutunu sudo olarak çalıştırır, böylece açık olan tüm kullanıcı dizinlerine fooerişilebilir, ancak barkullanıcının Akimlik bilgilerini kullanarak makineye erişmek için ssh kullanmasını söyler . İhtiyaçlarım yukarıdaki sorudan biraz farklıydı ancak bu, sistem konfigürasyonuna uymadan yönettiğim belirli bir makinedeki tüm kullanıcı dizinlerini hızlıca yedeklememe izin verdi.


2
Bu mükemmel. Bu -iseçeneği için unuttum ssh. --rsync-path="sudo /usr/bin/rsync" Makinede sudo varsa kullanabilirsiniz bar. Bu daha sonra okuma root@foove yazma yapar root@bar, ancak A@foo-> ile aktarma yapar B@bar. Teşekkürler!
ctbrown

Sahibini korumaz (ör. Root), haklı mıyım?
Andris

3

Hedef makinede rsync'i daemon olarak çalıştırmak, istediğiniz şeyi yapmanıza olanak sağlar.


1
Bu cevabı iptal ettim, ancak rsynch arka plan programının nasıl çalıştırılacağına ve root erişimi ile nasıl kullanılacağına dair bir açıklama yapmalıyım.
Mike Lippert

daemon olarak rsync bu durumla eşleşmez, çünkü rsync root olarak başlatılsa bile root izinlerini bırakır ve sonra tüm dosyalar transfer edilemez.
teissler

2

Benim çözümüm kullanmaktır, --rsync-path="sudo rsync"ancak geçici çözüm için parola ister:

rsync -chavzP --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync"  user@192.168.1.2:/ .

1
Şifreleri tek satırlık komut satırına koymak genellikle iyi bir fikir değildir; Örneğin, işlem ağacında görünür hale gelirler. Bazen asıl şifreyi $( cat my_password.txt )biraz daha iyi olan bu tür bir ifadede değiştiririm , ancak genellikle her iki uçtaki izinleri yapılandırmak ve / veya SSH anahtarlarını kullanmak, şifreleri CLI'da gerekmeyecek şekilde kullanmak tercih edilir.
JDS
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.