二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • 最佳实践

  • 迎刃而解

  • Nginx

    • 关于nginx请求头中有下划线_的坑
    • 利用nginx+sftp实现一个可供用户下载的服务
      • 1、创建 sftp 组
      • 2、创建一个 sftp 用户,名为 erya。
      • 3、创建目录并分配权限。
      • 4、配置 sshd_config。
        • 1,注释如下行。
        • 2,添加如下几行。
      • 5、设定 Chroot 目录权限。
        • 1,目录的权限设定有两个要点
        • 2,所以遵循以上两个原则
      • 6、建立 erya 用户登入后可写入的目录。
      • 7、重启 sshd 服务。
      • 8,安装 nginx 服务。
        • 1,端口默认。
        • 2,指定端口。
      • 9,sftp 客户端如何使用。
    • nginx配置文件及模块
    • 通过脚本按天切割nginx的日志
    • nginx通过四层代理实现端口转发
    • NGINX基于cookie针对同一域名进行分流转发
    • nginx利用内置模块配置限速限流
    • 利用NGINX内置模块mirror进行流量复制等操作
    • 使用$remote_user字段记录访问NGINX的用户
    • 从NGINX自身配置文件中定义访问日志按时间切割
    • NGINX配置单独代理百度的sitemap文件
    • nginx配置微信小程序校验及其他
    • nginx配置gzip压缩
    • 由Nginx集中代理分散的PHP集群的实践
    • http状态码详解
    • OpenResty-1-13-6-2-新增ldap模块儿
    • 排查NGINX的open_file_cache导致发布后访问404的问题
    • 制作OpenResty-1-19-9-1的RPM包
    • 从Nginx过滤打印user-agent为clb-healthcheck的日志聊聊Nginx的日志自定义打印
  • Php

  • Zabbix

  • AWS

  • Prometheus

  • Grafana

  • Loki

  • CentOS

  • Supervisord

  • Systemd

  • Docker

  • Docker-Compose

  • Rancher

  • Ansible

  • OpenLdap

  • GitLab

  • GitHub

  • Etcd

  • Consul

  • RabbitMQ

  • Kafka

  • Mysql

  • MongoDB

  • OpenVPN

  • Kvm

  • VMware

  • 配置文件详解

  • Other

  • 运维观止
  • Nginx
二丫讲梵
2018-06-18
目录

利用nginx+sftp实现一个可供用户下载的服务

文章发布较早,内容可能过时,阅读注意甄别。

公司服务端开发小伙伴来提需求啦,好像还很紧急的样子。宁静的日子也就这样被打破。据他描述,需求大概是:做一个可以咱们自己自由上传,而用户那边通过一个链接就可以下载 app 的服务。

经过讨论:想实现这个,一共有两部分,首先是本地将文件上传,其次是普通用户下载。

上传就用 sftp 了。

从技术角度来分析,几个要求:

  • 1、从安全方面看,sftp 会更安全一点。
  • 2、线上服务器提供在线服务,对用户需要控制,只能让用户在自己的 home 目录下活动。
  • 3、用户只能使用 sftp,不能 ssh 到机器进行操作。

提供 sftp 服务,可以用系统自带的 internal-sftp,也可以使用 vsftpd,这里需求不多,直接选用internal-sftp。

限制用户只能在自己的 home 目录下活动,这里需要使用到chroot,openssh 4.8p1 以后都支持 chroot,我现在用的是 CentOS 6.3,自带的 openssh 已经是 5.3p1,足够了。

ssh -V

#查看openssh的版本,如果低于4.8p1,需要自行升级安装,不在这里具体介绍了。
1
2
3

假设,有一个名为test的组,这个组中的用户只能使用sftp,不能使用ssh,且 sftp 登录后只能在自己的 home 目录下活动。

image

# 1、创建 sftp 组

groupadd test
1

# 2、创建一个 sftp 用户,名为 erya。

(原来的教程是创建了一个系统用户,不能登陆,现在可以创建一个普通用户,然后通过秘钥进行登陆)

useradd -g test erya
passwd erya
1
2

申明

原创文章eryajf,未经授权,严禁转载,侵权必究!此乃文中随机水印,敬请读者谅解。

Copyright 二丫讲梵 (opens new window) 版权所有

# 3、创建目录并分配权限。

test 组的用户的 home 目录统一指定到 / data/sftp 下,按用户名区分,这里先新建一个 erya 目录,然后指定 erya 的 home 为 / data/sftp/erya

