浅谈ssh(安全外壳协议)

ssh(安全外壳协议)

SSH (全拼:Secure Shell )
SSH 是建立在应用层基础上的安全协议。
专门为远程登录会话以及其他网络服务提供的安全性协议。

SSH是一种网络协议,用于计算机之间的加密登录。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
SSH客户端适用于多种平台,例如Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。

SSH之所以能够保证安全性,原因在于它采用了非对称加密技术(RSA)加密了所有传输的数据


实现过程:
(1)远程主机收到用户的登录请求后,把自己的公钥发送给用户。(2)用户使用了这个公钥,将登录密码加密后,发送回来。(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

这个过程实施的时候存在一个风险:如果被截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为SSH协议的公钥是没有证书中心(CA)公证的;

这就是著名的"中间人攻击"(Man-in-the-middle attack)。

定义: 就是“中间人”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”转手。



SSH协议是如何应对的呢?

通过使用SSH协议,我们可以把所有驱动器输入的数据进行加密。SSH有很多功能,它既可以代替Telnet,又可以为FTP、PoP、甚至为PPP提供一个安全的"通道" 。因为传输的数据是经过压缩的,所以也可以加快传输文件数据的速度;



SSH的登陆方式:

从客户端来看,SSH提供两种级别的安全验证:

第一种级别(基于口令的安全验证)

只要我们知道了自己帐号和口令,就可以登录到远程主机。(所有传输的数据都会被加密)

命令格式为: ssh 客户端用户名@服务器ip地址

如果需要调用图形界面程序可以使用 -X 选项
ssh -X 客户端用户名@192.168.0.1

SSH服务的默认端口是22,如果不设置端口的话登录请求会自动送到远程主机的22端口。我们可以使用 -p 选项来修改端口号
比如连接到服务器的1234端口:
ssh -p 1234 客户端用户名@192.168.0.1
然后会要求我们输入远程主机的密码,输入的密码正确就可以成功登录了。

第二种级别(基于密匙的安全验证)

需要依靠密匙,也就是我们必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果需要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用自己的密匙进行安全验证。服务器收到请求之后,先在该服务器主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。

<1>.在本机生成密钥对

使用ssh-keygen命令生成密钥对:

ssh-keygen -t rsa #-t表示类型选项,这里采用rsa加密算法

执行结束以后会在 /home/当前用户目录下生成一个 .ssh 文件夹,其中包含私钥文件 id_rsa 和公钥文件 id_rsa.pub。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<2>.将公钥复制到远程主机中

把公钥拷贝到需要登录的远程服务器或Linux系统上,这里可以使用ssh-copy-id自动完成,也可以手动追加秘钥到远程服务器。
使用ssh-copy-id命令将公钥复制到远程主机,命令会将公钥写到远程主机的 / .ssh/authorized_key 文件中。

方法一(推荐):
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.0.1
执行命令了会要求输入远程机器的密码,输入密码即可。
注:ssh-copy-id默认端口是22,如果您的SSH端口不是22,也就是远程服务器端口修改成其他的了,那就要得加上 -p +端口。

在这里插入图片描述

ssh-copy-id的参数有:
-i #指定密钥文件
-p #指定端口,默认端口号是22
-o <ssh -o options>
user@]hostname #用户名@主机名
-f: force mode – copy keys without trying to check if they are already installed
-n: dry run – no keys are actually copied
-h|-?: 显示帮助


方法二:

进入远程服务器需要SSH登录的用户的目录下,仍然用root用户,cd /root/.ssh,执行ls看看目录下是否有authorized_keys文件没有的话则执行以下命令创建:

touch authorized_keys

执行成功会创建空authorized_keys文件,授予600权限(注意:权限必须是600):
一般来说:

对.ssh目录设置700权限
对id_rsa、authorized_keys文件设置600权限
对id_rsa.pub、known_hosts文件设置644权限
( -rw------- (600) 只有拥有者有读写权限。
-rw-r–r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) 只有拥有者有读、写、执行权限。
-rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx–x--x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) 所有用户都有文件读、写权限。
-rwxrwxrwx (777) 所有用户都有读、写、执行权限。)

chmod 600 /root/.ssh/authorized_keys

如果已经有了authorized_keys文件,这直接执行以下的密钥追加工作。

将上面生成的公钥id_rsa.pub追加到authorized_keys文件中:

cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

注意是>>而不是>,双尖括号>>表示像向文件中追加;

接下来就可以使用密钥登录:

ssh -i ./id_rsa root@192.168.10.131
或者ssh root@192.168.10.131 -i ./id_rsa

注意:id_rsa是私钥,执行命令过程中,如果创建密钥对的时候设置了密码,则会提示您输入密码,没有的话就会直接登录。

密钥形式登录的原理是:利用密钥生成器制作一对密钥——一只公钥和一只私钥。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。这样一来,没有私钥,任何人都无法通过 SSH 暴力破解你的密码来远程登录到系统。此外,如果将公钥复制到其他账户甚至主机,利用私钥也可以登录。



SSH 主要由三部分组成:

传输层协议 [SSH-TRANS]

