【SSH和SFTP】

■  设置一个只允许访问部分目录的SFTP服务器

  由于SSH和SFTP之间的紧密联系,一个SFTP服务器必然会导致开放一定的SSH服务,而SSH的风险显然比SFTP要大一些。自然,我们就会需要:1.禁止SSH登录但保持SFTP服务可用;2.SFTP也不能让外部用户可以自由读写所有服务器上信息。这两个需求可以通过用户配置及sshd配置来配合完成。

  在/etc/ssh/sshd_config中加上这些配置:

#Subsystem      sftp    /usr/libexec/openssh/sftp-server
#这行是默认开启的,用#把它注释掉 #添加下面这些内容,其中ftpuser是我们要进行限制的用户
Subsystem sftp internal-sftp
Match User ftpuser
ChrootDirectory /hsdata/datadir/ftpuser
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp

  如果顺利,那么ftpuser通过sftp协议连入之后,默认就是在/hsdata/datadir/ftpuser这个目录下,且cd ..;或者读写其他目录下的尝试都会失败。比如cd /tmp时会提示不存在/tmp目录。因为此时对于这个SFTP的客户端来说,/hsdata/datadir/ftpuser就是根目录/。

  要想顺利实现,有两个前提条件:

  1. ChrootDirectory配置项的值即/hsdata/datadir/ftpuser这个目录及其所有长辈目录(/hsdata/datadir和/hsdata)必须都是root:root的。

  2. ChrootDirecotry配置项的值的目录及其所有长辈目录,最大权限只能开放到755,即写权限只能让目录所有者(即root)拥有。

 上述sshd_config的变更成功实现了对sftp用户进行访问限制的功能,但是此时用户还可以通过ssh连入,这就没有意义了。禁止其ssh连入但是允许sftp连入的实现方式很简单,是改变用户的默认shell(which是/bin/bash)为/bin/false:

#在root权限下
usermod -s /bin/false ftpuser

■  几个概念初探  

  使用java的jsch包,进行SSH/SFTP连接时,经常会出现各种各样的错误。比如报错Algorithm Negotiation错误,比如End of IO Stream等等。首先jsch包版本本身会对连接能否成功建立有影响。比如一个实践是当S端的openssh组件升级之后,C端无论如何连不上,但是将jsch包从45版本升级到53或者54版本就可以了。。这个比较迷,也还没来得及深究原因。

  其次要明确,SSH连接中有C端(客户端)和S端(服务端)。如果要进行一个连接,那么C端和S端应该都装有openssh(都是Linux的场合),如果两者版本一致是最好了。但是往往C端和S端的openssh版本不同。版本不同会导致很多乱七八糟的事情。

  在建立连接的过程中,C和S端要进行加密算法(Cipher)、密钥交换算法(Kex Algorithm)和消息确认算法(MAC)。Kex的全称是Key Exchange,MAC的全称是Message Authentication Code。如果两端无法协商成立使用统一的算法,那么连接就无法建立。通常一个特定发行版本的openssh会自带一些默认支持的算法,对于剩余不默认支持的,可以在配置文件中加入额外配置增加支持。

  当openssh升级过后客户端发现无法连接了,那么很有可能是openssh新版本将一些默认支持的老算法(尤其是kex算法部分)列入了默认不支持范围。可以考虑在/etc/ssh/sshd_config中增加相关配置即可。具体增加的配置可以百度一下,有很多,也就是配置了名为Ciphers,Kex Algorithms和MACs的三项。

  另一方面,在手动通过字符界面的ssh客户端发起连接时,如果想要知道客户端和服务端究竟协商成了什么样的算法,那么可以ssh -vvv 目标IP,加上参数-vvv之后,ssh连接过程中的所有debug日志都会被打印出来。在打印出来的日志中可以详细查询debug1(C端日志)和debug2(S端日志)开头的部分。其中就有debug1后面的kex algorithm和debg2后面的algorithm,分别指出了C、S端使用的Kex算法。

  在C或S任意一端上,如果想要查看默认支持的算法,还可以尝试通过man sshd_config或者ssh -Q kex(仅限于查看kex算法,也可换成cipher或者mac)两条命令。不过对于一些版本比价老的openssh,可能这些命令不支持需要注意。

