Loading

创建仅允许sftp文件传输的用户

诉求

使用公网服务器进行数据交换,复用已有的ssh端口进行文件传输。
要求限制用户只能传文件无shell也无法访问指定路径之外的目录。

实现

文件传输复用ssh端口很容易想到scp和sftp两种方式
考虑到scp可能要通过commandauthorized_keys中额外匹配
改用支持更好的sftp方式sshd_config原生支持ForceCommand internal-sftp

用户权限

sudo useradd sftpuser -m -d /home/sftpuser -s /bin/false
sudo mkdir -p /var/sftp/files
sudo chown sftpuser:sftpuser /var/sftp/files
sudo chown root:root /var/sftp 
sudo chmod 755 /var/sftp 

访问控制

sudo vim /etc/ssh/sshd_config
# add content
Match User sftpuser
	ForceCommand internal-sftp
	PasswordAuthentication no
	ChrootDirectory /var/sftp
	PermitTunnel no
	AllowAgentForwarding no
	AllowTcpForwarding no
	X11Forwarding no
# save and restart ssh service
sudo systemctl restart ssh 

上传脚本

sftp默认使用shell方式进行交互,上传脚本如下:

#!/bin/bash

sftp -P <port> -i <private_key> sftpuser@<server_ip>:/files <<< $"put <upload_file_path>"

# Best practice is to assign the sftp return code to a variable for further use, because
# ${?} is fleeting and only shows the condition code of the immediately preceding command

SFTP_RETURN_CODE=${?}

# If the return code is non-zero then the upload was not successful

if [[ 0 != ${SFTP_RETURN_CODE} ]]
   then
   echo "upload failed"
   exit ${SFTP_RETURN_CODE}
else
   echo "upload successed"
fi

exit 0

后记

如遇报错packet_write_wait: Connection to 127.0.0.1 port 22: Broken pipe
检查ChrootDirectory目录权限和owner是否配置正确

sudo chown root:root /var/sftp 
sudo chmod 755 /var/sftp

ChrootDirectory必须root+755而子目录可按需授予具体权限

sudo -R sftpuser:sftpuser /var/sftp/files

结合这篇文章利用find实现自动清理过期文件 - azureology - 博客园
可以实现服务器文件到期自动清提高存储空间利用率

参考

linux - Limit SSH key to SCP only - Server Fault
How to Create SFTP Only User in Ubuntu 20.04 – TecAdmin
Upload files using SFTP or SCP commands - OCLC Support
unix - Single line sftp from terminal - Stack Overflow
sftp搭建後首次登陸packet_write_wait + Broken pipe + Connection closed問題原因 - 台部落

posted @ 2022-11-07 15:10  azureology  阅读(219)  评论(0)    收藏  举报