提供了服务器认证,保密性及完整性。此外它有时还提供压缩功能。 SSH-TRANS 通常运行在TCP/IP连接上,也可能用于其它可靠数据流上。 SSH-TRANS 提供了强力的加密技术、密码主机认证及完整性保护。

用户认证协议 [SSH-USERAUTH]

用于向服务器提供客户端用户鉴别功能。它运行在传输层协议 SSH-TRANS 上面。当SSH-USERAUTH 开始后,它从低层协议那里接收会话标识符(从第一次密钥交换中的交换哈希H )。会话标识符唯一标识此会话并且适用于标记以证明私钥的所有权。 SSH-USERAUTH 也需要知道低层协议是否提供保密性保护。

连接协议 [SSH-CONNECT]

将多个加密隧道分成逻辑通道。它运行在用户认证协议上。它提供了交互式登录话路、远程命令执行、转发 TCP/IP 连接和转发连接。



SSH的高级应用:

1.使用远程主机不中断的跑程序:

我们可以利用 nohup + 需要运行的程序 使运行的程序在切断ssh连接的时候仍然能够继续在远程主机中运行。nohup即no hang up(不挂起)。


2.scp跨机远程cp拷贝

scp:(全拼:secure copy)用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。
注意:两台主机之间复制文件必需得同时有两台主机的复制执行帐号和操作权限

scp命令参数:

-1 强制scp命令使用协议ssh1
-2 强制scp命令使用协议ssh2
-4 强制scp命令只使用IPv4寻址
-6 强制scp命令只使用IPv6寻址
-B 使用批处理模式(传输过程中不询问传输口令或短语)
-C 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
-p 留原文件的修改时间,访问时间和访问权限。
-q 不显示传输进度条。
-r 递归复制整个目录。
-v 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
-c cipher 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
-F ssh_config 指定一个替代的ssh配置文件,此参数直接传递给ssh。
-i identity_file 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
-l limit 限定用户所能使用的带宽,以Kbit/s为单位。
-o ssh_option 如果习惯于使用ssh_config(5)中的参数传递方式,
-P port 注意是大写的P, port是指定数据传输用到的端口号
-S program 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。

scp一般的使用方法:
本地复制远程文件:(把远程的文件复制到本地)
scp root@www.test.com :/val/test/test.tar.gz /val/test/test.tar.gz
远程复制本地文件:(把本地的文件复制到远程主机上)
scp /val/test.tar.gz root@www.test.com:/val/test.tar.gz
本地复制远程目录:(把远程的目录复制到本地)
scp -r root@www.test.com:/val/test/ /val/test/


3.SSH端口操作

绑定本地端口:

既然SSH可以传送数据,那么我们可以让那些不加密的网络连接,全部改为SSH连接,从而提高安全性。
假定我们要让8080端口的数据,都通过SSH传向远程主机,命令就可以这样:
  $ ssh -D 8080 user@host

SSH会建立一个socket,去监听本地的8080端口。一旦有数据传向那个端口,就自动把它转移到SSH连接上面,发往远程主机。
( Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。)

本地端口转发:

有时我们必须指定数据传送的目标主机,从而形成"端口转发"。
假定host1是本地主机,host2是远程主机。但两台主机之间无法连通。我们可以使用另外一台host3,host3可以同时连通1,2两台主机。因此我们通过host3,将host1连上host2。
我们在host1执行下面的命令:
  $ ssh -L 1234:host2:21 host3

命令中的L参数一共接受三个值,分别是"本地端口:目标主机:目标主机端口",中间使用冒号分隔。
命令意思是指定SSH绑定本地端口1234,然后指定host3将所有的数据,转发到目标主机host2的21端口。
这样一来,我们只要连接host1的1234端口,就相当于连接上了host2的21端口。
  $ ftp localhost:1234
"本地端口转发"使得host1和host3之间形成一个数据传输的秘密隧道,因此又被称为"SSH隧道"

远程端口转发:

host1与host2之间无法连通,必须借助host3转发。但是,如果host3是一台内网机器,它可以连接外网的host1,但是反过来外网的host1连不上内网的host3。

解决办法:host3可以连接host1,那么就从host3上建立与host1的SSH连接,然后在host1上使用这条连接就可以了。
我们在host3执行下面的命令:
  $ ssh -R 2121:host2:21 host1
R参数也同样是接受三个值,分别是"远程主机端口:目标主机:目标主机端口"。命令的含义是让host1监听它自己本身的2121端口,然后将所有数据经由host3,转发到host2的21端口。这种情况就被称为"远程端口绑定"。
绑定之后,我们在host1就可以连接host2了:
  $ ftp localhost:2121
这里必须指出,"远程端口转发"的前提条件是:
host1和host3两台主机都存在sshD和ssh客户端


关于ssh的疑问:通过ssh可以确认通信双方的身份,可以建立一个可信的会话,但对于后面的正式会话,数据传输的安全性是如何保障的?

答:和Https类似,初始连接时通过非对称加密技术完成双方的身份认证和分配一个双方共享的对称密钥,这个会话密钥用于后续正式会话的加密保护。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值