Bağlanan kullanıcının ortak anahtarına bağlı olarak chroot ile SFTP


9

Ben sshfs üzerinden farklı istemcilerden yedekleri alan bir sunucu (Debian veya FreeBSD çalıştıran) oluşturmak istiyorum. Her istemci kendi yedekleme verilerini okuyabilmeli ve yazabilmeli, ancak diğer istemcilerin verilerini yazamamalıdır.

Aşağıdaki fikri vardı: her istemci ortak anahtar yetkilendirme üzerinden backup@backupserver.local bağlanır. Kullanıcı yedeklemesinin aşağıdaki gibi özel bir yetkili_anahtarlar dosyası vardır:

command="internal-sftp" chroot="/backup/client-1/data" ssh-rsa (key1)
command="internal-sftp" chroot="/backup/client-2/data" ssh-rsa (key2)
command="internal-sftp" chroot="/backup/client-3/data" ssh-rsa (key3)
etc...

Bunun avantajı, her istemci için ayrı bir kullanıcı kullanmam gerekmediği ve bir komut dosyası ile authority_keys dosyasını kolayca otomatik olarak oluşturabileceğim.

Sadece bir sorun var: chroot=...çalışmıyor. OpenSSH'ın yetkili_anahtarları dosyasının ChrootDirectory için eşdeğer olmadığı görülüyor (global olarak veya Eşleşme Kullanıcısı bloğunda / etc / ssh / sshd_config dosyasında çalışır).

OpenSSH kullanarak istediğimi gerçekleştirmenin oldukça basit bir yolu var mı? Belki command=...direktifin akıllıca kullanılması? Alternatif olarak, istediğimi yapabilen başka SFTP sunucuları var mı?

EDIT : Neyi başarmak istediğimi daha açık hale getirmek için: Birkaç istemcinin dosyaları sunucumda depolayabilmesini istiyorum. Her istemcinin başka herhangi bir istemcinin dosyasını görememesi gerekir. Sunucumu düzinelerce kullanıcı hesabıyla doldurmak istemiyorum, bu yüzden istemcilerin bir kullanıcı hesabını paylaşmaları ve yine de diğer dosyalara erişimleri için kolayca yönetilebilir bir çözüm istiyorum.

Yanıtlar:


5

Alternatif olarak, istediğimi yapabilen başka SFTP sunucuları var mı?

evet, proftpd kullanabilirsiniz

Kullanıcı ortamını hazırlayın. ProFTPD ile kullanıcıya geçerli bir kabuk verilmesine gerek yoktur.

# useradd -m -d /vhosts/backup/user1/ -s /sbin/nologin user1
# passwd --lock user1
Locking password for user user1.
passwd: Success

# mkdir /vhosts/backup/user1/.sftp/
# touch /vhosts/backup/user1/.sftp/authorized_keys

# chown -R user1:user1 /vhosts/backup/user1/
# chmod -R 700 /vhosts/backup/user1/

OpenSSH ortak anahtarlarını SFTPAuthorizedUserKeys içinde kullanmak için, bunları RFC4716 biçimine dönüştürmeniz gerekir. Bunu ssh-keygen aracıyla yapabilirsiniz:

# ssh-keygen -e -f user1.public.key > /vhosts/backup/user1/.sftp/authorized_keys

ProFTPD Kurulumu

ServerName "ProFTPD Default Installation"
ServerType standalone
DefaultServer off

LoadModule mod_tls.c
LoadModule mod_sftp.c
LoadModule mod_rewrite.c

TLSProtocol TLSv1 TLSv1.1 TLSv1.2

# Disable default ftp server
Port 0

UseReverseDNS off
IdentLookups off

# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask 022

# PersistentPasswd causes problems with NIS/LDAP.
PersistentPasswd off

MaxInstances 30

# Set the user and group under which the server will run.
User nobody
Group nobody

# Normally, we want files to be overwriteable.
AllowOverwrite                  on

TimesGMT off
SetEnv TZ :/etc/localtime

<VirtualHost sftp.example.net>
    ServerName "SFTP: Backup server."
    DefaultRoot ~
    Umask 002
    Port 2121

    RootRevoke on

    SFTPEngine on
    SFTPLog /var/log/proftpd/sftp.log

    SFTPHostKey /etc/ssh/ssh_host_rsa_key
    SFTPHostKey /etc/ssh/ssh_host_dsa_key
    SFTPDHParamFile /etc/pki/proftpd/dhparam_2048.pem
    SFTPAuthorizedUserKeys file:~/.sftp/authorized_keys

    SFTPCompression delayed
    SFTPAuthMethods publickey
