天天看点

Linux 服务器安全简明指南

现在让我们强化你的服务器以防止未授权访问。

<a target="_blank"></a>

保持最新的软件是你可以在任何操作系统上采取的最大的安全预防措施。软件更新的范围从关键漏洞补丁到小 bug 的修复,许多软件漏洞实际上是在它们被公开的时候得到修补的。

自动更新的可行性必须你自己判断,因为它归结为你在你的服务器上做什么。请记住,自动更新仅适用于来自仓库的包,而不是自行编译的程序。你可能会发现一个复制了生产服务器的测试环境是很有必要的。可以在部署到生产环境之前,在测试环境里面更新来检查问题。

到目前为止,你已经作为 <code>root</code> 用户访问了你的服务器,它有无限制的权限,可以执行任何命令 - 甚至可能意外中断你的服务器。 我们建议创建一个受限用户帐户,并始终使用它。 管理任务应该使用 <code>sudo</code>来完成,它可以临时提升受限用户的权限,以便管理你的服务器。

不是所有的 linux 发行版都在系统上默认包含 <code>sudo</code>,但大多数都在其软件包仓库中有 <code>sudo</code>。 如果得到这样的输出 <code>sudo:command not found</code>,请在继续之前安装 <code>sudo</code>。

要添加新用户,首先通过 ssh 登录到你的服务器。

1、 创建用户,用你想要的名字替换 <code>example_user</code>,并分配一个密码:

<code>useradd example_user &amp;&amp; passwd example_user</code>

2、 将用户添加到具有 sudo 权限的 <code>wheel</code> 组:

<code>usermod -ag wheel example_user</code>

1、 创建用户,用你想要的名字替换 <code>example_user</code>。你将被要求输入用户密码:

<code>adduser example_user</code>

2、 添加用户到 <code>sudo</code> 组,这样你就有管理员权限了:

<code>adduser example_user sudo</code>

1、 debian 默认的包中没有 <code>sudo</code>, 使用 <code>apt-get</code> 来安装:

<code>apt-get install sudo</code>

2、 创建用户,用你想要的名字替换 <code>example_user</code>。你将被要求输入用户密码:

3、 添加用户到 <code>sudo</code> 组,这样你就有管理员权限了:

创建完有限权限的用户后,断开你的服务器连接:

<code>exit</code>

重新用你的新用户登录。用你的用户名代替 <code>example_user</code>,用你的服务器 ip 地址代替例子中的 ip 地址:

<code>ssh [email protected]</code>

现在你可以用你的新用户帐户管理你的服务器,而不是 <code>root</code>。 几乎所有超级用户命令都可以用<code>sudo</code>(例如:<code>sudo iptables -l -nv</code>)来执行,这些命令将被记录到 <code>/var/log/auth.log</code> 中。

默认情况下,密码认证用于通过 ssh 连接到您的服务器。加密密钥对更加安全,因为它用私钥代替了密码,这通常更难以暴力破解。在本节中,我们将创建一个密钥对,并将服务器配置为不接受 ssh 密码登录。

1、这是在你本机上完成的,不是在你的服务器上,这里将创建一个 4096 位的 rsa 密钥对。在创建过程中,您可以选择使用密码加密私钥。这意味着它不能在没有输入密码的情况下使用,除非将密码保存到本机桌面的密钥管理器中。我们建议您使用带有密码的密钥对,但如果你不想使用密码,则可以将此字段留空。

linux / os x

如果你已经创建了 rsa 密钥对,则这个命令将会覆盖它,这可能会导致你不能访问其它的操作系统。如果你已创建过密钥对,请跳过此步骤。要检查现有的密钥,请运行 <code>ls〜/ .ssh / id_rsa *</code>。

<code>ssh-keygen -b 4096</code>

在输入密码之前,按下 回车使用 <code>/home/your_username/.ssh</code> 中的默认名称 <code>id_rsa</code> 和<code>id_rsa.pub</code>。

windows

2、将公钥上传到您的服务器上。 将 <code>example_user</code> 替换为你用来管理服务器的用户名称,将<code>203.0.113.10</code> 替换为你的服务器的 ip 地址。

linux

在本机上:

<code>ssh-copy-id [email protected]</code>

os x

在你的服务器上(用你的权限受限用户登录):

<code>mkdir -p ~/.ssh &amp;&amp; sudo chmod -r 700 ~/.ssh/</code>

