服务器莫名其妙中了挖矿病毒,也没找到原因,没办法重装了系统:) (好在有备份)

不多说,直接上干货

00:00
加载中……请稍等……

实现功能点

禁止root用户直接登入系统
任何用户所有操作都记录在日志中(日志为JSON格式,便于其他工具检索处理)
白名单之外IP登入系统后告警通知
设立回收站功能
禁止使用rm -rf 命令删除文件
未经授权用户进入系统可以创建文件,但无法删除

禁用root用户登录

用途:对服务器的root用户进行禁用,仅使用sudo命令来执行某些root才能执行的命令

创建普通用户

[root@sunday ~]# useradd appuser
[root@sunday ~]# passwd appuser # 设置用户密码

开启appuser用户 sudo su权限

开启后,appuser用户将具有sudo权限及sudo su免密切换至root

# 开启sudoers文件的写操作
[root@sunday ~]# chmod u+w /etc/sudoers 
[root@sunday ~]# vim /etc/sudoers
# 添加
appuser ALL=(ALL)       NOPASSWD:ALL
# 取消sudoers文件的写操作
[root@sunday ~]# chmod u-w /etc/sudoers

测试:重新打开一个终端,连接服务器时用appuser用户验证,通过后进入下一步

禁用root用户ssh

[root@sunday ~]# vim /etc/ssh/sshd_config
# 增加
PermitRootLogin no
# 重启sshd服务
[root@sunday ~]# systemctl restart sshd

测试:重新打开一个终端,连接服务器时用root用户验证,登录失败则成功进入下一步

至此,完成了禁用root用户的ssh登录,并授权创建了appuser用户管理服务器,下面就是对服务器更高级的应用

开启ssh登录警告确认

[appuser@localhost ~]$ sudo vim /etc/bashrc
# 增加
# Set login warning Evn
if [[ $(whoami) !=  'root' ]];then
clear
read -t 5 -p "Confirm whether to continue login (y|n):" input
case $input in
        y|Y)
        echo Your IP:$(who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g') 
        # /etc/send.sh 此处可添加用户登录告警脚本
        echo "Welcome,Now datetime: $(date +%Y/%m/%d-%H:%M)"
        ;;
        *) exit 1 ;;
esac
fi

测试:执行命令exit 退出终端,重新连接终端 即可进入交互式界面 五秒内输入yY后进入终端 输入其他或不输入或超出5s 断开连接

登录-效果图

开启sudo提权警告确认

[appuser@localhost ~]$ sudo vim /etc/bashrc
# 增加
# Set administrator warning
if [[ $(whoami) ==  'root' ]];then
read -t 5 -p "You are applying for administrator rights
After that,all operations including your IP address will be recorded
Please consider the operation(y|n):" input
case $input in
        y|Y)
        echo Your IP:$(who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g');;
        *) exit 1 ;;
esac
fi

测试:执行命令exit 退出终端,重新连接终端 登录后 执行sudo su 五秒内输入yY后进入root 输入其他或不输入或超出5s 退出提权操作

提权-效果图

开启历史命令存储

[appuser@localhost ~]$ sudo vim /etc/bashrc
# 增加
# Record operation command
HISTDIR='/var/log/command.log'
if [ ! -f $HISTDIR ];then
        touch $HISTDIR
        chmod 666 $HISTDIR
fi
export HISTTIMEFORMAT="{\"TIME\":\"%F %T\",\"IP\":\"$(who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g')\",\"USER\":\"$(who am i|awk '{print $1}')\",\"CMD\":\""
export PROMPT_COMMAND='history 1|tail -1|sed "s/^[ ]\+[0-9]\+  //"|sed "s/$/\"}/">> /var/log/command.log'

# 添加后执行bash重新生产环境变量
[appuser@localhost ~]$ sudo bash

测试:执行命令exit 退出终端,重新连接终端 查看/var/log/command.log 已经记录历史操作过的命令 之后每一步操作都会记录在此文件

开启回收站功能

# 创建回收站目录
[appuser@localhost ~]$ sudo mkdir /Recycle #自定义,但要与下面DIR变量值对应

[appuser@localhost ~]$ sudo vim /etc/bashrc
# 增加
# Open Recycle bin
USER=$(whoami)
DIR='/Recycle'
alias rm=trash
alias rlist="ls ${DIR}/$USER 2>/dev/null"

