网站搜索

使用 Ubuntu 20.04/18.04 和 16.04 进行初始服务器设置


本教程将指导您在新安装的 Ubuntu 服务器上配置所需的首要基本步骤,以提高服务器的安全性和可靠性。

本主题中解释的配置对于所有 Ubuntu 服务器系统几乎都是相同的,涉及底层操作系统平台,无论 Ubuntu 安装在裸机服务器、私有虚拟机还是虚拟机中在 VPS 公共云中衍生出来。

要求

  • Ubuntu 20.04服务器安装
  • Ubuntu 18.04服务器安装
  • Ubuntu 16.04服务器安装

更新和升级Ubuntu系统

在全新安装 Ubuntu 服务器或新部署的 Ubuntu VPS 时,您需要注意的第一步是确保系统和所有系统组件,例如内核、apt 软件包管理器和所有其他已安装的软件包都是最新的,具有最新发布的版本和安全补丁。

要更新 Ubuntu 服务器,请使用具有 root 权限的帐户或直接以 root 身份登录服务器控制台并运行以下命令以执行更新和升级过程。

sudo apt update 

运行更新命令后,您将看到可用于升级过程的软件包数量以及用于列出软件包升级的命令。

sudo apt list --upgradable

在查阅了可用于升级的软件包列表后,发出以下命令来启动系统升级过程。

sudo apt upgrade

要删除所有本地下载的 deb 包和所有其他 apt-get 缓存,请执行以下命令。

sudo apt autoremove
sudo apt clean

在 Ubuntu 中创建新帐户

默认情况下,作为安全措施,root 帐户在 Ubuntu 中是完全禁用的。为了在系统上创建新帐户,请使用具有 root 权限的帐户用户登录系统,并使用以下命令创建新帐户。

这个新帐户将通过 sudo 命令被授予 root 权限,并将用于在系统中执行管理任务。确保您设置了一个强密码来保护该帐户。按照adduser提示设置用户详细信息和密码。

sudo adduser ubuntu_user

如果将此帐户分配给另一个系统管理员,您可以通过发出以下命令强制用户在第一次登录尝试时更改其密码。

sudo chage -d0 ubuntu_user

目前,新添加的用户无法通过 sudo 实用程序执行管理任务。要授予此新用户帐户管理权限,您应该通过发出以下命令将该用户添加到“sudo”系统组。

sudo usermod -a -G sudo ubuntu_user

默认情况下,属于“sudo”组的所有用户都可以通过 sudo 实用程序以 root 权限执行命令。在编写执行所需的命令之前必须使用 sudo 命令,如下例所示。

sudo apt install package_name

通过登录系统并运行前缀为 sudo 的 apt update 命令来测试新用户是否具有 root 权限。

su - ubuntu_user
sudo apt update

在 Ubuntu 中配置系统主机名

通常,机器主机名是在系统安装过程中或在云端创建 VPS 时设置的。但是,您应该更改计算机的名称,以便更好地反映服务器的目的地或更好地描述其最终用途。

在大公司中,机器按照复杂的命名方案命名,以便轻松识别数据中心机架中的机器。例如,如果您的 Ubuntu 计算机将运行邮件服务器,则计算机的名称应反映这一事实,您可以将计算机主机名设置为 mx01.mydomain.lan

要显示有关计算机主机名的详细信息,请运行以下命令。

hostnamectl

要更改计算机的名称,请使用将为计算机配置的新名称发出 hostnamectl 命令,如下面的摘录所示。

sudo hostnamectl set-hostname tecmint

使用以下命令之一验证系统的新名称。

hostname
hostname -s
cat /etc/hostname 

在 Ubuntu 中使用公钥身份验证设置 SSH

为了提高Ubuntu服务器的系统安全程度,您应该为本地帐户设置SSH公钥认证。为了生成 SSH 密钥对(公钥和私钥)并指定密钥长度(例如 2048 位),请在服务器控制台执行以下命令。

