Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

updated (2022-05-18): 根据 Seviche CCVPS 安全初始化 进行了修改

设置与连接 SSH

安装 PuTTY

使用 windows 电脑连接 remote 的 Linux VPS,需要一个图形化的界面

If your Windows is Windows 10 Version 1803, OpenSSH Client has been implemented as a Windows feature, so it’s possible to use ssh command on command prompt without Putty and other SSH software.

open SSH 客户端的使用大同小异。下载 PuTTY,本次需要用到的是 PuTTYPuTTYgen,这两个在一次安装后都会出现

进行 SSH 连接

打开 PuTTY,输入 Host Name ( IP address ),和 Port (一般为22) ,然后按下 open,进入一个命令行窗口。在命令行窗口中,输入登录信息(login as 与 password,这两个在购买 VPS 的时候就已经得到了)

密码在输入的过程中,是不显示的,如果输入正确,会显示一些 VPS 系统相关的简要信息

更新 VPS 的 packages

在上一步中如果密码输入正确,还会显示需要更新的内容。输入一下内容,进行可更新 packages 的检查

apt update

再次输入 apt update,即可开始更新,更新完成后需要 reboot,使更新生效

创建新用户并修改用户权限

前面都使用 root 账户操作,root 对系统具有全部权限,因而可能对系统造成严重的损害,所以使用 root 是 不够安全的。而一个具有 superuser 权限的常规账户,需要在命令前面加上 sudo 前缀,才能获取管理员权限。
添加新用户:

adduser <your new username>

为新用户增加 superuser 权限:

usermod -aG sudo <your new username>

创建新用户,是为了确保之后进行 ssh连接 和操作的时候,不使用root用户,为VPS文件安全增加一个保险

增加 public key 认证

打开 PuTTYgen,点击 generate ,产生 public key。需要填写 Key passphrase,passphrase 会与产生的 key 一起作为密码

keys 产生速度慢的原因找到了……是没有再产生时,在下方空白随意移动鼠标(提示文字说这样可以加入随意的部分在keys中)

填写完成后,在页面选择 Save private key,把产生的文件保存在自己的电脑上。先不要关闭窗口,后面的操作还需要 copy public key

按照前面2步的方法,使用原来的 root 账号登录VPS。

使用以下命令,可以移动到之前创建的新用户的 home directory,这样命令行会对应到创建的新用户

su – <your new username>

之后,按照顺序输入下面的命令,作用是:为 public key 创建新文件夹,限制获取这个文件夹的权限,并且保存 public key

mkdir ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys

最后一个命令会开启 Nano editor

从之前的 PuTTYgen 窗口复制 public key,并且粘贴在这里。

一定要是直接从 Puttygen 复制,才符合authorized_keys的格式要求,后面才不会连接不上!如果发生了这样的事故,请在VPS运行商的页面上选择 Access > Reset root password

然后按住 CTRL + X,来关闭 Nano editor。系统会询问是否保存对 authorized_keys 文件的更改,输入 Y,确认更改

输入下面的命令,作用:更改刚才编辑的文件的 permissions,并返回到 root 用户

chmod 600 ~/.ssh/authorized_keys
exit

打开 PuTTY,选择菜单 Connection › SSH › Auth,Browser 载入 private keys

通过SSH连接VPS,并且按照前面的方法,以新用户的身份登入

输入下面的命令来关闭默认的密码的认证方式

注意:如果前面没有用keys登录成功,就不要开始关闭密码认证方式。如果前面设置错了,直接去服务商的网站上去 Rebuild > re-install,然后 Access >Reset root password,然后一切重头再来……

sudo nano /etc/ssh/sshd_config

修改下面的内容(这里参考了Seviche CC的文章)

PermitRootLogin no    
AllowUsers username   #如果没有这一行就手动添加
RSAAuthentication yes #这一行我找不到就没有配置
PasswordAuthentication no # 禁止使用密码登录

修改完成后,和前面一样,按住 CTRL + X,来关闭 Nano editor,输入 Y,确认更改

Reboot VPS 或者 输入

sudo service sshd restart

下次登录的时候,就需要使用 private keypassphrase

改 SSH 端口

这部分是新增的,参考了Seviche CC的文章

还是在 /etc/ssh/sshd_config中,在 Port 22 下面增加一行

Port <你选择的端口号>     # 换一个22以外的端口号

重启 sshd

sudo service sshd restart

打开防火墙,为新增的端口放行。设置好之后,用新端口重新连接一下,没问题的话,注释掉 Port 22

为 VPS 安装防火墙

设置防火墙之后,可以限制 VPS 向网络开放的端口。这样可以阻止很多针对服务器的攻击。可以使用 iptables ,来设置一个防火墙。

iptables 只适用于 ipv4 协议,如果需要适用 ipv6协议,需要转而使用ip6tables

ufw 也是一个常用的 firewall,也可以使用 ufw

ufw 的设置更简单,而且最新的Ubuntu系统本来就有ufw

什么是 iptables

iptables 是 Linux 的一种防火墙程序,它使用 tables 监控来自和去往你的服务器的流量。这些 tables 包含一系列的 rules (chains), 可以过滤包含数据的 packets。

[optin-monster-shortcode id=”fv4lqeko3gylvecpszws”]

每当一个 packet 符合一个 rule, 会被添加一个 target。 target 可以是另一个 rule 或者下列特殊值之一:

  • ACCEPT – 允许通过
  • DROP – 丢弃(不能通过)
  • RETURN – 不能通过这一次的 rule,转送到上一次的 rule

默认的 tables (filter)包含下面3个 rules:

  • INPUT – 过滤进入 server 的 packet

  • FORWARD – 过滤将要被 server 转发 (forward) 的 packet

  • OUTPUT – 过滤离开 server 的 packet

