实验环境:RHEL5.8 32Bit

OpenSSH服务及其相关应用

    早期我们的主机实现远程登录时使用的协议叫做telnet,telnet是一种远程登录的协议,基于tcp协议的23号端口,但是telnet协议天生有两大缺陷:

    1,在远程登录服务器的时候用户的认证过程是明文的,即远程服务器上的用户的用户名

       和用户密码是明文传输的。

    2,登录完成后,客户端和服务端之间的数据传输也是明文的。

    因此对于整个telnet协议来说,它是没有任何的安全性可言的,故telnet在今天的互联网环境当中作为一个远程登录协议已经不再适用了,但是人们又希望能够发明一种不但能够对认证过程和数据的传输过程加密,并且还得比telnet更加安全的远程登录协议,于是SSH就诞生了。

·SSH(Secure Shell:安全的shell)

    ssh和telnet一样都是一种远程登录协议,只不过二者的实现机制不同,ssh也是基于tcp协议的,只不过是基于tcp协议的22号端口,ssh协议出现后不久就出现了ssh工具,ssh协议和telnet协议一样都是基于C/S结构的协议。

·C/S架构

    需要在服务器端运行一个服务端软件监听在某个端口上,客户端发起连接请求,服务端在接收到客户端的请求后会响应客户端的请求,双方通过认证建立数据连接通道并一直处于连接的活动状态,而用户一旦登录到服务器当中,得等待所有的请求以及所有的任务处理完成之后才会退出登录,所以C/S架构的互联网通信需要一个专门的客户端软件和一个专门的服务端软件。

·OpenSSH(SSH的开源实现)

    ssh既是一种远程登录协议又是一种开源软件,ssh协议目前主要有两个版本:

    1,v1版

      v1版在设计上有缺陷,无法有效的避免中间人***,因此到目前为止v1版都处于废弃的状态,但是由于很多古老的网络设备上依然在使用v1版,故我们不得不使得我们的客户端依然能够访问sshv1版本的服务。

    2,v2版

    OpenSSH对以上两种版本的ssh协议都是支持的。

·SSH客户端软件

    一般来讲,如果我们的ssh客户端软件是运行在Linux操作系统上面的话,那么使用的客户端程序就是一个简单的ssh命令,如果是运行在Windows操作系统上面的话,要想远程连接ssh服务端(ssh服务端程序通常就是一个文本界面),只需要在本地安装一个本地连接工具即可,比较著名的工具有:

    1,putty

    2,SecureCRT(商业版软件)

    3,SSHSecureShellClient(该软件既有商业版又有开源版)

      该软件不但能够提供ssh客户端工具,还可以提供一个图形化的远程连接ssh服务器的实现文件传输的工具。

    4,Xmanager

·SSH服务端软件

    一般而言,ssh无法实现基于Windows操作系统的服务端软件,所以ssh的服务端软件一般都是基于Linux或者Unix操作系统的,这种类型的服务端软件由OpenSSH来提供,就叫做sshd。

    因此OpenSSH一共包含了两个组件:

        1,ssh客户端工具

          命令行工具:ssh命令

        2,ssh服务端工具

          叫做sshd,服务端软件也是一个可执行的程序,只不过该可执行程序工具起来之后就默认工作在后台,而且不会退出,因为只要它一退出,我们的ssh服务就会终止。

