SFTP ile şifresiz yedeklemeyi kısıtla


11

Duplicity kullanarak bir sunucunun bilgisayarıma yedekleme gerçekleştirmek gerekir:

duplicity /etc sftp://backup@my.dynamic.ip.address//home/backup

Bu yapılmadan önce, aşağıdakileri yaparak şifresiz erişime izin vermeliyim:

$ ssh-keygen
$ ssh-copy-id backup@my.dynamic.ip.address
$ ssh backup@my.dynamic.ip.address

Sorum şu: Komutu, üretilen ortak anahtardaki bu SFTP aktarımıyla nasıl kısıtlayabilirim?

command="restrict to sftp",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAA…

Dinamik bir IP adresinde olduğum için, IP'im her değiştiğinde "eksik bilinen ana bilgisayar" sorununun üstesinden nasıl gelebilirim?



1
"bilinen ana makine sorunu eksik": sss için StrictHostKeyChecking = seçenek yok
Marki

@Marki, teşekkürler, ssh_config üzerinde çalışıyor.
Question Overflow

Yanıtlar:


15

Soru 1

Sorum şu: Komutu, üretilen ortak anahtardaki bu SFTP aktarımıyla nasıl kısıtlayabilirim?

Bunu yapmak için 2 yöntem vardır.

1. - sshd ile kısıtlama

Bu yöntem, SSH arka plan programınızda SFTP özelliğinin ayarlanmasını içerir sshd. Bu, /etc/ssh/sshd_configyapılandırma dosyası aracılığıyla kontrol edilir . NOT: Bu, kullanıcının backupsunucuya SFTP'sine izin verilmesini kısıtlar .

# /etc/ssh/sshd_config

Subsystem       sftp    internal-sftp

## You want to put only certain users (i.e users who belongs to sftpusers 
## group) in the chroot jail environment. Add the following lines at the end 
## of /etc/ssh/sshd_config

Match User backup
  ForceCommand internal-sftp

2. - yetkili_anahtarlarla kısıtlama

Bu yöntem sshd_configdosyada herhangi bir değişiklik içermez . Sorunuzda command=daha önce bahsettiğiniz özellik sayesinde bir kullanıcıyı + SSH anahtarını tek bir komutla sınırlayabilirsiniz . Hile hangi komutu eklediğinizde. command=SFTP sunucusunu, sshd_configdosyanızda SFTP sunucusunu kurmakla aynı etkiye sahip olan bu satıra koyabilirsiniz .

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

NOT: kullanıcının yazma erişimi varsa, ~/.ssh/authorized_keysokuyabilir ve / veya değiştirebilir. Örneğin, onu indirebilir, düzenleyebilir ve sıyırma işlemini geri yükleyebilir commmand=...ve kabuk da dahil olmak üzere ona izin verilmeyen komut erişimi verebilir . Kullanıcının yazma erişimi varsa, ~/.sshdosyanın bağlantısını kaldırabilir ve yeniden oluşturabilir ya chmodda yazma erişimi oluşturabilir. ~/.ssh/authorized_keysDosyaları kullanıcı tarafından yazılamayan bir yere koymak gibi birçok olası çözüm vardır, örneğin :

Match Group sftponly
    AuthorizedKeysFile      /etc/ssh/authorized_keys/%u

Soru 2

Dinamik bir IP adresinde olduğum için, IP'im her değiştiğinde "eksik bilinen ana bilgisayar" sorununun üstesinden nasıl gelebilirim?

Bu daha zordur ancak dosya from=içindeki özelliği kullanarak da yapılabilir authorized_keys. Burada sadece ana bilgisayardan erişimi kısıtlıyoruz somehost.dyndns.org.

from = "somehost.dyndns.org", komut = "/ usr / libexec / openssh / sftp-server", bağlantı noktası yönlendirme yok, X11 yönlendirme yok, ajan yok yönlendirme, no-pty ssh-dss AAAAC8ghi9ldw == yedekleme @ host

command=SSH anahtarının kullanımını daha da sınırlayacağından, 'den sonraki ek ayarlar da aynı derecede önemlidir.

özelliklerin dökümü

  • from='hostname1,hostname2,'' - Belirtilen IP veya ana bilgisayar adı modellerinden erişimi kısıtlar
  • command='command' - Kimlik doğrulamasından sonra belirtilen komutu çalıştırır
  • no-pty - Bir pty ayırmaz (etkileşimli girişe izin vermez)
  • no-port-forwarding - Bağlantı noktası iletmeye izin vermez
  • no-X11-forwarding - kullanıcı X11 ekran GUI'lerini kaldıramaz
  • no-agent-forwarding - kullanıcı bu ana bilgisayar üzerinden diğer dahili ana bilgisayarlara yönlendiremez

