设置 Hadoop 先决条件和安全强化 - 第 2 部分
Hadoop集群构建是一个逐步的过程,该过程从购买所需的服务器、安装到机架、布线等以及放置在数据中心开始。然后我们需要安装操作系统,如果集群规模很大,可以在实时环境中使用kickstart来完成。安装操作系统后,我们需要准备用于 Hadoop 安装的服务器,并且需要根据组织的安全策略准备服务器。
要求
- 在 CentOS/RHEL 7 上部署 Hadoop 服务器的最佳实践 – 第 1 部分
在本文中,我们将介绍 Cloudera 推荐的操作系统级先决条件。此外,我们还根据生产服务器的CIS 基准强调了一些重要的安全强化技巧。这些安全加固可以根据需求而有所不同。
设置 Cloudera Hadoop 先决条件
在这里,我们将讨论 Cloudera 推荐的操作系统级先决条件。
1. 禁用透明大页
默认情况下,透明大页 (THP) 在 Linux 计算机中启用,与 Hadoop 工作负载交互效果较差,并且会降低集群的整体性能。因此,我们需要使用以下 echo 命令禁用此功能以获得最佳性能。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
2. 更改虚拟机交换性
默认情况下,大多数 Linux 计算机的 vm.swappiness 值为 30 或 60。
sysctl vm.swappiness
不建议 Hadoop 服务器使用较高的 swappiness 值,因为它可能会导致长时间的垃圾收集暂停。并且,通过较高的 swappiness 值,即使我们有足够的内存,数据也可以缓存到交换内存中。降低swappiness值可以使物理内存包含更多的内存页。
sysctl vm.swappiness=1
或者,您可以打开文件 /etc/sysctl.conf 并在末尾添加 "vm.swappiness=1"
。
vm.swappiness=1
3.禁用防火墙
每个 Hadoop 服务器都将负责其上运行的多个服务(守护进程)。所有服务器都将出于各种目的而频繁地相互通信。
例如,Datanode将每3秒向Namenode发送一次心跳,以便Namenode确保Datanode处于活动状态。
如果所有的通信都通过防火墙发生在不同服务器上的守护进程之间,这将给 Hadoop 带来额外的负担。因此,最佳实践是禁用集群中各个服务器中的防火墙。
iptables-save > ~/firewall.rules
systemctl stop firewalld
systemctl disable firewall
4.禁用SELinux
如果我们保持SELinux启用,则会在安装Hadoop时导致问题。由于Hadoop是集群计算,Cloudera Manager将到达集群中的所有服务器来安装Hadoop及其服务,并在需要的地方创建必要的服务目录。
如果启用 SELinux,它将不会让 Cloudera Manager 根据需要规则安装。因此,启用 SELinux 将成为 Hadoop 的障碍,并且会导致性能问题。
您可以使用以下命令检查SELinux的状态。
sestatus
现在,打开 /etc/selinux/config 文件并禁用 SELINUX,如图所示。
SELinux=disabled
禁用 SELinux 后,您需要重新启动系统才能使其激活。
reboot
5.安装NTP服务
在Hadoop集群中,所有服务器应该时间同步以避免时钟偏移错误。 RHEL/CentOS 7内置了chronyd用于网络时钟/时间同步,但Cloudera建议使用NTP。
我们需要安装NTP并配置它。安装后,停止“chronyd”并禁用。因为,如果服务器同时运行 ntpd 和 chronyd,Cloudera Manager 会考虑 chronyd 进行时间同步,那么即使我们通过ntp来同步时间。
yum -y install ntp
systemctl start ntpd
systemctl enable ntpd
systemctl status ntpd
6. 禁用 Chronyd
正如我们上面提到的,我们不需要 chronyd 处于活动状态,因为我们使用 ntpd。检查chronyd的状态,是否正在运行停止和禁用。默认情况下,chronyd 会停止,除非我们在操作系统安装后启动它,只是为了安全起见,我们需要禁用它。
systemctl status chronyd
systemctl disable chronyd
7. 设置FQDN(完全限定域名)
我们必须使用FQDN(完全限定域名)设置主机名。每个服务器都应该有一个唯一的规范名称。要解析主机名,我们需要配置 DNS 或 /etc/hosts。在这里,我们将配置/etc/hosts。
每台服务器的 IP 地址和 FQDN 应输入到所有服务器的 /etc/hosts 中。然后只有 Cloudera Manager 可以通过其主机名与所有服务器进行通信。
hostnamectl set-hostname master1.linux-console.net
接下来,配置/etc/hosts文件。例如: – 如果我们有 5 个节点集群,其中有 2 个主节点和 3 个工作节点,我们可以按如下方式配置 /etc/hosts。
8.安装Java开发工具包(JDK)
由于Hadoop由Java组成,因此所有主机都应该安装适当版本的Java。这里我们将有OpenJDK。默认情况下,Cloudera Manager 将安装OracleJDK,但 Cloudera 建议安装OpenJDK。
yum -y install java-1.8.0-openjdk-devel
java -version
Hadoop 安全和强化
在本节中,我们将强化 Hadoop 环境安全性……
1.禁用自动挂载
自动挂载“autofs”允许自动挂载 USB、CD/DVD 等物理设备。具有物理访问权限的用户可以连接其 USB 或任何存储介质来访问插入数据。使用以下命令验证它是否被禁用,如果没有禁用它。
systemctl disable autofs
systemctl is-enabled autofs
2. 安全启动设置
grub 配置文件包含启动设置的关键信息和解锁启动选项的凭据。 grub 配置文件“grub.cfg”位于 /boot/grub2,它被链接为 /etc/grub2.conf 并确保grub.cfg 由 root 用户拥有。
cd /boot/grub2
使用以下命令检查 Uid 和 Gid 均为 0/root 和“group”或“ >other' 不应该有任何权限。
stat /boot/grub2/grub.cfg
使用以下命令删除其他人和组的权限。
chmod og-rwx /boot/grub2/grub.cfg
3. 设置引导加载程序密码
此设置可避免其他未经授权的服务器重新启动。即,重新启动服务器需要密码。如果未设置,未经授权的用户可以引导服务器并可以更改引导分区。
使用以下命令设置密码。
grub2-mkpasswd-pbkdf2
将上面创建的密码添加到 /etc/grub.d/01_users 文件中。
接下来,重新生成 grub 配置文件。
grub2-mkconfig > /boot/grub2/grub.cfg
4.删除预链接工具
Prelink 是一种软件程序,如果恶意用户可以破坏 libc 等常见库,则该软件程序可能会增加服务器中的漏洞。
使用以下命令将其删除。
yum remove prelink
5.禁用不需要的服务
我们应该考虑禁用某些服务/协议以避免潜在的攻击。
systemctl disable <service name>
- 禁用网络服务 – 确保网络服务 – 收费、白天、丢弃、回声、时间未启用。这些网络服务用于调试和测试,建议禁用,可以最大限度地减少远程攻击。
- 禁用 TFTP 和 FTP – 这两种协议都不支持数据或凭据的机密性。除非明确要求,否则最好不要在服务器中使用。大多数这些协议是在文件服务器上安装和启用的。
- 禁用 DHCP – DHCP 是动态分配 IP 地址的协议。除非是 DHCP 服务器,否则建议禁用,以避免潜在的攻击。
- 禁用 HTTP – HTTP 是可用于托管 Web 内容的协议。除了主/管理服务器(其中要配置服务的WebUI,如CM、Hue等)之外,我们可以在其他工作节点上禁用HTTP,这可以避免潜在的攻击。
概括
我们已经完成了服务器准备工作,其中包括Cloudera Hadoop 先决条件和一些安全强化。为了顺利安装 Hadoop,Cloudera 定义的操作系统级别先决条件是必需的。通常,将使用 CIS 基准准备强化脚本,并用于实时审核和修复不合规情况。
在CentOS/RHEL 7的最小安装中,仅安装基本功能/软件,这将避免不必要的风险和漏洞。即使是最小安装,在安装 Hadoop 之前,甚至在构建集群之后、将集群移至运营/生产之前,也会进行多次安全审核迭代。