·SSH认证的实现

    ssh是如何实现加密传输数据的呢?通过前面的学习我们知道,通信双方想要建立安全可靠的通信,得依靠CA发放的数字证书,那么ssh的收发双方并没有CA发放的数字证书,那么它们是如何建立安全可靠的通信连接的呢?首先客户端会向服务端发起连接请求,接着服务端会向客户端发送自己的主机公钥,之后客户端就会拥有该主机公钥的指纹信息,接下来由客户端自己确认是否认可该主机公钥的指纹信息,如果认可,那么客户端就会拥有服务端的主机公钥,紧接着客户端会生成一个临时的对称会话密钥,将收发双方认证过程中所要传输的认证数据本身通通使用该对称密钥进行加密,而且还得将该对称密钥使用服务端的主机公钥进行加密并将加密后的结果附加在使用对称密钥加密后的所要传输的数据结果的后面,将这一个整体发送至服务端进行认证,服务端收到客户端发送过来的认证数据之后,首先会使用自己的私钥对被加密的对称密钥进行解密,之后使用解密后的对称密钥解密认证数据,得到客户端发送过来的认证信息,之后使用该认证信息在服务端进行用户认证,一旦认证通过,双方就会建立一个一直持续在线的ssh会话通道,以上这种ssh的认证机制,称为ssh的口令认证,这种认证机制有一定的安全隐患,因为不管怎么加密,认证信息都会在互联网上进行传输:

    wKioL1h0s9HBT_qtAABRTso-2Ys709.png

    ssh还有一种认证机制叫做基于密钥的认证,首先客户端上的用户会在客户端生成一对密钥,并将自己的公钥放到远程服务器上面,自己保留私钥信息,并且放在服务器上的公钥信息也得保密,客户端的公钥信息被保存在远程服务端上某个用户的家目录下面,之后在我们使用ssh命令远程登录服务器的时候,只需要我们输入远程服务器上面对应的用户名,而不需要再输入密码,而连接建立之后所传输的数据则使用客户端自己的私钥进行加密,在服务端使用之前保存的客户端的公钥进行解密即可,但是基于密钥的ssh认证需要我们事先进行配置。

    以上就是ssh的两种认证机制,默认情况下,ssh都是的认证过程都是基于口令认证进行的。

·SSH的安全防范

    1,一般而言,为了安全起见,服务端是不允许管理员直接登录的,因此如果我们想要使用ssh远程登录服务器的时候,只能使用普通用户的身份进行,登录成功之后再切换至管理员用户,这是为了保护服务器上管理员账号信息的安全。

    2,限定我们的服务器在互联网中不能任何主机都可以远程登录,就算是ssh服务,就算是普通用户也不可以任何主机都能够远程登录我们的服务器,但是如果我们经常出差,需要经常远程登录服务器的话,可以在我们的服务器的前端加一个×××服务器,而后设定我们的服务器只允许×××服务器的IP地址进行远程登录,然后我们每次需要登录服务器的时候,都可以先远程连接至×××服务器上面,接下里由×××服务器去连接我们的服务器即可。

    3,在使用ssh服务远程连接服务器的时候,最好不要使用默认的连接端口22。

    4,经常性的更换服务端的用户口令,并且密码最好是随机的,密钥长度也要足够长,如果可以的话,我们可以使用一个带有SecureCRT的U盘,SevureCRT里面包含基于密钥的登录认证信息,我们在需要远程登录的时候直接插入U盘即可。


    在红帽系列的操作系统上ssh服务是由多个rpm包组成的,这多个rpm包当中,有的用来提供客户端,有的用来提供通用组件,有的用来提供服务端:

    rpm -qa | grep 关键词->该命令用来查看组成关键词相关软件的rpm包:                   wKioL1h0ucaAje62AAAQzvY6psE037.png

    rpm -qi 关键词->该命令用于查看和关键词相关的软件的rpm包的详细信息:

        wKioL1h0umCAzkm-AABhMYwVAcA474.png

    红帽系列的操作系统默认安装ssh服务并且自动启动,默认监听22号端口:

    netstat -tnl->该命令用于查看对应的端口是否启动

        wKiom1h0u2-gBoy3AAAzvh32bHQ238.png

    -t(tcp connections)选项表示显示本地所有基于tcp协议所建立的会话

    -n选项表示以数字形式显示ip地址和端口号

        wKiom1h0vEKhfsUyAAA4Kv0LpzI241.png

    -l(listening)选项表示显示处于监听状态的服务,所谓监听状态指的是服务在服务端启动后等待客户端进行连接的状态,如果不加-l选项表示显示处于已连接状态的服务:

    wKiom1h0vfvTcZAaAAAadZK7Zok944.png

    -r选项表示显示路由表

    wKiom1h0vj7QsqjZAAAhboF6llo822.png

    -u(udp connections)表示显示本地所有基于udp协议所建立的会话

    wKiom1h0vqrjPjujAAAULazRgQo237.png

        udp协议没有LISTEN的状态,因为udp协议不需要建立连接。

    -p(process)选项显示某个具体的程序监听某个服务

    wKioL1h0v1vzFIMTAABE_lLYUnM748.png

    我们在使用netstat命令的时候如果发现某个端口处于LISTEN状态的时候,说明该端口对应的服务已经在服务端启动起来了,并且等待客户端的连接,同样也可以使用service sshd status和/etc/init.d/sshd status命令来查看ssh服务的运行状态:

    wKiom1h0wFCimIS_AAAWQBLDgjU320.png

