我们在购买了 Linux 系统的 VPS 或服务器后,一般的商家都会给你一个 root 权限的账号,并且默认的密码不会太长,这是很不安全的。经常有客户因为弱口令而被黑客暴力破解密码导致 VPS 服务器被入侵,并用来干坏事。
所以,在开通了 Linux 系统的 VPS 或服务器后,我们有必要做一些基本的安全设置。
一、关闭 SSH 密码登陆
首先,你需要有自己的 SSH Key,如果你使用 Windows 系统,可以用 Putty 下的 PUTTYGEN.EXE 生成私匙和公匙。
第一步,运行 PUTTYGEN.EXE
一般,我们选择默认的 RSA 加密即可,默认的 1024 位加密足够用,如果要保险点,可以选择 2048 或 4096 位加密,如图红圈处:
第二步,点击 Generate ,然后鼠标随意在空白处移动
等进度条满了,就生成好你的 SSH Key 了:
如果要更安全一点,可以设置 Key Passphrase ,也就是密码,这个密码和 root 密码不同,一旦别人获取了你的 Key ,没有这个密码他也加载不了你的 Key。
第三步,点击 Save Public Key 保存你的公匙,整个文件如下
---- BEGIN SSH2 PUBLIC KEY ---- Comment: "showfom-rsa-key-20130701" AAAAB3NzaC1yc2EAAAABJQAAAQEAna/D52fTZ1YNjxnwAJAUhxRdPCwar8ZfWLdw HEmT64Zqtxrz65KRxesHFRVND8Xn1GKtuQIQMu/d5fFhEajFbjoSw/n+Mz58irzU XDbE34Y/nxy1/iWc6aJz6lX6wT7nnDcVoqX8Be8j/8sjS7cMFarn3Iy+0bSQNON3 681+hEFM7mpoYyqrCVBpARfiiEZb8tNkfzrKJFrciZ87yaKkncPeDCIbYKjuJY2h ciK+Y+IptLdoMj5kQkSXStJFQUfFg+s3FQJ9Istu4C7BF3ZafD4mEupA7P90RRUj Lj95mUW/P/ebWGsMVbnxz/Xmq3OL/TOuo85umbSN44DmSB3NEQ== ---- END SSH2 PUBLIC KEY ----
其中中间那么长长的一串,就是你的公匙了,可以放在服务器的 ~/.ssh/authorized_keys ,我们应采取以下的格式:
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAna/D52fTZ1YNjxnwAJAUhxRdPCwar8ZfWLdwHEmT64Zqtxrz65KRxesHFRVND8Xn1GKtuQIQMu/d5fFhEajFbjoSw/n+Mz58irzUXDbE34Y/nxy1/iWc6aJz6lX6wT7nnDcVoqX8Be8j/8sjS7cMFarn3Iy+0bSQNON3681+hEFM7mpoYyqrCVBpARfiiEZb8tNkfzrKJFrciZ87yaKkncPeDCIbYKjuJY2hciK+Y+IptLdoMj5kQkSXStJFQUfFg+s3FQJ9Istu4C7BF3ZafD4mEupA7P90RRUjLj95mUW/P/ebWGsMVbnxz/Xmq3OL/TOuo85umbSN44DmSB3NEQ== showfom-rsa-key-20130701
其中 ssh-rsa 为加密类型, showfom-rsa-key-20130701 为说明,可以是任意文本,如 showfom-notebook
第四步,点击 Save Private Key 生成用于 Putty 的私匙,这里我们保存为 showfom.ppk ,整个文件如下
PuTTY-User-Key-File-2: ssh-rsa Encryption: none Comment: Showfom Public-Lines: 4 AAAAB3NzaC1yc2EAAAABJQAAAIBTILl54rOaEEkv95VKR6IEZ9Y0d1IpNNQeyk+e yHPtc7jVTmfL0oiho9s2UqquaNGmLmzLjhXRj3cPZ1VZInPFqVtgWYKWPEpGckGI 7/iTpNUuz6tKguEi5RYaEtfgKWF13qC5S8dWlk2FGv7dY5GbSoZMHZtc+zTL9Jpn NCa5nw== Private-Lines: 8 AAAAgEWly9TSsiciZtUpYWe/eegD+Kh/pbPSUNuG6MNOAEN8ocd5Ctsz2kI9LUkw gSpX0j8f+kmuZU62eIKHAlGZZ+nVyklcHE7qFO2AyMCuniUYm0mgdN5gjXUBFduV VTjIaYwd282Yo0xtjPWN0DJF3jmmsrw6pwMwaa6r6pAlKANtAAAAQQClYrYCu3eu 0GcGw9G2MVLIZoHoKYPL2e6HjfPQhvsze6AKUzpTF/DGMkBFY6dH//0zSoHue2jn gNsaLQygBvT/AAAAQQCArGNL76eXHtR28TRY2PONg8ij3YN9mCzYG3sDsV8feGAk RyZ8T5b6xZuf9UyvZ1lIA10i7ULZ63s2hvCZUxthAAAAQD+auXN8fUAylROh8zTM 14FyY7GRwdN7y7+EtZ8NuVDLvZP9Svpd4V5Ti9LpqjtiUcp0eELCd5i7zxyV2oHe U78= Private-MAC: ce0968aff198e2c2550704625b23ba7575e6b260
这个 showfom.ppk 你需要通过 Putty 目录下的 PAGEANT.EXE 导入,这样你就可以不需要输入 root 密码即可登录你的 VPS。
PS: WinSCP 和 Putty 的 SSH Key 是通用的,只需要导入一次即可。
但是 Putty 的 Private Key 是不标准的,只能用于 Putty 或 WinSCP ,如果你使用 Xshell 4 ,则需要转换成 rsa 文件,可以在 PUTTYGEN.EXE 上方菜单里的 Conversions > Export OpenSSH Key 方式转换。
第五步,导入你的 Linux VPS 或服务器
如果你本地是 Linux 桌面环境,可以很简单的一条命令搞定:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@198.51.100.100
但是大多数用户还是 Windows 用户,所以我建议两种比较简单的方法
1、把自己的公匙放在 https://launchpad.net/ 网站,并得到类似 https://launchpad.net/~showfom/+sshkeys 这样的地址,然后通过以下命令导入你的 Key
curl https://launchpad.net/~showfom/+sshkeys > ~/.ssh/authorized_keys
如果没有 .ssh 目录,可以新建立一个
mkdir .ssh
2、也可以直接写入 authorized_keys 文件
cat >>/root/.ssh/authorized_keys<<EOF ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAna/D52fTZ1YNjxnwAJAUhxRdPCwar8ZfWLdwHEmT64Zqtxrz65KRxesHFRVND8Xn1GKtuQIQMu/d5fFhEajFbjoSw/n+Mz58irzUXDbE34Y/nxy1/iWc6aJz6lX6wT7nnDcVoqX8Be8j/8sjS7cMFarn3Iy+0bSQNON3681+hEFM7mpoYyqrCVBpARfiiEZb8tNkfzrKJFrciZ87yaKkncPeDCIbYKjuJY2hciK+Y+IptLdoMj5kQkSXStJFQUfFg+s3FQJ9Istu4C7BF3ZafD4mEupA7P90RRUjLj95mUW/P/ebWGsMVbnxz/Xmq3OL/TOuo85umbSN44DmSB3NEQ== showfom-rsa-key-20130701 EOF
在某些服务商的 CentOS 系统里,由于开启了 SELinux ,默认是禁止了 .ssh 目录的权限的,可以用下面的命令解除限制:
restorecon -R -v /root/.ssh
如果遇到 authorized_keys 权限问题,可用如下命令解决:
chattr -i authorized_keys
然后你可以重启开启一个 SSH 窗口,测试是否不需要输入密码即可用 root 登陆。
第六步,关闭 SSH 密码登陆
编辑 SSH 配置文件:
vim /etc/ssh/sshd_config
找到
#PasswordAuthentication yes
并改为
PasswordAuthentication no
保存,退出,重启 SSH 服务
Ubuntu 下:
/etc/init.d/ssh restart
CentOS 下:
/etc/init.d/sshd restart
好了,这样禁止 SSH 密码登陆就大功告成,这一步就拒绝了 90% 的入侵危险,当然,你自己的私匙一定要保存好,否则被别人偷走可是不需要密码就能进你的服务器哦。
二、安装 CSF 防火墙屏蔽尝试入侵服务器的 IP
CSF 防火墙安装略简单,几个命令即可搞定:
rm -fv csf.tgz wget http://www.configserver.com/free/csf.tgz tar -xzf csf.tgz cd csf sh install.sh
然后运行 perl /usr/local/csf/bin/csftest.pl 检测是否安装成功
为了防止系统误屏蔽本地 IP,可以修改 /etc/csf/csf.allow 和 /etc/csf/csf.ignore 文件加入你需要的白名单 IP ,然后用 csf -r 命令重启读取配置文件即可。
三、用 iptables 只开启常规端口
一般我们只需要开启 22, 53, 80, 443 这三个常见的对外开放端口,可以使用如下命令
清空 iptables 默认规则
iptables -F
允许 22 端口进入和返回
iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
允许 53 端口,一般作为 DNS 服务使用
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -p udp --sport 53 -j ACCEPT
允许本机访问本机
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
允许所有 IP 访问 80 和 443 端口,一般作为 http 和 https 用途
iptables -A INPUT -p tcp -s 0/0 --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp -s 0/0 --dport 443 -j ACCEPT iptables -A OUTPUT -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
保存配置
iptables-save > /etc/sysconfig/iptables
重新加载 iptables
iptables -L
四、安装 fail2ban 屏蔽并举报扫描 SSH 端口的 IP
有很多精力旺盛的家伙会整天扫描 SSH 密码,当然直接关闭 SSH 密码登陆即可防止,但是为了给他们一点教训,可以安装 fail2ban ,屏蔽之余,还能自动写举报信给 IP 所在的 ISP。
CentOS 下安装:
导入 epel 源:
CentOS 6.x 32 位:
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
CentOS 6.x 64 位:
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
安装 fail2ban
yum -y install fail2ban cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local service fail2ban start
Ubuntu / Debian 下安装:
apt-get install fail2ban -y
通过查看 /var/log/fail2ban.log 文件即可知道有哪些精力过剩的家伙在整天扫描你的 SSH 了。
后记
因为近期不少客户的 VPS 或服务器被黑客入侵,原因都是用了很简单的 root 密码,所以考虑以后卖无管理型的 VPS 时,直接做个屏蔽密码的系统,用户购买的时候提交自己的 SSH Key ,或者系统分配你一个 SSH Key ,这样就会安全多。国外的 Amazon EC2、 DigitalOcean 和 HPCloud 均有导入自己 SSH Key 并默认屏蔽密码的方式,大大增加了安全性。