现在让我们强化你的服务器以防止未授权访问。
经常升级系统
自动安全更新
有一些用于服务器上自动更新的参数。Fedora 的 Wiki 上有一篇很棒的剖析自动更新的利弊的文章,但是如果你把它限制到安全更新上,自动更新的风险将是最小的。
自动更新的可行性必须你自己判断,因为它归结为你在你的服务器上做什么。请记住,自动更新仅适用于来自仓库的包,而不是自行编译的程序。你可能会发现一个复制了生产服务器的测试环境是很有必要的。可以在部署到生产环境之前,在测试环境里面更新来检查问题。
· CentOS 使用 yum-cron 进行自动更新。
· Debian 和 Ubuntu 使用 无人值守升级。
· Fedora 使用 dnf-automatic 。
添加一个受限用户账户
到目前为止,你已经作为 root 用户访问了你的服务器,它有无限制的权限,可以执行任何命令 - 甚至可能意外中断你的服务器。 我们建议创建一个受限用户帐户,并始终使用它。 管理任务应该使用 sudo 来完成,它可以临时提升受限用户的权限,以便管理你的服务器。
不是所有的 Linux 发行版都在系统上默认包含 sudo,但大多数都在其软件包仓库中有 sudo。 如果得到这样的输出 sudo:command not found,请在继续之前安装 sudo。
要添加新用户,首先通过 SSH 登录到你的服务器。
CentOS / Fedora
1、 创建用户,用你想要的名字替换 example_user,并分配一个密码:
useradd example_user && passwd example_user
2、 将用户添加到具有 sudo 权限的 wheel 组:
usermod -aG wheel example_user
Ubuntu
1、 创建用户,用你想要的名字替换 example_user。你将被要求输入用户密码:
adduser example_user
2、 添加用户到 sudo 组,这样你就有管理员权限了:
adduser example_user sudo
Debian
1、 Debian 默认的包中没有 sudo, 使用 apt-get 来安装:
apt-get install sudo
2、 创建用户,用你想要的名字替换 example_user。你将被要求输入用户密码:
adduser example_user
3、 添加用户到 sudo 组,这样你就有管理员权限了:
adduser example_user sudo
创建完有限权限的用户后,断开你的服务器连接:
exit
重新用你的新用户登录。用你的用户名代替 example_user,用你的服务器 IP 地址代替例子中的 IP 地址:
ssh example_user@203.0.113.10
现在你可以用你的新用户帐户管理你的服务器,而不是 root。 几乎所有超级用户命令都可以用 sudo(例如:sudo iptables -L -nv)来执行,这些命令将被记录到 /var/log/auth.log 中。
加固 SSH 访问
默认情况下,密码认证用于通过 SSH 连接到您的服务器。加密密钥对更加安全,因为它用私钥代替了密码,这通常更难以暴力破解。在本节中,我们将创建一个密钥对,并将服务器配置为不接受 SSH 密码登录。
创建验证密钥对
1、这是在你本机上完成的,不是在你的服务器上,这里将创建一个 4096 位的 RSA 密钥对。在创建过程中,您可以选择使用密码加密私钥。这意味着它不能在没有输入密码的情况下使用,除非将密码保存到本机桌面的密钥管理器中。我们建议您使用带有密码的密钥对,但如果你不想使用密码,则可以将此字段留空。
Linux / OS X
如果你已经创建了 RSA 密钥对,则这个命令将会覆盖它,这可能会导致你不能访问其它的操作系统。如果你已创建过密钥对,请跳过此步骤。要检查现有的密钥,请运行 ls?/ .ssh / id_rsa *。
ssh-keygen -b 4096
在输入密码之前,按下 回车使用 /home/your_username/.ssh 中的默认名称 id_rsa 和 id_rsa.pub。
这可以使用 PuTTY 完成,在我们指南中已有描述:使用 SSH 公钥验证。
2、将公钥上传到您的服务器上。 将 example_user 替换为你用来管理服务器的用户名称,将 203.0.113.10 替换为你的服务器的 IP 地址。
Linux
在本机上:
ssh-copy-id example_user@203.0.113.10
OS X
在你的服务器上(用你的权限受限用户登录):
mkdir -p ~/.ssh && sudo chmod -R 700 ~/.ssh/
在本机上:
scp ~/.ssh/id_rsa.pub example_user@203.0.113.10:~/.ssh/authorized_keys
如果相对于 scp 你更喜欢 ssh-copy-id 的话,那么它也可以在 Homebrew 中找到。使用 brew install ssh-copy-id 安装。
Windows
· 选择 1:使用 WinSCP 来完成。 在登录窗口中,输入你的服务器的 IP 地址作为主机名,以及非 root 的用户名和密码。单击“登录”连接。
一旦 WinSCP 连接后,你会看到两个主要部分。 左边显示本机上的文件,右边显示服务区上的文件。 使用左侧的文件浏览器,导航到你已保存公钥的文件,选择公钥文件,然后点击上面工具栏中的“上传”。
系统会提示你输入要将文件放在服务器上的路径。 将文件上传到 /home/example_user/.ssh /authorized_keys,用你的用户名替换 example_user。
· 选择 2:将公钥直接从 PuTTY 键生成器复制到连接到你的服务器中(作为非 root 用户):
mkdir ~/.ssh; nano ~/.ssh/authorized_keys
上面命令将在文本编辑器中打开一个名为 authorized_keys 的空文件。 将公钥复制到文本文件中,确保复制为一行,与 PuTTY 所生成的完全一样。 按下 CTRL + X,然后按下 Y,然后回车保存文件。
最后,你需要为公钥目录和密钥文件本身设置权限:
sudo chmod 700 -R ~/.ssh && chmod 600 ~/.ssh/authorized_keys
这些命令通过阻止其他用户访问公钥目录以及文件本身来提供额外的安全性。有关它如何工作的更多信息,请参阅我们的指南如何修改文件权限。
3、 现在退出并重新登录你的服务器。如果你为私钥指定了密码,则需要输入密码。
SSH 守护进程选项
1、 不允许 root 用户通过 SSH 登录。 这要求所有的 SSH 连接都是通过非 root 用户进行。当以受限用户帐户连接后,可以通过使用 sudo 或使用 su - 切换为 root shell 来使用管理员权限。
# Authentication:
...
PermitRootLogin no
2、 禁用 SSH 密码认证。 这要求所有通过 SSH 连接的用户使用密钥认证。根据 Linux 发行版的不同,它可能需要添加 PasswordAuthentication 这行,或者删除前面的 # 来取消注释。
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no
如果你从许多不同的计算机连接到服务器,你可能想要继续启用密码验证。这将允许你使用密码进行身份验证,而不是为每个设备生成和上传密钥对。
3、 只监听一个互联网协议。 在默认情况下,SSH 守护进程同时监听 IPv4 和 IPv6 上的传入连接。除非你需要使用这两种协议进入你的服务器,否则就禁用你不需要的。 这不会禁用系统范围的协议,它只用于 SSH 守护进程。
使用选项:
AddressFamily inet 只监听 IPv4。
AddressFamily inet6 只监听 IPv6。
默认情况下,AddressFamily 选项通常不在 sshd_config 文件中。将它添加到文件的末尾:
echo 'AddressFamily inet' | sudo tee -a /etc/ssh/sshd_config
4、 重新启动 SSH 服务以加载新配置。
如果你使用的 Linux 发行版使用 systemd(CentOS 7、Debian 8、Fedora、Ubuntu 15.10+)
sudo systemctl restart sshd
如果您的 init 系统是 SystemV 或 Upstart(CentOS 6、Debian 7、Ubuntu 14.04):
sudo service ssh restart