服务器 频道

如何构建安全的远程登录服务器(上)

    【IT168 专稿】在企业通常的使用环境中,服务器放在ISP托管中心或其服务器机房内,只有少数管理员能进入并接触到服务器。因此管理员通常会在服务器上开启Telnet服务守护进程,以便能够随时观察服务器上的变化,并登录到服务器上进行维护;如果管理员需要在服务器调试程序,还会开启FTP服务进程,从本地机上传程序到服务器进行调试。在异构网络中,很多用户选择Linux作为网络操作系统,利用其简单的配置和用户熟悉的图形界面提供Internet服务,Telnet便是其提供的服务之一。

    Telnet最基本应用就是 用于Internet的远程登录,共享远程系统中的资源。它可以使用户坐在已上网的电脑键盘前通过网络进入的另一台已上网的电脑,并负责把用户输入的每个字符传递给主机,再将主机输出的每个信息回显在屏幕上。这种连通可以发生在同一房间里面的电脑或是在世界各范围内已上网的电脑。Telnet服务与其他网络应用一样属于客户机/服务器模型,一旦连通后,客户机可以享有服务器所提供的一切服务。可见这种终端的服务对网络管理员来说非常重要。

一、 传统远程登录安全隐患

     但是传统的网络服务程序telnet在本质上都是不安全的,因为它在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。

    所谓“中间人”的攻击方式,就是“中间人”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”转手后做了手脚之后,就会出现很严重的问题。

二、  SSH能保护什么

    SSH可以防止IP地址欺骗、DNS欺骗和源路径攻击。SSH提供给用户身份认证的主要方法就是使用公共密钥加密法。根据所用SSH版本的不同,可以采用RSA或者Diffie-Helman和数字签名标准来实现。也可以选择使用各种不同的身份认证方法,包括公共密钥法、rhosts/shosts认证法和密码认证,这些方法都很简单安全。的确,利用SSH即便是使用.rhosts认证方式也能确保安全性。

    SSH所提供的是通过网络进入某个特定账号的安全方法。每个用户都拥有自己的RSA密钥。通过严格的主机密钥检查,用户可以核对来自服务器的公共密钥同先前所定义的是否一致。这样就防止了某个用户访问一个他没有相应公共密钥的主机。注意如果你想了解更多有关RSA、公共密钥加密和身份认证的知识,只需进行很小的修补,SSH就能保护一些不安全的连接,如X窗口。这将帮助你提高所管理的网络连接的安全性。

    由于SSH提供了主机身份认证,利用公共密钥而不是IP地址,所以它使网络更加安全可靠,并且不容易受到IP地址欺骗的攻击。这有助于辨认连接到你系统上的访问者身份,从而防止非法访问者登录到你的系统中。如果用户或系统打算采用rhosts/shosts的身份认证方式,主机就面临着公共密钥和私人密钥信息交换的挑战。否则,就得使用其他认证方式。

    在认证发生之前,会话已经通过对称密钥技术进行了加密,如DES、三重DES、IDEA、Twofish或Blowfish。这就使得会话自身被加密,从而防止了别人在你输入或同别人聊天时截取你的信息。同时也意味着你所输入的密码不会被他人读取,因为它也被加密了。加密技术基本上可以防止有人监听你的数据,同时也确保了数据的完整性,即防止有人肆意篡改你的信息和数据。表1列出了SSH所能防范的网络攻击。

表1 SSH可以防范的网络攻击类型

 

三、 SSH服务器和客户端工作流程

    SSH服务器和客户端工作流程见下图。

图1 SSH服务器和客户端工作流程

    1. SSH客户端发出请求连接SSH服务器;
    2. SSH检查申请SSH客户端数据包和IP地址;
    3. SSH服务器通过安全验证后发送密钥给ssh客户;
    4. 本地sshd将密钥发服务器回远程sshd 服务器。

    至此为止ssh客户端和远程SSH服务器建立了一个加密会话。

    SSH的安全验证方式

    用户通过SSH可以把所有传输的数据进行加密,使“中间人”的攻击方式不可能实现,而且也能够防止DNS和IP欺骗。它还有一个额外的好处是传输的数据是经过压缩的,可以加快传输的速度。SSH作用广泛,既可以代替Telnet,又可以为FTP、POP,甚至为PPP提供一个安全的“通道”。SSH协议在预设的状态中,提供两个服务器功能:一个是类似Telnet的远程联机使用Shell服务器,即俗称SSH功能;另一个是类似FTP服务的SFTP-Server功能,可提供更安全的FTP服务。

    SSH的安全验证如何工作呢?主要依靠联机加密技术。从客户端来看,有以下两种安全验证级别:

    1.基于口令的安全验证(ssh1) 只要知道自己的账号和口令,就可以登录到远程主机。所有传输的数据都将被加密,但是不能保证正在连接的服务器就是想要连接的服务器。可能受到“中间人”的攻击。

    2.基于密匙的安全验证(ssh2) 需要依靠密匙,即用户必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用密匙进行安全验证。服务器收到请求之后,先在该服务器的home目录下寻找公用密匙,然后把它和发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge),并把它发送给客户端软件。客户端软件收到“质询”后,就可以用私人密匙解密再把它发送给服务器。使用这种方式,用户必须知道自己密匙的口令。与第一种级别相比,这种级别不需要在网络上传送口令,不仅加密所有传送的数据,而且阻止了“中间人”攻击方式。整个登录的过程一般需要10秒。

