基于SSH搭建SFTP服务器

基于SSH搭建SFTP服务器

基于 ssh 的 sftp 服务相比 ftp 有更好的安全性(非明文帐号密码传输)和方便的权限管理(限制用户的活动目录) 开通 sftp 帐号,使用户只能 sftp 操作文件, 而不能 ssh 到服务器 限定用户的活动目录,使用户只能在指定的目录下活动,使用 sftp 的 ChrootDirectory 配置

确保 ssh 的版本高于 4.8p1

# ssh -V

新建sftp用户组及用户

# groupadd sftp
# useradd -d /home/sftp -m -g sftp -s /bin/false sftp
# passwd sftp

%u 用户名 活动目录,用chroot将用户的根目录指定到/data/sftp/%u 目录的权限设定有两个要点: 1、由ChrootDirectory指定的目录开始一直往上到系统根目录为止的目录拥有者都只能是root 2、由ChrootDirectory指定的目录开始一直往上到系统根目录为止都不可以具有群组写入权限

# mkdir -p /data/sftp/%u
#配置权限 注意此目录如果用于后续的 chroot 的活动目录 目录所有者必须是 root 必须是!!!
# chown root.sftp /data/sftp/%u
# chmod 755 /data/sftp/%u

配置sftp

# vim /etc/ssh/sshd_config

#####这里我们使用系统自带的 internal-sftp 服务即可满足需求,也可以用 /usr/libexec/openssh/sftp-server
#Subsystem      sftp    /usr/libexec/openssh/sftp-server
Subsystem      sftp    internal-sftp

#####sftp用户权限限定
#####Match [User|Group] userName|groupName
### ChrootDirectory /data/sftp/%u
Match Group sftp
    ChrootDirectory %h # 还可以用 %h代表用户家目录 %u代表用户名
    ForceCommand    internal-sftp # 强制使用系统自带的 internal-sftp 服务 这样用户只能使用ftp模式登录
    AllowTcpForwarding no
    X11Forwarding no
    PasswordAuthentication no

ChrootDirectory 用户的可活动目录 可以用 %h 标识用户家目录 %u 代表用户名 当 Match 匹配的用户登录后 会话的根目录会切换至此目录 这里要尤其注意两个问题 chroot 路径上的所有目录,所有者必须是 root,权限最大为 0755,这一点必须要注意而且符合 所以如果以非 root 用户登录时,我们需要在 chroot 下新建一个登录用户有权限操作的目录

ForceCommand 强制用户登录会话时使用的初始命令 如果如上配置了此项 则 Match 到的用户只能使用 sftp 协议登录,而无法使用 ssh 登录

# service sshd restart

建立SFTP可以写的目录

# mkdir /home/sftp/upload
# chown sftp.sftp /home/sftp/upload
# chmod 755 /home/sftp/upload

sftp 日志

# vim /etc/ssh/sshd_config

Subsystem sftp /usr/libexec/openssh/sftp-server -l INFO -f local5
LogLevel INFO

# vim /etc/rsyslog.conf

auth,authpriv.*,local5.* /var/log/sftp.log

# service rsyslog restart
# service sshd restart

参考: https://wiki.archlinux.org/index.php/SFTP_chroot

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Python中搭建SFTP服务器,你可以使用`paramiko`库。下面是一个简单的示例: ```python import paramiko # 创建一个SFTP服务器类 class MySFTPServer(paramiko.SFTPServerInterface): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 实现文件读取方法 def check_file(self, path): return paramiko.SFTPServerFlags.READ # 实现文件写入方法 def check_file_write(self, path): return paramiko.SFTPServerFlags.WRITE # 创建一个SSH服务器类 class MySSHDServer(paramiko.ServerInterface): def __init__(self): super().__init__() # 实现认证方法 def check_auth_password(self, username, password): # 在这里可以添加自定义的认证逻辑 return paramiko.AUTH_SUCCESSFUL # 实现SFTP子系统方法 def check_channel_subsystem_request(self, channel, name): if name == 'sftp': server = MySFTPServer() channel.sftp_server = server return paramiko.OPEN_SUCCEEDED return paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED # 创建SSH服务器对象 ssh_server = paramiko.Transport(('0.0.0.0', 22)) ssh_server.add_server_key(paramiko.RSAKey.generate(2048)) ssh_server.set_subsystem_handler('sftp', paramiko.SFTPServer, MySFTPServer) # 启动SSH服务器 ssh_server.start_server(server=MySSHDServer()) # 接受客户端连接 while True: client, _ = ssh_server.accept(20) if client is None: break client.close() ``` 在上面的示例中,我们创建了一个自定义的SFTP服务器类`MySFTPServer`,并实现了文件读取和文件写入的方法。然后,我们创建了一个SSH服务器类`MySSHDServer`,并实现了认证和SFTP子系统的方法。最后,我们创建了一个SSH服务器对象,添加了服务器密钥和SFTP子系统处理程序,并启动了SSH服务器。 请注意,在实际使用时,你可能需要根据自己的需求进行一些修改和调整。此示例仅提供了一个基本的框架,你可以根据自己的需求进行扩展和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值