linux服务器安全

前言

笔者因服务器被攻击,特此整理分享。进入主题如下:

修改核心配置时,建议 先备份原始文件。修改配置和重启服务后,先在新的终端尝试连接服务器,确认无误后,再退出当前的连接。如果错误修改了配置,当前连接状态通常不会掉,能及时改回来。

mkdir backup
sudo cp /etc/ssh/sshd_config ./backup

此外,这些策略更多是防止网络攻击,而不影响机房对服务器的连接。比如禁用 Root 密码登录后,仍可以正常使用云服务器的“远程登录”。同理,机房登录服务器也不受影响。

禁用 root 密码登录

sudo vim /etc/ssh/sshd_config

输入 /Permi 回车检索,找到 PermitRootLogin,将其注释掉

# PermitRootLogin prohibit-password

然后重启 sshd 服务

sudo systemctl restart sshd

禁用普通用户密码登录

vim /etc/ssh/sshd_config

检索并修改参数为 PasswordAuthentication no,然后重启 ssh 服务。

禁用所有用户密码登录太严厉了,也可以检索 Match User,对某用户增加密码登录权限。

这段代码通常在最后:

# Example of overriding settings on a per-user basis
#Match User anoncvs
#       X11Forwarding no
#       AllowTcpForwarding no
#       PermitTTY no
#       ForceCommand cvs server
# 修改成如下即可
Match User username
    PasswordAuthentication yes

更改默认 ssh 端口

默认的 ssh 端口号是 22。SSH 的端口一般建议把它改成一个大于 1024 小于 65535 的整数。举个例子,比如改为 1234

vim 检索 /etc/ssh/sshd_configPort 参数,更改如下

Port 1234
# 重启 ssh 服务生效。
sudo systemctl restart ssh
sudo systemctl status ssh

注: 需在防火墙中加入1234端口,否则远程ssh连不上

创建用户名时,应避免使用常见名词,如 test 之类。攻击者通常会对 IP 进行批量无差别攻击,由于对个体信息缺少了解,它们只能用常见词表来尝试用户名。

开启防火墙

部署服务公开的服务器,建议开启防火墙,这样可以增加一层保护,对当前开放的端口有更好的把控。个人使用服务器为方便起见,考虑暂不启用。

# 查看防火墙是否安装
which ufw  # /usr/sbin/ufw
# 如没有,安装
sudo apt-get install ufw

防火墙常用命令

sudo ufw status # 查看当前状态 | inactive 代表关闭
sudo ufw enable # 开启防火墙
sudo ufw disable # 关闭防火墙
sudo ufw status numbered # 显示序号,作为 delete 操作的索引
sudo ufw delete <数字> # 删除第几个规则
# 删除规则更建议的方式,用 delete + 规则
sudo ufw delete allow 22 # 删除规则 allow 22
sudo ufw delete allow 22/tcp # 删除规则 allow 22/tcp
sudo ufw default deny incoming # 禁止所有进站的流量
sudo ufw default allow outgoing # 允许所有出站的流量

如果前边更改了 ssh 端口为 1234,则这里执行

sudo ufw allow 1234/tcp comment "this is for ssh"
sudo ufw delete 22

密码复杂度策略

除了禁用登录,也可以采用相对温和的策略来防止穷举:通过修改 PAM(Pluggable Authentication Modules)来设置用户密码的强度、长度和重试间隔。

设置密码强度

这部分参考了 How to enable and enforce secure password policies on Ubuntu。

安全起见,先备份原始文件

mkdir -p backup
sudo cp /etc/pam.d/common-password ./backup/

安装相关依赖

sudo apt install libpam-pwquality -y

这是原始文件 /etc/pam.d/common-password 的部分内容

# here's the fallback if no module succeeds
password        requisite                       pam_deny.so

requisite 所在行修改为

password    requisite    pam_pwquality.so retry=3 minlen=8 difok=3

requisite 常用参数的解释:

  • retry=N:限制用户在输入错误密码后可以再次尝试的次数。
  • minlen=N:指定密码的最小长度。
  • difok=N:指定密码中必须包含的不同字符数。
  • ucredit=-N:指定密码中必须包含的大写字母数。
  • lcredit=-N:指定密码中必须包含的小写字母数。
  • dcredit=-N:指定密码中必须包含的数字数。
  • ocredit=-N:指定密码中必须包含的特殊字符数。

注意这些参数中的 -N 表示至少需要包含 N 个字符,而省略符号 - 则表示必须刚好包含 N 个字符。

对于新用户,上述设置将立即生效。对于现有用户,他们的密码策略将在下一次更改密码时应用

设置重试间隔

我们要用到一个 pam_fallock 的模块。

auth   required      pam_faillock.so preauth silent audit deny=3 unlock_time=1200
auth   [default=die] pam_faillock.so authfail audit deny=3 unlock_time=600

禁用 Ping

除了加强服务器自身的安全防护,还可以用禁 ping 的方式避免服务器被穷举搜索到。

StackExchange 上给了很多种方案:How to Disable Ping Response (ICMP echo) in Linux all the time?

这里采用 Iptables 方法来弄,执行

iptables -I INPUT -p icmp --icmp-type echo-request -j DROP

在服务器上 ping 自己,ping 域名,ping IP,发现已经 ping 不通了。

iptables 还有其他规则和用法,后边有空再补充更新。

Fail2ban 防扫描和暴力破解

需要更新补充

小结

笔者因为发布的模型部署在自己的服务器上被攻击,特此总结。规避了大部分攻击,目前项目已经正常运转。后续接触到其他重要的安全策略,再来进行补充。

你可能感兴趣的:(服务器,linux,安全)