最近看到一个客户在问服务器上的数据库被留下了“To recover your lost Database and avoid leaking it: Send us 0.05 Bitcoin (BTC) to our Bitcoin address 14yVUjTFesHAusWZ8qytA9faYmKfqEFpYv and contact us by Email with your Server IP or Domain name and a Proof of Payment. Your Database is downloaded and backed up on our servers. If we dont receive your payment in the next 10 Days, we will make your database public or use them otherwise.”
可以看到这个网友的服务器显然是被入侵了,类似这位网友的问题也经常可以看到,遇到这样的问题应该如何处理呢? 通常服务器被入侵后被动的解决是无效的这里要么按照留言付“比特币”给黑客要么只能认倒霉。 所以购买服务器前要提前加固好我们的服务器,本节就来介绍Linux服务器安全加固的10条建议。

以下是服务器安全加固的步骤,本文以腾讯云的CentOS7.7版本为例来介绍,如果你使用的是秘钥登录服务器1-5步骤可以跳过。

1) 设置复杂密码

服务器设置大写、小写、特殊字符、数字组成的12-16位的复杂密码 ,也可使用密码生成器自动生成复杂密码,这里给您一个链接参考:https://suijimimashengcheng.51240.com/

echo "root:wgr1TDs2Mnx0XuAv" | chpasswd

2) 设置密码策略

修改文件/etc/login.defs

PASS_MAX_DAYS      90               密码最长有效期
PASS_MIN_DAYS      10               密码修改之间最小的天数
PASS_MIN_LEN       8                密码长度
PASS_WARN_AGE      7                口令失效前多少天开始通知用户修改密码

3) 对密码强度进行设置

编辑文件/etc/pam.d/password-auth

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=  difok=1 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1
  • difok= 定义新密码中必须要有几个字符和旧密码不同
  • minlen=新密码的最小长度
  • ucredit= 新密码中可以包含的大写字母的最大数目。-1 至少一个
  • lcredit=新密码中可以包含的小写字母的最大数
  • dcredit=定新密码中可以包含的数字的最大数目

:这个密码强度的设定只对**"普通用户"有限制作用**,root用户无论修改自己的密码还是修改普通用户的时候,不符合强度设置依然可以设置成功

4) 对用户的登录次数进行限制

打开 /etc/pam.d/sshd  文件,在 #%PAM-1.0 的下面,加入下面的内容,表示当密码输入错误达到3次,就锁定用户150秒,如果root用户输入密码错误达到3次,锁定300秒。锁定的意思是即使密码正确了也登录不了
编辑文件 /etc/pam.d/sshd

auth required pam_tally2.so deny=3 unlock_time=150 even_deny_root root_unlock_time300

deny: 设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户
unlock_time: 设定普通用户锁定后,多少时间后解锁,单位是秒
root_unlock_time: 设定root用户锁定后,多少时间后解锁,单位是秒

多次输入密码失败后提示信息如下

图1

  • pam_tally2 查看被锁定的用户
  • pam_tally2 --reset -u username 将被锁定的用户解锁


图2

5) 进制root用户远程登录

禁止ROOT用户远程登录 。打开 /etc/ssh/sshd_config

#PermitRootLogin   no 

注:生效要重启sshd进程。

6) 更改ssh端口

vim /etc/ssh/sshd_config ,更改Port或追加Port
注:生效要重启sshd进程。

7) 安全组关闭没必要的端口

腾讯云平台有安全组功能,里面您只需要放行业务协议和端口,不建议放行所有协议所有端口,参考文档: https://cloud.tencent.com/document/product/215/20398

8) 设置账户保存历史命令条数,超时时间

设置账户保存历史命令条数,超时时间  。打开  /etc/profile ,修改如下

HISTSIZE=1000
TMOUT=600 

五分钟未动,服务器超时自动断开与客户端的链接。

9) 定期查看系统日志

/var/log/messages
/var/log/secure

重要服务器可以将日志定向传输到指定服务器进行分析。
系统日志:/var/log/messages
其中/var/log/messages 存放的是系统的日志信息,它记录了各种事件,基本上什么应用都能往里写日志,在做故障诊断时可以首先查看该文件内容

