云服务器安全新手配置指南

云服务器安全新手配置指南

注:以下操作均在root权限下进行。 #### 一、云服务器安全配置: ##### 1. 将默认SSH端口改为自定义端口
- ###### 修改SSH配置文件 vim /etc/ssh/sshd_config
(注:此处应为sshd_config而不是ssh_config)
找到“#Port 22”,将其修改为
Port 22

你想设置的端口号```(例:```Port 50000```)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
    SSH默认监听端口是22,如果不强制说明别的端口,“Port 22”注不注释都是开放22访问端口。这里先保留了22端口,防止之后因为各种权限和配置问题,导致连22端口都不能访问,等一切都配置结束,再关闭22端口。  
这里增加端口号是最好挑选10000 ~ 65565之间的端口号,10000以下一般是系统端口号与特殊英语进程端口号,使用10000 ~ 65535之间的端口号不容易出现端口冲突。
##### 2. 配置SELinux
- ###### 使用```semanage```命令是用来查询与修改SELinux默认目录的安全上下文。
首先安装semanage:```yum provides semanage```
(注:此处应为```yum provides semanage```而不是```yum install semanage```。)
- ###### 查看SELinux开放给SSH使用的端口
```semanage port -l|grep ssh```
这时我的服务器打印结果如下:
```ssh_port_t tcp 22```
可以看到SELinux并没有给SSH开放49999端口,下一步我们便添加这个端口:
```semanage port -a -t ssh_port_t -p tcp 50000```
再次查看开放的端口,显示结果为:
```ssh_port_t tcp 50000, 22```
添加成功。
- ###### 防火墙添加端口
先查看防火墙是否开放了50000端口:
```firewall-cmd --permanent --query-port=50000/tcp```
显示:```FirewallD is not running```说明防火墙尚未开启。我们先启动防火墙:```systemctl start firewalld```,再次查看:```no```,说明防火墙并没有开放49999端口,下面我们开放端口:
```firewall-cmd --zone=public --add-port=22/tcp --permanent```
```firewall-cmd --zone=public --add-port=49999/tcp --permanent```
添加一个端口后我们查看一下是否成功,使用上面的命令即可。每完成一个操作后就检查是否成功是一个很好的习惯,可以保证自己做过的都是正确的,之后的查错也会很方便。不出错的话,打印结果均为```success或yes```。
更新防火墙设置:```firewall-cmd --reload```。
再次查看是否成功开放端口,答应结果```yes```说明开放成功。
- ###### 重启SSH服务和防火墙
```systemctl restart sshd```
```systemctl restart firewalld.service```
##### 3. 验证50500是否能远程连接,使用自己的shell工具,远程通过49999端口连接服务器,能连通则配置成功。
##### 4. 49999连接成功后,关闭22端口的远程访问
```vim /etc/ssh/sshd_config```
找到“Port 22”,将其注释。
重启sshd服务:
```systemctl restart sshd```
验证22是否能远程连接,使用自己的shell工具,远程通过22端口连接服务器,不能连通则配置成功。
##### 5. 防暴力破解安装
- ###### 首先安装fail2ban:
```yum install fail2ban```
配置fail2ban安全策略:
```vim /etc/fail2ban/jail.d/jail.local```
```[DEFAULT]
# 以空格分隔的列表,可以是 IP 地址、CIDR 前缀或者 DNS 主机名
# 用于指定哪些地址可以忽略 fail2ban 防御
ignoreip = 127.0.0.1 172.31.0.0/24 10.10.0.0/24 192.168.0.0/24

# 客户端主机被禁止的时长(秒)
bantime = 86400

# 客户端主机被禁止前允许失败的次数
maxretry = 5

# 查找失败次数的时长(秒)
findtime = 600

mta = sendmail

[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, dest=your@email.com, sender=fail2ban@email.com]
# 以下两个根据需求选择对应的logpath即可
# Debian 系的发行版
logpath = /var/log/auth.log
# Red Hat 系的发行版
logpath = /var/log/secure
# ssh 服务的最大尝试次数
maxretry = 3
- ###### 重启fail2ban服务 service fail2ban restart
systemctl restart fail2ban
为了验证fail2ban成功运行,使用参数'ping'来运行fail2ban-client 命令。 如果fail2ban服务正常运行,你可以看到“pong(嘭)”作为响应。
fail2ban-client ping
Server replied: pong
##### 6. 禁ping服务器 echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all ##### 7. 创建新用户使用SSH登陆,禁止root登陆,密码登陆 - ###### 创建新用户,为新用户设置密码
useradd guest
passwd guest
这里的guest为示范用户,修改为自己的用户名,密码长度不短于8位长度,因为暴力破解8位已经很难了。 - ###### 为用户分配sudo权限
gpasswd -a guest wheel
查看带sudo权限的用户。
lid -g wheel 看到我们刚刚设置好的用户即说明配置成功。 - ###### 用户创建完毕,切换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
mv id_rsa id_rsa_ther.pem
mv id_rsa.pub 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的方式登陆,此时应该登录成功 ##### 8. 记录服务器所有操作
黑客一般会删除自己的操作记录,最好保留所有操作。 vim /etc/profile
在末尾加入。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
或者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
##### 9. 查看最近登录记录 最近成功的登录: last
最近失败的登录: lastb ##### 10. 如果机器被非法登陆过,排查机器遗留的非法入口 - 查看ssh登录配置
vim /etc/ssh/sshd_config
确认该文件只有以上配置过的选项,比如端口只有50000,如果有多余的,请删除。 确认以下配置,只有一个选项,这里是指定存放免密登录key的地方。 image
- 全盘扫描:.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:永久生效

1
2
3
4
5
6
//永久性的修改主机名称,重启后能保持修改后的。
hostnamectl set-hostname xxx
//删除hostname
hostnamectl set-hostname ""
hostnamectl set-hostname "" --static
hostnamectl set-hostname "" --pretty


云服务器安全新手配置指南
https://excelius.xyz/云服务器安全新手配置指南/
作者
Ther
发布于
2021年1月5日
许可协议