博客 > 术业专攻> 利用nginx+sftp实现一个可供用户下载的服务 2019年08月29日 11:26:25
公司服务端开发小伙伴来提需求啦,好像还很紧急的样子。宁静的日子也就这样被打破。据他描述,需求大概是:做一个可以咱们自己自由上传,而用户那边通过一个链接就可以下载app的服务。
经过讨论:想实现这个,一共有两部分,首先是本地将文件上传,其次是普通用户下载。
上传就用sftp了。
从技术角度来分析,几个要求:
提供sftp服务,可以用系统自带的internal-sftp,也可以使用vsftpd,这里需求不多,直接选用internal-sftp
。
限制用户
只能在自己的home目录下活动,这里需要使用到chroot
,openssh 4.8p1以后都支持chroot,我现在用的是CentOS 6.3,自带的openssh已经是5.3p1,足够了。
ssh -V #查看openssh的版本,如果低于4.8p1,需要自行升级安装,不在这里具体介绍了。
假设,有一个名为test
的组,这个组中的用户只能使用sftp
,不能使用ssh
,且sftp登录后只能在自己的home目录下活动。
groupadd test
erya
。(原来的教程是创建了一个系统用户,不能登陆,现在可以创建一个普通用户,然后通过秘钥进行登陆)
useradd -g test erya passwd erya
test 组的用户的home目录统一指定到/data/sftp下,按用户名区分,这里先新建一个erya目录,然后指定erya的home为/data/sftp/erya
mkdir -p /data/sftp/erya usermod -d /data/sftp/erya erya
编辑ssh配置文件/etc/ssh/sshd_config。
vim /etc/ssh/sshd_config Subsystem sftp /usr/libexec/openssh/sftp-server #注释此行
Subsystem sftp internal-sftp #这行指定使用sftp服务使用系统自带的internal-sftp Match Group sftp #这行用来匹配sftp组的用户,如果要匹配多个组,多个组之间用逗号分割 当然,也可以匹配用户 Match User mysftp #这样就可以匹配用户了,多个用户名之间也是用逗号分割,但我们这里按组匹配更灵活和方便 ChrootDirectory /data/sftp/%u #用chroot将用户的根目录指定到/data/sftp/%u,%u代表用户名,这样用户就只能在/data/sftp/%u下活动,chroot的含义,可以参考这里:http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/ ForceCommand internal-sftp #指定sftp命令 AllowTcpForwarding no X11Forwarding no #这两行,如果不希望该用户能使用端口转发的话就加上,否则删掉
注意:里边的注释是为了帮助理解,实际使用中可以去掉。
chown root:test /data/sftp/erya chmod 755 /data/sftp/erya
错误的目录权限设定会导致在log中出现”fatal: bad ownership or modes for chroot directory XXXXXX
”的内容.
照上面设置后,在重启sshd服务后,用户erya已经可以登录,但使用chroot指定根目录后,根应该是无法写入的,所以要新建一个目录供erya上传文件。这个目录所有者为erya,所有组为test,所有者有写入权限,而所有组无写入权限。
mkdir /data/sftp/erya/upload chown erya:test /data/sftp/erya/upload chmod 755 /data/sftp/erya/upload
service sshd restart
到这里,我们就可以通过sftp客户端登录并可以上传文件到upload
目录。
如果还是不能在此目录下上传文件,提示没有权限,检查SElinux是否关闭,可以使用# setenforce 0
指令关闭临时SElinux。
或者修改/etc/selinux/config
文件中的SELINUX="" 为 disabled
,然后重启,进行永久关闭。
此时可以通过Linux命令行登陆刚才配置的sftp服务了。
常规登陆:sftp erya@192.168.96.219
指定端口:sftp erya@192.168.96.219 -oPort=2222
也可以用过file-zilla,sftp等客户端登陆,进行上传下载。
然后是对下载端进行配置。
进入到配置文件中,配置如下内容:
server { listen 80; server_name sftp.erya.net; charset utf-8; location / { root /data/sftp/erya/upload; autoindex on; autoindex_exact_size off; autoindex_localtime on; } }
nginx -t
检测一下配置文件。
nginx -s reload
重新加载。
然后对刚才配置的域名进行解析配置。完成之后就可以到浏览器直接访问并进行下载了。
现在为了控制sftp授权的用户(erya
)对服务器的权限,让他在连接工具中直接免密码登陆
。
先在root用户下生成一对密钥对。
[root@localhost ~]# ssh-keygen -t rsa
然后把公钥传给家目录下改名为authorized_keys
,然后在登陆的时候,使用私钥文件,就实现了免密码登陆。
cp /root/.ssh/id_rsa.pub /home/erya/.ssh/authorized_keys
如果想通过传输的方式将公钥传输过去,那么有两种情况。
这种情况下,就直接使用ssh-copy-id的方式进行传输就好了。
ssh-copy-id –I .ssh/id_rsa.pub “-p 12345 abc@192.168.66.10”
这样如果给别人来进行上传,直接让他在客户端,把秘钥文件发给他,就ok了。安全又卫生。
现在,上传的文件,与nginx所访问到的目录文件保持了一致,只要在域名后边添加相应的文件名字,就可以直接进行下载了,把这样的效果交给服务端开发同学,只需要他这边把链接放到对应的地方就可以啦。
© 2018 www.qingketang.net 鄂ICP备18027844号-1
武汉快勤科技有限公司 13554402156 武汉市东湖新技术开发区关山二路特一号国际企业中心6幢4层7号
扫码关注,全站教程免费播放
订单金额:
支付金额:
支付方式: