首页 > 代码库 > linux学习之路之ssh协议

linux学习之路之ssh协议

SSH协议

SSH英文全称Secure SShell,是一种安全的协议,也是用于远程登入的。

SSH相比telenet而言,具有更高的安全性,使用telent远处登入某台主机,存在着以下两个隐患:

            1、用户认证是明文的

            2、数据传输也是明文的

因此,处于数据安全考虑,使用SSH来远处登入更安全。

SSH有2个版本,SSHv1和SSHv2,SSH1由于无法抵挡中间人攻击,因此,现在很少使用SSHv1版了。所以使用更多的还是SSHv2版,毕竟它要安全多了。

SSH是工作在TCP层,端口号是22;telent也是工作在TCP层的,端口是23

要想实现SSH整个功能,我们需要借助Openssh来完成,Openssh是SSH的开源实现,Openssh即是一种软件也是一种协议,由于是开源的,因此自然就不需要花钱了。

 

既然是远处登入工具,那么就需要有一台主机作为客户端,另一台主机作为服务器端。且在客户端上面必须要有能够远处登入的软件工具才行。

对于客户端来说:

            如果客户端是Linux系统,只需要使用ssh命令远处登入即可

            如何客户端是windows系统,能够实现远程登入的工具主要有:

                                    putty,secureCRT、SSHSecureShellClient,Xmanger

对于服务器来说:

            只需要开启ssh服务即可,这个服务名称为sshd,因此只要确保sshd服务一直在运行即可。

 

如何使用ssh来远处登入某台主机?

ssh用法

ssh -l USERANEM  REMOTE_HOST  [‘COMMAND‘]

以某个用户的身份登入到指定主机

‘COMMAND‘:表示为不用登入到远处主机,但是可以在远处主机上面执行某些命令,并将结果返回给

                        客户端

ssh USERNAME@REMOTE_HOST:以指定用户身份登入到远处主机,如果没有指定用户,则是以当

                                                                前用户的身份登录

       -X,-Y:表示登入到远处主机,并在远处主机上面执行打开图形窗口命令,而图形窗口将会在本地

                        打开,因此,本地要能够支持图形窗口界面

 

刚刚说过ssh既要有客户端也要有服务器端,所以,在Linux主机上面,及含有客户端配置文件,也含有服务器配置文件。

SSH客户端的配置文件是/etc/ssh/ssh_config

SSH服务器的配置文件是/etc/ssh/sshd_config

这两个文件的内容差不多,只有稍许的差别,在这里,我只介绍SSH服务器端的配置文件中大概的内容:

/etc/ssh/sshd_config

1、关于ssh server的设定说明

Protocol 2             #ssh的协议版本

ListenAddress 0.0.0.0  监听的主机地址,默认是监听所有接口的ssh要求

PidFile /var/run/sshd.pif  放置sshd这个pid的文件

LoginGraceTime 2m 多久没有成功连上就强迫断线,默认单位为秒

Compression delayed 指定何时开始使用数据压缩模式进行传输。有yesno和登入后才将数据压缩(delayed)选项

 

2说明主机的Private key放置的档案

HostKey /etc/ssh/ssh_host_key # SSH version 1 使用的私钥

HostKey /etc/ssh/ssh_host_rsa_key # SSH version 2 使用的 RSA 私钥

HostKey /etc/ssh/ssh_host_dsa_key # SSH version 2 使用的 DSA 私钥

 

PermitRootLogin yes  是否允许 root 登入!预设是允许的,但是建议设成no !

StrictModes yes   是否让 sshd 去检查用户家目录或相关档案的权限数据

PubkeyAuthentication yes

AuthorizedKeysFile .ssh/authorized_keys

是否允许用户自行使用成对的密钥系统进行登入行为,仅针对 version 2。

至于自制的公钥数据就放置于用户家目录下的 .ssh/authorized_keys 内

PasswordAuthentication yes

PermitEmptyPasswords no

IgnoreUserKnownHosts no

#是否忽略家目录内的 ~/.ssh/known_hosts 这个档案所记录的主机内容?

 

ChallengeResponseAuthentication no  允许任何的密码认证

UsePAM yes 利用 PAM 管理使用者认证

TCPKeepAlive yes

# 当达成联机后,服务器会一直传送 TCP 封包给客户端藉以判断对方式否一直存在联机。

MaxStartups 10   # 同时允许几个尚未登入的联机画面

DenyUsers *

# 设定受抵挡的使用者名称,如果是全部的使用者,那就是全部挡吧!

DenyGroups test

Subsystem    sftp    /usr/libexec/openssh/sftp-server  基于ssh的ftp服务

 

 

ssh的认证方式:

一种基于口令认证,ssh默认的认证发送就是基于口令认证的。

  一种是基于密钥认证

密钥验证工作原理

客户端A会在自己主机生成一个公钥和一个私钥,然后再将公钥拷贝给服务器端B,当客户端A下次再发送ssh请求时,该请求中包含了客户端A的公钥,服务器端收到请求后,查看客户端A中的公钥和自己主机上保存的公钥是否一样,如果一样,服务器端B就会随机产生一些数字C,然后服务器端B就会用A的公钥对这些数字C进行加密,加密后的数据在返回给客户端A,在用客户端A的私钥进行解密,解密得到的数据C2将返回给服务器B,服务器B会将这些数据C2和自己随机产生的数据C进行对比,如果数据一样,则说明客户端验证通过,否则,验证失败。

服务器的公钥放在~/.ssh/known_hosts文件中

基于密钥认证的整个步骤如下:

1、在客户端上生产一对密钥

            使用ssh-keygen命令生成

                    -t  {rsa|dsa}  指定加密算法

                    -f  filename  指定密钥保存的文件

                            默认私钥保存在~/.ssh/id_rsa中

                                    公钥保存在~/.ssh/id_rsa.pub 中       

                    -N  ‘password’ 指定密码,该密码是用来加密密钥的

    

2、将客户端生成的公钥传给服服务器 某用户家目录下的.ssh/authorized_keys文件中

             文件传输可以使用ssh-copy-id和scp命令来完成

             使用ssh-copy-id来自动完成将公钥传给服务器某用户家目录下的.ssh/authorized_keys文件中     

                ssh-copy-id   -i /path/to/pubkey   USERNAME@REMOTE_HOST

                    

                使用scp完成公钥传输

                scp命令语法基本和cp命令相同,不同之处在于指定远处主机时,要是有这样的结构:

                                    USERNAME@REMOTE_HOST :/PATH/TO/SOMEFILE

                因此,对于将本地数据复制到远处主机上,可以这样使用:

                    scp  /path/to/loacl   USERNAME@REMOTE_HOST:/PATH/TO/SOMEWHERE

                对于将远处主机上面的数据复制到本地,可以这么使用:

                    scp  USERNAME@REMOTE_HOST:/PATH/TO/SOMEWHERE  /path/to/loacl

 

3、测试登入即可,验证是否正确

 

总结关于使用ssh登录远处主机时,应该注意的安全事项:
1、密码应该经常换且足够复杂
2、使用非默认端口
3、限制登录客户地址
4、禁止管理员直接登入
5、仅允许有限用户登入
6、使用基于密钥的认证
7、禁止使用版本1

 

本文出自 “linux学习之路” 博客,谢绝转载!