</VirtualHost>

<Global>
    RequireValidShell off
    AllowOverwrite yes

    DenyFilter \*.*/

    <Limit SITE_CHMOD>
        DenyAll
    </Limit>
</Global>

LogFormat default "%h %l %u %t \"%r\" %s %b"
LogFormat auth    "%v [%P] %h %t \"%r\" %s"
ExtendedLog /var/log/proftpd/access.log read,write

DH (Diffie-Hellman) grup parametreleri oluşturun.

# openssl dhparam -out /etc/pki/proftpd/dhparam_2048.pem 2048

Herhangi bir SFTP istemcisini yapılandırın. FileZilla kullandım

FileZilla SFTP sunucusu ayarları

ProFPTD'yi hata ayıklama modunda çalıştırırsanız

# proftpd -n -d 3 

Konsolda aşağıdakine benzer bir şey göreceksiniz

2016-02-21 22:12:48,275 sftp.example.net proftpd[50511]: using PCRE 7.8 2008-09-05
2016-02-21 22:12:48,279 sftp.example.net proftpd[50511]: mod_sftp/0.9.9: using OpenSSL 1.0.1e-fips 11 Feb 2013
2016-02-21 22:12:48,462 sftp.example.net proftpd[50511] sftp.example.net: set core resource limits for daemon
2016-02-21 22:12:48,462 sftp.example.net proftpd[50511] sftp.example.net: ProFTPD 1.3.5a (maint) (built Sun Feb 21 2016 21:22:00 UTC) standalone mode STARTUP
2016-02-21 22:12:59,780 sftp.example.net proftpd[50512] sftp.example.net (192.168.1.2[192.168.1.2]): mod_cap/1.1: adding CAP_SETUID and CAP_SETGID capabilities
2016-02-21 22:12:59,780 sftp.example.net proftpd[50512] sftp.example.net (192.168.1.2[192.168.1.2]): SSH2 session opened.
2016-02-21 22:12:59,863 sftp.example.net proftpd[50512] sftp.example.net (192.168.1.2[192.168.1.2]): Preparing to chroot to directory '/vhosts/backup/user1'
2016-02-21 22:12:59,863 sftp.example.net proftpd[50512] sftp.example.net (192.168.1.2[192.168.1.2]): Environment successfully chroot()ed
2016-02-21 22:12:59,863 sftp.example.net proftpd[50512] sftp.example.net (192.168.1.2[192.168.1.2]): USER user1: Login successful

Ve /var/log/sftp.log dosyasındaki follwoing hatları

2016-02-21 22:12:48,735 mod_sftp/0.9.9[50309]: sending acceptable userauth methods: publickey
2016-02-21 22:12:48,735 mod_sftp/0.9.9[50309]: public key MD5 fingerprint: c2:2f:a3:93:59:5d:e4:38:99:4b:fd:b1:6e:fc:54:6c
2016-02-21 22:12:48,735 mod_sftp/0.9.9[50309]: sending publickey OK
2016-02-21 22:12:59,789 mod_sftp/0.9.9[50309]: public key MD5 fingerprint: c2:2f:a3:93:59:5d:e4:38:99:4b:fd:b1:6e:fc:54:6c
2016-02-21 22:12:59,790 mod_sftp/0.9.9[50309]: sending userauth success
2016-02-21 22:12:59,790 mod_sftp/0.9.9[50309]: user 'user1' authenticated via 'publickey' method

PS

Yetkili anahtarlar ( SFTPAuthorizedUserKeys ) içeren bir dosya için yapılandırılmış yol , kimliği doğrulanan kullanıcının adıyla enterpolasyon yapılacak % u değişkenini kullanabilir . Bu özellik, kullanıcıların kendi yetkili anahtarlarını yönetmelerini istemekten (veya izin vermeden), merkezi bir konumda bulunan yetkili anahtarların kullanıcı başına dosyalarına sahip olmayı destekler. Örneğin:

SFTPAuthorizedUserKeys file:/etc/sftp/authorized_keys/%u

Birkaç istemcinin dosyaları sunucumda depolayabilmesini istiyorum. Her istemci, başka bir istemcinin dosyalarını görememelidir. Sunucumu onlarca kullanıcı hesabıyla doldurmak istemiyorum, bu yüzden istemcilerin bir kullanıcı hesabını paylaşmaları ve yine de diğer dosyalara erişimleri için kolayca yönetilebilir bir çözüm istiyorum.