·ssh和sshd程序的配置文件

    在红帽系列的操作系统上ssh和sshd这两个程序的配置文件都位于/etc/ssh目录下,两个程序分别对应两个配置文件,客户端的配置文件叫做ssh_config->为客户端程序提供配置信息,服务端的配置文件叫做sshd_config->为服务端程序提供配置信息:

    wKioL1h0xFnCnw4EAAAUtSH9Vik025.png

    moduli文件是ssh会话过程中和密钥交换相关的文件

    ssh_host_rsa/dsa_key和ssh_host_rsa/dsa_key.pub文件是为sshv2版准备的主机密钥文件

    ssh_host_key和ssh_host_key.pub文件是为sshv1版准备的主机密钥文件

    使用哪种版本的主机密钥文件取决于客户端的连接请求,主机密钥是ssh加密会话得以实现的一个根本前提。

    服务端运行的ssh进程就是sshd这个进程,sshd服务启动起来之后,它会启动一个主进程,这个主进程监听所有用户的请求,一旦有用户请求进来,该主进程就会启动一个子进程来响应该用户的请求,如果远程登录的用户有很多,那么sshd启动的子进程就可能会有多个:

    wKioL1h0xkvAGevHAAAPqe4ljuw650.png

    sshd的配置文件叫做sshd_config,该配置文件中#后面有空格的行表示纯注释,#后面没有空格的行表示可以启动的选项,或者可以启用的参数,参数的复制不需要使用"=",直接在参数后面加空格跟上参数的值即可:

    

  1 #   $OpenBSD: sshd_config,v 1.73 2005/12/06 22:38:28 reyk Exp $
  2 
  3 # This is the sshd server system-wide configuration file.  See
  4 # sshd_config(5) for more information.
  5 
  6 # This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin
  7 
  8 # The strategy used for options in the default sshd_config shipped with
  9 # OpenSSH is to specify options with their default value where
 10 # possible, but leave them commented.  Uncommented options change a
 11 # default value.
 12 
 13 #Port 22 #表示ssh服务对应的端口号
 14 #Protocol 2,1
 15 Protocol 2 #表示ssh协议的版本,2表示sshv2版
 16 #AddressFamily any #表示ssh服务依据的是哪一种ip地质类型,ipv4和ipv6,any表示任何类型都可以
 17 #ListenAddress 0.0.0.0 #表示监听的主机,0.0.0.0表示任意主机,即本机向任意主机都提供sshd的服务
 18 #ListenAddress ::
 19 
 20 # HostKey for protocol version 1
 21 #HostKey /etc/ssh/ssh_host_key
 22 # HostKeys for protocol version 2
 23 #HostKey /etc/ssh/ssh_host_rsa_key
 24 #HostKey /etc/ssh/ssh_host_dsa_key
 25 
 26 # Lifetime and size of ephemeral version 1 server key
 27 #KeyRegenerationInterval 1h #表示密钥重新生成的时间间隔,该密钥指的是客户端生成的对称密钥
 28 #ServerKeyBits 768 #表示服务端密钥长度
 29 
 30 # Logging #表示和日志相关的配置
 31 # obsoletes QuietMode and FascistLogging
 32 #SyslogFacility AUTH #表示日志源
 33 SyslogFacility AUTHPRIV 
 34 #LogLevel INFO #表示日志级别
 35 
 36 # Authentication: #表示和认证过程相关的配置
 37 
 38 #LoginGraceTime 2m #表示登录的宽容期,即ssh连接建立后等待用户输入口令登录的时间
 39 #PermitRootLogin yes #表示是否允许管理员直接远程连接
 40 #StrictModes yes #表示是否使用严格限定模式
 41 #MaxAuthTries 6 #表示允许尝试登录的次数,为了防止暴力破解
 42 
 43 #RSAAuthentication yes #表示是否支持基于RSA的密钥认证
 44 #PubkeyAuthentication yes #表示是否支持基于密钥的认证
 45 #AuthorizedKeysFile .ssh/authorized_keys #表示如果我们启用基于密钥的认证方式连接远程服务器时,客户端的公钥在服务端的存放位置
 46 
 47 # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
 48 #RhostsRSAAuthentication no #表示主机认证,主机认证表示我们自己确认是否信任对方主机,如果信任,接下来就可以无需登录而直接使用对方的主机,这种方式很不安全,所以一般情况下我们不使用基于主机的认证方式
 49 # similar for protocol version 2
 50 #HostbasedAuthentication no
 51 # Change to yes if you don't trust ~/.ssh/known_hosts for
 52 # RhostsRSAAuthentication and HostbasedAuthentication
 53 #IgnoreUserKnownHosts no
 54 # Don't read the user's ~/.rhosts and ~/.shosts files
 55 #IgnoreRhosts yes
 56 
 57 # To disable tunneled clear text passwords, change to no here!
 58 #PasswordAuthentication yes #表示是否允许使用基于口令的ssh认证
 59 #PermitEmptyPasswords no
 60 PasswordAuthentication yes
 61 
 62 # Change to no to disable s/key passwords
 63 #ChallengeResponseAuthentication yes
 64 ChallengeResponseAuthentication no #表示是否允许使用挑战式握手认证协议,这种方式也不安全,一般也不允许使用
 65 
 66 # Kerberos options
 67 #KerberosAuthentication no
 70 #KerberosGetAFSToken no
 71 
 72 # GSSAPI options
 73 #GSSAPIAuthentication no
 74 GSSAPIAuthentication yes
 75 #GSSAPICleanupCredentials yes
 76 GSSAPICleanupCredentials yes
 77 
 78 # Set this to 'yes' to enable PAM authentication, account processing, 
 79 # and session processing. If this is enabled, PAM authentication will 
 80 # be allowed through the ChallengeResponseAuthentication mechanism. 
 81 # Depending on your PAM configuration, this may bypass the setting of 
 82 # PasswordAuthentication, PermitEmptyPasswords, and 
 83 # "PermitRootLogin without-password". If you just want the PAM account and 
 84 # session checks to run without PAM authentication, then enable this but set 
 85 # ChallengeResponseAuthentication=no
 86 #UsePAM no
 87 UsePAM yes #表示是否基于PAM去认证用户,一般而言在系统上认证用户都应该使用PAM
 88 
 89 # Accept locale-related environment variables
 91 AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
 92 AcceptEnv LC_IDENTIFICATION LC_ALL
 93 #AllowTcpForwarding yes
 94 #GatewayPorts no
 95 #X11Forwarding no
 96 X11Forwarding yes #表示是否转发X11请求
 97 #X11DisplayOffset 10
 98 #X11UseLocalhost yes
 99 #PrintMotd yes #表示用户成功登录后是否显示Motd文件的内容,该文件在/etc目录下
