如何增长黑客经过ssh入侵的难度--保护ssh的三把锁

源文档:https://blog.csdn.net/cnbird2008/article/details/6130696前端

简介web

若是须要远程访问计算机并启用了 Secure Shell (SSH) 链接,黑客就会尝试突破您的防线并控制您的计算机,您必须接受这个事实。尽管不能保证计算机不会被 “黑客” 占领,可是一些简单的解决方案有助于保护 SSH,可让攻击困难一些。本文讨论三种技术:数据库

  1. 把 SSH 的标准端口改成不经常使用的值并加强 SSH 配置,从而挡住最简单的攻击。
  2. 定义有限的用户列表,只容许这些用户登陆。
  3. 彻底隐藏容许 SSH 访问的事实,要求根据特殊的 “敲门” 序列识别有效用户。

要想应用这些技术,须要可以访问根帐户。另外,可能必须安装一些包,须要配置防火墙和路由器(若是有路由器的话),打开和关闭特定的端口并把数据包转发到您的计算机。后端

增强保护安全

“隐匿产生安全” 这个概念尽人皆知并且受到你们的嘲笑,由于采用隐匿的方式,但愿没人了解您的方法,这只是一厢情愿的想法。可是,在某些场景中,隐匿一点儿会有帮助。尽管简单的措施没法阻止下定决心的黑客,可是至少可以挡住那些 “脚本小子”,他们的脚本每每水平很通常。服务器

人人都知道 SSH 链接的标准端口是 22。所以,为了让计算机更安全,应该采起的第一个措施是把端口改成另外一个不经常使用的非标准端口号,好比 22960。1024 以上的号码一般均可以使用,可是应该查阅参考资料以免致使问题。这一修改对您的影响仅仅是必须使用下面的命令链接计算机:网络

ssh -p 22960 your.machine.urlsession

为了实现这个小措施,只需在 /etc/ssh/sshd_config 文件中作简单的修改。编辑此文件(必须做为根用户),寻找 Port 22 行,把端口号改成您选择的号码(若是这一行以镑符 [#] 开头,表示它被注释掉了,那么应该取消注释标志)。保存文件,用/etc/init.d/sshd restart 命令从新启动 SSH。应该在防火墙上打开您选择的端口并关闭端口 22。ssh

可是,还能够更进一步。编辑配置文件,在其中包含 清单 1 所示的行。注意,其中一些行可能已经存在,可是能够把它们注释掉。tcp

清单 1. 经过修改 SSH 配置文件简便地加强安全性

Port 22960
LoginGraceTime 30
MaxAuthTries 3
Protocol 2
PermitRootLogin no

LoginGraceTime 容许一次登陆花费 30 秒;若是用户花费的时间超过 30 秒,就不容许他访问,必须从新登陆。MaxAuthTries 把错误尝试的次数限制为 3 次,3 次以后拒绝登陆尝试。上面的 Protocol 2 行禁止使用比较弱的协议。最后一行不容许任何人做为根用户登陆,这会让黑客攻击更困难。还可使用 DenyUsers、AllowUsers、DenyGroups 和 AllowGroups 选项实现其余限制。这些修改不会显著加强计算机的安全性,可是只尝试强力攻击标准端口 22 的通常脚本会失败,不会形成损害。不管如何,这是向正确的方向迈出了第一步。在本文后面,咱们将使用更安全的方法,不只修改端口号,并且彻底隐藏它。

谁能够进入?

对于大多数人,PAM 是一种罐装的烹调油。可是做为 Linux® 安全术语,PAM 表明可插入身份验证模块(Pluggable Authentication Modules)。这些模块提供额外的身份验证规则,保护对计算机的访问。

首先讨论一个基本问题:究竟为何要使用 PAM?若是每一个程序不得不定义本身的身份验证逻辑,就会很混乱。如何肯定全部应用程序都实现了相同的测试和检查?若是须要额外的控制手段,那么怎么办?难道要从新编写全部程序吗?在计算机科学领域,有时候能够用额外的一层解决全部问题,至少在安全方面是这样。若是一个程序须要验证用户的身份,它能够调用 PAM API。这个 API 负责执行在 PAM 配置文件中指定的全部检查。这种方法还容许方便地修改身份验证规则,全部感知 PAM 的程序都会自动地应用新规则,不须要修改它们的代码。若是但愿使用某种生物学检查(好比虹膜扫描器或指纹采集器),并且生产商提供了 PAM,就能够方便地设置它。在配置文件中包含模块调用,全部应用程序就可使用这个设备了。

配置 PAM

PAM 提供四个安全领域的特性,可是应用程序不太可能同时须要全部这些方面。例如,passwd 命令只须要下面列表中的第三组:

  • account 处理帐户限制。对于有效的用户,容许他作什么?
  • auth 处理用户识别 — 例如,经过输入用户名和密码。
  • password 只处理与密码相关的问题,好比设置新密码。
  • session 处理链接管理,包括日志记录。

在 /etc/pam.d 目录中为将使用 PAM 的每一个应用程序建立一个配置文件,文件名与应用程序名相同。例如,login 命令的配置文件是 /etc/pam.d/login。

必须定义将应用哪些模块,建立一个动做 “堆”。PAM 运行堆中的全部模块,根据它们的结果容许或拒绝用户的请求。还必须定义检查是不是必需的。最后,other 文件为没有特殊规则的全部应用程序提供默认规则。

  • optional 模块能够成功,也能够失败;PAM 根据模块是否最终成功返回 success 或 failure。
  • required 模块必须成功。若是失败,PAM 返回 failure,可是会在运行堆中的其余模块以后返回。
  • requisite 模块也必须成功。可是,若是失败,PAM 当即返回 failure,再也不运行其余模块。
  • sufficient 模块在成功时致使 PAM 当即返回 success,再也不运行其余模块。

配置文件的结构很简单。能够包含注释,注释以散列符 (#) 开头;经过在换行处加上反斜杠 (/),能够把长的行分为多行。行有三个字段:领域 (account、auth、password 或 session)、控制标志(optional、required、requisite 或 sufficient)、将运行的模块的路径和参数。注意,第二个字段能够更复杂;更多信息见 参考资料。另外,可使用 include 规则以包含其余文件中的规则,好比auth include common-account。

特殊的 /etc/pam.d/other 文件是 “默认的” 配置文件(见 清单 2),其中的规则自动地应用于没有本身的配置文件的全部应用程序。为了确保安全,应该快速检查 /etc/pam.d 目录,把您不使用的全部配置文件改成其余名称(这样就会使用 other 配置)。若是认为确实须要某个应用程序,那么只需把配置文件改回原来的名称。默认配置一般拒绝全部请求(经过使用 pam_deny.so 模块)并警告管理员(经过 pam_warn.so 模块),让管理员解决问题。

标准的 “other” 配置文件为没有本身的配置文件的全部应用程序提供安全的默认规则(拒绝全部请求)。

清单 2. 标准的 “other” 配置文件

account required pam_deny.so
auth required pam_deny.so
auth required pam_warn.so
password required pam_deny.so
password required pam_warn.so
session required pam_deny.so

若是把 pam_deny.so 替换为 pam_unix.so,就应用标准的身份验证方法(输入用户名和密码)。若是您不关心安全性,那么使用pam_permit.so,这会容许任何请求!

一些可用方法

尽管没有标准的模块列表,可是全部发行版都包含如下模块中的大多数。请检查驻留模块的 /lib/security 或 /usr/lib/security 目录。对于 64 位操做系统,用 lib64 替换 lib。若是须要更多信息,能够尝试执行 man the.name.of.the.module,而不要直接执行它;PAM 不是可执行的二进制代码。

  • pam_access 根据 /etc/security/access.conf 文件容许或拒绝访问。稍后将使用此模块决定容许哪些用户登陆。
  • pam_cracklib 和 pam_pwcheck 检查新密码的强度。
  • pam_deny 和 pam_permit 是基本模块,分别拒绝或容许访问。
  • pam_echo 向用户显示指定文件的内容。
  • pam_lastlog 向用户显示他上一次登陆的日期和时间。
  • pam_ldap.so 让用户根据 LDAP 服务器进行身份验证,提供跨网络的集中式身份验证。
  • pam_limits 模块容许指定系统资源限制,限制在 /etc/security/limits.conf 文件中定义。
  • pam_listfile 提供根据一个文件的内容容许或拒绝服务的另外一种方法。
  • pam_mail 检查用户是否有未处理的邮件。
  • pam_motd 向用户显示 “message of the day” 文件。
  • 若是 /etc/nologin 文件存在,pam_nologin 阻止全部登陆。
  • pam_rootok 容许根用户访问,不执行进一步检查。/etc/pam.d/su 中经常包含这个模块;必需的行是 auth sufficient pam_rootok.so。根用户能够做为任何用户操做,不须要提供密码。
  • pam_succeed_if 检查帐户的特定属性,好比是不是某个组的成员。
  • pam_time 能够根据 /etc/security/time.conf 中的规则限制对服务的访问。
  • pam_unix(或 pam_unix2)提供基于 /etc/passwd 和 /etc/shadow 文件的传统 UNIX® 身份验证。
  • pam_userdb 根据一个 Berkeley 数据库执行身份验证。
  • pam_warn 在系统日志中记录信息。
  • pam_wheel 只向 wheel 组的成员提供根访问权;必需的行是 auth required pam_wheel.so。

关于其余模块和编写本身的模块的信息,请查阅 参考资料。如今,使用 PAM 决定谁能够登陆您的计算机。

用 PAM 限制访问

如今,咱们来使用 PAM 限制谁能够链接您的服务器。必须编辑 /etc/pam.d/sshd 文件,让它像清单 3 这样。

清单 3. 在 sshd PAM 文件中添加 pam_access.so

#%PAM-1.0
account include common-account
account required pam_access.so
auth include common-auth
auth required pam_nologin.so
password include common-password
session include common-session

在 sshd PAM 文件中添加 pam_access.so,就能够轻松地定义谁可使用 SSH 链接您的计算机。pam_access.so 模块实现基于 /etc/security/access.conf 文件的安全控制,见清单 4。

清单 4. 经过使用 pam_access.so,定义谁能够或不可使用 SSH

+ : ALL : 192.168.1.
+ : jack : ALL
+ : jill : ALL
- : ALL : ALL

第一行容许任何用户 (ALL) 从内部网络登陆。后两行容许用户 jack 和 jill 从任何地方访问服务器。最后一行拒绝其余任何用户从其余任何地方访问。容许多个用户访问的另外一种方法是使用 pam_listfile.so,这须要建立一个容许访问的用户列表(例如 /etc/ssh_users)。在 /etc/pam.d/sshd 文件中添加如下行:

auth required pam_listfile.so item=user sense=allow
file=/etc/ssh_users onerr=fail

这尚未完。必须修改 /etc/ssh/sshd_config 文件,让它使用 PAM。在此文件中添加 UsePAM yes 行,从新启动 sshd 守护进程,这样就好了!

到底是否有门?

即便应用了前两节中的方法,不管您怎么预防,黑客仍然会尝试穿越您系统中任何开放的门户。改变 SSH 端口号对于经验丰富的黑客只能形成小小的麻烦。限制容许访问的用户会有帮助,但前提是没有用户落入黑客或社会工程攻击的圈套而泄露密码。不管如何,只要您的系统中有门,就会吸引黑客。

加强计算机安全性的最后一种方案是最激进的:关闭打开的端口,这会让任何攻击都没法攻破您的计算机。只向可以提供 “秘密敲门暗号” 的用户开放所需的端口,让用户可以输入密码并访问计算机。

这种技术称为端口敲门,适用于须要访问不向公众开放的服务器的用户。服务器能够关闭全部端口,直到用户提供一个秘密的敲门序列 (序列很容易实现,并且须要的资源很少)。

打开秘密端口以后,应用经常使用的安全机制(好比密码或证书)。只需在防火墙级上提供一个额外的安全层,须要秘密端口的全部服务就会正常工做。

这种方法的要点在于关闭全部端口并监视外部链接尝试。当识别出预约义的尝试序列(称为敲门序列 )时,能够执行打开端口等操做,让外部的用户可以进来。敲门序列的复杂程度由您决定,从简单的列表(好比依次尝试 TCP 端口 7000、UDP 端口 7100 和 TCP 端口 7200)到一次性序列集合均可以。(按密码学术语来讲,一次性序列与 “一次一密” 类似,这是已知最安全的加密方法。)外面的用户必须知道使用 SSH 所需的端口号和密码,还必须知道打开端口并启用密码所需的敲门序列。若是没有这个序列,链接尝试就会静悄悄地失败。

这为何是很是安全的方案?由于有 65,535 个端口(见 参考资料)。即便考虑到已经分配的端口,仍然有超过 60,000 个可用端口。若是敲门序列只包含四次 “敲门”,黑客要想经过强力攻击猜出序列,就必须测试大约 13,000,000,000,000,000,000 个序列(13 后面 18 个零)。这样的攻击显然不太可能奏效!固然,强力攻击或胡乱猜想并非猜出正确序列的唯一方法。所以,不要只使用单一安全方法;而是使用一系列安全层来增长攻击的难度。

必须安装敲门守护进程 knockd;它监视敲门序列,当发现有效的序列时执行相应的操做。若是愿意,能够从头构建它,可是大多数(若是不是全部的话)发行版中都有这个包。最好使用包管理工具安装它。例如,在 OpenSUSE 中,可使用 Yast2 或经过执行sudo zypper install knockd 安装它。在 Ubuntu 中可使用 sudo apt-get install knockd,在 Debian 中使用 sudo aptitude install knockd。用发行版的软件安装工具搜索 knockd 每每可以找到它。

安装这个包以后,必须编辑 /etc/knockd.conf 文件以指定端口敲门规则,而后启动守护进程。为了完成所需的设置,必须了解您的防火墙的工做方式。例如,在 OpenSUSE 中,可使用 清单 5 这样的设置。

清单 5. 针对 OpenSUSE 防火墙设计的示例配置文件

[opencloseSSH]
sequence= 7000,8000,9000
tcpflags= syn
seq_timeout= 15
cmd_timeout= 30
start_command= /usr/sbin/iptables -s %IP% -I input_ext 1 -p tcp –dport 22960 -j ACCEPT
stop_command= /usr/sbin/iptables -s %IP% -D input_ext -p tcp –dport 22960 -j ACCEPT

这个示例在用户依次在端口 7000、8000 和 9000 上敲门以后启用 SSH 访问。

在启动 knockd 以前,关闭端口 22960 并尝试远程登陆。这个尝试应该会失败,见清单 6。

清单 6. 若是禁用 SSH 访问并且不启动敲门守护进程,登陆尝试会失败

> ssh the.url.for.your.site -p 22960 -o ConnectTimeout=15
ssh: connect to host the.url.for.your.site port 22960: Connection timed out

如今,使用 sudo /etc/init.d/knockd start 或 sudo knockd -d 启动端口敲门守护进程(这两个命令是等效的),而后再试一下;端口敲门序列要求在端口 7000、8000 和 9000 上敲门。必须在 15 秒内完成这个序列。识别出序列以后端口打开,必须在 30 秒内登陆。不然,端口再次关闭。

为了检验这个过程,回到您的远程机器上并登陆。这一次提供所需的敲门序列,见 清单 7。注意,在安装 knockd 时一般也会安装knock 命令。若是不是这样,只需用发行版的包管理工具搜索它。

清单 7. 提供所需的敲门序列以后登陆成功

> knock the.url.for.your.site 7000
> knock the.url.for.your.site 8000
> knock the.url.for.your.site 9000
> ssh the.url.for.your.site -p 22960 -o ConnectTimeout=10
Password:

若是提供了错误的敲门序列(或根本没有敲门),会收到 “Connection timed out” 消息,SSH 端口仍然彻底关闭,看不出它是存在的。

若是您处于路由器后面

若是您的服务器经过路由器链接 Internet,就必须修改它的配置。具体细节因路由器和防火墙类型而异,可是通常来讲应该:

  • 打开敲门端口并把数据包转发到您的计算机,让knockd 可以识别并处理它们。
  • 把端口 22960(SSH 链接使用的端口)上的数据包转发到您计算机上的端口 22960。
  • 配置您计算机的防火墙,让它拒绝对端口 22960 和敲门端口的链接。

尽管路由器会打开一些端口,可是对它们的全部访问都会到达您计算机的防火墙。访问会被阻止,除非探测到正确的端口敲门序列。

敲门配置

/etc/knockd.conf 文件有一个通常选项小节 options,但愿使用的每一个敲门序列各有一个小节。选项能够是大写、小写或大小写混合形式。

  • 在默认状况下,knockd 监视 eth0 接口。要想使用另外一个接口(例如 eth1),能够包含 Interface=eth1 行。注意,只使用设备名而不是设备的完整路径。
  • 若是但愿启用日志记录,能够经过包含 useSyslog 行使用标准的 Linux 日志文件,也能够经过包含LogFile=/the/full/path/to/your/file 使用本身的文件。可是,应该认识到日志记录是一个漏洞;若是黑客得到了日志,入侵者就会掌握端口敲门序列。
  • 若是但愿可以检查 knockd 是否仍然在运行,那么包含PidFile=/the/full/path/to/a/PID/file。这个守护进程的进程 ID (PID) 将存储在这个文件中。应该经过一个 cron 任务按期检查knockd 是否仍然在运行并在须要时从新启动它。注意,当这个守护进程中止运行时,系统是安全的;全部端口关闭,不可访问。在守护进程从新启动以前,用户没法登陆。

可让 knockd 监听多个序列并以不一样方式响应各个序列。在前面的示例中,让 knockd 打开 SSH 端口;能够简单地启用 HTTP 端口,让用户可以访问 web 服务器,也能够运行特定的进程。在配置文件中,每一个序列都有相应的小节。

  • 使用 sequence 定义敲门序列,好比 7000,8000,9000。在默认状况下,敲门使用 TCP,可是能够添加 UDP 以增长复杂性,好比 7000,8000:udp,9000。
  • 除了使用固定的序列以外,还能够指定一个包含 “一次性序列” 的文件,这些序列在使用以后就会删除,不能再次使用。指定这种序列的方法以下:one_time_sequences=/the/full/path/to/a/sequences/file

    使用任何文本编辑器建立此文件;其中每行包含一个序列(按照上面所示的格式)。应该在远程计算机上保存此文件的拷贝以便记住如何登陆。

  • 能够指定应该扫描哪些到达的 TCP 数据包,丢弃不与 ACK、FIN、PSH、RST、SYN 或 URG 标志匹配的数据包。对于 SSH 链接,应该使用 TCPFlags=SYN。
  • 能够用 Seq_Timeout=seconds.to.wait 指定完成一个序列的最大时间。若是在此时间内没有输入完整的序列,就不会识别出它,访问被拒绝。
  • 能够用 Cmd_Timeout=seconds.to.wait 指定在识别出序列以后用户执行第二个命令的最大时间。若是提供了敲门序列的用户没有快速地输入下一个命令(例如登陆),端口会再次关闭。
  • 最重要的参数是 Start_command=some.command.to.execute,它指定成功地识别出敲门序列以后要执行的命令或脚本。若是须要引用敲门者的 IP 地址(例如为了容许从他的计算机链接您的计算机),可使用 %IP%。在运行时,它会替换为正确的值。在上面的示例中指定:/usr/sbin/iptables -s %IP% -I input_ext 1 -p tcp –dport 22960 -j ACCEPT

    iptables 向提供敲门序列的 IP 地址上的用户开放端口 22960。

  • 另外一个重要的参数是 Stop_command=some.command.to.execute;当超过 Cmd_timeout 时间以后,执行它指定的命令或脚本。

在这里,由于只但愿打开或关闭端口 22960,因此使用单一命令就够了。若是须要更复杂的操做,能够经过调用脚本执行所需的任何操做 — 操做甚至能够彻底不涉及打开端口。能够触发任何操做,好比运行进程或执行备份。固然,了解要使用的命令可能有点儿难度。例如,由于我运行 OpenSUSE,它提供本身的防火墙前端,因此我不得不经过查看 iptables -l 的输出了解应该执行哪一个命令来打开或关闭端口 22960。

对于 knockd 自己,有几个选项须要考虑:

  • -c:容许指定默认配置文件 /etc/knockd.conf 以外的另外一个配置文件
  • -d:让 knockd 做为后台守护进程运行,这是标准运行方式
  • -D:提供输出调试消息
  • -h:提供关于语法和选项的帮助
  • -i:容许指定默认的 eth0 接口以外的其余接口
  • -l:为日志项启用 DNS 查找 — 这是一种很差的作法,由于这强迫计算机使用 DNS 通讯流,会产生漏洞
  • -v:提供更详细的消息和解释
  • -V:提供程序的版本号

最后,可使用多种方法产生敲门序列自己,编写 knock 命令是最简单的方法。

如下命令在 TCP 端口 7000 上敲门:

knock the.url.for.your.site 7000

如下命令在 UDP 端口 8000 上敲门:

knock the.url.for.your.site -u 8000

knock the.url.for.your.site 8000:udp

-h 参数提供这个命令的帮助。

结束语

您看到了三种保护 SSH 访问的方法:修改 sshd 的配置参数,经过 PAM 限制能够登陆的用户,以及使用端口敲门序列隐藏存在 SSH 访问的事实。尽管没有任何方法可以彻底保护任何计算机,可是采起这三个措施会让您的服务器安全一些。

 

源文档:https://blog.csdn.net/cnbird2008/article/details/6130696

相关文章
相关标签/搜索