<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[刘新修]]></title> 
<link>http://pic1.liuxinxiu.com:80/index.php</link> 
<description><![CDATA[刘新修的个人博客 (Liuxinxiu'S Blog)]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[刘新修]]></copyright>
<item>
<link>http://pic1.liuxinxiu.com:80/s//</link>
<title><![CDATA[高级SSH安全技巧【转载】]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[技术分类]]></category>
<pubDate>Mon, 18 Oct 2010 08:32:11 +0000</pubDate> 
<guid>http://pic1.liuxinxiu.com:80/s//</guid> 
<description>
<![CDATA[ 
	<p>在这篇文章中我将为你展示一些简单的技巧，帮助你提高你的SSH服务的安全。SSH服务器配置文件是/etc/ssh/sshd_conf。在你对它进行每一次改动后都需要重新启动SSH服务，以便让改动生效。</p><p><strong>1、修改SSH监听端口</strong></p><p>默认情况下，SSH监听连接端口22，攻击者使用端口扫描软件就可以看到主机是否运行有SSH服务，将SSH端口修改为大于1024的端口是一个明智的选择，因为大多数端口扫描软件（包括nmap）默认情况都不扫描高位端口。</p><p>打开/etc/ssh/sshd_config文件并查找下面这样的行：<br />Port 22</p><p>修改端口号并重新启动SSH服务：<br />/etc/init.d/ssh restart</p><p><strong>2、仅允许SSH协议版本2</strong></p><p>有两个SSH协议版本，仅使用SSH协议版本2会更安全，SSH协议版本1有安全问题，包括中间人攻击（man-in-the-middle）和注入（insertion）攻击。编辑/etc/ssh/sshd_config文件并查找下面这样的行：<br />Protocol 2,1<br />修改为<br />Protocol 2</p><p><strong>3、仅允许特定的用户通过SSH登陆</strong></p><p>你不一个允许root用户通过SSH登陆，因为这是一个巨大的不必要的安全风险，如果一个攻击者获得root权限登陆到你的系统，相对他获得一个普通用户权限能造成更大的破坏，配置SSH服务器不允许root用户通过SSH登陆，查找下面这样的行：<br />PermitRootLogin yes</p><p>将yes修改为no，然后重新启动服务。现在，如果你想使用特权用户，你可以先以其他用户登陆，然后再转换到root。</p><p>创建一个没有实际权限的虚拟用户是一个明智的选择，用这个用户登陆SSH，即使这个用户遭到破解也不会引起什么破坏，当创建这个用户时，确保它属于wheel组，因为那样你才能切换到特权用户。</p><p>如果你想让一列用户都能通过SSH登陆，你可以在sshd_config文件中指定它们，例如：我想让用户anze、dasa、kimy能通过SSH登陆，在sshd_config文件的末尾我添加下面这样一行：<br />AllowUsers anze dasa kimy</p><p><strong>4、创建一个自定义SSH banner</strong></p><p>&nbsp;</p><p>如果你想让任何连接到你SSH服务的用户看到一条特殊的消息，你可以创建一个自定义SSH banner，只需要创建一个文本文件（我的是/etc/ssh-banner.txt），然后输入你想的任何文本消息，如：<br />*This is a private SSH service. You are not supposed to be here.*<br />*Please leave immediately. *</p><p>编辑好后，保存这个文件，在sshd_config中查找下面这样一行：<br />#Banner /etc/issue.net</p><p>取消掉注释【将#去掉】，然后将路径修改为你自定义的SSH banner文本文件。</p><p><strong>5、使用DSA公钥认证</strong></p><p>代替使用用户名和密码对SSH进行认证，你可以使用DSA公钥进行认证，注意你既可以使用登陆名，也可以使用DSA公钥进行认证，使用DSA公钥认证可以预防你的系统遭受字典攻击，因为你不需要用登陆名和密码登陆SSH服务，而是需要一对DSA密钥，一个公钥和一个私钥，在你本地机器上保存私钥，将公钥放在服务器上。当你发起一个SSH登陆会话时，服务器检查密钥，如果它们匹配的话，你就可以直接进入shell，如果它们不匹配，你的连接将被自动断开。</p><p>在本例中的私人计算机叫&lsquo;工作站1&rsquo;，服务器叫&lsquo;服务器1&rsquo;。在两个机器上我有相同的home目录，如果服务器和客户端上的home目录不同将不能工作，实现，你需要在你的私人计算机上创建一对密钥，命令：~$ ssh-keygen -t dsa，它将要求你为私钥输入一个密语，但是你可以保留为空，因为这不是一个推荐的做法。密钥对创建好了：你的私钥在~/.ssh/id_dsa，你的公钥在.ssh/id_dsa.pub。</p><p>接下来，拷贝~/.ssh/id_dsa.pub中的内容到&lsquo;服务器1&rsquo;的~/.ssh/authorized_keys文件中，~/.ssh/id_dsa.pub的内容看起来象下面这样：</p><p><span style="color: #0000ff">~$ cat .ssh/id_dsa.pub<br />ssh-dss AAAAB3NzaC1kc3MAAACBAM7K7vkK5C90RsvOhiHDUROvYbNgr7YEqtrdfFCUVwMWc<br />JYDusNGAIC0oZkBWLnmDu+y6ZOjNPOTtPnpEX0kRoH79maX8NZbBD4aUV91lbG7z604ZTdr<br />LZVSFhCI/Fm4yROHGe0FO7FV4lGCUIlqa55+QP9Vvco7qyBdIpDuNV0LAAAAFQC/9ILjqII7n<br />M7aKxIBPDrQwKNyPQAAAIEAq+OJC8+OYIOeXcW8qcB6LDIBXJV0UT0rrUtFVo1BN39cAWz5pu<br />Fe7eplmr6t7Ljl7JdkfEA5De0k3WDs<br />9/rD1tJ6UfqSRc2qPzbn0p0j89LPIjdMMSISQqaKO4m2fO2VJcgCWvsghIoD0AMRC7ngIe6bta<br />NIhBbqri10RGL5gh4AAACAJj1/rV7iktOYuVyqV3BAz3JHoaf+H/dUDtX+wuTuJpl+tfDf61rb<br />WOqrARuHFRF0Tu/Rx4oOZzadLQovafqrDnU/No0Zge+WVXdd4ol1YmUlRkqp8vc20ws5mLVP<br />34fST1amc0YNeBp28EQi0xPEFUD0IXzZtXtHVLziA1/NuzY= </span><a href="mailto:anze@station1.example.com"><span style="color: #0000ff">anze@station1.example.com</span></a></p><p>如果文件~/.ssh/authorized_keys已经存在，请将上面的内容附加在该文件的后面。剩下的只是给该文件设置正确的权限了：<br />~$ chmod 600 ~/.ssh/authorized_keys</p><p>现在，配置sshd_config文件使用DSA密钥认证，确保你将下面三行前的注释去掉了：<br />RSAAuthentication yes<br />PubkeyAuthentication yes<br />AuthorizedKeysFile %h/.ssh/authorized_keys</p><p>重新启动服务，如果你的配置没有错误，现在你就可以SSH到你的服务器，而且无需任何交互动作（如输入用户名和密码）就直接进入你的home目录了。<br />如果你只想使用DSA认证登陆，确保你在sshd_config中取消掉注释并修改PasswordAuthentication这一行，将yes改为no：<br />PasswordAuthentication no</p><p>任何在服务器上没有公钥的人试图连接到你的SSH服务，它就被拒绝，给它显示如下一个拒绝提示信息：<br />Permission denied (publickey).</p><p><strong>6、使用TCP wrappers仅允许指定的主机连接</strong></p><p>&nbsp;</p><p>如果你想在你的网络上只允许特定的主机才能连接到你的SSH服务，但又不想使用或弄乱你的iptables配置，那这个方法非常有用，你可以使用TCP wrappers。在这个例子中对sshd进行TCP包裹，我将创建一条规则允许本地子网192.168.1.0/24和远程193.180.177.13的自己连接到我的SSH服务。<br />默认情况下，TCP wrappers首先在/etc/hosts.deny中查找看主机是否允许访问该服务，接下来，TCP wrappers查找/etc/hosts.allow看是否有规则允许该主机服务指定的服务，我将在/etc/hosts.deny中创建一个规则，如下：<br />sshd: ALL</p><p>这意味着默认情况下所有主机被拒绝访问SSH服务，这是应该的，否则所有主机都能访问SSH服务，因为TCP wrappers首先在hosts.deny中查找，如果这里没有关于阻止SSH服务的规则，任何主机都可以连接。</p><p>接下来，在/etc/hosts.allow中创建一个规则允许指定的主机使用SSH服务：<br />sshd: 192.168.1.0/24 193.180.177.13</p><p>现在，只有来自192.168.1.0/24和193.180.177.13的主机能够访问SSH服务了，其他主机在连接时还没有到登陆提示符时就被断开了，并收到错误提示，如下：<br />ssh_exchange_identification: Connection closed by remote host</p><p>=====================================================</p><p>方法1、iptables。 <br />iptables&nbsp;&nbsp; -A&nbsp;&nbsp; INPUT&nbsp;&nbsp; -s&nbsp;&nbsp; 192.168.1.100&nbsp;&nbsp; --destination-port&nbsp;&nbsp; 22&nbsp;&nbsp; -j&nbsp;&nbsp; ACCEPT <br />iptables&nbsp;&nbsp; -A&nbsp;&nbsp; INPUT&nbsp;&nbsp; --destination&nbsp;&nbsp; 22&nbsp;&nbsp; -j&nbsp;&nbsp; DROP <br />&nbsp;</p><p>方法2： <br />vi&nbsp;&nbsp; /etc/ssh/sshd_config <br />添加一行： <br />allowusers&nbsp;&nbsp; <a href="mailto:x@192.168.1.100">root@192.168.1.100</a> <br />注：root为你用来登入服务器的用户名。</p><p>&nbsp;==========================================================</p><p><strong>7、使用iptables允许特定的主机连接</strong></p><p>作为TCP wrappers的一个代替品，你可以使用iptables来限制SSH访问（但可以同时使用这个两个的），这里有一个简单的例子，指出了如何允许一个特定的主机连接到你的SSH服务：<br />~# iptables -A INPUT -p tcp -m state --state NEW --source 193.180.177.13 --dport 22 -j ACCEPT</p><p>并确保没有其他的主机可以访问SSH服务：<br />~# iptables -A INPUT -p tcp --dport 22 -j DROP</p><p>保存你的新规则，你的任务就完成了，规则是立即生效的</p><p><strong>8、SSH时间锁定技巧</strong></p><p>你可以使用不同的iptables参数来限制到SSH服务的连接，让其在一个特定的时间范围内可以连接，其他时间不能连接。你可以在下面的任何例子中使用/second、/minute、/hour或/day开关。</p><p>第一个例子，如果一个用户输入了错误的密码，锁定一分钟内不允许在访问SSH服务，这样每个用户在一分钟内只能尝试一次登陆：</p><p>~# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT<br />~# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j DROP</p><p>第二个例子，设置iptables只允许主机193.180.177.13连接到SSH服务，在尝试三次失败登陆后，iptables允许该主机每分钟尝试一次登陆：<br />~# 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<br />~# iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -j DROP</p><p><strong>9、结论</strong></p><p>这些技巧都不是很难掌握，但是它们对于保护你的SSH服务却是很强劲的手段，花一点代价换来的是睡一个好觉。</p>
]]>
</description>
</item><item>
<link>http://pic1.liuxinxiu.com:80/s//#blogcomment</link>
<title><![CDATA[[评论] 高级SSH安全技巧【转载】]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://pic1.liuxinxiu.com:80/s//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>