100 #PrintLastLog yes #表示是否显示上一次通过哪一个主机在什么时间登录过服务器,该信息最好不要显示
101 #TCPKeepAlive yes
102 #UseLogin no
103 #UsePrivilegeSeparation yes
104 #PermitUserEnvironment no
105 #Compression delayed
106 #ClientAliveInterval 0
107 #ClientAliveCountMax 3
108 #ShowPatchLevel no
109 #UseDNS yes
110 #PidFile /var/run/sshd.pid
111 #MaxStartups 10
112 #PermitTunnel no
113 #ChrootDirectory none
114 
115 # no default banner path
116 #Banner /some/path #表示欢迎标语
117 
118 # override default of no subsystems
119 Subsystem   sftp    /usr/libexec/openssh/sftp-server #这个是sftp服务端程序
     #Subsystem表示子系统,ssh服务有一个子程序叫做sftp,即基于ssh的ftp服务,故我们可以基于ssh来使用ftp服务

    sshd服务的任何一个配置想要生效的话,都得重启服务,不过我们也可以使用reload参数去重新读取sshd_config文件来更改配置而不用去重启sshd服务,reload参数相当于给sshd服务传递了一个SIGHUP信号。

·ssh的客户端应用

    使用ssh命令即可,ssh命令默认是以当前主机的当前用户作为登录远程服务器的用户的:

    wKioL1h01p7QKzN9AAByeUumH7o305.png

    我们也可以指定用户去登录远程服务器:

        ssh -l USERNAME REMOTE_HOST(远程主机)

        wKiom1h02VKQEfsEAAARG-t54Fs421.png

        ssh USERNAME@REMOTE_HOST

        wKiom1h02ciAEUW3AAAQ3wYrfhs013.png

    我们在使用ssh命令第一次去连接某个主机的时候,它会询问我们是否接受服务器发送过来的主机密钥,而当我们下一次使用ssh命令再去连接一个同样的主机的时候它就不会在询问同样的问题了,这是因为我们本地的客户端已经默认认可该主机的密钥,并且本地客户端会将该主机的主机密钥信息保存在我们本地的可信主机名单里,任何一个用户在本地使用sshd命令远程连接过其他主机,在该用户的家目录下就会生成一个.ssh的隐藏目录,在该目录下有一个叫做known_hosts的文件,这个文件就是可信主机名单,任何时候我们接收一个主机的主机公钥信息,它就会被保存在该文件中:

    wKiom1h0207CBPKDAACA0xqm9IY071.png

    

    ssh命令还可以在不登录远程主机的情况下,在远程主机上面执行操作,并将命令的执行结果返回到远程主机本地:

    ssh USERNAME@REMOTE_HOST 'COMMAND'->该命令可以一次性的使用远程主机的功能

    wKioL1h03KuxKZ4BAAAcSVd2VhI283.png

    wKiom1h03L7jZLWbAAAVCrtaL_4515.png

    ssh命令不但可以远程登录远程主机,还可以在远程主机上面执行窗口命令,但是 窗口本身会显示在本地,那就意味着本地必须得安装图形客户端:

    ssh -X/-Y USERNAME@REMOTE_HOST

    ssh默认是基于口令进行整个认证过程的,那么ssh如何实现基于密钥的认证过程呢?