确保您使用要设置 SSH 密钥的用户登录系统。

su - ubuntu_user
ssh-keygen -t RSA -b 2048

生成密钥后,系统将提示您添加密码以保护密钥。如果您想通过 SSH 服务器自动执行任务,您可以输入强密码或选择将密码留空。

生成 SSH 密钥后,您可以通过执行以下命令将公钥复制到远程服务器。要将公钥安装到远程 SSH 服务器,您需要一个具有适当权限和凭据的远程用户帐户才能登录远程服务器。

ssh-copy-id remote_user@remote_server

您应该能够使用公钥身份验证方法通过 SSH 自动登录到远程服务器。使用 SSH 公钥身份验证时,您不需要添加远程用户密码。

登录远程服务器后,您可以开始执行命令,例如w命令列出ssh远程登录的用户,如下图所示。

在控制台中键入 exit 以关闭远程 SSH 会话。

ssh remote_user@remote_server
w
exit

要查看公共 SSH 密钥的内容以便手动将密钥安装到远程 SSH 服务器,请发出以下命令。

cat ~/.ssh/id_rsa.pub

Ubuntu 中的安全 SSH 服务器

为了保护 SSH 守护进程的安全,您应该将默认 SSH 端口号从 22 更改为高于 1024 的随机端口,并禁止通过以下方式远程 SSH 访问 root 帐户:密码或密钥,通过打开 SSH 服务器主配置文件并进行以下更改。

sudo vi /etc/ssh/sshd_config

首先,搜索注释行#Port22并在下面添加新行(相应地替换监听端口号):

Port 2345

不要关闭文件,向下滚动并搜索行 #PermitRootLogin yes,通过删除该行开头的 # 符号(主题标签)来取消注释该行,然后将该行修改为如下摘录所示。

PermitRootLogin no

然后,重新启动 SSH 服务器以应用新设置,并尝试通过新端口号使用 root 帐户从远程计算机登录到此服务器来测试配置。应限制通过 SSH 对 root 帐户的访问。

sudo systemctl restart sshd

另外,运行 netstat 或 ss 命令并通过 grep 命令过滤输出,以显示 SSH 服务器的新侦听端口号。

sudo ss -tlpn| grep ssh
sudo netstat -tlpn| grep ssh

在某些情况下,您可能希望在一段时间不活动后自动断开与服务器建立的所有远程 SSH 连接。

为了启用此功能,请执行以下命令,该命令会将 TMOUT bash 变量添加到您的帐户 .bashrc 隐藏文件中,并强制使用该名称建立的每个 SSH 连接用户在 5 分钟不活动后将被断开连接或退出。

echo 'TMOUT=300' >> .bashrc

运行 tail 命令检查变量是否已正确添加到 .bashrc 文件末尾。从现在起,所有后续 SSH 连接将在 5 分钟不活动后自动关闭。

tail .bashrc

在下面的屏幕截图中,通过 ubuntu_user 帐户从 drupal 计算机到 Ubuntu 服务器的远程 SSH 会话已超时并在 5 分钟后自动注销。

配置 Ubuntu 防火墙 UFW

每台服务器都需要配置良好的防火墙,以确保网络级别的系统安全。 Ubuntu服务器使用UFW应用程序来管理服务器上的iptables规则。

通过发出以下命令检查 Ubuntu 中 UFW 防火墙应用程序的状态。

sudo systemctl status ufw
sudo ufw status

通常,UFW 防火墙守护进程在 Ubuntu 服务器中启动并运行,但默认情况下不应用规则。在系统中启用 UFW 防火墙策略之前,首先应添加一条新规则以允许 SSH 流量通过更改后的 SSH 端口穿过防火墙。可以通过执行以下命令来添加规则。

sudo ufw allow 2345/tcp

允许 SSH 流量后,您可以使用以下命令启用并检查 UFW 防火墙应用程序。

sudo ufw enable
sudo ufw status

