注意:转载请注明出处:http://www.programfish.com/blog/?p=124

SSH 基本概念

SSH 英文全称是secure shell,字面意思:安全的shell。

SSH协议由IETF(Internet Engineering Task Force)的Network Working Group所制定,建立在应用层和传输层基础上相对可靠,专为远程登录会话和其他网络服务提供安全性的协议。

说其是Secure的很重要一个原因是ssh会对远程登陆时的认证信息和远程执行的命令进行加密传输。而传统的网络服务程序如ftp、telnet、pop、rlogin、rexec等都是在网络上用明文传送口令和数据,这样就容易受到网络上别有用心的人攻击(例如“中间人”)。而对SSH对口令及数据加密传输则可以有效防止这种攻击。

功能上它既可以代替telnet,又可以为ftp、pop、甚至ppp提供一个安全的“通道”。

ssh协议目前有SSH1和SSH2,SSH2协议兼容SSH1。

目前实现SSH1和SSH2协议的主要软件有OpenSSH和SSH Communications 软件。

OpenSSH是一款免费开源的SSH软件,而SSH Communications见分则是一款商业软件并且收费的。一般在类unix系统上使用的是OpenSSH。

SSH 层次结构

  • 传输层协议 [SSH-TRANS]

提供服务器认证,数据机密性,信息完整性 等的支持;

  • 用户认证协议 [SSH-AUTH]

为服务器提供客户端的身份鉴别;

  • 连接协议 [SSH-CONN]

将加密的信息隧道复用成若干个逻辑通道,

对于这部分的详细内容请阅读:SSH协议详解  http://airekans.github.io/protocol/2012/06/28/ssh-explained/

相关的工具命令:

Sftp  使用了加密传输方式的远程传输工具,使用命令与ftp基本一样,这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低,适合网络安全性要求更高的情况使用。

Scp   非交互式sftp-server的客户端,用来向服务器上传/下载文件

Sshfs    远程目录挂载工具,非常方便实用,使用方法参见http://www.programfish.com/blog/?p=145

SSH 认证方式

SSH客户端的身份认证中提供三种方式:

  • password(基于口令的安全验证)
  • public key(基于密匙的安全验证)
  • Hostbased验证

{SSH2.0还提供了 password-publickey 认证(方式一和二都进行)和 any 认证(进行方式一或二中的一种)}

其中最常用的是password验证及public key验证。

Password验证就是在你请求连接到远程主机的时候要求输入远程主机上的用户口令并加密传输到远程主机上进行验证。

而public key验证不需要在网络上传送口令,它依赖于在本地创建的一对密钥(公钥和私钥)进行验证。

以下会以实例操作介绍两种认证方式(使用开源的openSSH操作):

Password认证:

  • 指定ip连接:

lfly@linux-oj9e:~> ssh 172.17.0.3

  • 指定的主机名连接:

lfly@linux-oj9e:~> ssh www.programfish.com

  • 指定登陆用户名(上面没有指定则使用当前用户名):

lfly@linux-oj9e:~> ssh lfly@172.17.0.3

lfly@linux-oj9e:~> ssh lfly@www.programfish.com

如果是第一次尝试连接到当前指定的远程主机,则会出现如下提示:

lfly@linux-oj9e:~> ssh 172.17.0.3

The authenticity of host ‘172.17.0.3 (172.17.0.3)’ can’t be established. ECDSA key fingerprint is 2a:d9:31:44:04:08:ed:ff:2e:0a:3d:31:53:65:3b:f3. Are you sure you want to continue connecting (yes/no)?

这里由于是本地首先连接到该远程主机(172.17.0.3),ssh会提示你是否要信 任这个主机,这里需要你键入yes回车,选择了信任这台主机后ssh会把这台主机上的公钥(public key)记录在~/.ssh/known_hosts这个文件下(.ssh是你家目录下的一个隐藏目录)。

这里其中一个公钥是这样的:

|1|w2w2Qcl7o5Mi4Iwcg613O+16I4A=|NpE0Zzu5NsgZ3DEpYLgNfzwhcR4= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBARhzN4tb3VaHAdPJBi/H+rW/ARafC0CSJE4QrpepOIv55T+P+AV9pMsPpug0juAW/E3V929p+KhtKqUrkMP+SU=

这样下一次你再尝试连接这个IP地址的远程主机时ssh会拉取它的公钥然后与 known_hosts文件里的这个ip的公钥作对比,如果对比吻合,则顺利跳过这步。如果对比不吻合,则ssh会提示你远程主机身份证明(公钥)已经改 变,这次连接可能正在受到中间人的攻击(man-in-the-middle attack)。

提示如下:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is 70:60:25:72:8f:96:f6:cd:25:16:80:30:30:58:de:ea. Please contact your system administrator. Add correct host key in /home/lfly/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /home/lfly/.ssh/known_hosts:1 You can use following command to remove all keys for this IP: ssh-keygen -R 172.17.0.3 -f /home/lfly/.ssh/known_hosts ECDSA host key for 172.17.0.3 has changed and you have requested strict checking. Host key verification failed.