·ssh的密钥认证

    首先得需要一台主机作为客户端,在该客户端上面基于某个用户实现整个密钥认证的过程:

    1,生成一对密钥

      使用ssh-keygen -t(指定密钥算法) rsa命令

        wKiom1h03wrA_ii5AAAuApmAKXo923.png

        生成密钥队之后,密钥对信息被保存在当前用户家目录下的.ssh目录下的id_rsa(私钥)和id_rsa.pub(公钥)文件中,私钥可以加密存放:

        wKiom1h04FOgibKxAAAIprgus4Y602.png

    .ssh目录的权限是700,权限一旦被改变,ssh服务便无法使用:

        wKioL1h039ryZ6VDAAANTphshoU119.png

        -f选项可以指定生成的密钥文件名:

        wKioL1h04Jng4nggAAAt8DCOf4Y453.png

     -N选项用来指定加密私钥文件的密码:

        wKioL1h04QOhgoh-AAAtE99u-1E512.png

    2,将生成的公钥文件信息追加(>>)至服务端上面某用户的家目录下的.ssh/authorized_keys文件中

        一般而言,我们可以使用文件传输工具传输公钥文件的信息:

        1,ssh-copy-id(专用工具)

          用法:ssh-copy-id /path/to/pubkey USERNAME@REMOTE_HOST

            该命令可以直接将公钥文件的信息追加至服务端对应用户的家目录的对应文件当中:

            wKiom1h04umhL3OUAAAsel9hY3c548.png

 wKiom1h04ySAHjfgAABIG2Vi2gI079.png

       如果客户端上面没有ssh-copy-id工具的话,我们也可以使用scp命令传输,scp命令是ssh的另外一个客户端应用,scp命令是基于ssh协议的远程复制命令,能够实现在主机与主机之间基于ssh协议传输数据,所以该传输过程也是加密的,命令用法:

        scp [options] SRC DEST

        使用该命令远程传输文件的时候,远程主机上的命令格式永远都是USERNAME@REMOTE_HOST:/path/to/somefile,同样,也可以不指定用户名,这点和ssh命令一样:

    wKioL1h05OXwNuxOAAAh5-6kvf8173.png