【SSH/SFTP】SSH协议和SFTP的更多相关文章

  1. 教你如何配置linux用户实现禁止ssh登陆机器但可用sftp登录!

    构想和目标最近有个这样的诉求:基于对线上服务器的保密和安全,不希望开发人员直接登录线上服务器,因为登录服务器的权限太多难以管控,如直接修改代码.系统配置,并且也直接连上mysql.因此希望能限制开发人 ...

  2. 常见https,SSH协议和MD5加密方式分析

    前言 https,SSH协议和MD5加密是前端可能会接触到的加密,所以我就将他们进行了一个归纳. 1.https 1.1原理 A.就是在http加入SSL层,是http安全的基础;B.htts协议是在 ...

  3. Installing SFTP/SSH Server on Windows using OpenSSH

    Installing SFTP/SSH Server 1. On Windows 10 version 1803 and newer In Settings app, go to Apps > ...

  4. 第1章 ssh和SSH服务(包含隧道内容)

    本文对SSH连接验证机制进行了非常详细的分析,还详细介绍了ssh客户端工具的各种功能,相信能让各位对ssh有个全方位较透彻的了解,而不是仅仅只会用它来连接远程主机. 另外,本人翻译了ssh客户端命令的 ...

  5. man ssh翻译(ssh命令中文手册)

    本文为命令ssh的man文档翻译,翻译了90%的内容,剩余是一些没必要翻译的东西,请见谅. 如此文有所疑惑,希望我的另一篇文章能解惑: SSH(1)                    BSD Ge ...

  6. HTTP协议和SOCKS5协议

    HTTP协议和SOCKS5协议 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们平时上网的时候基本上是离不开浏览器的,尤其是搜索资料的时候,那么这个浏览器是如何工作的呢?用的又是 ...

  7. [转]ssh和SSH服务(包含隧道内容)

    本文对SSH连接验证机制进行了非常详细的分析,还详细介绍了ssh客户端工具的各种功能,相信能让各位对ssh有个全方位较透彻的了解,而不是仅仅只会用它来连接远程主机. 另外,本人翻译了ssh客户端命令的 ...

  8. linux下的ssh与ssh客户端

    经常会看到ssh客户端,或者听到ssh到某台机器..问题:ssh和ssh客户端什么关系? 1.ssh,secure shell,是一种网络交互协议,也指实现该协议的网络服务程序.主要用于远程机器管理, ...

  9. 页面解耦—— 统跳协议和Rewrite引擎

    原文: http://pingguohe.net/2015/11/24/Navigator-and-Rewrite.html 解耦神器 —— 统跳协议和Rewrite引擎 Nov 24, 2015 • ...

随机推荐

  1. 深度学习word2vec笔记之基础篇

    作者为falao_beiliu. 作者:杨超链接:http://www.zhihu.com/question/21661274/answer/19331979来源:知乎著作权归作者所有.商业转载请联系 ...

  2. Caused by:org.hibernate.DuplicateMappingException:Duplicate class/entity/ mapping

    1.错误描述 java.lang.ExceptionInInitializerError Caused by:org.hibernate.InvalidMappingException:Could n ...

  3. JSP路径出现问题

    1.错误描述 2.错误原因 <%@ page language="java" import="java.util.*" pageEncoding=&quo ...

  4. c语言 第二次实验报告

    一·实验题目,设计思路,实现方法 11-7 找鞍点 一个矩阵元素的"鞍点"是指该位置上的元素值在该行上最大.在该列上最小. 本题要求编写程序,求一个给定的n阶方阵的鞍点. 利用双重 ...

  5. Python中进程

    程序 程序:编写完的代码称为程序. 进程 进程:又称重量级进程,正在执行中的程序称为进程.进程的执行会占用内存等资源.多个进程同时执行时,每个进程的执行都需要由操作系统按一定的算法(RR调度.优先数调 ...

  6. docker学习系列(三):docker镜像的分层结构

    docker的镜像分层 docker里的镜像绝大部分都是在别的镜像的基础上去进行创建的,也就是使用镜像的分层结构. 实验 比如说使用dockerfile去创建一个最简单的hello镜像.创建好对应的d ...

  7. ListView 无 DataSource 依然用 DataPager 翻页

    ListView 有 DataSource 使用 DataPager 翻页ListView 无 DataSource 使用 DataPager 翻页问题描述点击两次才能翻页返回上一页,内容为空解决方法 ...

  8. java线程安全问题以及使用synchronized解决线程安全问题的几种方式

    一.线程安全问题 1.产生原因 我们使用java多线程的时候,最让我们头疼的莫过于多线程引起的线程安全问题,那么线程安全问题到底是如何产生的呢?究其本质,是因为多条线程操作同一数据的过程中,破坏了数据 ...

  9. [BZOJ3224] [Tyvj 1728] 普通平衡树 (treap)

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...

  10. linux升级python3.6相关命令

    sudo apt-get install python3.6 sudo update-alternatives --install /usr/bin/python python /usr/bin/py ...