原文链接: 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
保持系统最新总是没错的,让我们继续。
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
现在打开一个新的终端窗口,使用新创建的用户来登录你的新服务器 (记住不要关闭 root 用户登录的那个终端窗口)。如果成功,请切回 root 登录的终端,来设置新用户的 sudo 密码。
passwd deploy
设置复杂的密码 -- 您可以将其存储在安全的地方。这是您将使用的 sudo 密码。
sudo visudo
注释现有的 user/group 授权,并添加:
root ALL=(ALL) ALL
deploy ALL=(ALL) ALL
以上操作使 deploy 用户在使用 sudo 并输入正确的密码后能够被授予权限。
编辑 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 是一个守护进程,它监视您的日志并通过电子邮件发送给您。这对于追踪和检测非法访问是有帮助的。如果有人访问您的服务器,通过电子邮件发送给您的日志有助于您了解到发生了什么 -- 因为服务器上的日志有可能已经被清理了。
apt-get install logwatch
vim /etc/cron.daily/00logwatch
添加这一行。
/usr/sbin/logwatch --output mail --mailto test@gmail.com --detail high
我想现在我们的服务器应该很安全。在短短几分钟内,我们让一个服务器足够安全而又易于维护,每天都能够阻挡很多非法的访问,但是请确保你的密码足够安全!
我很想听听你对这个方案的看法和反馈,随时讨论 Hacker News 和 follow me on Twitter。