安全配置你的 Linux Server 的小技巧

Fri, Oct 6, 2017

安全配置自己的 Linux Server,其实是一个很巨大的命题,巨大到写一本几百页的书本,内容有几十万字可能都讲不完。不过,我也没有打算展开来讲太多,只说一些自己经常使用的安全配置自己的 Linux Server 的一些心得和技巧。

是的,我不是专家,也不打算自己去装专家。我只是想记录一些自己的想法。

SSH 暗号开放端口临时连接

除了常见的使用证书登录、改端口、限制连接次数等各种手段,这些只能保证敌人来到你的城门,你各种方法不让他入城吧。

怎么说呢,上面罗列的这些手段仍然是必须的,但是我们换个思路,为什么要让你的敌人来到你的城门下面呢?为什么不直接关了城门呢?

或者你会说,没有城门,我们自己也登录不了服务器管理啊!这个时候,你可以设置一句暗语啊!说对了暗语,才会有城门出现;说不对暗语,连门都没有,对,就是连门都没有。

如果你注重安全,或者你会听说过 Knockd 没错, Knockd 正是我这个想法的比较完美的实现,因为它可以用暗号动态控制 iptables 的行为,从而动态开启或者关闭系统的某些端口!这种技术称为 Port Knocking 中文又称 端口敲门 技术,这个 Port-Knocking 介绍网站可以为你详细讲解端口敲门的工作原理。

不过这个 Port-Knocking 我觉得并不完美,一来它需要安装多一个二进制程序包,二来它有一个后台的守护进程,我是处女座啊!怎么可能容忍这样的事情存在!

其实单纯用 Linux iptables 就可以完成上面的事情啦!

使用 iptables 加入下面的规则:

# 指定78 字节的 ICMP 数据包(包含IP头部20 字节,ICMP头部8 字节)通过被加入sshopen 列表。
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 78 -m recent --set --name sshopen --rsource -j ACCEPT

# 检查sshopen 列表是否存在你的来源IP,如果存在,即从第一次使用密令开始10 秒钟内开启SSH 22 端口,
# 超过10 秒端口自动关闭,不再允许新连接,已连接的不会断开。
iptables -A INPUT -p tcp --dport 22 --syn -m recent --rcheck --seconds 10 --name sshopen --rsource -j ACCEPT

如果你想开启 SSH 端口用于远程连接,那么要先发送对应长度的 ICMP包到你的服务器

# linux/unix
ping -s 50 YOUR_HOST_IPv4_ADDRESS

# windows
ping -l 50 YOUR_HOST_IPv4_ADDRESS

感觉这样的实现很猥琐,不过很实用。就两条 iptables 策略的事情,世界多么简单啊!

Authy 动态密码验证登录

是不是感觉固定的密码很不安全?是不是觉得用完就丢的随机的密码才是高大上的体现?嗯嗯,不用 RSA Token 这么高贵的密钥生成器,免费的唾手可得的动态密码登录一样能让你爽到飞起。

Login 服务器就立刻发通知

服务器一旦有人登录,就立刻给你的邮箱、手机短信、微信或者 Telegram 发通知!是不是很炫酷很牛逼啊!

这个方法个人可用吧,当你管理着很多服务器的时候,请谨慎用,因为通知消息太多的话,会淹没真正有用的消息的,这个时候有没有通知都一个卵样。

这里的例子是使用 instanotification 推送通知到你的微信,发送到邮件、短信或者 Telegram,请自行折腾!

首先确认你的 SSH 开启了 PAM 支持,关于 PAM 这个东西,具体请自行学习。就是打开 /etc/ssh/sshd_config 然后检查里面有没有这样一项 YES

# ubuntu 14.04
# /etc/ssh/sshd_config

UsePAM yes

然后利用 pam_exec 为 SSH 增加一个 HOOK,简单说就是在 etc/pam.d/sshd 文件的末尾增加一行

session    optional     pam_exec.so seteuid /etc/ssh/login-notifications.sh

然后创建 /etc/ssh/login-notifications.sh,具体的命令操作如下:

# ubuntu 14.04
# YOU MUST DO IT IN ROOT!!!
touch /etc/ssh/login-notifications.sh

写入下面的内容:

#!/bin/sh
if [ "$PAM_TYPE" != "close_session" ]; then
    REQUEST="http://www.instanotification.com/messages?secret="
    SECRET="__YOUR_INSTANOTIFICATION_SECRET_HERE__"
    HOSTNAME=$(hostname)
    NOW=$(date)
    NAME="NOTIFICATION: USER[$PAM_USER] FROM[$PAM_RHOST] LOGIN[$HOSTNAME] TIME[$NOW]"
    # send
    curl ${REQUEST}${SECRET}"&name="${NAME}
fi

记得修改一下这个脚本的属性,执行以下命令:

# ubuntu 14.04
# YOU MUST DO IT IN ROOT!!!
chmod 700 /etc/ssh/login-notifications.sh

就这么简单,一旦有人登录你的的服务器,就会立刻通过 instanotification 推送通知到你的微信,是不是很炫酷!

Logger 日志定期备份上云存储

服务器上的日志文件本地存储的话,实话实说,意义不大,因为入侵者一旦取得你的服务器权限,稍微懂点套路的入侵者都会清理完自己留下的日志。将日志定期备份上云存储,原理上并不能保证入侵者在入侵时对日志的删除和清理,但是多数入侵者在前期肯定会对服务器有过扫描或者猜解密码等行为,简称入侵前踩点!入侵者踩点的日志记录能保持下来,也是可以帮助我们分析入侵者的行为的。

Comments

comments powered by Disqus