ProFTPD ile de mümkündür. İlk yapılandırmamda biraz değişiklik yapmanız gerekiyor

<VirtualHost sftp.example.net>
    ...   
    SFTPAuthorizedUserKeys file:/etc/proftpd/sftp_authorized_keys
    AuthUserFile /etc/proftpd/sftp_users.passwd

    CreateHome on 0700 dirmode 0700 uid 99 gid 99

    RewriteHome on
    RewriteEngine on
    RewriteLog /var/log/proftpd/rewrite.log
    RewriteCondition %m REWRITE_HOME
    RewriteRule (.*) /vhosts/backup/%u
</VirtualHost>

Ve bir sanal hesap oluşturun

# ftpasswd --passwd --file /etc/proftpd/sftp_users.passwd --sha512 --gid 99 --uid 99 --shell /sbin/nologin --name user1 --home /vhosts/backup

Bu kadar. Her ek hesap için tek ihtiyacınız olan ortak anahtarını / etc / proftpd / sftp_authorized_keys'e eklemektir.

Not: dosya sonunda yeni satır içermelidir! Bu önemli.


Ayrıntılı cevabınız için teşekkür ederim. Ancak, bunun, birçok müşterinin tek bir kullanıcı hesabını kullanma hedefime ulaşmamda nasıl yardımcı olabileceğini görmüyorum. (Ve bir senaryo ile kolayca yönetilebilir olun.) Orijinal sorumu tekrar okuduğumda, başarmak istediğim şeyin tamamen açık olmadığını itiraf ediyorum. Bunun için özür dilerim.
Xykon42

Cevabı güncelledim
ALex_hha

1
Tamam, küçük bir değişiklikle, bu gerçekten iyi çalışıyor, teşekkürler! Kullanıcıların, kullanıcı adlarını tahmin ederek (veya CreateHome işlevini kötüye kullanarak sunucumu selleştirerek) diğer kullanıcıların dosyalarına erişemediğinden emin olmak için, yetkili_anahtarlar dosyasının /foo/authorized_keys.d/%u gibi kullanıcıya özgü olması gerekir.
Xykon42

6

chroot=...çalışmıyor.

Hayır, kılavuz sayfasında dosya sshdbiçimini açıklayan böyle bir şey yoktur authorized_keys.

Eğer içine chot koyarsanız command=, kullanamazsınız internal-sftp, çünkü içerideki dahili fonksiyon çağrısının yerine geçer sshd.

Ayrılmaya ihtiyacınız varsa, önerilen yol daha fazla kullanıcı kurar. Ayrıca internal-sftp, katı bir ayırmaya ihtiyacınız yoksa (yalnızca farklı çalışma dizinlerini exaxmple için) gibi argümanlar da kullanabilirsiniz .

command="internal-sftp -d /backup/client-1/data" ssh-rsa (key1)

-PManuel sayfadaki gibi seçeneği kullanarak istek miktarını sınırlamak da mümkündür sftp-server.


0

Bu arada, en azından kullanım durumumda da iyi çalışan basit bir çözüm buldum:

Her istemci, sunucuya aynı kullanıcı hesabıyla ve muhtemelen aynı anahtarla bağlanır (farketmez). OpenSSH, aşağıdaki yapıya sahip bir dizine bağlanır:

d--x--x---   dark-folder
drwxr-x---   |- verylongrandomfoldername1
drwxr-x---   |- verylongrandomfoldername2
drwxr-x---   `- ...

Yedekleme komutuyla birlikte, sunucu istemciye dosyalarını içine koyması gereken klasör adını söyler. Klasör adları hemen hemen tahmin edilemeyen 64 baytlık rastgele dizelerdir, bu nedenle her istemci kendi klasörüne erişebilir, ancak diğerleri "karanlıkta bir yerlerde" olsalar da.

karanlık klasördeki d - x - x-- modu, her istemcinin klasöre (ve aşağıdaki klasörlere) girmesini sağlar, ancak içeriğini listeleyemez veya yeni giriş oluşturamaz.

Alt klasörler yedekleme sunucusu işlemi tarafından oluşturulur ve istemci ve klasör arasındaki bağlantı (diğer şeylerin yanı sıra) bir sqlite db içinde saklanır.

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.