zoukankan      html  css  js  c++  java
  • linux之openssh协议

     

    SSH的全称是Secure Shell,简单说来ssh是一种安全的外壳协议,用于两个计算机间安全的远程登陆,说它安全,是因为ssh采用公钥加密的机制。最开始时用作远程管理的工具是telnet,这个协议工作时在网络上传输的数据全是明文,出于安全性的考虑,此协议的使用率越来越少。而ssh的安全性使用它成为一种互联网上远程登陆主机的解决方案。在windows系统上常用到的有Putty、SecureCRT、XManager中的Xshell工具,而XManager工具是我见到的IT工作者中使用频率极高的一个工具,在windows上好像没有ssh协议的服务器端的实现,ssh协议的实现也分为商业的实现和开源的实现,在这里将是对ssh协议的一个开源实现的学习与记录。Openssh即是Linux系统下开源的实现,它开放且免费。

     

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

    第一种级别(基于用户名和口令的安全验证)只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。

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

    用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。

    上述2种方式一般选其一。

    putty这2种都支持,我们一般用putty的时候,需要输入用户名和密码,就是基于口令的验证。

    其过程:

    wKioL1LbXejDpvOFAAZV7FsCDpY940.jpg

     

     

    应对中间人攻击,SSH有2种方法应对,一是远程主机把自己的公钥拿到CA处做认证,申请一个数字证书;二是远程主机把自己公钥的指纹信息公布出来,比如公布在网站上,大家都可查看到公钥的指纹信息。这样用户在登陆时就可以鉴别主机的真伪了。提取主机的指纹信息的方法如下:

    [root@Server-A ~]# ssh-keygen -lf/etc/ssh/ssh_host_dsa_key.pub 
    102439:61:e5:80:e8:09:b3:83:10:39:c8:b4:5e:ca:45:7e /etc/ssh/ssh_host_dsa_key.pub(DSA)

    远程主机可以把这个采用dsa算法的指纹信息发布在一个网站上,那我用xshell去远程连接时就可对比一下指纹信息是不是一样,如果是一样的那就能证明我连接的是真实的主机。

    在linux下用ssh方式登陆另一linux主机时,如果第一次登陆会有如下的提示:

    [root@Server-A~]# ssh 192.168.0.201
    Theauthenticity of host '192.168.0.201 (192.168.0.201)' can't be established.
    RSAkey fingerprint is 4c:a3:2f:29:69:86:f6:0f:38:25:8c:7c:7c:3b:d5:91.
    Areyou sure you want to continue connecting (yes/no)?

    表示的意义与用xshell登陆时的提示相同,输入“yes”,再输入远程主机的口令即可登陆,登陆成功后本地主机会生成“~/.ssh/known_hosts”文件,这文件里保存着远程主机的公钥信息,这样下次再远程登陆时就不需要发送公钥信息了,直接输入口令即可。

     

    基于公钥的认证:

        基于用户口令的认证方式每次都要求用户提供正确的口令,比较麻烦,且增加了口令泄露的机率。而基于公钥的认证则不需要用户输入口令即可完成远程登陆。这种认证方式是这样工作的:用户把自己的公钥存储在远程主机上,在登陆时,远程主机向用户发送一段随机字符串,用户用自己的私钥加密这段随机数字,并把加密后的信息发送给远程主机,远程主机用事先存储的公钥来解密这个数据,如果解密成功,则说明请求登陆的用户是可信任的,这样就直接允许用户登陆,而不要求输入密码了。这种认证方式需要把用户自己的公钥保存到远程主机上。若没有现成的公钥,那就生成:

    [root@Server-A~]# ssh-keygen -t rsa
    Generatingpublic/private rsa key pair.
    Enterfile in which to save the key (/root/.ssh/id_rsa): 
    Enterpassphrase (empty for no passphrase): 
    Entersame passphrase again: 
    Youridentification has been saved in /root/.ssh/id_rsa.
    Yourpublic key has been saved in /root/.ssh/id_rsa.pub.
    Thekey fingerprint is:
    9b:ef:2c:6a:92:05:c7:f4:4b:b8:4e:b4:ce:05:2f:0croot@Server-A
    Thekey's randomart image is:
    +--[RSA 2048]----+
    |                 |
    |      .         |
    |     o o        |
    |    E * o       |
    |     * *S.      |
    |      B +o      |
    |     B oo       |
    |    o = .o      |
    |     o.. o+     |
    +-----------------+
    [root@Server-A~]# ls .ssh/
    id_rsa  id_rsa.pub known_hosts
     
    此时在家目录下的“./ssh”目录下生成了两个文件,一个id_rsa(私钥文件),id_rsa.pub(公钥文件)。接着把公钥文件拷贝到远程主机:

    [root@Server-A ~]# scp .ssh/id_rsa.pub 192.168.0.201:/root/.ssh/authorized_keys

    这里的“authorized_keys”这个文件名不能更改,这是由“/etc/ssh/sshd_config”文件定义的。

    测试一下能否不输入密码就能远程登陆Server_B主机:

    [root@Server-A ~]# ssh 192.168.0.201
    Address 192.168.0.201 maps to bogon, butthis does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
    [root@Server-B ~]#
    没错,成功了,但有报告信息,这是因为在/etc/hosts文件里没有增加两主机的映射关系,增加就可以了,在两主机中的“/etc/hosts”文件中都增加以下两行:
    [root@Server-A ~]# echo"192.168.0.200  Server-A">> /etc/hosts
    [root@Server-A ~]# echo "192.168.0.201  Server-B" >> /etc/hosts
    上边用“scp”命令直接把主机的公钥文件拷贝到远程主机用户家目录下的“root/.ssh/authorized_keys”,其实还有一个更好的方法,ssh为我们提供了一个客户端工具,即“ssh-copy-id”,这个工具能将本地主机的公钥自动拷贝到远程主机上生成“authorized_keys”文件,且会让这个文件的权限为“600”这样更为安全,此命令的用法如下:
    [root@Server-A ~]# ssh-copy-id root@192.168.0.201
    建议用这个命令来实现无密码公钥登陆,因为用“scp”命令把公钥拷贝到远程主机后,不会把authorized_keys文件的权限修改成“600”,在某些linux版本下是无法实现基于公钥登陆的。
     
    wKioL1LbXg6i3chIAAWteYRXX8g912.jpg
     
     

     对于openssh,我们需要关注的配置文件分为两类,一类是公共配置文件,另一类是私有配置文件。公共配置文件又分为服务端的配件文件和客户端的配置文件。

    /etc/ssh/sshd_config   #服务端配置文件

    /etc/ssh/ssd_config    #客户端配置文件

    ~/.ssh/*               #私有配置文件

    我们主要关注的是服务端的配置文件和私有配置文件。

     

    SSH的配置文件主要分为服务器端和客户端:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
         服务器端:/etc/ssh/sshd_config
         客户端:/etc/ssh/ssh_config
     1.限制root用户远程登录
         # vi /etc/ssh/sshd_config
         PermitRootLogin no
     2.通过控制用户访问限制 SSH 访问
         # vi /etc/ssh/sshd_config
         AllowUsers fsmythe bnice swilson
         DenyUsers jhacker joebadguy jripper
     3.# vi /etc/ssh/sshd_config
         Protocol 2
     4.不要支持闲置会话,并配置 Idle Log Out Timeout 间隔:
    #当客户端连上服务器端后,若没有任何操作则,服务器端默认会
    #每隔一定时间发送一个alive消息给客户端寻求客户端应答,
    #默认一共发三次.若都没有回应,则断开连其中           
    #ClientAliveInterval设置每隔多少秒发送一次alive消息
    #ClientAliveCountMax 设置一共发多少次.
         # vi /etc/ssh/sshd_config
         ClientAliveInterval 600     
         # (Set to 600 seconds = 10 minutes)
         ClientAliveCountMax 0
     5.禁用基于主机的身份验证:(这种认证方式是不安全的)
         # vi /etc/ssh/sshd_config
         HostbasedAuthentication no
     6.使用 Chroot SSHD 将 SFTP 用户局限于其自己的主目录
         # vi /etc/ssh/sshd_config
         ChrootDirectory /home/%u
     7.禁用空密码:
         # vi /etc/ssh/sshd_config
         PermitEmptyPasswords no
     8.指令压缩
         Compression {yes|no|delayed}
     #默认是delayed 意思就是等到用户认证结束后再对数据进行压缩
     9.设置日志级别
     #LogLevel INFO 默认是INFO级别,调试的时候可以选择DEBUG
     #级别,这样调试信息更加详细
     10.支持图形界面操作
         X11Forwarding yes
     #对Xwindows的数据进行转发,开启该项并使用xshell程序远程登
     #录服务器是可以打开图形界面程序

    其它选项:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    PrintMotd no            
    # 登入后是否显示出一些信息呢?例如上次登入的时间、地点等,预设是 yes ,但是,如果为了安全,可以考虑改为 no !
    PrintLastLog yes     
    # 显示上次登入的信息!可以啊!预设也是 yes !
    KeepAlive yes    
    # 一般而言,如果设定这项目的话,那么 SSH Server 会传送
    # KeepAlive 的讯息给 Client 端,以确保两者的联机正常!
    # 在这个情况下,任何一端死掉后, SSH 可以立刻知道!而不会
    # 有僵尸程序的发生!
    Banner /to/somefile
    # 指定在用户完成认证前输出到终端的信息
    GSSAPIAuthentication no
    #指定是否使用基于GSSAPI的用户认证默认为no
    MaxAuthTries 默认值为6
    #每一个链接最多尝试验证的次数为这个值得一半,此外失败的信息还会记录在/var/log/message
    UseDNS yes
    #是否对主机名进行dns解析(常用与没有固定IP只有域名的场合)

     

     
     

    1.生成密钥(客户端操作)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@wwww ~]# ssh-keygen -t rsa -b 4096
    #-t 指定生成密钥的算法 -b指定密钥的位数
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa):
    #询问生成的密钥放在的位置,默认放在家目录下的.ssh目录
    Enter passphrase (empty for no passphrase):
    #询问是否对私钥再进行加密
    Enter same passphrase again:
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    e7:60:45:fe:d8:09:24:c1:1e:ef:35:cc:c1:c3:24:e4 root@wwww.axhu.com
    #生成的指纹信息

    注: 这里使用ssh-keygen -t rsa -b 4096 -f /path/to/KEY_FILE -P '指定加密私钥的密码' 这样既可实现自动化,不要交互了

    2.传送密钥至远程服务器
    有两种实现方式:
       方式一:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [root@wwww ~]# scp ~/.ssh/id_rsa.pub root@192.168.157.132:~/
    The authenticity of host '192.168.157.132 (192.168.157.132)' can't be established.
    RSA key fingerprint is 6e:0f:f8:f8:c7:c2:11:e6:4d:99:aa:16:6a:81:4a:02.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.157.132' (RSA) to the list of known hosts.
    root@192.168.157.132's password:
    id_rsa.pub                                                                                   100%  740     0.7KB/s   00:00
    然后远程连接到远程主机进行设置:
    [root@wwww ~]# ssh root@192.168.157.132
    root@192.168.157.132's password:
    Last login: Sat Jan 18 21:16:49 2014 from 192.168.157.128
    [root@bogon ~]# mkdir .ssh
    #这个目录默认不存在,但是这太机子若连接过其他服务器就会自动生成.ssh目录用来保存known_hosts文件
    [root@bogon ~]# chmod 700 .ssh
    #这个权限很重要,设置不对的话是没法通过验证
    [root@bogon ~]# cat id_rsa.pub >> ~/.ssh/authorized_keys
    #这里最好每次都是以>>追加的形式输出,不然会覆盖其他主机的公钥
    [root@bogon ~]# chmod 600 ~/.ssh/authorized_keys
    #修改权限放在其他用户修改查看
    到此配置完成


       方式二:

    1
    2
    3
    4
    5
    6
    [root@wwww ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.157.132
    root@192.168.157.132's password:
    Now try logging into the machine, with "ssh 'root@192.168.157.132'", and check in:
      .ssh/authorized_keys
    to make sure we haven't added extra keys that you weren't expecting.
    #直接通过命令完成.推荐使用,但是并不是每台机器上都会装有这个命令.

     

     

     

  • 相关阅读:
    js图片飘动
    实战ASP.NET大规模网站架构:Web加速器(1)【转】
    DNS服务器设置详解
    Lucene:基于Java的全文检索引擎简介【转】
    传道解惑 软件开发技术名词解密(转载)
    UTF8 and Unicode FAQ
    高并发 高负载 网站系统架构 !深入讨论!【转载】
    (转)值的关注的Java开源项目
    MSDN:Webcast 系列课程
    ASP.NET MVC 学习网站
  • 原文地址:https://www.cnblogs.com/kex1n/p/5220823.html
Copyright © 2011-2022 走看看