Chinaunix首页 | 论坛 | 博客
  • 博客访问: 230987
  • 博文数量: 86
  • 博客积分: 5030
  • 博客等级: 大校
  • 技术积分: 810
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-30 16:36
文章分类

全部博文(86)

文章存档

2010年(86)

我的朋友

分类: 网络与安全

2010-04-15 16:31:45

ZDNet 安全频道频道 更新时间:2008-06-12 作者:黄永兵 来源:51CTO

  在这篇文章中我将为你展示一些简单的技巧,帮助你提高你的SSH服务的安全。SSH服务器配置文件是/etc/ssh/sshd_conf。在你对它进行每一次改动后都需要重新启动SSH服务,以便让改动生效。

  1、修改SSH监听端口

  默认情况下,SSH监听连接端口22,攻击者使用端口扫描软件就可以看到主机是否运行有SSH服务,将SSH端口修改为大于1024的端口是一个明智的选择,因为大多数端口扫描软件(包括nmap)默认情况都不扫描高位端口。

  打开/etc/ssh/sshd_config文件并查找下面这样的行:

  Port 22

  修改端口号并重新启动SSH服务:

  /etc/init.d/ssh restart

  2、仅允许SSH协议版本2

  有两个SSH协议版本,仅使用SSH协议版本2会更安全,SSH协议版本1有安全问题,包括中间人攻击(man-in-the-middle)和注入(insertion)攻击。编辑/etc/ssh/sshd_config文件并查找下面这样的行:

  Protocol 2,1

  修改为

  Protocol 2

  3、仅允许特定的用户通过SSH登陆

  你不一个允许root用户通过SSH登陆,因为这是一个巨大的不必要的安全风险,如果一个攻击者获得root权限登陆到你的系统,相对他获得一个普通用户权限能造成更大的破坏,配置SSH服务器不允许root用户通过SSH登陆,查找下面这样的行:

  PermitRootLogin yes

  将yes修改为no,然后重新启动服务。现在,如果你想使用特权用户,你可以先以其他用户登陆,然后再转换到root。

  创建一个没有实际权限的虚拟用户是一个明智的选择,用这个用户登陆SSH,即使这个用户遭到破解也不会引起什么破坏,当创建这个用户时,确保它属于wheel组,因为那样你才能切换到特权用户。

  如果你想让一列用户都能通过SSH登陆,你可以在sshd_config文件中指定它们,例如:我想让用户anze、dasa、kimy能通过SSH登陆,在sshd_config文件的末尾我添加下面这样一行:

  AllowUsers anze dasa kimy

  如果你想让任何连接到你SSH服务的用户看到一条特殊的消息,你可以创建一个自定义SSH banner,只需要创建一个文本文件(我的是/etc/ssh-banner.txt),然后输入你想的任何文本消息,如:

  *This is a private SSH service. You are not supposed to be here.*

  *Please leave immediately. *

  编辑好后,保存这个文件,在sshd_config中查找下面这样一行:

  #Banner /etc/issue.net

  取消掉注释【将#去掉】,然后将路径修改为你自定义的SSH banner文本文件。

  5、使用DSA公钥认证

  代替使用用户名和密码对SSH进行认证,你可以使用DSA公钥进行认证,注意你既可以使用登陆名,也可以使用DSA公钥进行认证,使用DSA公钥认证可以预防你的系统遭受字典攻击,因为你不需要用登陆名和密码登陆SSH服务,而是需要一对DSA密钥,一个公钥和一个私钥,在你本地机器上保存私钥,将公钥放在服务器上。当你发起一个SSH登陆会话时,服务器检查密钥,如果它们匹配的话,你就可以直接进入shell,如果它们不匹配,你的连接将被自动断开。

  在本例中的私人计算机叫‘工作站1’,服务器叫‘服务器1’。在两个机器上我有相同的home目录,如果服务器和客户端上的home目录不同将不能工作,实现,你需要在你的私人计算机上创建一对密钥,命令:~$ ssh-keygen -t dsa,它将要求你为私钥输入一个密语,但是你可以保留为空,因为这不是一个推荐的做法。密钥对创建好了:你的私钥在~/.ssh/id_dsa,你的公钥在.ssh/id_dsa.pub。

  接下来,拷贝~/.ssh/id_dsa.pub中的内容到‘服务器1’的~/.ssh/authorized_keys文件中,~/.ssh/id_dsa.pub的内容看起来象下面这样:

  ~$ cat .ssh/id_dsa.pub

  ssh-dss AAAAB3NzaC1kc3MAAACBAM7K7vkK5C90RsvOhiHDUROvYbNgr7YEqtrdfFCUVwMWc

  JYDusNGAIC0oZkBWLnmDu+y6ZOjNPOTtPnpEX0kRoH79maX8NZbBD4aUV91lbG7z604ZTdr

  LZVSFhCI/Fm4yROHGe0FO7FV4lGCUIlqa55+QP9Vvco7qyBdIpDuNV0LAAAAFQC/9ILjqII7n

  M7aKxIBPDrQwKNyPQAAAIEAq+OJC8+OYIOeXcW8qcB6LDIBXJV0UT0rrUtFVo1BN39cAWz5pu

  Fe7eplmr6t7Ljl7JdkfEA5De0k3WDs

  9/rD1tJ6UfqSRc2qPzbn0p0j89LPIjdMMSISQqaKO4m2fO2VJcgCWvsghIoD0AMRC7ngIe6bta

  NIhBbqri10RGL5gh4AAACAJj1/rV7iktOYuVyqV3BAz3JHoaf+H/dUDtX+wuTuJpl+tfDf61rb

  WOqrARuHFRF0Tu/Rx4oOZzadLQovafqrDnU/No0Zge+WVXdd4ol1YmUlRkqp8vc20ws5mLVP

  34fST1amc0YNeBp28EQi0xPEFUD0IXzZtXtHVLziA1/NuzY= anze@station1.example.com

  如果文件~/.ssh/authorized_keys已经存在,请将上面的内容附加在该文件的后面。剩下的只是给该文件设置正确的权限了:

  ~$ chmod 600 ~/.ssh/authorized_keys

  现在,配置sshd_config文件使用DSA密钥认证,确保你将下面三行前的注释去掉了:

  RSAAuthentication yes

  PubkeyAuthentication yes

  AuthorizedKeysFile %h/.ssh/authorized_keys

  重新启动服务,如果你的配置没有错误,现在你就可以SSH到你的服务器,而且无需任何交互动作(如输入用户名和密码)就直接进入你的home目录了。

  如果你只想使用DSA认证登陆,确保你在sshd_config中取消掉注释并修改PasswordAuthentication这一行,将yes改为no:

  PasswordAuthentication no

  任何在服务器上没有公钥的人试图连接到你的SSH服务,它就被拒绝,给它显示如下一个拒绝提示信息:

  Permission denied (publickey).

  如果你想在你的网络上只允许特定的主机才能连接到你的SSH服务,但又不想使用或弄乱你的iptables配置,那这个方法非常有用,你可以使用TCP wrappers。在这个例子中对sshd进行TCP包裹,我将创建一条规则允许本地子网192.168.1.0/24和远程 193.180.177.13的自己连接到我的SSH服务。

  默认情况下,TCP wrappers首先在/etc/hosts.deny中查找看主机是否允许访问该服务,接下来,TCP wrappers查找/etc/hosts.allow看是否有规则允许该主机服务指定的服务,我将在/etc/hosts.deny中创建一个规则,如下:

  sshd: ALL

  这意味着默认情况下所有主机被拒绝访问SSH服务,这是应该的,否则所有主机都能访问SSH服务,因为TCP wrappers首先在hosts.deny中查找,如果这里没有关于阻止SSH服务的规则,任何主机都可以连接。

  接下来,在/etc/hosts.allow中创建一个规则允许指定的主机使用SSH服务:

  sshd: 192.168.1 193.180.177.13

  现在,只有来自192.168.1.0/24和193.180.177.13的主机能够访问SSH服务了,其他主机在连接时还没有到登陆提示符时就被断开了,并收到错误提示,如下:

  ssh_exchange_identification: Connection closed by remote host

  7、使用iptables允许特定的主机连接

  作为TCP wrappers的一个代替品,你可以使用iptables来限制SSH访问(但可以同时使用这个两个的),这里有一个简单的例子,指出了如何允许一个特定的主机连接到你的SSH服务:

  ~# iptables -A INPUT -p tcp -m state --state NEW --source 193.180.177.13 --dport 22 -j ACCEPT

  并确保没有其他的主机可以访问SSH服务:

  ~# iptables -A INPUT -p tcp --dport 22 -j DROP

  保存你的新规则,你的任务就完成了,规则是立即生效的

  8、SSH时间锁定技巧

  你可以使用不同的iptables参数来限制到SSH服务的连接,让其在一个特定的时间范围内可以连接,其他时间不能连接。你可以在下面的任何例子中使用/second、/minute、/hour或/day开关。

  第一个例子,如果一个用户输入了错误的密码,锁定一分钟内不允许在访问SSH服务,这样每个用户在一分钟内只能尝试一次登陆:

  ~# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT

  ~# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j DROP

  第二个例子,设置iptables只允许主机193.180.177.13连接到SSH服务,在尝试三次失败登陆后,iptables允许该主机每分钟尝试一次登陆:

  ~# iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT

  ~# iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -j DROP

  9、结论

  这些技巧都不是很难掌握,但是它们对于保护你的SSH服务却是很强劲的手段,花一点代价换来的是睡一个好觉。