wKioL1h05WngL8poAAAYbEEx1nQ898.png        

        

        wKioL1h05heSNTw8AAAlCiALq48840.png

     -r选项,表示递归复制,复制目录

     -a选项,表示元数据的复制方式,相当于-rp选项

    3,测试登录即可

      wKioL1h1iUuQ9mwdAAAOR-bBHZc487.png

    ssh基于密钥认证的远程连接机制如下:

      wKioL1h1krug4dZQAAArdJqDrGE631.png

·sftp

    sftp这个程序既是客户端又是服务端,我们直接使用sftp USERNAME@REMOTE_HOST命令就可以连接到远程主机,之后使用get命令就可以将远程主机上的命令下载到本机:

    wKioL1h06DXAzk8QAAAxpw3KYOc141.png

·SSH总结

    1,认证口令经常更换且足够复杂

    2,使用非默认端口进行远程登录

        使用-p选项指定端口:

        wKioL1h06bjxpJe7AAAykZduRo4731.png

    3,限制登录客户端的地址

    4,仅允许有限的用户进行远程登录

    5,禁止管理员直接登录

    6,使用基于密钥的认证

    7,不要使用ssh v1

·如何基于Vmware实现基于虚拟机的克隆

    1,点击虚拟机->管理->克隆

      wKioL1h1ie2SbFa2AABf_FqTVaU150.png

    2,点击下一步

      wKiom1h1iieifohmAAA2UhwTvfI640.png

    3,选择虚拟机中的当前状态,点击下一步

      wKioL1h1inOC40mbAAA2H9nK4bg840.png

    4,选择创建链接克隆,点击下一步

      wKioL1h1iumCLZgIAAAxGidW7EE139.png

    5,填写克隆虚拟机的名称以及保存路径,点击完成即可

      wKioL1h1iyyDoK0oAAAftcmBQ4w005.png

·Xshell在远程连接虚拟机时如何实现基于密钥的认证

    1,点击工具->新建用户密钥生成向导

      wKiom1h1jAyhX8AyAACLbJdLsfs702.png

    2,选择密钥类型和密钥长度,点击下一步

      wKioL1h1jETQybpGAAB_oyTzjKQ843.png

    3,点击下一步

      wKioL1h1jHGgctdcAACDwxPRG8k879.png

    4,点击下一步

      wKiom1h1jUST1i6cAACeHvf8VQQ952.png

    5,将生成的公钥文件保存在桌面,点击完成

      关闭打开的用户密钥对话框

    6,使用rz命令将生成的公钥文件传输到待连接的Linux虚拟机上面

      wKioL1h1ju7hXujkAAATTSPRCmo271.png

    7,将该公钥文件中的内容追加至当前用户家目录下的.ssh目录中的authorized_keys文件中即可

      wKioL1h1j1rwgZyhAAAtJ8p6lv8644.png

    8,测试连接即可

      wKiom1h1kFiB-WwZAABEzJm5epY100.png

      wKiom1h1kG_hc81sAABsME-GOIE641.png

      点击确定即可成功连接。