<code>scp ~/.ssh/id_rsa.pub [email protected]:~/.ssh/authorized_keys</code>

一旦 winscp 连接后,你会看到两个主要部分。 左边显示本机上的文件,右边显示服务区上的文件。 使用左侧的文件浏览器,导航到你已保存公钥的文件,选择公钥文件,然后点击上面工具栏中的“上传”。

系统会提示你输入要将文件放在服务器上的路径。 将文件上传到 <code>/home/example_user/.ssh /authorized_keys</code>,用你的用户名替换 <code>example_user</code>。

选择 2:将公钥直接从 putty 键生成器复制到连接到你的服务器中(作为非 root 用户):

<code>mkdir ~/.ssh; nano ~/.ssh/authorized_keys</code>

上面命令将在文本编辑器中打开一个名为 <code>authorized_keys</code> 的空文件。 将公钥复制到文本文件中,确保复制为一行,与 putty 所生成的完全一样。 按下 <code>ctrl + x</code>,然后按下 <code>y</code>,然后回车保存文件。

最后,你需要为公钥目录和密钥文件本身设置权限:

<code>sudo chmod 700 -r ~/.ssh &amp;&amp; chmod 600 ~/.ssh/authorized_keys</code>

3、 现在退出并重新登录你的服务器。如果你为私钥指定了密码,则需要输入密码。

1、 不允许 root 用户通过 ssh 登录。 这要求所有的 ssh 连接都是通过非 root 用户进行。当以受限用户帐户连接后,可以通过使用 <code>sudo</code> 或使用 <code>su -</code> 切换为 root shell 来使用管理员权限。

<code># authentication:</code>

<code>...</code>

<code>permitrootlogin no</code>

2、 禁用 ssh 密码认证。 这要求所有通过 ssh 连接的用户使用密钥认证。根据 linux 发行版的不同,它可能需要添加 <code>passwordauthentication</code> 这行,或者删除前面的 <code>#</code> 来取消注释。

<code># change to no to disable tunnelled clear text passwords</code>

<code>passwordauthentication no</code>

如果你从许多不同的计算机连接到服务器,你可能想要继续启用密码验证。这将允许你使用密码进行身份验证,而不是为每个设备生成和上传密钥对。

3、 只监听一个互联网协议。 在默认情况下,ssh 守护进程同时监听 ipv4 和 ipv6 上的传入连接。除非你需要使用这两种协议进入你的服务器,否则就禁用你不需要的。 这不会禁用系统范围的协议,它只用于 ssh 守护进程。

使用选项:

<code>addressfamily inet</code> 只监听 ipv4。

<code>addressfamily inet6</code> 只监听 ipv6。

默认情况下,<code>addressfamily</code> 选项通常不在 <code>sshd_config</code> 文件中。将它添加到文件的末尾:

<code>echo 'addressfamily inet' | sudo tee -a /etc/ssh/sshd_config</code>

4、 重新启动 ssh 服务以加载新配置。

如果你使用的 linux 发行版使用 systemd(centos 7、debian 8、fedora、ubuntu 15.10+)

<code>sudo systemctl restart sshd</code>

如果您的 init 系统是 systemv 或 upstart(centos 6、debian 7、ubuntu 14.04):

fail2ban 可以监视各种协议,包括 ssh、http 和 smtp。默认情况下,fail2ban 仅监视 ssh,并且因为 ssh 守护程序通常配置为持续运行并监听来自任何远程 ip 地址的连接,所以对于任何服务器都是一种安全威慑。

大多数 linux 发行版都安装并运行了网络服务,监听来自互联网、回环接口或两者兼有的传入连接。 将不需要的面向网络的服务从系统中删除,以减少对运行进程和对已安装软件包攻击的概率。

要查看服务器中运行的服务:

<code>sudo netstat -tulpn</code>

如果默认情况下 <code>netstat</code> 没有包含在你的 linux 发行版中,请安装软件包 <code>net-tools</code> 或使用 <code>ss -tulpn</code> 命令。

以下是 <code>netstat</code> 的输出示例。 请注意,因为默认情况下不同发行版会运行不同的服务,你的输出将有所不同:

<code>proto recv-q send-q local address foreign address state pid/program name</code>

<code>tcp 0 0 0.0.0.0:111 0.0.0.0:* listen 7315/rpcbind</code>