要为服务器上随后安装的其他网络服务(例如 HTTP 服务器、邮件服务器或其他网络服务)添加新的防火墙规则,请使用以下防火墙命令示例作为指导。

sudo ufw allow http  #allow http traffic
sudo ufw allow proto tcp from any to any port 25,443  # allow https and smtp traffic

要列出所有防火墙规则,请运行以下命令。

sudo ufw status verbose

设置 Ubuntu 服务器时间

要控制或查询 Ubuntu 服务器时钟和其他相关时间设置,请执行不带参数的 timedatectl 命令。

要更改服务器的时区设置,请首先执行带有 list-timezones 参数的 timedatectl 命令,以列出所有可用的时区,然后设置系统的时区,如下面的摘录所示。

sudo timedatectl 
sudo timedatectl list-timezones 
sudo timedatectl set-timezone Europe/Vienna

新的 systemd-timesyncd systemd 守护进程客户端可以在 Ubuntu 中使用,以便为您的网络服务器提供准确的时间,并与上游对等服务器同步时间。

要应用 Systemd 的这一新功能,请修改 systemd-timesyncd 守护程序配置文件,并将地理位置最近的 NTP 服务器添加到 NTP 语句行,如以下文件摘录所示:

sudo nano /etc/systemd/timesyncd.conf

将以下配置添加到 timesyncd.conf 文件中:

[Time]
NTP=0.pool.ntp.org 1.pool.ntp.org
FallbackNTP=ntp.ubuntu.com

要添加距离您最近的 NTP 服务器,请查阅以下地址的 NTP 池项目服务器列表:http://www.pool.ntp.org/en/

然后,重新启动 Systemd 时间同步守护进程以反映更改并通过运行以下命令检查守护进程状态。重新启动后,守护进程将开始与新的 ntp 服务器对等点同步时间。

sudo systemctl restart systemd-timesyncd.service 
sudo systemctl status systemd-timesyncd.service

在 Ubuntu 中禁用并删除不需要的服务

为了获取 Ubuntu 服务器中默认运行的所有 TCP 和 UDP 网络服务的列表,请执行 ss 或 netstat 命令。

sudo netstat -tulpn
OR
sudo ss -tulpn

Ubuntu 16.10 版本开始,默认 DNS 解析器现在由 systemd-resolved 服务控制,如 netstat 的输出所示>ss 命令

您还应该通过运行以下命令来检查 systemd-resolved 服务状态。

sudo systemctl status systemd-resolved.service

systemd-resolved 服务绑定在所有启用的网络接口上,并侦听端口 535355 TCPUDP

由于恶意黑客对不安全的 DNS 服务器进行了大量的 DDOS 攻击,因此在生产服务器上运行系统解析缓存 DNS 守护进程可能会很危险。

要停止并禁用此服务,请执行以下命令。

sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

通过发出 ssnetstat 命令 验证服务是否已停止并禁用。 systemd 解析的侦听端口(53 和 5355 TCP 和 UDP)不应在 netstat 或 ss 命令输出中列出,如下所示。

您还应该重新启动计算机,以完全禁用所有 systemd 解析的守护进程服务并恢复默认的 /etc/resolv.conf 文件。

sudo ss -tulpn
sudo netstat -tulpn
sudo systemctl reboot

尽管您已经禁用了一些不需要的网络服务在服务器中运行,但您的系统中还安装并运行了其他服务,例如 lxc 进程和 snapd 服务。这些服务可以通过 ps、top 或 pstree 命令轻松检测到。

sudo ps aux
sudo top
sudo pstree

如果您不打算在服务器中使用 LXC 容器虚拟化或开始安装通过 Snap 包管理器打包的软件,您应该通过发出以下命令来完全禁用和删除这些服务。

sudo apt autoremove --purge lxc-common lxcfs
sudo apt autoremove --purge snapd

就这样!现在,Ubuntu 服务器已准备好安装自定义网络服务或应用程序所需的其他软件,例如安装和配置 Web 服务器、数据库服务器、文件共享服务或其他特定应用程序。