安装并使用 Iptables

安装 Iptables

sudo apt-get update
sudo apt-get install iptables

检查现有 Iptables 设置:

sudo iptables -L -v

-L:列出所有的rules, -v:展示详细信息

显示所有的 chains 都设置为了 ACCEPT,也即是没有 rules(所有的 packet 都能通过)。

定义新 chain rules

新定义的 rule 需要被挂在 chain 的后面,所以需要在 iptables 命令后面加上 -A 选项 (Append),同时与下面的选项结合:

  • -i (interface) — the network interface whose traffic you want to filter, such as eth0, lo, ppp0, etc.
  • -p (protocol) — the network protocol where your filtering process takes place. It can be either tcp, udp, udplite, icmp, sctp, icmpv6, and so on. Alternatively, you can type all to choose every protocol.
  • -s (source) — the address from which traffic comes from. You can add a hostname or IP address.
  • –dport (destination port) — the destination port number of a protocol, such as 22 (SSH), 443 (https), etc.
  • -j (target) — the target name (ACCEPT, DROP, RETURN). You need to insert this every time you make a new rule.
sudo iptables -A <chain> -i <interface> -p <protocol (tcp/udp) > -s <source> --dport <port no.>  -j <target>

在下面用 INPUT chain 作为示例。

允许主机内通信

使用 lo (loopback) 接口:

sudo iptables -A INPUT -i lo -j ACCEPT

这个命令让同一台机器上的数据库和应用程序正常通信

开启 HTTP, SSH 和 SSL 端口

协议和端口号的对应是:http (port 80), https (port 443), 和 ssh (port 22) 。这里需要指定 -p–dport 参数。

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

检查是否添加进 rule:

sudo iptables -L -v
基于 IP 地址过滤 packet

用到 -s 选项,例如扔掉来自 192.168.1.3 的 packet:

sudo iptables -A INPUT -s 192.168.1.3 -j DROP

如果想要扔掉某个范围 IP地址的 packet,需要先加上 -m iprange,然后用 ––src-range 加上 IP 地址的范围,例如:

sudo iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j DROP
扔掉不符合端口号的所有packets

需要先用上面的方法,设置允许的端口号。

sudo iptables -A INPUT -j DROP
删除 rules

删除所有的rules-F 选项 (flush):

sudo iptables -F

删除某一条rule-D 选项:

先排序查看 rules

sudo iptables -L --line-numbers

会出现类似下面的情况

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination

1    ACCEPT     all -- 192.168.0.4          anywhere
2    ACCEPT     tcp -- anywhere             anywhere tcp dpt:https
3    ACCEPT     tcp -- anywhere             anywhere tcp dpt:http
4    ACCEPT     tcp -- anywhere             anywhere tcp dpt:ssh

需要用到 chain 类型和序号来执行删除命令。例如,删除 INPUT chain 的第 3 条:

sudo iptables -D INPUT 3

关闭 Iptables 防火墙

sudo iptables -F
sudo /sbin/iptables-save

保存 Iptables 更改

Iptables chains 更改的数据存于缓存里,但是重启 server 之后需要重新定义 chains。采用下面的命令,保证重启后更改仍是生效的。

每次更改 Iptables 后,都应该运行这个命令

sudo /sbin/iptables-save

进一步的安全防护

这里参考 Seviche CCVPS 安全初始化 ,感谢 Seviche CC 的文章,让我知道了更多 VPS 的安全防护方法

运行防病毒软件 ClamAV

# 安装
sudo apt update
sudo apt install clamav clamav-daemon -y
sudo systemctl stop clamav-freshclam # 停止服务
sudo freshclam # 执行更新
sudo systemctl start clamav-freshclam # 再次启动 clamav-freshclam
sudo systemctl is-enabled clamav-freshclam # 设置开机自启动
ls /var/lib/clamav/ # 下载 ClamAV 数据库
# nice:降低 clamscan 的优先级(限制相对 cpu 时间)
sudo nice -n 15 clamscan # 限制 Clamscan CPU 使用率
# cpulimit:限制绝对的 CPU 时间。 安装cpulimit
sudo apt-get install cpulimit
cpulimit -z -e clamscan -l 20 & clamscan -ir /

其它可能用到的命令

clamscan /home/filename.docx  #扫描特定目录或文件
clamscan --no-summary /home/ #扫描结束时不显示摘要
clamscan -i / #打印受感染的文件
clamscan --bell -i /home #警惕病毒检测
clamscan -r --remove /home/USER #删除受感染的文件

返回码

  • 0:未发现病毒。
  • 1:发现病毒。
  • 2:发生了一些错误。

安装 fail2ban 以阻止重复登录尝试

sudo apt update 
sudo apt upgrade -y
sudo apt install fail2ban
sudo nano /etc/fail2ban/jail.local

写入

[DEFAULT]
destemail = [email protected]
sendername = Fail2Ban

[sshd]
enabled = true
port = 22   # 换成前面自己设置的 SSH 端口号

[sshd-ddos]
enabled = true
port = 22  # 换成前面自己设置的 SSH 端口号

重启fail2ban

sudo systemctl restart fail2ban

最后的最后

Seviche CC 的新文章还给出了安全检查的 tips,看一看会更有收获:

https://seviche.cc/2022-05-07-vps-init#%E6%97%A5%E5%B8%B8%E9%98%B2%E6%8A%A4

参考资料

[1] 5 Steps to Get Your New Virtual Private Server (VPS) Ready to Use

[2] Iptables Tutorial – Securing Ubuntu VPS with Linux Firewall

[3] Seviche CCVPS 安全初始化

评论