安全技巧:保护SSH免受强力口令破解攻击 ZDNet 安全频道频道 更新时间:2008-06-12 作者:巧巧读书 来源:巧巧读书本文关键词:ssh

  在确保Unix类系统的安全免受外部的攻击时,我们要保证不能运行任何不必要的服务。在免费的BSD Unix系统或Linux发行版本中,我们几乎总能遇到的一个服务,即SSH进程。在多数情况下,这指的是OpenSSH,你可能会需要确保远程访问服务器的安全,特别是在你的服务器并没有安装监视器和键盘时更是这样。

高级SSH安全技巧 - 野渡无人 - 23点59分59秒

  只要你连上互联网,你就会发现:总有一些系统在那儿每天24小时都在试图通过22号端口访问你的计算机,其目的是突破你的SSH口令保护。如果你检查一下网络中与互联网直接相连的任何系统中的(或者是连接到某个开放的无线访问点的设备中的)/var/log/auth.log文件,很快你就会发现,在这个文件的末尾会出现如下的内容:

  NOV 05 9:03:12 local_host sshd[6906]: error: PAM: authentication error for root from remote_host

  其实,为降低这种攻击的影响范围,我们可以做的事情有许多。我们完全可以减少由这种盲目攻击所造成的损害。例如,就目前的技术水平而言,一个足够复杂的口令就很难破解。当然,任何复杂的口令最终都能够被破解,不过这种可能性也许要花费一个世纪才能完成。

  另一个方法是简单配置SSH,使之在另外一个端口上监听,而不是22号端口。例如,可以使其监听1138号端号。为此,可以简单地改变/etc /ssh/sshd_config文件的端口行(即以Port开头的一行),以显示你想使用的新端口号,而且在从一个远程系统连接时,要确保使用这个端口号。在编辑完毕后,sshd_config的这一行看起来应是如下这个样子:

  Port 1138

  这种方法可以提供额外一层的安全性,使普通的恶意破坏份子难以发现你拥有一个开放的SSH端口。OpenSSH容许采用基于密钥的认证而不是口令认证,这就进一步地限制了这种别有用心的攻击,这正如我们可以配置一个防火墙,使其拒绝除被列入优良者名单的所有连接企图。

  也许最普遍的、最有效的限制强力攻击的方法是简单地禁止通过SSH对根(root)的访问。也许你想远程登录,然后执行需要根的访问权的管理任务,不过你还要保障其他人不能通过强力的口令破解攻击直接获得对你系统的访问权。

  当然,你还可以容许其它的账户通过SSH访问你的系统。借助于sudu或su,你可以获得对根的访问。因为自动化的攻击难于猜测到一个未知用户的账户名称及其口令(特别是如果这个口令足够复杂的话),而且,事实上多数攻击者绝对不会试着猜测除根用户之外的其它用户的口令,主要原因在于:由于采取这种简单的措施,你的系统在面对这种自动化的攻击时,安全性得到了极大的提升。如果你不允许一般用户账户使用sudu或su来获得对根的访问,情况尤其如此。你可以指定一个特别的管理员账户,使其对系统拥有很有限的特权,不过一定要有一个其它非根账户没有的特权:通过su或sudu执行管理任务的能力,这种任务可拥有对根的特权。

  但是,一旦你已经不接受通过SSH对根的访问,你就会选择安排可管理的访问,其实,允许从远程对根的访问的情况很少。要禁用通过SSH直接登录到根用户,需要再次编辑ssdh_config文件,将PermitRootLogin设置为“no”:

  PermitRootLogin no

  有一些操作系统,如FreeBSD将其作为默认值。其它的系统,如多数的Linux发行版本并非如此。任何用户都应该检查其选择的操作系统,在决定自己的系统安然无恙之前,首先要决定其默认的PermitRootLogin设置。

阅读(1352) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~