Linux小白如何打造一个相对安全的小鸡系统

可能大多数人都觉得Linux是很安全的吧?但我要告诉你,这种想法是错误的!要知道世界上没有『绝对』安全的系统。只能说,Linux相对于windows,是『相对』安全些。但是,如果不加以完善和强化Linux系统的安全配置,那也不是一个很安全的系统。

任何一个操作系统,都有漏洞,只是暂时没有被发掘。为什么操作系统会有漏洞?因为是人设计和开发的,人都是有漏洞的,世界上没有完美的人,当然也就没有完美的操作系统和软硬件。

在这个充满着不断Scans漏洞、嗅探、穷举和暴力破解的网络环境中,我们暴露在公网小鸡几乎每天都成为『hacker』&『脚本小子』练手、渗透到目标对象。很多朋友都忽视系统的安全配置,觉得设置一个比较复杂的密码,就会很安全了。别人基本猜不到。但是这远远是不够的。复杂的密码,只能说是拉长了暴力破解所需的时间。如果hacker真要对你下手,想必他们的密码字典肯定不弱吧?而且也可以从多方面获取你的个人信息,包括出生年月、姓名、家庭住址、邮箱地址等,再通过大数据『社工库』检索你在各大平台注册过的账号和历史密码等敏感信息。要知道,现在的软件很牛b,把你的所有信息组合起来,用软件一键生成一个几兆几十兆甚至几百几G的密码库一个个去试探登录..而且就算正常的登录口令无法破解,可能会从发布的展示网站找漏洞去渗透入侵提权。
入侵的目的性:
1.为『渗透测试』练练手。
2.挂个txt文本或者html页面炫耀一下。
3.窃取数据去地下黑产交易中心卖钱。
4.种植后门木马变成肉鸡以用来发动DDOS攻击。
5.用做跳板来入侵其他的服务器来掩藏自己的踪迹。

你还敢说很安全吗。
例如下图的一个两三兆的密码字典:
first.png
这只是一个小小有四十多万行密码的字典,很多搞黑产的大牛,手握各种大裤子大字典论GB甚至TB的数据量,真是不敢想象。

博主是一个linux小白,经验不够各位观众丰富,还请见谅。 分享一下『linux对外安全配置』来把我们的小鸡打造得相对强大一点吧!

PS:『小鸡系统』=配置很渣的ovz架构vps。

在购买了小鸡系统之后,默认的root是允许所有IP可登录的,基本上可以说在小鸡创建完成对外可访问的那一刻,基本少不了来自各地的IP的试探性弱口令登录入侵:
1secure.png

2lastb.png

他们会利用工具配合字典库中的用户名和密码一个个去尝试登录我的服务器--『穷举暴力破解』,因此root的密码最好是设置的倍儿复杂,没有规律性,避开123456、1991、1993、1995、2008、2012、2013、5201314、abcqwe、ABCQWE、haha、hehe等弱密码。大小写字母+特殊符号,长度在13位以上是最好的,而且尽量不加自己的姓名拼音或者出生年月。如果是我,我会这样设置root密码:
[email protected]!7ChIna=
/CHInA$LoVE)#


测试场景:CentOS6.8 x86_64
支持环境:CentOS6.x
PS: CentOS7.X系统默认没有iptables,用的是firewalld

【【外围登录入口防护】】

【加固ssh连接】
我们可以修改ssh的默认端口,将22换成复杂的端口,这样很大程度上屏蔽了扫描软件的扫描。
vim /etc/ssh/sshd_config,将默认的13行内容注释掉,然后在底下一行重新写上Port +你想定义的端口,例如Port 34562,然后保存退出。并/etc/init.d/sshd restart重启ssh服务以致修改的配置生效。(修改端口后,当前已连接的seesion不会断开,只会在下一次重新登录的时候,就会提示无法连接到远程服务器,你只需连接时改一下新的ssh端口即可)
3ssh.png