这种情况如果不是中间人攻击则很可能是因为远程主机上的操作系统更换了导致了ssh公钥改变了。

这样的话解决方法就很明了:手动删掉known_hosts里面的相应或全部内容后再尝试连接该远程主机。

  • 使用别名认证(免去记远程ip的麻烦)

在~/.ssh下的config文件(没有则创建)里加入如下格式的内容:

Host  cg

HostName  172.17.0.3

User  lfly

这样的话我就把上面我的远程主机设置了一个别名为cg 。

下次就可以这样连接到该主机:

lfly@linux-oj9e:~> ssh cg

上面的命令等价于: lfly@linux-oj9e:~> ssh lfly@172.17.0.3

如果要设置多个远程主机的别名,则添加多个以上的三行为一组的内容进config文件即可。

public key认证(免密码认证)

过程:

  1. 先在本地创建一对密钥(公钥和私钥),并把公匙放在需要访问的服务器上;
  2. 客户端向远程服务器发出请求用你的公钥认证;
  3. 服务器收到请求之后,在本地找出你的公钥,然后把它和你发送过来的公钥进行比较。若两密匙一致,服务器就用公匙加密“质询”(challenge)并把它发送给客户端软件;
  4. 客户端软件收到“质询”之后就可以用私钥解密后再把它发送给服务器。

这种方式不需要在网络上传送口令,但你要记住密钥的口令(在创建密钥时会要求设置)。public key认证可以有效避免“中间人”攻击。

创建密钥:(公钥加密算法有rsa和dsa两种可选)

lfly@linux-oj9e:~/.ssh> ssh-keygen -t rsa  (这里指定rsa公钥加密算法)

回车后ssh会询问你密钥要存放的位置,回车默认为~/.ssh/id_rsa。然后又要求输入密钥的口令,回车默认为空口令。成功创建则如下所示:

成功后可以看到.ssh文件夹下多了两个文件:id_rsa 和id_rsa.pub

lfly@linux-oj9e:~/.ssh> ls

config  id_rsa  id_rsa.pub  known_hosts  known_hosts.old

上传公钥(id_rsa.pub)到远程主机。有两种方法:

方法1、用scp复制

确定远程主机家目录里有没有.ssh这个目录,如果没有则先远程登陆并手动创建并设置权限为755

$ mkdir .ssh

$ chmod 755 .ssh

然后回到本地用scp上传文件到远程家目录下并重命名为authorized_keys文件:

lfly@linux-oj9e:~/.ssh> scp id_rsa.pub lfly@172.17.0.3:~/.ssh/authorized_keys

输入密码后则可完成。之后远程连接即可不用输入密码,如果不要求输入密码,说明还没成功:此时要检查远程主机家目录上.ssh目录权限应该要为700以及.ssh目录下的authorized_keys文件权限应该要为644。

方法2、用ssh-copy-id命令

lfly@linux-oj9e:~/.ssh>  ssh-copy-id  -i  ~/.ssh/id_rsa.pub  lfly@192.168.56.101

这里是要复制到192.168.56.101的lfly的家目录上,权限会自动设置,很方便。

方法1如果需要多台主机无密码访问该远程主机(即要多次添加不同的id_rsa.pub到authorized_keys文件)不可行,因为每次用scp上传会覆盖原有的内容。 而用方法2则会自动在authorized_keys文件结尾添加而非覆盖,所以更方便。

SSH做socks代理FQ

需要用到的工具:

  • Tsocks     代码托管:https://github.com/pc/tsocks
  • 一个能连接到外国ip主机的ssh帐号

Tsocks 是一个透明 SOCKS 代理软件。Ubuntu源里的这个包,opensuse用户可以在www.opensuse.org里搜索到这个包。

1. 安装后要配置/etc/tsocks.conf文件(以下为部分内容)

# We can access 192.168.0.* directly

local = 192.168.0.0/255.255.255.0  # Otherwise we use the server

server = 127.0.0.1

server_port = 7070

代理服务器为127.0.0.1即本机,端口为7070

2. 然后用ssh搭建ssh隧道:

lfly@linux-oj9e:~> ssh  -fNC  -D  7070  111.111.111.111

这里注意:上面填写的111.111.111.111替换成你能通过ssh登陆的外国主机的ip (关于ssh隧道详见参考资料)

3. Tsocks配置好了以及ssh隧道搭建成功后娐可FQ

Tsocks 的用法是在你要运行的工具前面加上 tsocks :

例如我要用火狐FQ:

lfly@linux-oj9e:~> tsocks firefox

欢迎访问本人网站:http://www.programfish.com

LinuxCoder 社区: http://linuxcoder.org

