【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. 程序bug致损失400亿,判程序员坐牢? 搞笑我们是认真的

    号外!号外!走过,路过,不要错过!日本 IT 业的狗血八卦继续独家放送啦!! 2015 年 9 月 3 日,随着东京最高法院驳回瑞穗证券的上诉,维持二审的原判结果,一个长达 10 年的诉讼终于画下了句 ...

  2. stm32开发之使用Keil MDK以及标准外设库创建STM32工程

    ‑6 MDK详细版本信息 ‑8保存路径的选择 ‑9选择芯片型号 ‑10拷贝启动代码选择 ‑11选择 Manage Comoonents ‑12编辑组并添加对应文件 ‑13工程管理文件列表 ‑14选择进 ...

  3. Excel 2010高级应用-圆环图(七)

    Excel 2010高级应用-圆环图(七) 基本操作如下: 1.新建空白Excel文档,并命名为圆环图 2.单击"插入",并找到圆环图图样 3.单击圆环图图样,并在空白文档上生成图 ...

  4. 【mongodb系统学习之五】mongodb启动最常用参数

    五.mongodb启动时其他常用参数的使用(都是选用): 1).--logappend,指定日志的写入方式为追加,强烈建议使用: 2).--port,指定mongodb的端口号,当不使用这个参数的时候 ...

  5. WDF驱动的编译、调试、安装

    编译和调试使用WDK编译,源代码应包括wdf.h,ntddk.h以及KMDF_VERSION=1,编译使用/GS.KMDF包括以下库:1). WdfDriverEntry.lib(编译时绑定):驱动入 ...

  6. pat1011-1020

    一开始几道题写到吐血,真的自己现在好弱 1011 水题不说了 #include<bits/stdc++.h> using namespace std; const int N = 105; ...

  7. java中outputStream与inputStream的相互转换

    package com.boco.test; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; im ...

  8. Postgresql与Oralce常用用法区别总结

    日期操作 1. 操作当前日期和时间 oracle Select SYSDATE FROM dual; PostgreSQL Select CURRENT_DATE; Select NOW();返回日期 ...

  9. Android中的Socket

    1. UDP (1)访问网络必须添加权限,访问网络必须添加权限,访问网络必须添加权限,重要的事情说三遍. (2)简述 UDP协议是面向报文的,简单地说,利用UDP访问网络的步骤就是"寄快递& ...

  10. [SCOI2007]蜥蜴

    网络流 一个点拆成两个,注意要把某一类边连反过来 这样才能保证有限制 # include <bits/stdc++.h> # define IL inline # define RG re ...