【加固root用户】
我们也可以修改系统的root名称,例如换为wa666haha.
vim /etc/passwd
vim /etc/shadow
将这两个文件的首行的root名称,修改为wa666haha即可。(PS:在下一次重新登录系统时生效)
<passwd>:
4passwd.png
<shadow>:
5shadow.png


【sshd_config】
sshd_config是Secure Shell (SSH)服务守护进程配置文件。这个文件自带有一些安全策略,也可以做IP和用户鉴权。
参数是AllowUsers
这个参数就没有黑名单的说法了,毕竟是Allow参数嘛,所以只开放允许的用户或IP连接到ssh,其他一律ban。

开放用户:root、haha
开放IP:61.61.61.61、219.138.2.2

写法:
编辑/etc/ssh/sshd_config
在末尾新增一行参数

AllowUsers [email protected]
AllowUsers [email protected]

保存退出,重启ssh服务即可生效。
service sshd restart
ssh_allowusers.png

描述:
只允许61.61.61.61用root账号、219.138.2.2用haha账号登录到本地服务器。
当然可以写成

AllowUsers *@61.61.61.61

是允许61.61.61.61用任意账号登录。或者

AllowUsers *@*

是允许任意IP用任意账号登录;但是这样写没必要,如果想要开放所有,那干脆不配置这个参数就行了。

测试情况:
白名单IP,但不是白名单用户登录的话,即使密码是正确的,登录会话依然被限制:
1101.png

只有用特定IP和特定用户才能正常登录。

这个方法的不 足之处 和 特点 跟下文的【hosts.deny&hosts.all】是一样的。


【iptables】
简介:iptables防火墙工作在网络层,针对TCP/IP数据包实施过滤和限制,iptables防火墙基于内核编码实现,具有非常稳定的性能和高效率;

我们也可以不修改root的名称,可以利用系统自带的iptables防火墙来做安全策略。讲真,iptables是一个很强大很好用的工具,利用它来配置合理的规则和防护策略,可以很有效的起到保护系统的一个作用。
不清楚的朋友可戳这里:
1.维基百科--iptables
2.iptables学习笔记 (1)
3.iptables简单基础应用

某天我发现系统登录错误日志中有一个非法IP记录,于是我将它加入iptables的黑名单。直接DROP掉他连接到服务器的22端口。
6DROPoneip.png
现在配置防火墙的入站规则,拒绝这个ip接入22端口。
iptables -I INPUT -p tcp -s 121.18.238.28 --dport 22 -j DROP
当然也可以拒绝他连接服务器的任何端口。
iptables -I INPUT -p tcp -s 121.18.238.28 -j DROP
/etc/init.d/iptables save
这样这个ip怎么样都连不上我的服务器了。

结果仔细一看日志,发现还有很多IP在穷举尝试登录系统:
7manyIP.png

如果说是手工一个个去添加防火墙规则的话,太费神了。可以写一个小脚本,批量将这些非法IP加入到防火墙中。
addblackip.jpg

chmod u+x addblackip.sh后执行一下脚本。便可实现一键批量DROP黑名单ip连接22端口。
addblackipok.png
再配合定时任务crond,每天凌晨1点去跑一次这个脚本,这样就不用担心非法ip的持续性穷举破解22端口了。
crontab.png

附上脚本:

#!/bin/bash
date=$(date "+%Y-%m-%d")
#define a date variable

if [[ ! -d "/root/blackip"  ]]
 then
   mkdir /root/blackip/
fi

lastb -a |awk '{print $10}'|grep -vE "^$|[A-Z,a-z]"|sort |uniq  > /root/blackip/blackip_${date}.log
#get the black ip by the lastb command, then write to /root/blackip directory.

catip=`cat /root/blackip/blackip_${date}.log`
#see the black ip file

for add in ${catip}
  do

    iptables -A INPUT  -p tcp -s ${add} --dport 22 -j DROP

  done

【iptables+ip鉴权】
我们可以利用iptables,只开放允许我们白名单可信任的IP或者IP段可连接服务器22端口,例如我们的办公IP、家庭IP(可能是动态获取,可写相应网段)、可信任的一个中转IP。其他的ip一律全局拒绝连接。

PS:在写规则的时候一定要慎重仔细,防火墙是从上往下读取匹配的,需要正确地使用iptalbes -Aiptables -I参数,不恰当的操作会导致自己被挡在了墙外而无法连接服务器!!!(过来人T_T)

iptables -I 将当前的命令插入到链的首行并生效
iptables -A 将当前的命令附加到链的末尾并生效

场景:
信任的IP:61.61.61.50 (虚构)
信任的IP:123.207.66.66 (虚构)

需求:
办公室的ip是61.61.61.50,跳转的ip是123.207.66.66,我想只通过这两个IP来登录我的远程小鸡,其他IP一律拒绝。

实现过程:
1.)在过滤表filter的INPUT链中,将可允许连接目的端口22的源ip加入防火墙
iptables -t filter -I INPUT -p tcp -s 61.61.61.50 --dport 22 -j ACCEPT
iptables -t filter -I INPUT -p tcp -s 123.207.66.66 --dport 22 -j ACCEPT

加入到首行最先匹配到

2.)在过滤表filter的INPUT链中,禁止所有源ip访问目的本机端口22
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
加入到末行最后匹配到

iptables-I1.png

iptablesstatus.png
这样,除了61.61.61.50、123.207.66.66能连接本机服务器的22端口之外,其他的ip都无法连接。
telnet.png

当然也可以用私钥证书来登录。


【hosts.deny&hosts.all】
/etc/hosts.allow/etc/hosts.deny两个文件是控制远程访问设置的,通过这两个文件可以允许或者拒绝某个ip或者ip段的请求到系统的某项服务。记住,编辑文件后,保存会立即生效。
比如SSH服务,我们通常只对管理员开放,那我们就可以禁用不必要的IP,只开放管理员可能使用到的IP或IP段。
20171031-1.png

信息:
测试白名单IP:61.61.61.61 (管理员IP,只允许这个公网IP可以与系统的sshd、vsftpd服务进行连接,其他IP一律ban)
其他IP一律禁止连接到这两个服务。

测试场景:
1.我们编辑/etc/hosts.allow,在文件末尾新增一行参数,参数格式是 [服务名]:白名单ip,多个IP或IP段可以通过空格来增加,然后保存退出。
vimhostsallow.png

2.编辑/etc/hosts.deny,在文件末尾新增一行参数,参数格式是 [服务名]:黑名单ip或者写成all,多个IP或IP段可以通过空格来增加,然后保存退出。 PS:写成all代表系统拒绝任何地址请求到这个服务。
vimhostsdeny.png

测试情况:
白名单IP正常连接。
非白名单IP不可可连接ssh,vsftpd:
hostsdeny1.png
hostsdenyftp2.png
hostsdenytelnetftp3.png

不足之处:
不能在进入应用层之前,也就是网络层时,就将非法IP请求ban掉,等ip可以连接到服务端口时,系统才去核对/etc/hosts.allow/etc/hosts.deny中是否有当前连接进来的IP,然后才做下一步的操作。

上面的图片大家可以看到,已经连到服务了,才断开。 当然也可以用iptables来实现,比这个更好一点,更完美地屏蔽了端口是活跃的敏感信息。

特点:
就算暴露22端口在公网,只要加了这些策略,几乎可以完美地阻挡了弱口令扫描猜解的穷举攻击。


【【内部系统优化防护】】

未完待续...


总结:
有的朋友说,改一个超级复杂的密码不就行了。我觉得复杂密码固然重要,但是不能依靠一个复杂的密码来保障整个系统的安全性吧?所以,该DROP的IP就DROP,不给非法用户第二次破解我们系统密码的机会。

无论是在生产上还是测试环境,一切操作要认真谨慎小心!一切操作要认真谨慎小心!!一切操作要认真谨慎小心!!!

老铁们如果你们有更好的方法和经验,不妨分享出来,大家一起学习、一起进步~

标签: security, linux

已有 2 条评论

  1. ZeawinL ZeawinL

    技术贴,学习了。ଘ(੭ˊ꒳​ˋ)੭✧

添加新评论