Xyk*_*n42 9 linux freebsd ssh sftp ssh-keys
我想构建一个服务器(运行 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...
Run Code Online (Sandbox Code Playgroud)
这样做的好处是我不需要为每个客户端使用单独的用户,而且我可以轻松地使用脚本自动生成 authorized_keys 文件。
只有一个问题:chroot=...不起作用。OpenSSH 的authorized_keys 文件似乎没有ChrootDirectory 的等效文件(它在/etc/ssh/sshd_config 中工作,无论是全局还是在Match User 块中)。
是否有一种相当简单的方法可以使用 OpenSSH 完成我想要的操作?也许command=...以巧妙的方式使用指令?或者,是否还有其他 SFTP 服务器可以执行我想要的操作?
编辑:为了更清楚我想要实现的目标:我希望多个客户端能够在我的服务器上存储文件。每个客户端都不能看到任何其他客户端的文件。而且我不想让我的服务器有几十个用户帐户,所以我想要一个易于管理的解决方案,让客户共享一个用户帐户,但仍然无法访问彼此的文件。
在
chroot=...不工作。
不,手册页中没有类似的内容,用于sshd描述authorized_keys文件格式。
如果你把chroot放入command=,你将无法使用internal-sftp,因为它是内部函数调用的替代sshd。
推荐的方式是设置更多的用户,如果你需要分离。internal-sftp如果您不需要严格分离(例如,只是不同的工作目录),您也可以使用 参数,例如
command="internal-sftp -d /backup/client-1/data" ssh-rsa (key1)
Run Code Online (Sandbox Code Playgroud)
也可以使用-P手册页中的选项来限制请求数量sftp-server。
或者,是否还有其他 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/
Run Code Online (Sandbox Code Playgroud)
为了在 SFTPAuthorizedUserKeys 中使用 OpenSSH 公钥,您必须将它们转换为 RFC4716 格式。您可以使用 ssh-keygen 工具执行此操作:
# ssh-keygen -e -f user1.public.key > /vhosts/backup/user1/.sftp/authorized_keys
Run Code Online (Sandbox Code Playgroud)
设置 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
Run Code Online (Sandbox Code Playgroud)
创建 DH (Diffie-Hellman) 组参数。
# openssl dhparam -out /etc/pki/proftpd/dhparam_2048.pem 2048
Run Code Online (Sandbox Code Playgroud)
配置任何 SFTP 客户端。我用过 FileZilla
如果在调试模式下运行 ProFPTD
# proftpd -n -d 3
Run Code Online (Sandbox Code Playgroud)
在控制台中,您将看到类似以下内容
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
Run Code Online (Sandbox Code Playgroud)
以及 /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
Run Code Online (Sandbox Code Playgroud)
聚苯乙烯
包含授权密钥 ( SFTPAuthorizedUserKeys )的文件的配置路径可以使用%u变量,该变量将插入被验证用户的名称。此功能支持将每个用户的授权密钥文件放在一个中央位置,而不是要求(或允许)用户管理他们自己的授权密钥。例如:
SFTPAuthorizedUserKeys file:/etc/sftp/authorized_keys/%u
Run Code Online (Sandbox Code Playgroud)
我希望多个客户端能够在我的服务器上存储文件。每个客户端都不能看到任何其他客户端的文件。而且我不想让我的服务器有几十个用户帐户,所以我想要一个易于管理的解决方案,让客户共享一个用户帐户,但仍然无法访问彼此的文件。
使用 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>
Run Code Online (Sandbox Code Playgroud)
并创建一个虚拟帐户
# ftpasswd --passwd --file /etc/proftpd/sftp_users.passwd --sha512 --gid 99 --uid 99 --shell /sbin/nologin --name user1 --home /vhosts/backup
Run Code Online (Sandbox Code Playgroud)
就这样。对于每个额外的帐户,您只需将他的公钥添加到 /etc/proftpd/sftp_authorized_keys
注意:文件最后必须包含新行!这一点很重要。