保护SSH的三把锁

///////////////////////////////写在前面//////////////////////////////////////
原帖地址:
http://www.ibm.com/developerworks/cn/aix/library/au-sshlocks/index.html?ca=drs-#ibm-pcon

本文在原贴的基础上稍作修改,如有错误请及时告诉我

//////////////////////////////////////////////////////////////////////////////

简介:
如果需要远程访问计算机并启用了 Secure Shell (SSH) 连接,黑客就会尝试突破您的防线并控制您的计算机,您必须接受这个事实。尽管不能保证计算机不会被 “黑客” 占领,但是一些简单的解决方案有助于保护 SSH,可以让攻击困难一些。本文讨论三种技术:
1.把 SSH 的标准端口改为不常用的值并增强 SSH 配置,从而挡住最简单的攻击。
2.定义有限的用户列表,只允许这些用户登录。
3.完全隐藏允许 SSH 访问的事实,要求根据特殊的 “敲门” 序列识别有效用户。
要想应用这些技术,需要能够访问根账户。另外,可能必须安装一些包,需要配置防火墙和路由器(如果有路由器的话),打开和关闭特定的端口并把数据包转发到您的计算机。

 

加强保护:

人人都知道 SSH 连接的标准端口是 22。因此,为了让计算机更安全,应该采取的第一个措施是把端口改为另一个不常用的非标准端口号,比如 22960。1024 以上的号码通常都可以使用,但是应该查阅参考资料以避免导致问题。这一修改对您的影响仅仅是必须使用下面的命令连接计算机:

ssh -p 22960 your.machine.url     或者是  ssh user@ip -p port

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


但是,还可以更进一步。编辑配置文件,在其中包含 清单 1 所示的行。注意,其中一些行可能已经存在,但是可以把它们注释掉。
清单 1. 通过修改 SSH 配置文件简便地增强安全性

Port 22960 
LoginGraceTime 30    #LoginGraceTime 允许一次登录花费 30 秒;如果用户花费的时间超过 30 秒,就不允许他访问,必须重新登录。
MaxAuthTries 3       #MaxAuthTries 把错误尝试的次数限制为 3 次,3 次之后拒绝登录尝试。
Protocol 2           #Protocol 2 禁止使用比较弱的协议。
PermitRootLogin no   #禁止使用root账户进行远程登录,这会让黑客攻击更困难。
PermitRootLogin without-password #用户仅能通过密钥认证登陆,取消密码登陆
DenyUsers/AllowUsers user
DenyGroups/AllowGroups  group

这些修改不会显著增强计算机的安全性,但是只尝试强力攻击标准端口 22 的一般脚本会失败,不会造成损害。无论如何,这是向正确的方向迈出了第一步。在本文后面,我们将使用更安全的方法,不仅修改端口号,而且完全隐藏它。

 

谁可以进入:

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 守护进程,这样就行了!

 

究竟是否有门?

这个参考最顶的原始帖子吧,这个还没有弄呢,日后补上

上面提到的打开关闭端口号的方法:

iptables -A INPUT -dport 20 -j DROP

iptables -A OUTPUT -dport 20 -j DROP

具体参考这篇文章

http://www.cnblogs.com/ImJerryChan/p/6155869.html

posted @ 2016-10-25 21:03  ImJerryChan  阅读(953)  评论(0编辑  收藏  举报