从ssh服务谈服务器安全
早就给自己准备好的一个命题,却迟迟不肯动笔,不是因为没有时间.只是怕自己准备的不够充分,达不到自己心中想要的宽度和高度.09年就要接近尾声了,总不能把这事儿拖到年后吧,所以还是赶紧行动起来.
谈到服务器安全,似乎是IT安全人员专有的话题.作为一个普通的系统管理员,说起这些来似乎有些不那么本分.本篇只是普通的入门级ssh管理教程,高手掠过,新手指教.谢谢.OK,打点了各路神仙,笔者就上要路啦.
服务器安全,什么样的服务器最安全呢?笔者认为拔掉网线的服务器最安全,如果可以的话,最好关机,锁到十八层地狱里并冰冻起来,这样即省电又能保证硬件的安全.但是?服务器是干什么的呢?服务器是用来跑服务的,是人们交流的载体.那么前面的极端做法就有点因噎废食,不伦不类了.那样服务器是安全了,但是与一堆新的废铁无异.
OK,相信现在你已同意服务器必须联网并对外提供服务的观点了(!##$%^&废话,要不还能叫"服务"器?).现在咱们从最原始的角度来看服务器的安全.我们现在把"服务器"定义到linux操作系统.初始化安装完linux系统以后,无论哪个发行版的linux都会默认起动N多服务.好,服务器安全第一条:启用尽可能少的服务.运行的东西越多,出问题的机率就越大.但是精减系统服务需要系统管理员比较熟悉系统服务和这台机器的用途.以笔者来说,刚装完系统,笔者会将启动的服务最小化到:network,syslog,iptables,ssh.根据实际情况是否启用多处理器.然后再根据实际的服务器用途再启用相应的服务并调整防火墙策略(在此不得不提一句ubuntu的9.10的服务版做的真得很棒,用过的朋友知道我在说什么.).
现在服务器已经启用了它要运行所必须的几个服务:只要系统启动,我们就希望它有运行日志,这样方便了解服务器的运行情况,在排错的时候也有章可循.服务器启动了,当然也要启用"网络"吧,不启用这个服务和拔掉网线没什么区别,还废电.网络启动以后,我们就要抵制来自网络的风险,所以防火墙最好启动.服务器正常工作了,但是总不可能有点什么配置都要跑到服务器跟前去调吧,所以对于linux服务器.ssh服务是笔者认为第一个要启用的网络服务.这样一来服务器就可以被外界访问了.网络有风险,联网需谨慎!服务器安全第二条:管好你的ssh.接下来咱们就通过简单的几点小改动,让你的ssh方便使用并变成铜墙铁壁。
咱们在linux下用的ssh服务肯定都是openssh了,无论它在/etc/init.d里是叫ssh还是sshd.在/etc/ssh目录里有两个重要的配置文件,一个是ssh_config,它是在使用ssh client时用的默认配置文件,今天咱先不提它;另一个就是ssh服务运行时的主配置文件了,它就是sshd_config.我们今天所做的修改都是基于它,当然,要是配置生效的话要重启ssh服务哟.顺便说一下,当你使用ssh远程登陆到linux服务器修改ssh的配置以后,重启ssh服务是不影响你当前的登陆连接的哟.下面就展开今天的话题:
1)禁止root
root是linux里的最高统帅了,就它官最大,可以在系统里畅通无阻.也就是因为这个原因,它是我们的重点保护对象.对于管理linux系统,一个最基本的建议就是:平时登陆和工作的时候都使用普通用户进行操作.在需要修改系统设置使用特级权限时,再切换到root用户.这样可以最大限度的避免因为误操作造成对linux系统的破坏.另外因为root用户是每个linux系统里都内置的,恶意的黑客可能会拿它做用户名然后尝试用不同的密码登陆密码哟.所以还是自己新建一个帐号,这样用户名被猜中的机率就很低了,再禁止root用户登陆,想猜密码?先猜用户吧.
在sshd_config中修改如下就可以了:
PermitRootLogin no
2)空密码登陆
再有就是空密码.一般来说linux系统都会内置很多帐号,而这些用户的密码我们是不知道的.谁知道哪天哪个linux的发行版,对其中的帐号设置空密码或者指定的密码呢?所以还是禁止为妙,省得夜长梦多.
在sshd_config这样修改:
PermitEmptyPasswords no
3)修改端口
其实吧很多时候你的服务器被盯上,并不是有人特别跟你过不去.人家随机的用软件扫了一个ip段,而你的ip正好在里面.而人家的扫描规则就是:是否开启22端口.这个时候,如果你没有禁止root登陆,root的密码又是简单的123456或者000000,111111这些地球人都知道的密码的话,你的服务器不黑,谁的被黑?所以安全从简单的小事儿做起,你向前移动一小步,你的服务器安全就进步一大步.还等什么?先修改默认端口呗,打开sshd_config文件,修改成:
Port 1222
根据你的心情,port随机的选一个,除了你自己,鬼知道你当时选的哪个端口.再打开/var/log/secure,看下世界是不是一下子清静了?再也没有烦人的用不同的帐号和密码尝试登陆的日志了.这招百试不爽.
4)限制ssh监听的ip
在服务器有多个ip的时候.设置ssh服务器只监听在指定的ip,未尝不是一个好办法.例如一组服务器中,肯定会组成内网和外网两个小的局域网.这时候只让不起眼的一两台机器的ssh服务监听到公网ip上.其它的机器ssh只监听内网ip,通过另外的一两台机器登陆进行管理,是不是很安全保守的做法呢?
在sshd_config中修改如下:
ListenAddress 192.168.1.5
如上的写法,是ssh服务器只监听192.168.1.5这个ip.
5)使用的协议
ssh协议有两个版本.肯定v2要比v1安全高效的多了.ssh服务器默认会接受两种协议的连接.为了保证服务器的安全,咱们可以定义服务器只使用v2:
在sshd_config中修改如下:
Protocol 2
6)禁用密码登陆
其实经过前面几步简单的设置,个人认为ssh服务器的安全已经有了一个质的提高.但是在不使用其它复杂的手段的情况下,还有一些加固的小技巧,例如这一条:禁止使用密码登陆.什么?是不是写错了,或者弄迷糊了?ssh服务器竟然要禁止使用密码登陆?那怎么管理服务器呢?当然还是用ssh啦.ssh服务器不单支持密码认证,还支持通过key的认证方式,而且是默认的哟.关于怎样生成key的方法参见:<<使ssh不用输入密码>>
在sshd_config中修改如下:
PasswordAuthentication no
经过这点小的改动,你的ssh服务绝对又是一个质的提升.能够拿到你的私key,又知道服务器登陆的用户名和端口,这绝对不是一件简单的事儿吧.
7)限制连接IP
现在再拿出最后一招杀手锏:限制ssh服务连接的ip.我们前面提到一组服务器我们只留一两台机器可以远程访问.这样这两台机器的安全又成了重中之重.怎样再保证一下这两台机器的安全呢?我们可以限制连接这两台机器的ip.例如:这两台机器只允许公司的出口ip进行访问.这样就再次提高了服务器的安全系数.想想如果有一个黑客,能够进入你们公司的办公网络,能够拿到你的私key,又能知道只有你才知道的服务器的用户名和登陆的端口,以及登陆的方式,如果有这样的牛X的黑客,还有什么好防的呢?因为防不胜防啊.扯远了,看下限制ip的做法:
在/etc/hosts.allow输入
sshd:192.168.1.5:allow(其中192.168.1.5是你要允许登陆ssh的ip,或者是一个网段192.168.1.0/24)
在/etc/hosts.deny输入
sshd:ALL(表示除了hosts.allow中允许的,其他的ip拒绝登陆ssh)
呵呵,这是传统的做法,因为开了防火墙所以笔者更喜欢直接在防火墙上做设置:)
关于ssh安全的其它做法:
令牌环:笔者的哥们所在的游戏公司,专门为了服务器的登陆开发了一个程序.所有的服务器统一认证.密码放在数据库里,当你想登陆的时候,先访问一个网页,验证完信息以后会给你的手机发一条短信告诉你登陆的密码.而且会告诉你一分钟内有效,过时重取,哈哈,除了数据库自己,谁也不知道密码是多少,是不是很专业呢?
动态ssh:据说有这么一种做法,在服务器上安装另外一个程序,当然也是开源的.那个程序会打开一个你指定的端口,而默认的时候ssh服务是关闭的.当你需要登陆服务器的时候.你先telnet一下,你的ip和你指定的先前那个程序所监听的端口,那个程序就会帮你把ssh服务打开,然后你就可以进行正常的登陆操作了.是不是也很专业呢?
废话那么多,其实以上的三种做法,无论哪一种都可以将你的服务器安全提升一个层次.还是那句话:服务器安全你向前一小步,它就提高一大步,你的服务器安全了吗?
本文出自 “rainbird” 博客,请务必保留此出处http://rainbird.blog.51cto.com/211214/247387