trash()
{
  if [[ ! -d ${DIR}/$USER ]];then
  echo "Delete failed
        Please contact the administrator to create the recycle bin directory: ${DIR}/$USER 
        Administrator mail: 2695476342@qq.com"
  else
  COM=$1
  RF='-rf'
  if [[ $COM == $RF ]];then
  echo "rm -rf Deprecated!!!
Please use the command: rm filename command parameter to delete the file"
  else
#  mv $@ ${DIR}/$USER/$@_$(date +%Y%m%d%H%M)  2>/dev/null
  mv $@ ${DIR}/$USER/$@_$(date +%Y%m%d%H%M)  2>/dev/null
  fi
  fi
}
cleardata()  
{
    read -p "Clear trash?[n]" confirm
    [ $confirm == 'y' ] || [ $confirm == 'Y' ]  && /usr/bin/rm -rf ${DIR}/$USER/*
}

初始化root、appuser用户回收站目录

[appuser@localhost ~]$ sudo mkdir /Recycle/{appuser,root}
[appuser@localhost ~]$ sudo chown -R appuser:appuser /Recycle/appuser
[appuser@localhost ~]$ sudo chown -R root:root /Recycle/root
[appuser@localhost ~]$ sudo chmod 700 /Recycle/{appuser,root}
[appuser@localhost ~]$ ll /Recycle/
总用量 0
drwx------. 2 appuser appuser 6 6月  15 00:53 appuser
drwx------. 2 root root 6 6月  15 00:53 root   

测试:执行命令exit 退出终端,重新连接终端 按照下放功能点测试

# 禁用rm -rf 
使用rm -rf 命令时 被拒绝
# 删除文件
[appuser@localhost ~]$ rm {file_name}
# 查看已删除文件
[appuser@localhost ~]$ rlist
#清空当前用户回收站所有文件
[appuser@localhost ~]$ cleardata #键入y后清空
# 为新的用户初始化回收站目录(管理员操作)
[appuser@localhost ~]$ sudo mkdir /Recycle/用户名
[appuser@localhost ~]$ sudo chown -R 用户名:用户名 /Recycle/用户名
[appuser@localhost ~]$ sudo chmod 700 /Recycle/用户名

回收站建议

为了方便平时使用,建议将文件操作命令放置在用户登录时提示 我放在了登录成功后显示

# Set login warning Evn
if [[ $(whoami) !=  'root' ]];then
clear
read -t 5 -p "Confirm whether to continue login (y|n):" input
case $input in
        y|Y)
        echo Your IP:$(who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g')
        # /etc/send.sh
        echo "Welcome,Now datetime: $(date +%Y/%m/%d-%H:%M)"
        echo '
        File operation command:
        rm: Delete file                              Syntax: rm filename
        cleardata: Clear current user recycle bin    Syntax: rm filename
        rlist: View current user recycle bin file    Syntax: rlist'
        ;;
        *) exit 1 ;;
esac
fi

异常IP登入警告

即为上述Function中的白名单之外IP登入系统后告警通知 我实现的方式为:

建立IP白名单,每次登录时,让系统检测用户目前IP是否处于白名单,不在白名单时触发告警,发送短信告警通知

# 建立IP白名单
[root@sunday appuser]# sudo vim /opt/ips.ini 
# Demo(一行一个IP地址)
1.1.1.1

# 建立检测脚本
[root@sunday appuser]# sudo vim /etc/send.sh
#!/bin/bash
DATE=$(date +%Y/%m-%d-%H:%M)
USER=$(/usr/bin/who am i|awk '{print $1}')
IP=$(/usr/bin/who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g')

# IP不在白名单时 告警
if [[ ! -f /opt/ips.ini ]];then  echo 'IP白名单列表文件不存在 请创建: /opt/ips.ini 一行一个IP';exit 1;fi
find=$(cat /opt/ips.ini|grep $IP|wc -l|grep -Ev '^$|#')

if [[ $find -eq 0 ]];then
        MESSAGE=$(printf "服务器异常登入警告\\n登入用户: ${USER}\\n登入IP: ${IP}\\n登入日期: ${DATE}")
        echo -e $MESSAGE
        #此处可以执行发送短信、邮件等脚本,$MESSAGE作为消息参数
fi

# 赋予脚本执行权限
[root@sunday appuser]# sudo chmod +x /etc/send.sh
[root@sunday appuser]# sudo chmod 755 /etc/send.sh

上述功能点 放到/etc/bashrc的Set login warning Evn提示的位置即可。效果如下:

登录告警

Last modification:June 15th, 2020 at 03:40 pm