接続ユーザーの公開鍵に応じてchrootを使用したSFTP


9

sshfsを介してさまざまなクライアントからバックアップを受け取るサーバー(DebianまたはFreeBSDを実行)を構築したいと思います。各クライアントは、独自のバックアップデータを読み書きできますが、他のクライアントのデータはできません。

私は次のアイデアを持っていました:各クライアントは公開鍵認証を介して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ファイルを自動生成できることです。

ただ1つの問題がありchroot=...ます。それが機能しません。OpenSSHのauthorized_keysファイルには、ChrootDirectoryに相当するものがないようです(これは/ etc / ssh / sshd_configでグローバルに、またはMatch Userブロックで機能します)。

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/

SFTPAuthorizedUserKeysでOpenSSH公開鍵を使用するには、それらを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

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

そして、1つの仮想アカウントを作成します

# 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に追加することだけです。

注:ファイルの最後には改行が含まれている必要があります!それは重要です。


詳しい回答ありがとうございます。ただし、これが、お互いのファイルを表示できないはずの多くのクライアントに対して1つのユーザーアカウントのみを使用するという私の主な目標を達成するのにどのように役立つかわかりません。(そして、スクリプトで簡単に管理できるようにします。)元の質問をもう一度読んで、私が達成したかったことが完全に明白ではなかったかもしれないことを認めます。そのために残念。
Xykon42 2016

私は答えを更新しました
ALex_hha 2016

1
さて、小さな変更で、これは実際にうまくいきます、ありがとう!ユーザーがユーザー名を推測して他のユーザーのファイルにアクセスできないようにする(またはCreateHome関数を誤用してサーバーをあふれさせる)には、authorized_keysファイルを/foo/authorized_keys.d/%uのようにユーザー固有にする必要があります。
Xykon42 2016年

6

これはchroot=...機能しません。

いいえ、ファイルsshdの形式を説明しているのマニュアルページには、そのようなものはありませんauthorized_keys

chrootをcommand=に入れるとinternal-sftp、内部の内部関数呼び出しの代わりになるため、使用できなくなりますsshd

分離が必要な場合は、より多くのユーザーを設定することをお勧めします。次のようにinternal-sftp、厳密に分離する必要がない場合(例:異なる作業ディレクトリのみ)に、引数を使用することもできます。

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

-Pマニュアルページのようにオプションを使用してリクエストの量を制限することもできますsftp-server


0

その間、私は少なくとも私のユースケースでもうまく機能する別の簡単な解決策を思いつきました。

すべてのクライアントは、同じユーザーアカウントを使用してサーバーに接続し、場合によっては同じキーを使用します(重要ではありません)。OpenSSHは、次の構造を持つディレクトリにchrootします。

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

サーバーは、backupコマンドと一緒に、ファイルを入れるフォルダー名をクライアントに通知します。フォルダー名は64バイトのランダムな文字列であり、事実上推測することはできません。そのため、他のユーザーが「暗闇のどこかにいる」としても、すべてのクライアントは実際には独自のフォルダーにしかアクセスできません。

dark-folderのd--x--x--モードでは、すべてのクライアントがフォルダー(およびその下のフォルダー)に入ることができますが、その内容を一覧表示したり、新しいエントリを作成したりすることはできません。

サブフォルダーはバックアップサーバープロセスによって作成され、クライアントとフォルダー間の接続は(特に)SQLiteデータベースに保存されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.