四、安装配置OPENSSH服务器

    SSH(Secure Shell)是以远程联机服务方式操作服务器时的较为安全的解决方案。它最初由芬兰的一家公司开发,但由于受版权和加密算法的限制,很多人转而使用免费的替代软件OpenSSH。SSH是由客户端和服务端的软件组成的,有两个不兼容的版本,分别是:1.x和2.x。用SSH 2.x的客户程序是不能连接到SSH 1.x的服务程序上去的。OpenSSH 2.x同时支持SSH 1.x和2.x

     1. 安装与启动OpenSSH 

    在Red Hat Linux 7以及其上的发行版本中已经包含了与OpenSSH相关的软件包,如果没有,则可以从OpenSSH的主页下载RPM包自行安装,OpenSSH的主页是地址是: http://www.openssh.com 。首先查询系统是否安装了软件包。

    #rpm -qa |grep openssh

    如果没有安装则执行如下命令。

    #rpm -ivh openssh-3.5p1-6
    #rpm -ivh openssh-server-3.5p1-6
    #rpm -ivh openssh-askpass-gnome-3.5p1-6
    #rpm -ivh openssh-clients-3.5p1-6
    #rpm -ivh openssh-askpass-3.5p1-6

    安装完成之后,可以使用下述命令中的进行启动。

    #service sshd start

    查看opensshd进程和端口号是否正常,使用下面命令,结果见图2:

    # netstat -nutap | grep dhcpd;ps -ef | grep dhcpd
 

