在开通了 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 ,我们应采取以下的格式:
1
代码如下 | 复制代码 |
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 .ssh2、也可以直接写入 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 restartCentOS 下:
/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.rpmCentOS 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 了。
四、使用DDos deflate简单防落CC和DDOS攻击
使用netstat命令,查看VPS当前链接确认是否受到攻击:
netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n
IP前面的数字,即为连接数,如果说正常网站,几十到一百都属于正常连接,但出现几百,或上千的就可以垦定这个IP与你的VPS之间可能存在可疑连接现象。
可以使用iptables直接BAN了这个IP的永久访问:
iptables -A INPUT -s 12.34.56.78 -j DROP
使用软件DDos deflate来自动检测并直接BAN掉的方法,首先要确认一下iptables服务状态,默认CENTOS就安装的,不看也行。
service iptables status
安装DDos deflat:
wget http://www.inetbase.com/scripts/ddos/install.sh
chmod +x install.sh
./install.sh
安装后需要修改/usr/local/ddos/ddos.conf,主要是APF_BAN=1要设置成0,因为要使用iptables来封某些可疑连接,注意EMAIL_TO=”root”,这样BAN哪个IP会有邮件提示:
##### Paths of the script and other files
PROGDIR=”/usr/local/ddos”
PROG=”/usr/local/ddos/ddos.sh”
IGNORE_IP_LIST=”/usr/local/ddos/ignore.ip.list” //IP地址白名单
CRON=”/etc/cron.d/ddos.cron” //定时执行程序
APF=”/etc/apf/apf”
IPT=”/sbin/iptables”
##### frequency in minutes for running the script
##### Caution: Every time this setting is changed, run the script with –cron
##### option so that the new frequency takes effect
FREQ=1 //检查时间间隔,默认1分钟
##### How many connections define a bad IP? Indicate that below.
NO_OF_CONNECTIONS=150 //最大连接数,超过这个数IP就会被屏蔽,一般默认即可
##### APF_BAN=1 (Make sure your APF version is atleast 0.96)
##### APF_BAN=0 (Uses iptables for banning ips instead of APF)
APF_BAN=1 //使用APF还是iptables。推荐使用iptables,将APF_BAN的值改为0即可。
##### KILL=0 (Bad IPs are’nt banned, good for interactive execution of script)
##### KILL=1 (Recommended setting)
KILL=1 //是否屏蔽IP,默认即可
##### An email is sent to the following address when an IP is banned.
##### Blank would suppress sending of mails
EMAIL_TO=”root” //当IP被屏蔽时给指定邮箱发送邮件,推荐使用,换成自己的邮箱即可
##### Number of seconds the banned ip should remain in blacklist.
BAN_PERIOD=600 //禁用IP时间,默认600秒,可根据情况调整
五、使用iftop查看详细网络状况
安装IFTOP软件:
yum -y install flex byacc libpcap ncurses ncurses-devel libpcap-devel
wget http://www.ex-parrot.com/pdw/iftop/download/iftop-0.17.tar.gz
tar zxvf iftop-0.17.tar.gz
cd iftop-0.17
./configure
make && make install
安装后,使用iftop运行,查看网络情况。TX,发送流量;RX,接收流量;TOTAL,总流量;Cumm,运行iftop期间流量;peak,流量峰值;rates,分别代表2秒、10秒、40秒的平均流量。
快捷键:h帮助,n切换显示IP主机名,s是否显示本机信息,d是否显示远端信息,N切换端口服务名称,b切换是否时数流量图形条。
因为近期不少客户的 VPS 或服务器被黑客入侵,原因都是用了很简单的 root 密码,所以考虑以后卖无管理型的 VPS 时,直接做个屏蔽密码的系统,用户购买的时候提交自己的 SSH Key ,或者系统分配你一个 SSH Key ,这样就会安全多。国外的 Amazon EC2、 DigitalOcean 和 HPCloud 均有导入自己 SSH Key 并默认屏蔽密码的方式,大大增加了安全性。
当然也可以禁止ROOT登陆
先添加一个新帐号 111cn.net ,可以自定义:
useradd 111cn.net
给 111cn.net 帐号设置密码:
passwd 111cn.net
仍旧是修改/etc/ssh/sshd_config文件,第39行:#PermitRootLogin yes,去掉前面的#,并把yes改成no,然后,重启SSH服务。以后,先使用 111cn.net 登陆,再su root即可得到ROOT管理权限。
login as: 111cn.net
111cn.net@ip password:*****
Last login: Tue Nov 22 15:18:18 2011 from 1.2.3.4
su root
Password:*********** #注这里输入ROOT的密码