我正在强化在默认 Ubuntu 20.04 AMI 上运行的 EC2 实例的安全组。关闭除 TCP 80 和 TCP 443 之外的所有传出端口后,哪些系统服务会中断?(我假设应用程序所需的所有端口也都打开了。我担心的是会破坏操作系统提供的隐式服务。)
我的理解是,允许 TCP 80/443 足以满足基本操作系统服务的需求。例如,apt-get
更新应该可以正常工作。或者我是否错过了 Ubuntu 或 AWS 始终期望开放的端口?
附注:我想知道时间同步是如何工作的。默认情况下,我看不到默认 Ubuntu AMI 上预装的任何 NTP 或 chrony 服务。否则,UDP 端口 123 也应该打开。我的假设是 VM 提供的(客户机)硬件时钟已由主机(由 AWS 运营)同步。除此之外,我想不出从操作系统角度需要允许的任何端口。
根据应用程序将使用的 AWS 服务,需要更多端口,例如 ElastiCache (Redis) 需要 6379。但我担心不是来自已部署应用程序的 API 调用。您可以假设应用程序的要求是已知的。环境(操作系统和 EC2 基础设施)的要求更棘手。
答案1
在 Ubuntu 20.04 中,允许传出 http 和 https 流量基本上就足够了。但是,我遇到了 NTP 问题。我尝试打开 UDP 端口 123 失败了。我不确定为什么,但为了解决这个问题,我最终切换到了内部来自 AWS 的时间同步服务:
$ cat /etc/systemd/timesyncd.conf
[Time]
NTP=169.254.169.123
如果时钟同步,您应该得到以下输出:
$ timedatectl
...
System clock synchronized: yes
...
如果没有,请通过以下方式检查日志:
$ journalctl --unit=systemd-timesyncd
就我的情况而言,即使打开了 UDP 123 端口(我甚至还尝试打开 TCP 123),连接到 时仍然会超时ntp.ubuntu.com:123
。使用 AWS 服务时,无需打开这两个传出端口,它就可以正常工作。
答案2
您需要为此使用 NACL,因为安全组只能处理传入流量并允许所有传出流量。您需要考虑临时端口。这意味着当您启动对https://my-apt-repo.com
目标端口的请求时,由于 HTTPS,端口将为 443,但请求在您的实例上从其启动的源端口可以是从端口 ~10000 到 ~65000 的任何端口。您必须注意允许传入和传出端口,因为 NACL 是无状态的。如果您只允许某些端口上的传出而不允许传入,则响应将无法返回。
要查看系统使用哪些端口作为临时端口,请运行:
sysctl net.ipv4.ip_local_port_range
您可以通过编辑文件来更改端口范围/etc/sysctl.conf
。如果您不想重新启动以使更改生效,请运行以下命令来获取配置:
sysctrl -p /etc/sysctl.conf .
欲了解更多信息,查看这篇文章。