服务器 频道

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

    【IT168 专稿】前文(点击)介绍如何建立OPENSSH远程登录服务器,下面介绍如何加固OPENSSH服务器。

五、加固OPENSSH服务器

    1.SSH服务器面临的安全隐患

    (1) 软件漏洞

    因为早期的OpenSSH版本(3.0.0版本)存在安全漏洞。2003年9月,在类Unix的世界里也出现了一个严重的漏洞:Openssh的溢出漏洞。Openssh是远程终端登录软件,运行在类Unix上。几乎所有的类Unix发行版本都把这个软件作为缺省安装。因此这个软件出现溢出漏洞影响了几乎所有的类Unix操作系统。

    (2) 口令暴力破解

    Openssh服务面临的另外一个威胁是黑客采取暴力破解的方式获取用户密码而非法登录SSH服务器。

    (3) SSH所不能保护的网络攻击

    SSH并不能堵住所有其他端口上的全部漏洞。如果有人通过Telnet攻击你的网络,端口号为23,SSH就不能提供安全保护,因为SSH运行在另外一个端口。另外一个例子是NFS(NetworkFileSystem,网络文件系统)。如果有人借助NFS安装了根目录,那么你的计算机就会很危险。而且,SSH不能制止特洛伊木马或拒绝服务(denial-of-service,DoS)类型的攻击。

    (4)OpenSSH中可能安放有特洛伊木马

    在免费的SSH(SecureShell)软件套件“OpenSSH”中可能被安放了特洛伊木马。如果编译包含特洛伊木马的OpenSSH源代码,就可能从外部在机器上执行任意指令。有可能包含特洛伊木马的产品包括“openssh-3.4p1.tar.gz”、“openssh-3.4.tgz”和“openssh-3.2.2p1.tar.gz”。凡是在7月30日以后下载Openssh的用户都必须重新进行确认。如果编译包含此次警告的特洛伊木马的Openssh的源代码文件,那么特洛伊木马就会在机器上运行。该特洛伊木马每一个小时会试图连接一次某个特定IP地址的TCP端口:6667。TCP端口6667是IRC(InternetRelayChat)服务器通常所使用的端口。该服务器与特洛伊木马的连接完成之后,就会在服务器上执行任意的指令。此时的访问权限与编译Openssh的用户相同。据CERT/CC表示,利用文件的时间标记及尺寸来判断文件是否包含了特洛伊木马还不够。推荐使用MD5检查和PGP签名进行确认。

    2.SSH服务器安全策略
 
    (1) 升级旧版本

    升级陈旧的OpenSSH版本,因为早期的OpenSSH版本(3.0.0版本)存在的安全漏洞。2003年9月,在类Unix的世界里也出现了一个严重的漏洞:Openssh的溢出漏洞。Openssh是远程终端登录软件,运行在类Unix上。几乎所有的类Unix发行版本都把这个软件作为缺省安装。因此这个软件出现溢出漏洞影响了几乎所有的类Unix操作系统。Redhatlinux描述此漏洞的页面网址是:rhn.redhat.com/errata/RHSA-2003-279.html。特别是对于一个新配置的OpenSSH服务器来说使用最新稳定版本是最明智的选择,可以在其官方网站(http://www.openssh.com/)下载其源代码进行编译。最新版本是2005年9月1日发布4.2。

    (2)使用xinetd模式运行OpenSSH

    OpenSSH能以Stand-alone、xinetd两种模式运行,当用户账号比较少又经常需要连接到SSH服务器时推荐使用xinetd模式运行。使用xinetd方式运行ProFTPD可以有效防范DoS攻击。xinetd模式工作原理见:“教你配置安全的ProFTPD服务器(中),网络链接:http://publish.it168.com/2006/0905/20060905002801.shtml?positioncode=970 ”。使用xinetd方式运行sshd的步骤:

  • 检查确省运行情况
    确省情况下sshd以stand-alone工作模式运行,可以使用“psaux|grepsshd”命令查看是否正在运行,然后使用命令“/etc/rc.d/init.d/sshdstop”中止运行。
  • 创建配置文件/etc/xinetd.d/sshd,代码如下:
    servicessh
    {socket_type=stream
    wait=no
    user=root
    instances=20
    cps=2560
    server=/usr/local/sbin/sshd
    server_args=-i
    log_on_success+=DURATIONUSERID
    log_on_failure+=USERID
    nice=10}
  • 重新启动xinetd配置
    killall-USR1xinetd

    (3)使用使用BlockHosts对抗暴力破解

    Openssh服务面临的另外一个威胁是黑客采取暴力破解的方式获取用户密码而非法登录FTP服务器。BlockHosts软件就是利用通过分析日志文件帮助tcp_wrappers实现工作自动化。例如在30秒钟内一个IP地址(192.168.1.23)连续20次登录sshd服务器而且全部因为密码错误登录失败。那么这个IP地址无疑是非法或者恶意主机。这时BlockHosts会自动将该IP地址写入/etc/hosts.deny文件。首先编辑你的/etc/syslog.conf文件,一般修改security.*/var/log/security条目内容如下:
security.*;auth.info/var/log/security原因很简单,这样syslogd就把连接到sshd的日志信息记录下来。

    BlockHosts官方网站:http://www.aczoom.com/cms/blockhosts/,最新版本:1.0.0。BlockHosts启动方法:pythonsetup.py BlockHosts是基于命令行模式的,使用非常简单这里就不赘述了。

    (4)使用TCP会绕程序

    它是针对一系列对荷兰埃因霍温理工大学的系统攻击,WietseVenema开发了一个名为TCPWrappers的简单而优美的工具来控制和监测到来的网络传输。TCPWrappers修正调用网络服务的xinetd方法。它通过对FTP和Telnet这些缺省的网络服务程序进行“包装”来开展工作。当建立了一个连接时,最先调用TCPWrappers而不是缺省服务。它对到来的连接进行简单访问控制(通过两个文件—/etc/hosts.allow和/etc/host.deny),记录远程主机的名字,然后运行原来的网络服务程序。

    TCP会绕程序(TCPwrappers)为多项服务提供访问控制。多数现代的网络服务,如SSH、Telnet和FTP,都使用TCP会绕程序。该会绕程序位于进入请求和被请求服务之间。tcp_wrapper可以用来禁止(或者显式的允许)特定的主机对某些服务的访问。简单的说,它的工作原理是这样的:inetd或xinetd运行很多的服务,其中很多都是由tcpd包装好的。换句话说,tcpd是真正运行这些服务的程序,但是inetd或xinetd不知道这些(其实它根本不关心)。tcpd根据/etc/hosts.allow和/etc/hosts.deny来判断是否允许传来的连接请求。tcp_wrapper工作原理见图3。
 

图3 tcp_wrapper工作原理


    tcp_wrappers的应用思路是“先放行、后阻止”。对我们Linux 用户来讲比较幸运的是,大多数Linux发行版本中TCP Wrappers 默认已经安装,我们所要作的就是编辑/etc/hosts.allow 和/etc/hosts.deny 这两个文件,它们决定了谁能访问系统和谁不能访问系统。默认情况下,Linux 允许来自任何地方的连接,所以你需要修改配置,根据以下两个原则:

    1)尽量使用IP,不要使用域名,域名比IP地址更具有欺骗性。
    2)编辑/etc/hosts.deny,禁止来自任何地方对所有服务的访问。语法为:
    ALL:ALL,然后在/etc/hosts.allow中添加某些允许访问的主机。

    应用实例:
    所以我们先把 /etc/host.deny设定为:
    ALL: ALL
    假设我要允许192.168.10.2的主机使用ssh的服务的话,可以在 /etc/hosts.allow中设定
    sshd: 192.168.10.2如果是整个网段的话,就设定为
    sshd: 192.168.10.0/255.255.255.0
    或者是你可以使用网域的名称
    ssh: .ossii.com.cn
    如果同一笔数据中有多个位置,可以用 ”,” 分开,例如:
    sshd: 192.168.10.2, 10.0.0.120, 192.168.20.0/255.255.255.0, ossii.com.cn.

    (5)管理SSH监听端口

    在Linux上使用广泛的SSH服务器软件sshd也提供相应的监听端口控制选项。在sshd_config(默认路径是/etc/ssh/sshd_config)文件中,Port 22是sshd监听的端口,即为连接到主机时需要使用的端口。使用以下代码可以指定sshd监听的接口地址:

    ListenAddress 192.168.0.254

    (6)关闭telnet服务

    在OPENSSH服务器一定要关闭telnet服务。如果有人通过Telnet攻击你的网络,端口号为23,SSH就不能提供安全保护,因为SSH运行在另外一个端口。一般新的Linux发行版本已经自动关闭这个服务。查看方法如下:

#cat /etc/xinetd.d/telnet
service telnet
{       disable = yes     #yes即表示关闭#
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID }


    (7)禁止 root 用户的登录SSH服务器:

    任何时候,不许 root用户 以远程联机的方式登入,所以这里建议大家直接将 root 的登入权限拿掉。所以,可以修改 /etc/ssh/sshd_config 这个档案的内容为:

[root@test root]# vi /etc/ssh/sshd_config
PermitRootLogin no      #将其改成 no  #
[root@test root]# /etc/rc.d/init.d/sshd restart  #重新启动 #

    (8)启用防火墙保护OPENSSH服务器

    SSH 和 CIPE 之类的安全服务可以用于到 LAN 服务的加密远程连接。对于拥有基于 PPP 资源(如调制解调器池或批量 ISP 帐号)的管理员来说,拨号进入可以被用来安全地避开防火墙,因为调制解调器连接是直接连接,通常位于防火墙/网关之后。 然而,对于有宽带连接的远程用户来说,你就需要制定些特殊规定。你可以配置 IPTables 接受来自远程 SSH 和 CIPE 客户的连接。例如,要允许远程 SSH 访问,你可以使用以下规则:

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p udp --sport 22 -j ACCEPT

    (9)使用Protocol 2 

    如果你没有使用SSH protocol (协议)1的机会, 这里建议你关闭protocol 1的使用,因为ssh protocol 1不如protocol 2安全, 还可以有效的阻止攻击者通过修改包携带的版本banner来劫持(hijacking)启动 会话进程并降级你到protocol 1,理论上可以迫使使用ssh 1 协议来通信。你必须注释掉Protocol 2,1而使用下面的一行来代替: 

    Protocol 2 

    (10)不使用r系列命令

    伯克利版本的r命令集是UNIX的一个完整的部分。最初,伯克利版本的r命令集是为了提高Telnet的安全性而开发的,使用时不必在网上以明码方式输入密码(那时它是非常成功的)。r服务也提供了主机名或IP地址认证,Telnet却不能做到这些。r命令的主机名和用户名认证标志着伯克利服务是在网络安全连接方面有着重大影响的一步。遗憾的是,通过主机名和IP地址认证方式来提高连接的安全性是不可靠的。攻击者开始使用一些已经公开的能够绕过r命令认证机制的IP地址,这就使得攻击者可以从他们自己的主机上发送数据包,并假装是你,而实际上你攻击者被欺骗者的系统根本就没有发送这些包,这就是所谓的IP欺骗技术。伯克利版本的r命令引用了一系列的文件,允许与另一个主机建立一种无缝连接。这些命令包括远程登录(rlogin)、远程shell(rsh)和远程拷贝(rcp)。

    (11)最后修改配置文件的属性,防止非授权用户修改配置文件:

    chmod 644 /etc/ssh/sshd_config
    Linux系统是一个典型的多用户系统,不同的用户处于不同的地位。为了保护系统的安全性,Linux系统对不同用户访问同一文件的权限做了不同的规定。对于一个Linux系统中的文件来说,它的权限可以分为三种:读的权限、写的权限和执行的权限,分别用r、w和x表示。不同的用户具有不同的读、写和执行的权限。对于一个文件来说,它都有一个特定的所有者,也就是对文件具有所有权的用户。同时,由于在Linux系统中,用户是按组分类的,一个用户属于一个或多个组。文件所有者以外的用户又可以分为文件所有者的同组用户和其它用户。因此,Linux系统按文件所有者、文件所有者同组用户和其它用户三类规定不同的文件访问权限。图4是在笔者机器上的/sshd目录下运行ls -l命令的查看sshd_config文件的权限情况。 
 