<code>tcp 0 0 0.0.0.0:22 0.0.0.0:* listen 3277/sshd</code>

<code>tcp 0 0 127.0.0.1:25 0.0.0.0:* listen 3179/exim4</code>

<code>tcp 0 0 0.0.0.0:42526 0.0.0.0:* listen 2845/rpc.statd</code>

<code>tcp6 0 0 :::48745 :::* listen 2845/rpc.statd</code>

<code>tcp6 0 0 :::111 :::* listen 7315/rpcbind</code>

<code>tcp6 0 0 :::22 :::* listen 3277/sshd</code>

<code>tcp6 0 0 ::1:25 :::* listen 3179/exim4</code>

<code>udp 0 0 127.0.0.1:901 0.0.0.0:* 2845/rpc.statd</code>

<code>udp 0 0 0.0.0.0:47663 0.0.0.0:* 2845/rpc.statd</code>

<code>udp 0 0 0.0.0.0:111 0.0.0.0:* 7315/rpcbind</code>

<code>udp 0 0 192.0.2.1:123 0.0.0.0:* 3327/ntpd</code>

<code>udp 0 0 127.0.0.1:123 0.0.0.0:* 3327/ntpd</code>

<code>udp 0 0 0.0.0.0:123 0.0.0.0:* 3327/ntpd</code>

<code>udp 0 0 0.0.0.0:705 0.0.0.0:* 7315/rpcbind</code>

<code>udp6 0 0 :::111 :::* 7315/rpcbind</code>

<code>udp6 0 0 fe80::f03c:91ff:fec:123 :::* 3327/ntpd</code>

<code>udp6 0 0 2001:db8::123 :::* 3327/ntpd</code>

<code>udp6 0 0 ::1:123 :::* 3327/ntpd</code>

<code>udp6 0 0 :::123 :::* 3327/ntpd</code>

<code>udp6 0 0 :::705 :::* 7315/rpcbind</code>

<code>udp6 0 0 :::60671 :::* 2845/rpc.statd</code>

tcp

请参阅 <code>netstat</code> 输出的 <code>local address</code> 那一列。进程 <code>rpcbind</code> 正在侦听 <code>0.0.0.0:111</code> 和<code>:::111</code>,外部地址是 <code>0.0.0.0:*</code> 或者 <code>:::*</code> 。这意味着它从任何端口和任何网络接口接受来自任何外部地址(ipv4 和 ipv6)上的其它 rpc 客户端的传入 tcp 连接。 我们看到类似的 ssh,exim 正在侦听来自回环接口的流量,如所示的 <code>127.0.0.1</code> 地址。

udp

我们的 <code>netstat</code>输出说明 ntpdate :1)接受服务器的公网 ip 地址的传入连接;2)通过本地主机进行通信;3)接受来自外部的连接。这些连接是通过端口 123 进行的,同时支持 ipv4 和 ipv6。我们还看到了 rpc 打开的更多的套接字。

你可能主要通过 ssh 连接管理你的服务器,所以让这个服务需要保留。如上所述,rsa 密钥和 fail2ban 可以帮助你保护 ssh。

然而,exim 和 rpc 是不必要的,除非你有特定的用途,否则应该删除它们。

本节针对 debian 8。默认情况下,不同的 linux 发行版具有不同的服务。如果你不确定某项服务的功能,请尝试搜索互联网以了解该功能是什么,然后再尝试删除或禁用它。

如何移除包取决于发行版的包管理器:

arch

<code>sudo pacman -rs package_name</code>

centos

<code>sudo yum remove package_name</code>

debian / ubuntu

<code>sudo apt-get purge package_name</code>

fedora

<code>sudo dnf remove package_name</code>

再次运行 <code>sudo netstat -tulpn</code>,你看到监听的服务就只会有 ssh(<code>sshd</code>)和 ntp(<code>ntpdate</code>,网络时间协议)。

使用防火墙阻止不需要的入站流量能为你的服务器提供一个高效的安全层。 通过指定入站流量,你可以阻止入侵和网络测绘。 最佳做法是只允许你需要的流量,并拒绝一切其他流量。请参阅我们的一些关于最常见的防火墙程序的文档:

现在你可以按你的需求开始设置你的服务器了。

原文发布时间为:2017-12-30

本文来自云栖社区合作伙伴“linux中国”

继续阅读