- 如果买了云服务器,不管是哪家的,默认没有防护服务,除非花钱购买,所以这里总结下,提供给各位
- 欢迎提供自己的经验,加入到其中,帮助更多人
按照以下完成服务器配置,至少可以抵御80%来自互联网的扫描和攻击
禁用22端口,改为其他端口
一、修改SSH配置文件(注意是sshd_config而不是ssh_config,多了个d)
vim /etc/ssh/sshd_config
找到“#Port 22”,把两行的“#”号即注释去掉,修改成:
Port 22
Port 50500
SSH默认监听端口是22,如果你不强制说明别的端口,”Port 22”注不注释都是开放22访问端口。上面我保留了22端口,防止之后因为各种权限和配置问题,导致连22端口都不能访问了,那就尴尬了。等一切都ok了,再关闭22端口。
Ok,继续,我增加了50500端口,大家修改端口时候最好挑10000~65535之间的端口号,10000以下容易被系统或一些特殊软件占用,或是以后新应用准备占用该端口的时候,却被你先占用了,导致软件无法运行。
二、如果你关闭了SELinux,可以忽略第二步
先查看SELinux开放给ssh使用的端口
semanage port -l|grep ssh
我的系统打印如下:
ssh_port_t tcp 22
可知,SELinux没有给SSH开50500端口,那么我们来添加该端口:
semanage port -a -t ssh_port_t -p tcp 50500
完成后,再次查看
semanage port -l|grep ssh
ssh_port_t tcp 22,50500
三、如果你关闭了防火墙,可以忽略第三步,话说防火墙不开启太危险了,建议开启(关了防火墙等于一个美女脱光了满大街跑)。
先查看防火墙是否开启了50500端口:
firewall-cmd --permanent --query-port=50500/tcp
打印结果如下:
success
重新加载防火墙策略:
firewall-cmd --reload
执行成功后,查看50500端口是否被开启:
firewall-cmd --permanent --query-port=50500/tcp
打印结果如下:
yes
四、重启SSH服务和防火墙
systemctl restart sshd
systemctl restart firewalld.service
五、验证50500是否能远程连接,使用自己的shell工具,远程通过50500端口连接服务器,能连通则配置成功
六、50500连接成功后,关闭22端口的远程访问能力
vim /etc/ssh/sshd_config
找到“Port 22”,将其注释。
重启sshd服务:
systemctl restart sshd
七、验证22是否能远程连接,使用自己的shell工具,远程通过22端口连接服务器,不能连通则配置成功
防暴力破解安装
安装fail2ban
yum install fail2ban
配置fail2ban安全策略
vim /etc/fail2ban/jail.d/jail.local
输入:
#defalut这里是设定全局设置,如果下面的监控没有设置就以全局设置的值设置。
[DEFAULT]
# 用于指定哪些地址ip可以忽略 fail2ban 防御,以空格间隔。
ignoreip = 127.0.0.1/8
# 客户端主机被禁止的时长(默认单位为秒)
bantime = 3600
# 过滤的时长(秒)
findtime = 600
# 匹配到的阈值(次数)
maxretry = 3
[ssh-iptables]
# 是否开启
enabled = true
# 过滤规则
filter = sshd
# 动作
action = iptables[name=SSH, port=ssh, protocol=tcp]
# 日志文件的路径
logpath = /var/log/secure
# 匹配到的阈值(次数)
maxretry = 3
启动防暴器
systemctl start fail2ban
fail2ban-client reload
查看防爆结果
fail2ban-client status ssh-iptables
禁ping服务器
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
创建新用户,使用ssh登陆,禁止root登陆,密码登陆
注意:以下所有操作都不要关闭shell窗口,需要等所有操作都执行完了,才允许关闭shell窗口,防止人为配置出错,导致自己无法登录服务器
先使用root用户登陆,创建新用,为新用户创建密码
useradd guest
passwd guest
这里的guest为演示用户,修改为自己的用户名,长度不短于8位长度,因为暴力破解8位已经很难了
为用户分配sudo权限
给予sudo权限, 当权限不够时,可以用sudo
gpasswd -a guest wheel
查询所有带sudo权限的用户
lid -g wheel
如果想删除用户,删除用户和相应的目录:
这一步不是必须的
userdel -r guest
用户创建完毕,切换guest用户登陆(因为要为当前用户生成密钥)
su guest
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" //生成密钥,邮件换成自己的
生成之后 ,
私钥是/home/guest/.ssh/id_rsa
公钥是id_rsa.pub
可以更改私钥名称为id_rsa_guest.pem,公钥为authorized_keys(因为centos默认配置文件的名字是authorized_keys )
退回到root用户
exit
执行
chmod 700 /home/guest/.ssh/
chmod 644 /home/guest/.ssh/authorized_keys
将私钥文件从服务器下载到本地,然后用shell登陆,使用public key的方式登陆
确保登陆后,修改/etc/ssh/sshd_config文件,禁止密码登陆,启用密钥验证
vim /etc/ssh/sshd_config
修改以下三项:
- PasswordAuthentication no
- RSAAuthentication yes
- PubkeyAuthentication yes
在最后新增一行,限制只允许guest远程登录,其他用户都不可以,如果将来这一行不见了或者被改了,说明服务器被攻击了(其实/etc/ssh/sshd_config这个文件中的配置只要被人动过,说明黑客已经获取到root执行权限了,很危险了已经,建议立即断开外网,再处理)
AllowUsers guest
重启ssh服务
systemctl restart sshd.service
验证
- 打开新的shell窗口,使用root用户名登录,此时应该登录失败
- 打开新的shell窗口,使用guest用户名登录,此时应该登录失败
- 打开新的shell窗口,使用使用public key的方式登陆,此时应该登录成功
至此,以上都验证过了,才可以关闭shell窗口
使用跳转机
- 如果资金允许的话,可以购买一台或多台配置相当的机器作为跳转机,所有服务都关闭外网访问能力,开通对这些跳转机的接入接出能力。
- 这样的话,可以将真实的服务以及服务器都隐藏在这些跳转机后面,起到间接保护服务器作用。即使跳转机被攻破,真正的服务也能暂时得到保护。
使用预警系统
可对以下参数监控:
- CPU
- 内存
- 登录日志
- 文件系统
这块可自行查找,有免费的、有收费的
记录服务器的所有操作
黑客一般会删除自己的操作记录,最好保留所有操作。
vim /etc/profile
在末尾加入
LOGIN_USER=`who -u am i 2>/dev/null| awk '{print $1}'`
LOGIN_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
if [ ! -d /opt/his/cmd_history ]
then
mkdir -p /opt/his/cmd_history
chmod 777 /opt/his/cmd_history
fi
if [ ! -d /opt/his/cmd_history/${LOGIN_USER} ]
then
mkdir -p /opt/his/cmd_history/${LOGIN_USER}
fi
export HISTFILE="/opt/his/cmd_history/${LOGIN_USER}/history"
chattr +i /opt/his/cmd_history/${LOGIN_USER}/history
shopt -s histappend
PROMPT_COMMAND="history -a"
HISTFILESIZE=50000
HISTSIZE=10000
或者
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi
if [ ! -d /opt/his/cmd_history ]
then
mkdir -p /opt/his/cmd_history
chmod 777 /opt/his/cmd_history
fi
if [ ! -d /opt/his/cmd_history/${LOGNAME} ]
then
mkdir -p /opt/his/cmd_history/${LOGNAME}
chmod 300 /opt/his/cmd_history/${LOGNAME}
fi
export HISTSIZE=4096
DT=`date "+%Y-%m-%d_%H:%M:%S"`
export HISTFILE="/opt/his/cmd_history/${LOGNAME}/${USER_IP}_his.$DT"
chmod 600 /opt/his/cmd_history/${LOGNAME}/*_his* 2>/dev/null
查看最近登录记录
最近成功的登录
last
最近失败的登录
lastb
如果机器被非法登陆过,排查机器遗留的非法入口
- 查看ssh登录配置
vim /etc/ssh/sshd_config
- 确认该文件只有以上配置过的选项,比如端口只有50500,如果有多余的,请删除。
- 确认以下配置,只有一个选项,这里是指定存放免密登录key的地方
- 全盘扫描
.ssh/authorized_keys
find / -name authorized_keys
确保只有自己按照上面配置生成过的秘钥,如果有多余的路径,多半是黑客留下的后门,马上删掉,我的机器上被黑客留了好几个后门。
-
如果上面有发现任何黑客留下的后门,马上删除自己之前生成的authorized_keys,重新生成一遍,记得换邮箱,这一步千万别关shell窗口。
-
查看黑客启动的进程,使用top命令找出可疑进程,不是自己的,多分析,一般自己进程都闲着,占用cpu、内存高的进程都有问题
-
查看crontab,很多黑客会修改crontab,添加自己的自启动任务
crontab -l
发现非法的定时任务,马上干掉
- 查看机器与哪些外部机器在远程通信
netstat -anp
主要关注Foreign Address一列,这一步可以找出很多蛛丝马迹
机器只要重启,都要检查一遍防火墙、ssh、防暴器是否都已经启动
在云服务器web管理端页面关闭多余端口,只开放需要的少量端口
查看系统隐藏的进程,我的服务器cpu一直为0,但是负载很高,最后查到,黑客的进程躲在后台运行,top查不出进程信息。
vim /etc/ld.so.preload
如果这里面配置了某个程序地址,将其删除,就可以在top看到他的进程
查找近24小时内被修改过的文件
find /etc -mtime +1 -type f -print | ll -t
如果主机名被修改了,按照以下方法修改
方法1:临时有效
hostname 主机名 //只能临时修改的主机名,当重启机器后,主机名称又变回来了。
hostname xh01
方法2:永久生效
//永久性的修改主机名称,重启后能保持修改后的。
hostnamectl set-hostname xxx
//删除hostname
hostnamectl set-hostname ""
hostnamectl set-hostname "" --static
hostnamectl set-hostname "" --pretty