Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yitong-ovo/c479afa5f8dddf067bf4a16fa381ddcf to your computer and use it in GitHub Desktop.
Save yitong-ovo/c479afa5f8dddf067bf4a16fa381ddcf to your computer and use it in GitHub Desktop.
当服务器运行的前五分钟

原文链接: My First 5 Minutes On A Server; Or, Essential Security for Linux Servers

新建服务器的后五分钟

保证一个服务器的安全可以很简单。我的安全理念能够在保持高效率的同时让你免遭最常见的攻击,我相信你也会这么做。

任何经验丰富的系统管理器都会告诉你,随着人员的增长和服务器的增加,用户管理不可避免的会成为一个负担,在快速增长的环境中保证安全的访问是艰难的,你会遇到例如:过期密码,废弃的测试账户等等问题。恕我直言,即使有账户同步工具来帮助减轻这种痛苦,这种方法既浪费时间也对安全不利,保持简单才是安全的核心。

我们会在服务器上创建两个用户:root 和 deploy 。deploy 用户通过任意长度的密码访问,具有 sudo 权限,是开发人员登录的账户,开发人员使用公钥而不是密码登录,因此管理登录授权只需保持 authorized_keys 是最新的即可。root 用户无法通过 ssh 登录,而 deploy 用户只能从我们办公室的 IP 登录。

没有完美的解决方案,我们的方法也有缺点,如果 authorized_keys 文件被破坏或是权限设置错误,我们需要登录到远程终端 (例如 vnc 和 webshell) 去修复它,如果你非常谨慎,你不会这样做的。

注意:我不认为这是最安全的做法 ,只是在我们这个小团队里,它平衡了安全和管理的简单。根据我的经验,大多数漏洞都是因为程序安全性不足或是维护不当导致的。

动手吧

我们有一个新的服务器,我这里使用的是 Ubuntu 并使用 root 用户登录,如果你使用的是其他发行版的 Linux ,那么命令可能会有所不同。 那么,五分钟开始!

passwd

将你的 root 密码更改为长而复杂的密码。你不需要记住它,将它存储在安全的地方就可以了。(这个密码只有在你无法使用 ssh 登录服务器的时候才会被使用。)

apt-get update
apt-get upgrade

保持系统最新总是没错的,让我们继续。

安装 Fail2ban

apt-get install fail2ban

Fail2ban 是一个守护进程,它监控尝试链接到服务器的行为,并阻止可疑的活动进行,开箱即用,很好配置。

现在,让我们设置您的登录用户。随意命名用户,除了 “deploy” -- 它只是一个方便理解的例子。

useradd deploy
mkdir /home/deploy
mkdir /home/deploy/.ssh
chmod 700 /home/deploy/.ssh

使用公钥来进行认证

密码已经过时了,或者说 -- "不再安全" 。丢掉密码来使用 公钥认证 能显著的提高易用性和安全性。

vim /home/deploy/.ssh/authorized_keys

将您本地计算机上 id_rsa.pub 的内容以及需要访问这个服务器的任何公钥添加到此文件。

chmod 400 /home/deploy/.ssh/authorized_keys
chown deploy:deploy /home/deploy -R

测试新用户 && 启用 sudo

现在打开一个新的终端窗口,使用新创建的用户来登录你的新服务器 (记住不要关闭 root 用户登录的那个终端窗口)。如果成功,请切回 root 登录的终端,来设置新用户的 sudo 密码。

passwd deploy

设置复杂的密码 -- 您可以将其存储在安全的地方。这是您将使用的 sudo 密码。

sudo visudo

注释现有的 user/group 授权,并添加:

root    ALL=(ALL) ALL
deploy  ALL=(ALL) ALL

以上操作使 deploy 用户在使用 sudo 并输入正确的密码后能够被授予权限。

配置 SSH

编辑 sshd 配置文件以阻止密码登录,并设置为只有特定的 IP 才能够登录。

vim /etc/ssh/sshd_config

将这些行粘贴到文件中,输入您需要设置的特定 IP 地址。

PermitRootLogin no
PasswordAuthentication no
AllowUsers deploy@(your-ip) deploy@(another-ip-if-any)

重启 ssh:

sudo systemctl restart sshd.service

设置防火墙

没有开启防火墙的服务器不是安全的服务器。 Ubuntu 提供了 UFW ,能够让管理防火墙变得容易,运行:

ufw allow from {your-ip} to any port 22
ufw allow 80
ufw allow 443
ufw enable

这将设置一个简单的防火墙,并配置防火墙允许 80 和 443 端口的流量通过。您可以添加更多的端口通过防火墙,这取决于您的服务器要做什么。

启用安全自动更新

我已经使用 apt-get update/upgrade 有很多年了,我管理着十几个服务器,较少登录的服务器没有保持最新,例如那些用作负载均衡的服务器,虽然自动安全更新让我感到害怕,但总比有漏洞的好。

apt-get install unattended-upgrades

vim /etc/apt/apt.conf.d/10periodic

更新你的文件,它看起来像这样:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";

还需要编辑一个配置文件:

vim /etc/apt/apt.conf.d/50unattended-upgrades

如下所示。您应该设置自动安全更新并禁用自动更新。

Unattended-Upgrade::Allowed-Origins {
        "Ubuntu lucid-security";
//      "Ubuntu lucid-updates";
};

安装 Logwatch 来监控服务器

Logwatch 是一个守护进程,它监视您的日志并通过电子邮件发送给您。这对于追踪和检测非法访问是有帮助的。如果有人访问您的服务器,通过电子邮件发送给您的日志有助于您了解到发生了什么 -- 因为服务器上的日志有可能已经被清理了。

apt-get install logwatch

vim /etc/cron.daily/00logwatch

添加这一行。

/usr/sbin/logwatch --output mail --mailto test@gmail.com --detail high

全部完成

我想现在我们的服务器应该很安全。在短短几分钟内,我们让一个服务器足够安全而又易于维护,每天都能够阻挡很多非法的访问,但是请确保你的密码足够安全!

我很想听听你对这个方案的看法和反馈,随时讨论 Hacker Newsfollow me on Twitter

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment