সংযোগকারী ব্যবহারকারীর পাবলিক কী এর উপর নির্ভর করে ক্রুটের সাথে এসএফটিপি


9

আমি একটি সার্ভার তৈরি করতে চাই (ডেবিয়ান বা ফ্রিবিএসডি চলছে) যা এসএসএফএসের মাধ্যমে বিভিন্ন ক্লায়েন্টের ব্যাকআপ গ্রহণ করে। প্রতিটি ক্লায়েন্টের নিজস্ব ব্যাকআপ ডেটা পড়তে এবং লিখতে সক্ষম হওয়া উচিত, তবে অন্যান্য ক্লায়েন্টের কোনওটির ডেটা নয়।

আমার নিম্নোক্ত ধারণাটি ছিল: প্রতিটি ক্লায়েন্ট পাবলিক কী অथের মাধ্যমে ব্যাকআপ@ব্যাকআপসভার.লোকালের সাথে সংযুক্ত হয়। ব্যবহারকারীর ব্যাকআপের একটি বিশেষ অনুমোদিত_কিজি ফাইল রয়েছে:

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

এর সুবিধাটি হ'ল আমার প্রতিটি ক্লায়েন্টের জন্য পৃথক ব্যবহারকারী ব্যবহার করার দরকার পড়বে না এবং আমি সহজেই কোনও স্ক্রিপ্টের সাথে অনুমোদিত_কিজ ফাইলটি স্বয়ংক্রিয়ভাবে তৈরি করতে পারতাম।

একটি মাত্র সমস্যা আছে: chroot=...কাজ করে না। ওপেনএসএইচ-এর অনুমোদিত_কাইজ ফাইলটির ক্রুটডাইরেক্টরির (যা / etc / ssh / sshd_config, বিশ্বব্যাপী বা ম্যাচ ব্যবহারকারী ব্লকের সাথে কাজ করে) সমতুল্য বলে মনে হচ্ছে না।

আমি ওপেনএসএইচ ব্যবহার করতে চাইলে এটি সম্পাদন করার কি যুক্তিসঙ্গত সহজ উপায় আছে? সম্ভবত command=...একটি চালাক উপায়ে নির্দেশ ব্যবহার ? বিকল্পভাবে, অন্য এসএফটিপি সার্ভারগুলি কি আমি চাই তা করতে পারে?

সম্পাদনা : আমি কী অর্জন করতে চাই তা আরও স্পষ্ট করার জন্য: আমি চাই যে বেশ কয়েকটি ক্লায়েন্ট আমার সার্ভারে ফাইল সঞ্চয় করতে সক্ষম হন। প্রতিটি ক্লায়েন্টের অন্য কোনও ক্লায়েন্টের ফাইল দেখতে সক্ষম হওয়া উচিত নয়। এবং আমি কয়েক ডজন ব্যবহারকারীর অ্যাকাউন্টের সাথে আমার সার্ভারটি লিটারে ফেলতে চাই না, তাই আমি ক্লায়েন্টদের পক্ষে একটি ব্যবহারকারী অ্যাকাউন্ট ভাগ করে নেওয়ার জন্য একটি সহজেই সমাধানযোগ্য সমাধান চাই এবং তারপরেও প্রত্যেকের ফাইলগুলিতে অ্যাক্সেস নেই।

উত্তর:


5

বিকল্পভাবে, অন্য এসএফটিপি সার্ভারগুলি রয়েছে যা আমি যা করতে পারি তা করতে পারে?

হ্যাঁ, আপনি 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/

কোনও SFTPAuthorisedUserKeys- এ ওপেনএসএসএইচ পাবলিক কীগুলি ব্যবহার করতে, আপনাকে অবশ্যই তাদের আরএফসি 4716 ফর্ম্যাটে রূপান্তর করতে হবে। আপনি এটি ssh-keygen সরঞ্জাম দিয়ে করতে পারেন:

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

প্রোএফটিপিডি সেটআপ করুন

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

ডিএইচ (ডিফি-হেলম্যান) গ্রুপ পরামিতি তৈরি করুন।

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

যে কোনও এসএফটিপি ক্লায়েন্ট কনফিগার করুন। আমি ফাইলজিলা ব্যবহার করেছি

ফাইলজিলা এসএফটিপি সার্ভার সেটিংস

আপনি যদি ডিবাগ মোডে প্রোএফপিটিডি চালান

# 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

এবং একটি /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

পুনশ্চ

অনুমোদিত কী ( SFTPAuthorisedUserKeys ) সমন্বিত কোনও ফাইলের জন্য কনফিগার করা পথটি % u ভেরিয়েবল ব্যবহার করতে পারে , যা ব্যবহারকারীর নামের সাথে বৈধতা দেওয়া হবে। এই বৈশিষ্ট্যটি ব্যবহারকারীদের নিজস্ব অনুমোদিত কীগুলি পরিচালনা করার (বা অনুমতি দেওয়ার) পরিবর্তে কোনও কেন্দ্রীয় অবস্থানে থাকা অনুমোদিত কীগুলির প্রতি ব্যবহারকারী ফাইলগুলি সমর্থন করে। উদাহরণ স্বরূপ:

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

আমি চাই যে বেশ কয়েকটি ক্লায়েন্ট আমার সার্ভারে ফাইল সঞ্চয় করতে সক্ষম হন। প্রতিটি ক্লায়েন্টের অন্য কোনও ক্লায়েন্টের ফাইল দেখতে সক্ষম হওয়া উচিত নয়। এবং আমি কয়েক ডজন ব্যবহারকারীর অ্যাকাউন্টের সাথে আমার সার্ভারটি লিটারে ফেলতে চাই না, তাই আমি ক্লায়েন্টদের পক্ষে একটি ব্যবহারকারী অ্যাকাউন্ট ভাগ করে নেওয়ার জন্য একটি সহজেই সমাধানযোগ্য সমাধান চাই এবং তারপরেও প্রত্যেকের ফাইলগুলিতে অ্যাক্সেস নেই।

প্রোএফটিপিডি দিয়ে এটিও সম্ভব। আপনার কেবলমাত্র আমার প্রাথমিক কনফিগারেশনটি পরিবর্তন করতে হবে

<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_authorised_keys এ যুক্ত করতে হবে

দ্রষ্টব্য: ফাইলটিতে অবশ্যই শেষের দিকে নতুন লাইন থাকা উচিত! এটা গুরুত্বপূর্ণ.


আপনার বিস্তারিত উত্তরের জন্য ধন্যবাদ। তবে, আমি দেখতে পাচ্ছি না যে এটি কীভাবে অনেক ক্লায়েন্টের জন্য কেবলমাত্র একটি ব্যবহারকারীর অ্যাকাউন্ট ব্যবহারের আমার প্রধান লক্ষ্য অর্জনে সহায়তা করবে যা প্রতিটিের ফাইলগুলি দেখতে সক্ষম হবে না। (এবং কোনও স্ক্রিপ্টের মাধ্যমে সহজেই পরিচালনাযোগ্য হয়ে উঠুন)) আমার মূল প্রশ্নটি আবার পড়ে, আমি স্বীকার করি যে আমি কী অর্জন করতে চেয়েছিলাম তা সম্ভবত পুরোপুরি সুস্পষ্ট ছিল না। তার জন্য দুঃখিত।
Xykon42

আমি উত্তর আপডেট করেছি
ALex_hha

1
ঠিক আছে, একটি ছোট পরিবর্তন সহ, এটি আসলে দুর্দান্তভাবে কাজ করে, ধন্যবাদ! ব্যবহারকারীরা তাদের ব্যবহারকারীর নাম অনুমান করে (বা ক্রিয়েটহোম ফাংশনটির অপব্যবহার করে আমার সার্ভারকে প্লাবিত করতে) অন্য ব্যবহারকারীদের ফাইল অ্যাক্সেস করতে পারবেন না তা নিশ্চিত করার জন্য অনুমোদিত_কিগুলি ফাইলটি /foo/authorised_keys.d/%u এর মতো ব্যবহারকারী-নির্দিষ্ট হওয়া দরকার।
Xykon42

6

chroot=...কাজ করে না।

না, ফাইলের sshdফর্ম্যাটটি বর্ণনা করে দেওয়ার জন্য ম্যানুয়াল পৃষ্ঠাতে এর মতো কিছুই নেই authorized_keys

আপনি যদি ক্রুটটি এতে প্রবেশ করান command=, আপনি ব্যবহার করতে পারবেন না internal-sftp, কারণ এটি অভ্যন্তরীণ ফাংশন কলটির বিকল্প sshd

প্রস্তাবিত উপায়ে আরও ব্যবহারকারী সেট আপ করা হয়েছে, যদি আপনার বিচ্ছেদ প্রয়োজন হয়। আপনার internal-sftpযদি কঠোরভাবে পৃথকীকরণের প্রয়োজন না হয় (যেমন এক্সাক্স্পাম্পল কেবলমাত্র ভিন্ন ভিন্ন ওয়ার্কিং ডিরেক্টরি) প্রয়োজন হয়, যেমন আপনি যুক্তিগুলিও ব্যবহার করতে পারেন

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

-Pম্যানুয়াল পৃষ্ঠা হিসাবে বিকল্প ব্যবহার করে অনুরোধের পরিমাণ সীমাবদ্ধ করাও সম্ভব sftp-server


0

এদিকে, আমি আরও একটি সহজ সমাধান নিয়ে এসেছি যা ভালভাবে কাজ করে, কমপক্ষে আমার ব্যবহারের ক্ষেত্রেও:

প্রতিটি ক্লায়েন্ট একই ব্যবহারকারীর অ্যাকাউন্ট এবং সম্ভবত এমনকি একই কী (সার্ভারের সাথে সংযোগ স্থাপন করে)। ওপেনএসএসএইচ ক্রুটগুলি নিম্নলিখিত ডিরেক্টরিতে থাকা ডিরেক্টরিতে রয়েছে:

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

ব্যাকআপ কমান্ডের সাথে, সার্ভার ক্লায়েন্টকে ফোল্ডারের নাম জানায় যে এটির ফাইলগুলি এতে প্রবেশ করা উচিত। ফোল্ডারের নামগুলি -৪-বাইটের এলোমেলো স্ট্রিং যা কার্যত অদ্বিতীয়।

ডার্ক-ফোল্ডারে থাকা ডি - এক্স - এক্স-- মোডটি নিশ্চিত করে যে প্রতিটি ক্লায়েন্ট ফোল্ডারটি (এবং নীচের ফোল্ডারগুলিতে) প্রবেশ করতে পারে তবে এর সামগ্রীগুলি তালিকাবদ্ধ করতে বা কোনও নতুন এন্ট্রি তৈরি করতে পারে না।

সাবফোল্ডারগুলি ব্যাকআপ সার্ভার প্রক্রিয়া দ্বারা তৈরি করা হয় এবং ক্লায়েন্ট এবং ফোল্ডারের মধ্যে সংযোগ একটি স্ক্লাইট ডিবিতে (অন্যান্য জিনিসের মধ্যে) সংরক্ষণ করা হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.