mkdir -p /data/sftp/erya
usermod -d /data/sftp/erya erya
1
2

# 4、配置 sshd_config。

编辑 ssh 配置文件 / etc/ssh/sshd_config。

# 1,注释如下行。

 vim  /etc/ssh/sshd_config

Subsystem      sftp    /usr/libexec/openssh/sftp-server
#注释此行
1
2
3
4

# 2,添加如下几行。

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
#这两行,如果不希望该用户能使用端口转发的话就加上,否则删掉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

注意:里边的注释是为了帮助理解,实际使用中可以去掉。

# 5、设定 Chroot 目录权限。

chown root:test /data/sftp/erya
chmod 755 /data/sftp/erya
1
2

错误的目录权限设定会导致在 log 中出现”fatal: bad ownership or modes for chroot directory XXXXXX” 的内容.

# 1,目录的权限设定有两个要点

  • 1、由 ChrootDirectory 指定的目录开始一直往上到系统根目录为止的目录拥有者都只能是 root
  • 2、由 ChrootDirectory 指定的目录开始一直往上到系统根目录为止都不可以具有群组写入权限

# 2,所以遵循以上两个原则

  • 1)我们将 / data/sftp/erya 的所有者设置为了 root,所有组设置为 test
  • 2)我们将 / data/sftp/erya 的权限设置为 755,所有者 root 有写入权限,而所有组 test 无写入权限

# 6、建立 erya 用户登入后可写入的目录。

照上面设置后,在重启 sshd 服务后,用户 erya 已经可以登录,但使用 chroot 指定根目录后,根应该是无法写入的,所以要新建一个目录供 erya 上传文件。这个目录所有者为 erya,所有组为 test,所有者有写入权限,而所有组无写入权限。

mkdir /data/sftp/erya/upload
chown erya:test /data/sftp/erya/upload
chmod 755 /data/sftp/erya/upload
1
2
3

# 7、重启 sshd 服务。

service sshd restart
1

到这里,我们就可以通过 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 等客户端登陆,进行上传下载。

然后是对下载端进行配置。

# 8,安装 nginx 服务。

进入到配置文件中,配置如下内容:

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;
	          }
	     }
1
2
3
4
5
6
7
8
9
10
11

nginx -t 检测一下配置文件。 nginx -s reload重新加载。

然后对刚才配置的域名进行解析配置。完成之后就可以到浏览器直接访问并进行下载了。

现在为了控制 sftp 授权的用户(erya)对服务器的权限,让他在连接工具中直接免密码登陆。

先在 root 用户下生成一对密钥对。

[root@localhost ~]# ssh-keygen -t rsa
1

然后把公钥传给家目录下改名为authorized_keys,然后在登陆的时候,使用私钥文件,就实现了免密码登陆。

cp /root/.ssh/id_rsa.pub /home/erya/.ssh/authorized_keys
1

如果想通过传输的方式将公钥传输过去,那么有两种情况。

# 1,端口默认。

这种情况下,就直接使用 ssh-copy-id 的方式进行传输就好了。

# 2,指定端口。

ssh-copy-id –I .ssh/id_rsa.pub “-p 12345 abc@192.168.66.10”
1

# 9,sftp 客户端如何使用。

1, 将 / root/.ssh/id_rsa 文件发到本地,然后在 Xftp 的工具栏里导入。

2018061805064048

2, 进行 erya 用户登陆的配置,IP,协议,端口,秘钥,用户名。

image

3, 配置完成,直接点击连接,这样用户就锁定在 upload 目录下了。

这样如果给别人来进行上传,直接让他在客户端,把秘钥文件发给他,就 ok 了。安全又卫生。

image

现在,上传的文件,与 nginx 所访问到的目录文件保持了一致,只要在域名后边添加相应的文件名字,就可以直接进行下载了,把这样的效果交给服务端开发同学,只需要他这边把链接放到对应的地方就可以啦。

微信 支付宝
#nginx#ftp
上次更新: 2024/07/04, 22:40:37
关于nginx请求头中有下划线_的坑
nginx配置文件及模块

← 关于nginx请求头中有下划线_的坑 nginx配置文件及模块→

最近更新
01
记录二五年五一之短暂回归家庭
05-09
02
学习周刊-总第210期-2025年第19周
05-09
03
学习周刊-总第209期-2025年第18周
05-03
更多文章>
Theme by Vdoing | Copyright © 2017-2025 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式