图2查看opensshd进程和端口号是否正常


    另外,如果想在系统启动时就自动运行该服务,那么需要使用命令:

    #chkconfig -level 345 sshd on

    重新启动OpenSSH服务器命令:

    #/etc/rc.d/init.d/sshd restart

    停止OpenSSH服务器命令:

    #/etc/rc.d/init.d/sshd stop

    查看目前OpenSSH服务器状态命令:

    #/etc/rc.d/init.d/sshd status

    2. 理解OPENSSH修改配置文件

    /etc/ssh/sshd_config

    配置“/etc/ssh/sshd_config”文件是OpenSSH的配置文件,允许设置选项改变这个守护进程的运行。这个文件的每一行包含“关键词-值”的匹配,其中“关键词”是忽略大小写的。下面列出来的是最重要的关键词,用man命令查看帮助页(sshd (8))可以得到详细的列表。编辑“sshd_config”文件(vi /etc/ssh/sshd_config),加入或改变下面的参数:


 
    下面逐行说明上面的选项设置:

    Port 22 :“Port”设置sshd监听的端口号。
    ListenAddress 192.168.1.1 :“ListenAddress”设置sshd服务器绑定的IP地址。
    HostKey /etc/ssh/ssh_host_key :“HostKey”设置包含计算机私人密匙的文件。
    ServerKeyBits 1024:“ServerKeyBits”定义服务器密匙的位数。
    LoginGraceTime 600 :“LoginGraceTime”设置如果用户不能成功登录,在切断连接之前服务器需要等待的时间(以秒为单位)。
    KeyRegenerationInterval 3600 :“KeyRegenerationInterval”设置在多少秒之后自动重新生成服务器的密匙(如果使用密匙)。重新生成密匙是为了防止用盗用的密匙解密被截获的信息。
    PermitRootLogin no :“PermitRootLogin”设置root能不能用ssh登录。这个选项尽量不要设成“yes”。
    IgnoreRhosts yes :“IgnoreRhosts”设置验证的时候是否使用“rhosts”和“shosts”文件。
    IgnoreUserKnownHosts yes :“IgnoreUserKnownHosts”设置ssh daemon是否在进行RhostsRSAAuthentication安全验证的时候忽略用户的“$HOME/.ssh/known_hosts”
    StrictModes yes :“StrictModes”设置ssh在接收登录请求之前是否检查用户家目录和rhosts文件的权限和所有权。这通常是必要的,因为新手经常会把自己的目录和文件设成任何人都有写权限。
    X11Forwarding no :“X11Forwarding”设置是否允许X11转发。
    PrintMotd yes :“PrintMotd”设置sshd是否在用户登录的时候显示“/etc/motd”中的信息。
    SyslogFacility AUTH :“SyslogFacility”设置在记录来自sshd的消息的时候,是否给出“facility code”。
    LogLevel INFO :“LogLevel”设置记录sshd日志消息的层次。INFO是一个好的选择。查看sshd的man帮助页,已获取更多的信息。
    RhostsAuthentication no :“RhostsAuthentication”设置只用rhosts或“/etc/hosts.equiv”进行安全验证是否已经足够了。
    RhostsRSAAuthentication no :“RhostsRSA”设置是否允许用rhosts或“/etc/hosts.equiv”加上RSA进行安全验证。
    RSAAuthentication yes :“RSAAuthentication”设置是否允许只有RSA安全验证。
    PasswordAuthentication yes :“PasswordAuthentication”设置是否允许口令验证。
    PermitEmptyPasswords no:“PermitEmptyPasswords”设置是否允许用口令为空的帐号登录。
    AllowUsers admin :“AllowUsers”的后面可以跟着任意的数量的用户名的匹配串(patterns)或user@host这样的匹配串,这些字符串用空格隔开。主机名可以是DNS名或IP地址。

     /etc/ssh/ssh_config

    配置“/etc/ssh/ssh_config”文件是OpenSSH系统范围的配置文件,允许你通过设置不同的选项来改变客户端程序的运行方式。这个文件的每一行包含“关键词-值”的匹配,其中“关键词”是忽略大小写的。

    下面列出来的是最重要的关键词,用man命令查看帮助页(ssh (1))可以得到详细的列表。 

    编辑“ssh_config”文件(vi /etc/ssh/ssh_config),添加或改变下面的参数: 

 
    下面逐行说明上面的选项设置:

    Host * :选项“Host”只对能够匹配后面字串的计算机有效。“*”表示所有的计算机。 

ForwardAgent no :“ForwardAgent”设置连接是否经过验证代理(如果存在)转发给远程计算机。 

    ForwardX11 no :“ForwardX11”设置X11连接是否被自动重定向到安全的通道和显示集(DISPLAY set)。 

    RhostsAuthentication no :“RhostsAuthentication”设置是否使用基于rhosts的安全验证。 

    RhostsRSAAuthentication no :“RhostsRSAAuthentication”设置是否使用用RSA算法的基于rhosts的安全验证。 

    RSAAuthentication yes :RSAAuthentication”设置是否使用RSA算法进行安全验证。 

    PasswordAuthentication yes :“PasswordAuthentication”设置是否使用口令验证。 

    FallBackToRsh no:“FallBackToRsh”设置如果用ssh连接出现错误是否自动使用rsh。 

    UseRsh no :“UseRsh”设置是否在这台计算机上使用“rlogin/rsh”。 

    BatchMode no :“BatchMode”如果设为“yes”,passphrase/password(交互式输入口令)的提示将被禁止。当不能交互式输入口令的时候,这个选项对脚本文件和批处理任务十分有用。 

    CheckHostIP yes :“CheckHostIP”设置ssh是否查看连接到服务器的主机的IP地址以防止DNS欺骗。建议设置为“yes”。 

    StrictHostKeyChecking no :“StrictHostKeyChecking”如果设置成“yes”,ssh就不会自动把计算机的密匙加入“$HOME/.ssh/known_hosts”文件,并且一旦计算机的密匙发生了变化,就拒绝连接。 

    IdentityFile ~/.ssh/identity :“IdentityFile”设置从哪个文件读取用户的RSA安全验证标识。 

    Port 22 :“Port”设置连接到远程主机的端口。 

    Cipher blowfish :“Cipher”设置加密用的密码。 

    EscapeChar ~ :“EscapeChar”设置escape字符。 

    到此为止我们已经建立了基于OPENSSH的远程登录服务器,下篇文章中将介绍如何加固OPENSSH的远程登录服务器,敬请关注。

0
相关文章