服务器安全基础指南

分布式事务
• 阅读 6207

首先,VPS 服务器被黑怎么办?

第一, 10秒之内登录你的 VPS 提供商账号,关机。
第二,切断被黑机器的外网。
第三,在相同的 VPS 提供商重开一台机器,内网登录,备份重要的信息
第四,迁移数据
第五,报废之前被黑的 VPS

最近正好接触到一次服务器由于开启redis但没注意安全设置从而被提权的入侵的事件,以下是自己做的一些小总结。

此文章适用于系统版本为:Ubuntu 14.04 64

Nginx 配置:

升级到稳定版

sudo apt-get update && sudo apt-get upgrade

sudo apt-get upgrade nginx

Nginx 目前在 Ubuntu 14.04 中稳定版本号是 1.4.6

可以通过在 VPS 上执行以下 curl 命令来查看信息:

curl -I http://localhost

返回大概是:

HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)

这里直接显示了 Nginx 的版本号,可以通过配置隐藏:

sudo vi /etc/nginx/nginx.conf

http 部分添加:

http {
        ##
        # Basic Settings
        ##
        server_tokens off;
}

重启 Nginx

sudo service nginx reload

这样再次执行 curl 就可以看到隐藏了 Nginx 的版本号了:

curl -I http://localhost
HTTP/1.1 200 OK
Server: nginx
...
X-Powered-By: PHP/5.5.9-1ubuntu4.14
...

注意到上面 X-Powered-By: PHP/5.5.9-1ubuntu4.14 这一行暴露了 PHP 的版本号,所以我们来配置 php.ini 来隐藏之,即在 php.ini 文件中设置:

expose_php = Off

如果你的服务器的 php.ini 默认就隐藏了版本,那么恭喜你。

SSH 配置:

配置 ssh ,比如关掉密码认证式登录等:

sudo vi /etc/ssh/sshd_config 

打开之后配置:

# 不允许空密码
PermitEmptyPasswords no
# 关闭密码验证登录,前提是你已经使用了 ssh 密钥验证方式登录
PasswordAuthentication no
# 如果你在服务器上手动添加了用户并将用户分配到 root 用户组,可以考虑禁止root用户登录
PermitRootLogin no

重启 ssh

sudo service ssh restart

iptables 配置

iptables 提供了一种可灵活配置安全策略防火墙框架,具体的原理可以看这篇文章:http://seanlook.com/2014/02/23/iptables-understand/

博主写文章很认真,推荐一下

开始之前,可以通过以下命令全新配置 iptables

iptables -F

注意上述命令会将你之前自己设置的过滤规则清空。

你可以查看 iptables 的相关资料,一条一条添加安全规则,也可以这样:

sudo vi /etc/iptables.up.rules

添加内容:

*filter

# Accepts all established inbound connections
 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allows all outbound traffic
# You could modify this to only allow certain traffic
 -A OUTPUT -j ACCEPT

# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
 -A INPUT -p tcp --dport 443 -j ACCEPT
 -A INPUT -p tcp --dport 80 -j ACCEPT
# Allows SSH connections for script kiddies
# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE
 -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

# Now you should read up on iptables rules and consider whether ssh access
# for everyone is really desired. Most likely you will only allow access from certain IPs.

# Allow ping
 -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# log iptables denied calls (access via 'dmesg' command)
 -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Reject all other inbound - default deny unless explicitly allowed policy:
 -A INPUT -j REJECT
 -A FORWARD -j REJECT

COMMIT

其中非常值得注意的是这三条:

 # 443 通常是 ssl 的端口,如果 VPS 是作为一台web应用的服务器并且启用 https,你需要这个
 -A INPUT -p tcp --dport 443 -j ACCEPT
 # 80 端口就不多说了
 -A INPUT -p tcp --dport 80 -j ACCEPT
 # 这是 ssh 默认的 22 端口,开放给自己登录使用
 -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

注意这里的 22 端口,你可以修改为其他的端口,并且关闭 22 端口。更有一种解决方案是:将生产机器 ssh 端口完全关闭,用一台同一子网下的跳板机,通过来登录目标生产机器。

其他的配置的话,你需要根据你的业务来具体配置相对应的安全策略。

写好这些配置项之后,告诉 iptables 你的配置在哪:

sudo iptables-restore < /etc/iptables.up.rules

创建 shell 脚本来开机自启动:

sudo vi /etc/network/if-up.d/iptables

添加内容:

#!/bin/sh
iptables-restore /etc/iptables.up.rules

给以可执行的权限:

chmod +x /etc/network/if-up.d/iptables

到这里,iptables 的基础设置就OK了。

配置 Fail2Ban

Fail2Ban 的工作原理是:通过监控系统的日志文件,并根据检测到的任何可疑的行为自动触发不同的防御动作,如将产生可疑行为的目标 ip 锁定等。

安装:

sudo apt-get install fail2ban

打开配置文件,进行配置:

sudo vi /etc/fail2ban/jail.conf

写入:

[DEFAULT]
ignoreip = 127.0.0.1/8
bantime  = 3600
maxretry = 3
destemail = email@yourdomain.com
action = %(action_mw)s

[ssh]

enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 3

到这里,就是我个人从上次被黑当中总结的一些基本的服务器安全,而至于群里 @little 大神说的跳板机的方案,容我再消化消化再尝试部署起来。

总结

1.服务一些基本的安全配置得跟上。
2.关注安全圈的新闻和动态,及时升级软件和修复相关安全漏洞。
3.服务器上的服务,用哪个就看哪个,不用的坚决关掉。
4.服务器一旦被入侵,不急。关机,断网,备份,迁移,舍弃。

记住:The less information you provide, the more secure you are .

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
3年前
Linux应急响应(一):SSH暴力破解
0x00前言SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议,主要用于给远程登录会话数据进行加密,保证数据传输的安全。SSH口令长度太短或者复杂度不够,如仅包含数字,或仅包含字母等,容易被攻击者破解,一旦被攻击者获取,可用来直接登录系统,控制服务器所有权限。0x01应急场景某天,网站
百度云,华为云,腾讯云,阿里云测评
在挑选VPS之前,首先你要明确自己的用途,根据自己的用途挑选合适的VPS。2022年国内最好最优质的VPS推荐​阿里云、华为云、腾讯云、百度云哪家便宜一般来说腾讯云价格较华为云、阿里云都便宜。阿里云价格华为云价格腾讯云价格>百度云价格NO1:阿里云简介:阿里云成立于2009年,为中国目前最大的虚拟专用服务器(VPS)提供商。服务范围覆盖全球200多个国家和