SFTP พร้อม chroot ขึ้นอยู่กับพับลิกคีย์ของการเชื่อมต่อผู้ใช้


9

ฉันต้องการสร้างเซิร์ฟเวอร์ (เรียกใช้ Debian หรือ FreeBSD) ที่ได้รับการสำรองข้อมูลจากไคลเอนต์ที่แตกต่างกันผ่าน sshfs ไคลเอนต์แต่ละคนควรสามารถอ่านและเขียนข้อมูลสำรองของตัวเอง แต่ไม่ใช่ข้อมูลของลูกค้าอื่น ๆ

ฉันมีความคิดต่อไปนี้: ไคลเอนต์แต่ละคนเชื่อมต่อผ่านกุญแจสาธารณะรับรองความถูกต้องเพื่อ backup@backupserver.local การสำรองข้อมูลผู้ใช้มีไฟล์ authorized_keys พิเศษเช่นนี้:

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

ข้อดีของการทำเช่นนี้คือฉันไม่ต้องการใช้ผู้ใช้แยกต่างหากสำหรับไคลเอนต์ทุกคนและฉันสามารถสร้างไฟล์ authorized_keys ที่ได้รับอนุญาตด้วยสคริปต์ได้อย่างง่ายดาย

มีเพียงปัญหาเดียวคือ: ใช้งานchroot=...ไม่ได้ ไฟล์ authorized_keys ของ OpenSSH ดูเหมือนจะไม่เทียบเท่า ChrootDirectory (ซึ่งทำงานใน / etc / ssh / sshd_config ไม่ว่าจะเป็นแบบโกลบอลหรือในบล็อกผู้ใช้ตรงกัน)

มีวิธีที่เรียบง่ายพอสมควรในการบรรลุสิ่งที่ฉันต้องการโดยใช้ OpenSSH หรือไม่? อาจใช้command=...คำสั่งอย่างฉลาด? หรือมีเซิร์ฟเวอร์ SFTP อื่นที่สามารถทำสิ่งที่ฉันต้องการได้หรือไม่

แก้ไข : เพื่อให้ชัดเจนยิ่งขึ้นสิ่งที่ฉันต้องการบรรลุ: ฉันต้องการให้ลูกค้าหลายรายสามารถจัดเก็บไฟล์บนเซิร์ฟเวอร์ของฉัน ลูกค้าแต่ละรายไม่ควรเห็นไฟล์ของลูกค้าอื่น และฉันไม่ต้องการทิ้งเซิร์ฟเวอร์ของฉันด้วยบัญชีผู้ใช้หลายสิบบัญชีดังนั้นฉันจึงต้องการโซลูชันที่จัดการได้ง่ายเพื่อให้ลูกค้าแบ่งปันบัญชีผู้ใช้และยังไม่สามารถเข้าถึงไฟล์ของแต่ละคนได้

คำตอบ:


5

หรือมีเซิร์ฟเวอร์ SFTP อื่นที่สามารถทำสิ่งที่ฉันต้องการได้หรือไม่

ใช่คุณสามารถใช้ proftpd

เตรียมสภาพแวดล้อมของผู้ใช้ ด้วย ProFTPD ไม่จำเป็นต้องให้เชลล์ที่ถูกต้องแก่ผู้ใช้

# 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 ใน SFTPAuthorizedUserKeys คุณจะต้องแปลงเป็นรูปแบบ RFC4716 คุณสามารถทำได้ด้วยเครื่องมือ ssh-keygen:

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

ติดตั้ง ProFTPD

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)

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

กำหนดค่าไคลเอนต์ SFTP ใด ๆ ฉันใช้ FileZilla

การตั้งค่าเซิร์ฟเวอร์ FileZilla SFTP

หากคุณเรียกใช้ ProFPTD ในโหมดแก้ไขข้อบกพร่อง

# proftpd -n -d 3 

ในคอนโซลคุณจะเห็นสิ่งต่อไปนี้

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

และบรรทัด follwoing ใน /var/log/sftp.log

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

พา ธ ที่กำหนดค่าไว้สำหรับไฟล์ที่มีคีย์ที่ได้รับอนุญาต ( SFTPAuthorizedUserKeys ) สามารถใช้ตัวแปร% uซึ่งจะถูกแก้ไขด้วยชื่อของผู้ใช้ที่ได้รับการตรวจสอบความถูกต้อง คุณสมบัตินี้รองรับการมีไฟล์ต่อผู้ใช้ของคีย์ที่ได้รับอนุญาตที่อยู่ในตำแหน่งศูนย์กลางแทนที่จะต้องการให้ผู้ใช้ (หรืออนุญาต) จัดการคีย์ที่ได้รับอนุญาตของตนเอง ตัวอย่างเช่น:

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

ฉันต้องการให้ลูกค้าหลายคนสามารถจัดเก็บไฟล์บนเซิร์ฟเวอร์ของฉัน ลูกค้าแต่ละรายไม่ควรเห็นไฟล์ของลูกค้าอื่น และฉันไม่ต้องการทิ้งเซิร์ฟเวอร์ของฉันด้วยบัญชีผู้ใช้หลายสิบบัญชีดังนั้นฉันจึงต้องการโซลูชันที่จัดการได้ง่ายเพื่อให้ลูกค้าแบ่งปันบัญชีผู้ใช้และยังไม่สามารถเข้าถึงไฟล์ของแต่ละคนได้

