在本文中,将了解这些概念:
● 在防火墙级别配置进出 Samba 服务器的访问
● 排除与 Samba 服务器有关的防火墙故障
本文帮助您准备 Linux Professional Institute (LPI) 的混合环境专业考试(302)的主题 315 下的目标 315.2。该目标的权值为 2。
先决条件
为了最有效地利用本系列中的文章,您应该具备高级 Linux 知识,并需要准备一个 Linux 系统,用它来练习本文介绍的命令。另外,您还要能访问 Windows 环境,从而可以用它来测试安全设置。
防火墙
Samba 有很多特性可以限制哪些人能访问哪些共享文件 — 限制特定用户名的访问、强制要求密码、检查组成员或在网络层过滤。后面的参数,比如 allow hosts 和 smb ports,它们对 IP 地址和 User Datagram Protocol (UDP)/TCP 端口进行操作,提供了一种简单的方法来控制哪些主机可连接到 Samba 服务器上。
如果能识别哪些设备连接到服务器,比如属于内部网络,或者甚至是某个特定的子网或一组服务器,那么就实现了网络层控制。这是第一道防线:如果攻击者无法连接到设备,那么设备会更安全。
在 Samba 守护进程中控制网络网络访问,这听上去是完美的解决方案,但其实有更好的方法。为了确定远程连接是否满足要求,Samba 首先要接受连接,因为 Samba 只有在完成连接后才能获取详细信息。如果是想要防止不符合要求的用户连接到 Samba,那么防止 Samba 看到这些连接更有意义。Samba 中的所有配置都只会影响 Samba,因此必须为其他的守护进程(比如 web 服务器和文件传输)找到类似的解决方案。
在典型环境中,网络安全不是由系统管理员而是由其他 IT 员工负责。在主机层(而不是应用程序层)控制访问能够实现业务分离,而且会减少由于更改 smb.conf 而导致的错误。
了解 iptables
Linux 提供了一个强大的基于主机的防火墙,称为 iptables。该防火墙能够检查进出或通过 Linux 设备的包。iptables 也可以指 Linux 内核中的包过滤系统或用来管理过滤器的命令名称。经过几年的发展,内核中的包过滤系统已经从简单的匹配引擎发展成可动态加载插件的强大防火墙。因此,如果是在基本用例范围之外,配置起来就相当复杂。
关于 iptables 的第一个重要概念就是表本身。一个表就是一组规则和操作的自包含列表。当内核需要过滤包时,它会查询 filter 表。如果需要网络地址转换 (NAT),就会用到 nat 表。根据加载到内核的网络特性的不同,还会用到其他表。一个数据包可遍历多个表 — 例如,在地址转换前执行包过滤。
每个表的内部都是一组链。每个表都有一些预定义的链,您也可以将自定义链加入列表中。这些预定义的链会在数据包生命周期不同时刻使用。例如,filter 表有三个预定义链:
● INPUT。 用来定义如何处理传向主机自身的数据包。
● OUTPUT。 适用于从主机传出的包。
● FORWARD。 仅用于从一个接口传递到另一个接口,比如当主机充当路由器时的数据包。
每条链都是一个包含零个或多个规则的有序列表,每个规则由匹配的子句和目标组成。匹配子句可以是任何内容,从 IP 地址或端口到只在特定操作过于频繁时起作用的速率限制语句。目标可以是另一个链或一个操作,比如接受或丢弃数据包的指令。您可以通过内核模块创建匹配子句和目标,没有任何限制。
内核会根据需要做什么来选择链,并按顺序查看每条规则。符合第一条匹配规则后,内核就跳到目标上。大多数情况下,规则处理会停止,尽管有些目标—比如登录—被认为是不会结束的,因此内核将继续处理下一条规则。如果没有匹配任何规则,将会使用链的默认目标。
请注意:出于本文的目的,本文只用到 filter 表。
使用防火墙保护 Samba
有多种不同的方法来设计 Samba 的防火墙策略,选择时要考虑网络布局以及谁或哪些主机需要访问 Samba 服务器等事项。从较高的层面来看,您可以选择保护整个主机或只关注 Samba。
如果您想要保护整个主机,那么您就不必担心 Samba 使用哪个端口。以下代码是一个简单策略,只允许来自 10.0.0.0/8 专用网络的流量传输到本地服务器:
iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -P INPUT DROP |
第一个命令向 INPUT 链添加了一条规则,它将规则添加到当前的规则列表中。该规则设置了来自源网络(-s)10.0.0.0/8 的所有内容都跳到 ACCEPT 目标,它将会接受数据包。第二个命令允许来自现有会话的包,这是通过调用带有 -m state 的状态匹配器实现的。匹配器会追踪哪些连接离开主机。传出的连接的响应包被认为是 established 或 related,因此规则的其余部分会接受这些包。
最后一个命令设置 INPUT 链丢弃数据包的默认策略。如果数据包不是来自 10.0.0.0/8 网络或者不是主机生成的连接的一部分,那么它不会被接受。