【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. 【前端】Vue2全家桶案例《看漫画》之六、图片阅读页

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_6.html 项目github地址:https://github.com/shamoyuu/ ...

  2. 读取含有BOM头的文件遇到的问题

    需求是读取一个csv文件,然后解析成对应的数据结构.csv必须包含指定的某些列,通过列名header来进行校验. 解析配置文件的方法. public List<QuestionData> ...

  3. 笔记+R︱信用风险建模中神经网络激活函数与感知器简述

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 本笔记源于CDA-DSC课程,由常国珍老师主讲 ...

  4. 在U-boot中添加以太网驱动

    当定义CONFIG_CMD_NET和CONFIG_CMD_PING,编译之后执行ping命令,告警没有找到以太网. 因此,需要打开U-boot的网络功能, u-boot-sunxi-sunxi中没有找 ...

  5. mysql 查询表死锁 和结束死锁的表步骤

    1.查询是否锁表 show OPEN TABLES ; 2.查询进程 show processlist 查询到相对应的进程===然后 kill    id 3.查看正在锁的事务 SELECT * FR ...

  6. sudo:无法解析主机 解决方案

    你如果电脑中没有vim,用gedit也可以. 打开文件以后,将其中的 127.0.1.1  xxxxx xxx 替换成你电脑的自己的名字即可.

  7. PHP 常量dirname(__file__)

    PHP 常量dirname(__FILE__)取得当前文件的绝对路径. define('ROOT_PATH', str_replace('includes/2.php', '', str_replac ...

  8. vxworks for x86读取bios时间的解决方法

    vxworks for x86读取bios时间的解决方法 系统时间与bsp有关,在vzworks for x86系列的目标没有直接读取RTC(实时时钟控制器)的函数,用time.h中的函数读到的始终是 ...

  9. DML触发器1

    数据库触发器是特殊的存储程序.通常不直接调用它们,而是由数据库的事件触发. 触发器分类: >DML触发器 >instead-of触发器 >系统事件触发器,还可以是DDL 一. DML ...

  10. 基于am3358的lcd输出

    /*#include<stdio.h> */ #include <unistd.h> #include <stdio.h> #include <stdlib. ...