"Bilinen eksik ana makineler" hakkındaki mesajdan kurtulmak için, aşağıdaki gibi bağlandığında istemciye bu SSH seçeneğini ekleyebilirsiniz:

$ ssh -o StrictHostKeyChecking=no ....

ssh_configBu anahtarla ilgili tüm ayrıntılar için kılavuz sayfasına bakın .

Kullanıcının kabuğunu kısıtlama

Yukarıdaki her iki çözüm için de, backupbu kullanıcının kabuğundaki /etc/passwddosyada da sınırlama yaparak kullanıcıyı kilitlemek isteyeceksiniz . Genellikle bunu ayarlamak istersiniz scponly, ancak bunun için başka seçenekler de vardır. U & L Q & A bu başlıklı Bkz: " Eğer SCP için bir kabuk gerekiyor mu? " Bunu yapmanın yollarını.

Yukarıdaki # 1/sbin/nologin ' sshd_configde belirtildiği gibi chroot özelliğini kullanmayı tercih ederseniz,' nın kullanımı da kullanılabilir . Ancak # 2'de özetlenen yöntemi kullanmayı seçerseniz , kullanıcının kabuğu için muhtemelen başka bir şey kullanmanız gerekir .scponly/etc/passwd


BONUS - Yukarıdaki # 2'yi genişletme

Bu kullanıcı için bir dizi komutu göstermeniz gerekiyorsa bunu da yapabilirsiniz. Bunun gibi bir komut dosyası oluşturun /home/backup/commands.sh:

#!/bin/sh

case $SSH_ORIGINAL_COMMAND in
  "diskspace")
    df -h
    ;;
  "dirlist")
    ls -1
    ;;
  "apache_restart")
    /etc/init.d/apache restart
    ;;
  *)
    echo "Unknown command"
esac

Daha sonra authorized_keysdosyayı şu şekilde ayarlarsınız:

command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host

backupKullanıcı daha sonra şöyle bu komutları çalıştırabilirsiniz:

# diskspace
$ ssh -q user@remote_host diskspace
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/dev-root   39G  2.2G   35G   6% /

# dirlist
$ ssh -q remote_host dirlist
commands.sh
dump.sql

Referanslar


Kullanıcının erişmesine izin verdiğiniz komutlara dikkat edin veya kullanıcı tam bir kabuk kazanma özelliğine sahip olabilir. Örnek olarak, birine vim'e erişim izni verirseniz kolayca:! / Bin / bash veya:! / Bin / someotherprogram olabilir.
rking

@rking - evet söylemeye gerek yok ...
slm

Bana bu kadar ayrıntılı bir cevap verdiğiniz için teşekkürler. Komut kısıtlaması mükemmel çalışıyor. Ancak iki sorun var. 1) Dinamik ip sunucuya değil bilgisayarıma atıfta bulunur. Authority_keys dosyasının "from" alanındaki ana bilgisayar adları yalnızca sunucunun bilgisayarıma erişebileceği adresi kısıtlar ve bilgisayarımdaki "bilinen ana makine eksik" sorununu çözmek için hiçbir şey yapmaz. 2) Bilgisayarımdaki yedek kullanıcı için kabuk girişinin devre dışı bırakılması /sbin/nologin, sunucunun SFTP ile bilgisayarıma erişmesini önleyecektir. Bunu denedim.
Question Overflow

1
Karışıklık için özür dilerim. Sunucu S, bilgisayarım C'ye arka uç SFTP bağlantısı yaptığında istemci olur. Yedeklemeyi yapan sunucu S, ssh known_hostsdosyasında listelenmeyen bir konuma bağlandığında "eksik bilinen ana bilgisayar" sorunu oluşur . Marki yorumunda doğru çözümü sundu. fromParametresi authorized_keysbilgisayarım C dosyanın sadece S C'ye bağlanabilir hangi konuma kısıtlar
Soru Taşma

Evet, lütfen düzenleme işlemini yapın. Bu arada , sertifikada belirttiğiniz yerine /sbin/nologinforce komutunu internal-sftpkullanırsam bunun işe yaradığını anlıyorum /usr/libexec/openssh/sftp-server. Sanırım bunlar iki farklı alt sistem. Birincisi için bir chroot dizini oluşturmak çok daha basittir.
Question Overflow

0

Sınırlı Kabuk

Scponly veya rssh gibi kısıtlı bir kabuk atamanız gerekir .

Scp veya sftp kullandığınızda, uzak siteye ssh üzerinden bağlanırsınız ve daha sonra uzak kabuk bir scp işlem veya sftp işlemi yürütür. İhtiyacınız olan şey sadece scp veya sftp'nin oturum açmayı kilitlemesine izin veren sınırlı bir kabuktur.

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.