ด้วย ProFTPD ก็เป็นไปได้เช่นกัน คุณเพียงแค่ปรับเปลี่ยนการกำหนดค่าเริ่มต้นของฉันเล็กน้อย

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

และสร้างบัญชีเสมือนหนึ่งบัญชี

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

นั่นคือทั้งหมดที่ สำหรับทุกบัญชีเพิ่มเติมสิ่งที่คุณต้องมีก็คือการเพิ่มกุญแจสาธารณะของเขาให้กับ / etc / proftpd / sftp_authorized_keys

หมายเหตุ: ไฟล์จะต้องมีบรรทัดใหม่ในตอนท้าย! มันสำคัญ.


ขอบคุณสำหรับคำตอบที่ไม่ต้องเสียเงิน อย่างไรก็ตามฉันไม่เห็นว่าสิ่งนี้จะช่วยให้ฉันบรรลุเป้าหมายหลักในการใช้บัญชีผู้ใช้เพียงบัญชีเดียวสำหรับลูกค้าจำนวนมากที่ไม่สามารถดูไฟล์ของแต่ละคนได้ (และสามารถจัดการได้ง่ายโดยสคริปต์) อ่านคำถามเดิมของฉันอีกครั้งฉันยอมรับว่าอาจไม่ชัดเจนว่าฉันต้องการบรรลุอะไร ขอโทษสำหรับสิ่งนั้น.
Xykon42

ฉันได้อัปเดตคำตอบแล้ว
ALex_hha

1
โอเคกับการเปลี่ยนแปลงเล็กน้อยมันใช้งานได้ดีจริง ๆ ขอบคุณ! เพื่อให้แน่ใจว่าผู้ใช้ไม่สามารถเข้าถึงไฟล์ของผู้ใช้คนอื่นโดยคาดเดาชื่อผู้ใช้ของพวกเขา (หรือทำให้เซิร์ฟเวอร์ของฉันท่วมโดยใช้ฟังก์ชั่น CreateHome) ไฟล์ที่ได้รับอนุญาตจะต้องเป็นแบบเฉพาะผู้ใช้เช่น /foo/authorized_keys.d/%u
Xykon42

6

chroot=...ไม่ทำงาน

ไม่ไม่มีอะไรในหน้าคู่มือสำหรับsshdอธิบายรูปแบบของauthorized_keysไฟล์

ถ้าคุณจะใส่เข้าไปใน chroot command=คุณจะไม่สามารถที่จะใช้เพราะมันเป็นทดแทนภายในฟังก์ชั่นการโทรภายในinternal-sftpsshd

วิธีที่แนะนำจะตั้งค่าผู้ใช้มากขึ้นหากคุณต้องการแยก คุณอาจใช้อาร์กิวเมนต์internal-sftpถ้าคุณไม่ต้องการการแยกที่เข้มงวด (สำหรับ exaxmple เพียงไดเรกทอรีทำงานที่แตกต่างกัน) เช่น

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

นอกจากนี้ยังมีความเป็นไปได้ที่จะ จำกัด จำนวนของการร้องขอโดยใช้ตัวเลือกในขณะที่หน้าคู่มือสำหรับ-Psftp-server


0

ในขณะเดียวกันฉันคิดวิธีแก้ปัญหาง่ายๆที่ใช้งานได้ดีอย่างน้อยในกรณีใช้งานของฉัน:

ลูกค้าทุกคนเชื่อมต่อกับเซิร์ฟเวอร์ด้วยบัญชีผู้ใช้เดียวกันและอาจเป็นรหัสเดียวกันก็ได้ (ไม่สำคัญ) OpenSSH chroots ลงในไดเร็กทอรีที่มีโครงสร้างต่อไปนี้:

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

เมื่อใช้ร่วมกับคำสั่ง backup เซิร์ฟเวอร์จะแจ้งชื่อโฟลเดอร์ให้ลูกค้าทราบว่าควรใส่ไฟล์ไว้ในที่ใด ชื่อโฟลเดอร์เป็นสตริงแบบสุ่ม 64- ไบต์ที่ไม่สามารถคาดเดาได้ดังนั้นลูกค้าทุกคนสามารถเข้าถึงโฟลเดอร์ของตัวเองได้อย่างแท้จริงเท่านั้นแม้ว่าคนอื่น ๆ จะอยู่

โหมด d - x - x-- ใน dark-folder ทำให้แน่ใจว่าไคลเอนต์ทุกคนสามารถเข้าสู่โฟลเดอร์ (และโฟลเดอร์ด้านล่าง) แต่ไม่สามารถแสดงรายการเนื้อหาหรือสร้างรายการใหม่ใด ๆ

โฟลเดอร์ย่อยถูกสร้างขึ้นโดยกระบวนการเซิร์ฟเวอร์สำรองและการเชื่อมต่อระหว่างไคลเอนต์และโฟลเดอร์จะถูกเก็บไว้ (เหนือสิ่งอื่นใด) ใน sqlite db

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.