图4 sshd_config文件的权限


    在组群右侧的信息包括文件大小、创建的日期和时间,以及文件名。第一列显示了当前的权限;它有十位。第一位代表文件类型。其余九位实际上是用于三组不同用户的三组权限。sshd_config文件的权限:

    -rw-r--r--    1 test test     39 3月 11 12:04 sshd_config

    每种权限设置都可以用一个数值来代表:

    r = 4 ;w = 2 ;x = 1 ;- = 0

    当这些值被加在一起,它的总和便用来设立特定的权限。譬如,如果你想有读取和写入的权限,你会得到一个值为 6 的总和;4(读取)+ 2(写入)= 6。

    sshd_config文件的数字权限设置如下:

(rw-)   (r--)  (r--)
  |       |      |
 4+2+0   4+0+0  4+0+0

    所有者的总和为六,组群的总和为四,其他人的总和为四。这个权限设置读作 644。 这里是一个某些常用设置、数值、以及它们的含义的列表:

-rw------- (600) — 只有所有者才有读取和写入的权限。
-rwx------ (700) — 只有所有者才有读取、写入、和执行的权限。
-rwxr-xr-x (755) — 所有者有读、写、和执行的权限;组群和其他人只有读取和执行的权限。
-rwx--x--x (711) — 所有者有读取、写入、和执行权限;组群和其他人只有执行权限。
-rw-rw-rw- (666) — 每个人都能够读取和写入文件。(请谨慎使用这些权限。)
-rwxrwxrwx (777) — 每个人都能够读取、写入、和执行。(这种权限设置可能会很危险。)

    到此为止我们已经加固OPENSSH的远程登录服务器。下篇将介绍如何使用Linux和windows的客户端安全登录OPENSSH服务器,敬请关注。

0
相关文章