[root@mirh5_center1_111.231.133.13 ~]# tail /var/log/messages 
Dec 18 23:27:07 localhost kernel: [33100840.027421] possible SYN flooding on port 3873. Sending cookies.
Dec 18 23:30:11 localhost sz[31090]: [root] 1.txt/ZMODEM: 8144 Bytes, 16520 BPS
Dec 19 16:29:29 localhost kernel: [33162181.801121] possible SYN flooding on port 3873. Sending cookies.  
Dec 19 17:15:05 localhost sz[16756]: [root] ConfigActivity.xml/ZMODEM: 653205 Bytes, 393989 BPS
Dec 19 17:38:55 localhost sz[17617]: [root] ConfigActivity.xml/ZMODEM: 287531 Bytes, 337878 BPS

可以分为几个字段来描述这些事件信息:
  1. 事件的日期和时间
  2. 事件的来源主机
  3. 产生这个事件的程序[进程号] 
  4. 实际的日志信息

如:Dec 19 17:39:06 localhost sz[17833]: [root] ConfigActivity.xml/ZMODEM: 287531 Bytes, 343933 BPS

1. 产生这个事件的时间是:Dec 19 17:39:06
  2. 事件的来源主机为:localhost
  3. 产生这个事件的程序和进程号为:sz[17833]
  4. 这个事件实际的日志信息为:[root] ConfigActivity.xml/ZMODEM: 287531 Bytes, 343933 BPS

安全日志:/var/log/secure

/var/log/secure 一般用来记录安全相关的信息,记录最多的是哪些用户登录服务器的相关日志,如果该文件很大,说明有人在破解你的 root 密码

[root@localhost ~]$ tail /var/log/secure
Dec 27 14:04:51 139 sshd[30956]: Disconnecting: Too many authentication failures [preauth]
Dec 27 14:04:53 139 sshd[30968]: Invalid user user from 193.201.224.12 port 26133
Dec 27 14:04:53 139 sshd[30968]: input_userauth_request: invalid user user [preauth]
Dec 27 14:05:01 139 sshd[30968]: Disconnecting: Change of username or service not allowed: (user,ssh-connection) -> (User,ssh-connection) [preauth]
Dec 27 14:05:03 139 sshd[30996]: Invalid user User from 193.201.224.12 port 43273

可以分为几个字段来描述这些事件信息:

1. 事件的日期和时间
  2. 事件的来源主机 ( 通常是写主机名 )
  3. 产生这个事件的程序[进程号]
  4. 实际的日志信息

常见信息:

Jan 17 12:27:36 139 sshd[12812]: pam_unix(sshd:session): session closed for user root    # 表示root用户关闭了会话(也就是关闭了终端)
Jan 17 12:28:59 139 sshd[14064]: Accepted publickey for root from 14.23.168.10 port 36637 ssh2     # 表示接受来自14.23.168.10的root用户的公钥登录
Jan 17 12:28:59 139 sshd[14064]: pam_unix(sshd:session): session opened for user root by (uid=0)   # 表示给root用户打开一个终端
Jan 17 14:41:10 Mir2_Center sshd[9913]: Received disconnect from 183.60.122.237: 11: disconnected by user    # 表示已经连着的终端主动断开连接,并关闭终端
Jan 17 14:41:10 Mir2_Center sshd[9913]: pam_unix(sshd:session): session closed for user root
Jan 17 14:39:48 139 sshd[31261]: Invalid user redis from 45.115.45.3 port 33274                           # 表示对端使用无效的用户redis来连接
Jan 17 14:39:48 139 sshd[31261]: input_userauth_request: invalid user redis [preauth]                     # 本机对redis用户进行认证,认证失败,发送错误信号给对端
Jan 17 14:39:48 139 sshd[31261]: Received disconnect from 45.115.45.3 port 33274:11: Bye Bye [preauth]    # 对端接收到错误信号主动断开连接
Jan 17 14:39:48 139 sshd[31261]: Disconnected from 45.115.45.3 port 33274 [preauth]                       # 连接关闭

10) 定期备份数据,锁定重要文件

目录要有规划,并且有周期性的打包备份数据到指定的服务器。

应用程序 /www/server
程序日志 /www/wwwlogs
重要数据 /www/wwwroot

对重要的文件进行锁定,即使ROOT用户也无法删除

chattr    改变文件或目录的扩展属性
lsattr    查看文件目录的扩展属性
chattr  +i  /etc/passwd /etc/shadow   //增加属性  
chattr  -i  /etc/passwd /etc/shadow  //移除属性    
lsattr  /etc/passwd /etc/shadow

参考地址:https://cloud.tencent.com/developer/article/1623140