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

注:以下操作均在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