注意:转载请注明 “作者:广州Linux爱好者+云计算 刁金明”

SSH 概念及使用详解的更多相关文章

  1. Storm概念、原理详解及其应用(一)BaseStorm

    本文借鉴官文,添加了一些解释和看法,其中有些理解,写的比较粗糙,有问题的地方希望大家指出.写这篇文章,是想把一些官文和资料中基础.重点拿出来,能总结出便于大家理解的话语.与大多数“wordcount” ...

  2. ELK&ElasticSearch5.1基础概念及配置文件详解【转】

    1. 配置文件 elasticsearch/elasticsearch.yml 主配置文件 elasticsearch/jvm.options jvm参数配置文件 elasticsearch/log4 ...

  3. Linux实现利用SSH远程登录服务器详解

    Linux实现利用SSH远程登录服务器详解 http://www.111cn.net/sys/linux/55152.htm

  4. JAVA反射概念及使用详解(超详细)

    JAVA反射概念及使用详解 一.什么是反射? 反射:框架设计的灵魂 框架:半成品软件.可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 ​ 好处: ​ ...

  5. SSH免密登录详解

    SSH免密登录详解 SSH(Security Shell)安全外壳协议,是较为可靠的,专为远程登录会话和其他网络服务提供安全保证的协议. ​ 对于传统的网络服务程序(例如,FTP,Telnet等)来说 ...

  6. C#反射概念以及实例详解【转】

    2009-08-28 13:12 佚名 互联网 我要评论(1) 字号:T | T C#反射概念以及实例向你介绍了C#反射的基本内容以及C#反射实例的简单应用,希望对你了解和学习C#反射以及C#反射实例 ...

  7. JAVAEE——spring01:介绍、搭建、概念、配置详解、属性注入和应用到项目

    一.spring介绍 1.三层架构中spring位置 2.spring一站式框架 正是因为spring框架性质是属于容器性质的. 容器中装什么对象就有什么功能.所以可以一站式. 不仅不排斥其他框架,还 ...

  8. ELK & ElasticSearch 5.1 基础概念及配置文件详解【转】

    转自:https://blog.csdn.net/zxf_668899/article/details/54582849 配置文件 基本概念 接近实时NRT 集群cluster 索引index 文档d ...

  9. mycat基本概念及配置文件详解

    在介绍mycat之前,首先来了解一下数据库切分. 对于海量数据处理,按照使用场景,主要分为两类:联机事务处理(OLTP)和联机分析处理(OLAP). 联机事务处理也称为面向交易的处理系统,其基本特征是 ...

随机推荐

  1. include 和 require 的区别

    1. 首先不去介绍大家都知道的区别,百度上都进行了详细的说明,对于返回值的方面大家都很少提到. include 和 require 还有一个区别就是是否具有返回值.参见手册 对include 加载文件 ...

  2. BZOJ 1497 最大获利(最大权闭合子图)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1497 思路:由题意可以得知,每个顾客都依赖2个中转站,那么让中转站连有向边到汇点,流量为它的建设费用 ...

  3. mysqli connect database and print

    <?php $connect = mysqli_connect('localhost','root','','intertrading') or die('Unale to connect'); ...

  4. mybatis和hibernate对比

    Hibernate是一个数据库表和java对象之间完全映射的框架,java开发人员直接对java对象操作,而不对数据库表进行操作: Mybatis是对SQL语句和java对象进行映射,仍需要开发人员编 ...

  5. UITableView系列(1)---Apple缓存池机制

    一.概述 关于UITableView的基本使用, 其实十分简单.但是做App最重要的之一就是细致,技术方面要做到细致, 必须深入了解底层, 才能做出优化让程序跑得更快.那么这一系列文章从我实际项目中获 ...

  6. 单链表之C++实现

    在实现单链表时要注意对单链表的逻辑存储.物理存储有清晰的概念. 如上图链表已经完成,其逻辑结构如上.当需要对其进行操作,比如插入.删除,通常需要引 入指针,如上的ptr1.ptr2.在编程时一定要注意 ...

  7. poj2787 算24

    每次枚举两个数,一个运算符,得到一个运算结果.在重复执行,直到只剩下一个数即可. #include <iostream> #include <cmath> using name ...

  8. 《Java程序员面试笔试宝典》之switch使用时有哪些注意事项

    switch语句用于多分支选择,在使用switch(expr)的时候,expr只能是一个枚举常量(内部也是由整型或字符类型实现)或一个整数表达式,其中整数表达式可以是基本类型int或其对应的包装类In ...

  9. 关系型数据库遵循ACID规则

    事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (Atomicity) 原子性原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的 ...

  10. LDA-线性判别分析(四)

    本来是要调研 Latent Dirichlet Allocation 的那个 LDA 的, 没想到查到很多关于 Linear Discriminant Analysis 这个 LDA 的资料.初步看了 ...