雨来

千里之行,始于足下 thesky341@foxmail.com

0%

服务器防止被暴力登录

背景

在知乎看到一些人说,如果22端口放开,会被别人暴力扫描和破解。我去看了下自己服务器的登录日志,发现每分钟都有人在尝试登录,不过登录失败了。想了想,要把自己服务器的登录方式修改,包括端口和校验方式。

网络世界犹如三体中的黑暗森林,如果公开ip地址,就会被别人不断攻击。

目标

  1. 排查服务器是否被入侵
  2. 增强服务器登录安全能力

排查服务器是否被入侵

1
2
3
4
5
6
7
8
9
sudo su #root 运行
w # 查看当前登录用户,会显示用户名,ip,登录方式
last # 显示登录历史,可以结合以往登录历史查看
# 因为攻击者登录后,可能删除/var/log/wtmp文件,登录历史会被删除
# 如果发现没有以前的登录历史,则可能被攻击者删除了
history # 查看历史输入命令
top # 查看系统资源使用情况。攻击者入侵后,可能运行某些消耗cpu资源的程序
lsof -i # 查看所有联网进程,看LISTEN和ESTABLISHED状态的进程是否奇怪
cat /etc/passwd # 查看是否多出奇怪的账号

增强服务器登录安全能力

修改默认用户名

因为选择了ubuntu系统,腾讯云默认用户名为 ubuntu,不安全。现在修改为新用户名。

修改方式为使用 usermod,groupmod修改,但因为登录时使用ubuntu登录,不能修改自己,因此需要先创建一个临时用户,用临时用户进行修改。修改完成后,需要将临时用户删除

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
---------------ubuntu身份----------------
# 先ssh登录ubuntu用户
# 获取root权限
sudo su
# 要将ubuntu用户修改为newname,需要先创建一个临时用户,无法自己修改自己
useradd tempuser # 输入密码
visudo # 为tempuser添加sudo su权限
# 在最下面添加 tempuser ALL=(ALL) ALL
# 保存后推出
# 此时还是ubuntu/root身份,退出连接,后面使用 tempuser 身份登录

---------------tempuser身份---------------
sudo su # 获取 root 权限
usermod -l newname ubuntu # 将/etc/passwd和/etc/shadow中用户名从ubuntu修改为newname
groupmod -n newname ubuntu # 将/etc/group和/etc/gshadow中的组名修改为newname
usermod -md /home/newhome newname 修改用户目录
visudo # 将 ubuntu 对应的行中的 ubuntu,修改为newname
# 退出tempuser/root身份,退出连接,后面使用新用户名 newname 身份登录

--------------newname身份-----------------
sudo su # 获取 root 权限
userdel tempuser # 删除临时用户
# 如果tempuser还有正在运行的进程,可以使用 kill -9 杀掉
visudo # 删除临时用户 tempuser 获取sudo root 的权限

--------------完结------------------------
# 后续可以使用新用户名登录

修改 ssh 登录端口

俗话说,22 端口是不能暴露的,暴露就等着被攻击吧。将 ssh 端口修改成其它端口,可极大提高服务安全。

  1. 修改 ssh配置文件 /etc/ssh/sshd_config
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sudo vim /etc/ssh/sshd_config #随便一个大于1024端口,比如6789

    -------------/etc/ssh/sshd_config------------------
    Port 6789

    -------------shell-------------------------
    sudo systemctl restart ssh # 重启ssh,加载新配置

    ss -an | grep 6789 # 查看是否修改成功
  2. 腾讯云服务器-防火墙放开 6789 端口,关闭22端口。

使用密钥登录服务器

  1. 本地生成密钥对,如果已经生成可以跳过,避免覆盖
    1
    2
    ----------在本地执行
    ssh-keygen -t rsa # 一直按enter,会在~/.ssh 目录下生成私钥id_rsa和id_rsa.pub公钥
  2. 上传本地公钥到服务器
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ----------云服务器
    # 生成目录 /home/newname/.ssh/authorized_keys
    mkdir -P

    # 上传公钥到服务器
    # 如果服务器.ssh目录不存在,则 mkdir -p /home/newname/.ssh 新建
    # 因为服务器上没有authorized_keys,因此直接覆盖;如果有,需要使用追加的方式增加
    # 执行后需要保证.ssh目录有700权限和authorized_keys有600权限
    # 前面修改了ssh端口,此处需要带上
    scp -P 6789 ~/.ssh/id_rsa.pub newname@server_ip:/home/newname/.ssh/authorized_keys
  3. 服务器开启密钥登录
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    -------云服务器
    sudo vim /etc/ssh/sshd_config # 打开ssh配置文件

    -------sshd_config
    RSAAuthentication yes
    PubkeyAuthentication yes

    -------云服务器
    sudo service sshd restart
    # 验证本地重新登录,发现已经不需要输入密码,直接登录,证明实现了密钥登录
  4. 关闭密码登录(可选)
    1
    2
    3
    4
    5
    6
    7
    8
    ------云服务器
    sudo vim /etc/ssh/sshd_config # 打开ssh配置文件

    ------sshd_config
    PasswordAuthentication no

    ------云服务器
    sudo service sshd restart

总结

到此为止,能做的服务器登录安全配置都加上了,同时也实现了免密登录。

参考文档

技术|如何判断 Linux 服务器是否被入侵?
Linux中修改用户名
Linux SSH 端口修改
技术|使用公钥/私钥对设定免密的 Linux 登录方式