当前位置:Linux教程 - Linux综合 - Linux应用:动手加固OpenSSH服务器(图)

Linux应用:动手加固OpenSSH服务器(图)

  为了进行远程管理Unix以及Linux服务器,远程登录服务器方法主要包括:Telnet、 FTP、 rlogin、 rsh、 rexec和ssh。其中ssh(Secure Shell)是以远程联机服务方式操作服务器时的较为安全的解决方案。它最初由芬兰的一家公司开发,但由于受版权和加密算法的限制,很多人转而使用免费的替代软件OpenSSH。它用安全、加密的网络连接工具代替了 telnet、ftp、rlogin、rsh 和 rcp 工具。OpenSSH 支持 SSH 协议的版本 1.3、1.5、和 2。使用 OpenSSH 工具将会增进你的系统安全性。 所有使用 OpenSSH 工具的通讯,包括口令,都会被加密。 telnet 和 ftp 使用纯文本口令,并被明文发送。这些信息可能会被截取,口令可能会被检索,然后未经授权的人员可能会使用截取的口令登录进你的系统而对你的系统造成危害。你应该尽可能地使用 OpenSSH 的工具集合来避免这些安全问题。    OpenSSH相对Telnet、FTP、rlogin、rsh、rexec这些服务来说比较安全。但是需要看到OpenSSH服务也面临一些安全隐患:但是OpenSSH目前存在几个安全遗患:口令、密匙破解(SSH可以允许任何人只要保持密码框空白并按回车键,就可远程登录密码为两个字符的某一帐户。)以及部分OpenSSH发行版本中可能被安放木马(相关链接:http://network.ccidnet.com/pub/disp/Article?columnID=239&articleID=21882&pageNO=1 ),以及拒绝服务攻击。本文将介绍如何加固OpenSSH服务器。    一、升级旧版本    升级陈旧的OpenSSH版本,因为早期的OpenSSH版本(3.0.0版本)存在的安全漏洞。2003年9月,在类Unix的世界里也出现了一个严重的漏洞:Openssh的溢出漏洞。Openssh是远程终端登录软件,运行在类Unix上。几乎所有的类Unix发行版本都把这个软件作为缺省安装。因此这个软件出现溢出漏洞影响了几乎所有的类Unix操作系统。Redhat linux描述此漏洞的页面网址是:rhn.redhat.com/errata/RHSA-2003-279.Html。特别是对于一个新配置的OpenSSH服务器来说使用最新稳定版本是最明智的选择,可以在其官方网站(http://www.openssh.com/ )下载其源代码进行编译。最新版本是2005年9月1日发布4.2。    二、使用xinetd模式运行OpenSSH    OpenSSH能以Stand-alone、xinetd两种模式运行,当用户账号比较少又经常需要连接到ProFTPD服务器时推荐使用xinetd模式运行。使用xinetd方式运行ProFTPD可以有效防范DoS攻击。xinetd模式工作原理见:深入了解Linux的守护进程(daemons)(链接:http://www.ccw.com.cn/server/yyjq/htm2005/20050914_14ND5.htm )。    和stand-alone工作模式相比,系统不想要每一个网络服务进程都监听其服务端口。运行单个xinetd就可以同时监听所有服务端口,这样就降低了系统开销,保护系统资源。但是对于访问量大、经常出现并发访问时,xinetd想要频繁启动对应的网络服务进程,反而会导致系统性能下降。xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。能有效的防止拒绝服务攻击(Denial of Services):    1、限制同时运行的进程数    通过设置instances选项设定同时运行的并发进程数:    instances=20    当服务器被请求连接的进程数达到20个时,xinetd将停止接受多出部分的连接请求。直到请求连接数低于设定值为止。    2、限制一个IP地址的最大连接数    通过限制一个主机的最大连接数,从而防止某个主机独占某个服务。    per_source=5    这里每个IP地址可以连接单个IP地址的连接数是5个。    3、限制负载    xinetd还可以使用限制负载的方法防范拒绝服务攻击。用一个浮点数作为负载系数,当负载达到这个数目的时候,该服务将暂停处理后续的连接:    max_load = 2.8    上面的例子中当一项系统负载达到2.8时,所有服务将暂时中止,直到系统负载下降到设定值以下。说明要使用这个选项,编译时要加入--with-loadavg ,xinetd将而已处理max-load配置选项。从而在系统负载过重时关闭某些服务进程,来实现某些拒绝服务攻击。    4、限制所有服务器数目(连接速率)    xinetd可以使用cps选项设定连接速率,下面的例子:    cps = 25 60    第一个参数表示每秒可以处理的连接数,如果超过了这个连接数之后进入的连接将被暂时停止处理;第二个参数表示停止处理多少秒后继续处理先前暂停处理的连接。即服务器最多启动25个连接,如果达到这个数目将停止启动新服务60秒。在此期间不接受任何请求。    使用xinetd方式运行sshd的步骤:    (1)检查确省运行情况    确省情况下sshd以stand-alone工作模式运行,可以使用“ps aux grep sshd”命令查看是否正在运行,然后使用命令“/etc/rc.d/init.d/ sshd stop”中止运行。    (2)创建配置文件/etc/xinetd.d/sshd,代码如下:    service ssh  {  socket_type = stream  wait = no  user = root  instances=20  cps = 25 60  server = /usr/local/sbin/sshd  server_args = -i  log_on_sUCcess += DURATION USERID  log_on_failure += USERID  nice = 10  }    (3)重新启动xinetd配置    killall -USR1 xinetd    三、为sshd配置PAM    1、安装PAM模块    PAM简介:    PAM全称:Pluggable Authentication Module (嵌入式认证模块)。它最初有SUN公司开发;很快被Linux社区的接受,并且开发了更多的模块。其目标是提供一套可用于验证用户身份的函数库,从而将认证从应用程序开发中独立出来。Linux-PAM处理四种独立的(管理)工作。它们是: 认证管理; 帐号管理; 会话期间管理;和密码管理。    PAM工作方式:    1、调用某个应用程序,以得到该程序的服务。  2、PAM应用程序调用后台的PAM库进行认证工作。  3、PAM库在/etc/pam.d/目录中查找有关应用程序细节的配置文件,该文件告诉PAM,本应用程序使用何种认证机制。  4、PAM库装载所需的认证模块。  5、这些模块可以让PAM与应用程序中的会话函数进行通信。  6、会话函数向用户要求有关信息。  7、用户对这些要求做出回应,提供所需信息。  8、PAM认证模块通过PAM库将认证信息提供给应用程序。  9、认证完成后,应用程序做出两种选择:将所需权限赋予用户,并通知用户。认证失败,并通知用户。     图1 PAM工作流程。    PAM具体使用方法:    下面手工建立一个/etc/pam.d/ftp文件包括以下内容:    %PAM-1.0  auth required /lib/security/pam_stack.so service=system-auth  auth required /lib/security/pam_nologin.so  account required /lib/security/pam_stack.so service=system-auth  passWord required /lib/security/pam_stack.so service=system-auth  session required /lib/security/pam_stack.so service=system-auth    下面就可以使用PAM加固OpenSSH服务器。    四、使用TCP 会绕程序    TCP 会绕程序(TCP wrappers)为多项服务提供访问控制。多数现代的网络服务,如 SSH、Telnet 和 FTP,都使用 TCP 会绕程序。该会绕程序位于进入请求和被请求服务之间。 tcp_wrapper可以用来禁止(或者显式的允许)特定的主机对某些服务的访问。简单的说,它的工作原理是这样的:inetd或xinetd运行很多的服务,其中很多都是由tcpd包装好的。换句话说,tcpd是真正运行这些服务的程序,但是inetd或xinetd不知道这些(其实它根本不关心)。tcpd根据/etc/hosts.allow和/etc/hosts.deny来判断是否允许传来的连接请求。tcp_wrapper工作原理见图2。     tcp_wrappers的应用思路是“先阻止、后放行”。因此策略是首先禁止所有主机访问FTP服务器(在/etc/hosts.deny文件中设定),然后在/etc/hosts.allow中加入允许访问的主机或IP地址列表,这是最安全的访问策略。修改/etc/hosts.allow文件,注释掉"ALL : ALL : allow", 去掉其他无关控制访问,增加如下内容:    sshd : localhost : allow  sshd : friendlycomputer : allow  sshd : all : deny    五、修改确省配置文件    Sshd配置文件是/etc/ssh/sshd_config,如果你没有使用SSH protocol (协议)1的机会,这里建议你关闭pro tocol 1的使用,因为ssh protocol 1不如protocol 2安全, 还可以有效的阻止攻击者通过修改包携带的版本banner来劫持(hijacking)启动 会话进程并降级你到protocol 1,理论上可以迫使使用ssh 1 协议来通信。你必须注释掉Protocol 2,1而使用下面的一行来代替:    Protocol 2    另外SSH在运行的时候消耗比较多的内存,是个"耗粮"大户,这也是近来发现有关SSH存在拒绝服务攻击的原因。每一个连接使用一大块可观的内存,FreeBSD默认使用"MaxStartups"来管理,默认的值是一个比较健康的值,如:    MaxStartups 5:50:10    因为一个系统你除非有很多人管理系统或者提供SHELL服务,一般情况下这个值是足够了,MaxStartups不是意味着总的连接数,只是指还没有认证的连接数,这意味着,在任一(意)时刻, 多达5人可以(能)同时唤起登陆进程。    默认情况下Linux的OpenSSH配置关闭了空密码登陆,这里还建议里关闭X11Forwarding,你可以把X11Forwarding 这行改为:    X11Forwarding no    如果你的机器作为服务器在运行,就不需要安装X服务程序,因为使用了X11Forwarding on,就可能被受控制了的远程主机发送进程把自己attach你的 X11会话进程,从而可以记录击键记录,显示一些杂乱信息和捕获你的显示内容。强烈建议不使用静态密码,而使用DSA或者RSA KEY,你修改如下内容就可以关闭。    使用密码认证:    PasswordAuthentication no    你可以通过下面的方法来限制组用户或者光是单独用户来访问SHELL:    AllowGroups shellusers    设定root账号不能登录,这里将#号去掉并改成不允许root用ssh登录ssh服务器,因为利用root用户登陆是不明智的,因为它拥有太大的权限,在实际使用时应该会出现安全问题,方法:    將  #PermitRootLogin Yes  改成 PermitRootLogin no    端口22是sshd监听的端口,即为连接到主机时需要使用的端口。为了增加黑客探测sshd难度,可以把端口修改为其他数值,最好大于1024。    Port 1678    另外可以使用以下代码可以指定sshd监听的接口地址:    ListenAddress 192.168.0.254    这样,就可以避免向未知的人群提供此类登录服务。    最后修改配置文件的属性,防止非授权用户修改配置文件:    chmod 644 /etc/ssh/sshd_config    六、使用使用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启动方法:    python setup.py    BlockHosts是基于命令行模式的,使用非常简单这里就不赘述了。    总结:    以上介绍了如何六个方面加固Openssh服务器方法。无论哪种类型的服务,存在漏洞都是不可避免的,只是被发现的时间早晚问题。作为使用者,我们能做的只有密切关注漏洞的发布情况,并及时打安全补丁以加固服务器,才能保证自己所管理的网络不被黑客利用已经发现的漏洞攻击。
[1] [2] 下一页 

(出处:http://www.sheup.com)


上一页 [1] [2]