Samba服务器安全指南


在本文中,将了解这些概念:

  • 在防火墙级别配置进出 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 网络或者不是主机生成的连接的一部分,那么它不会被接受。

您可以通过在端口层过滤来获得更加精细的粒度。前一个示例过滤源地址,因此会阻塞所有服务。如果在您的主机上有一个 web 服务器,您想让它对一般的 Internet 开放访问,那么之前的策略就不起作用了。

回想一下 “学习 Linux,302混合环境):配置 Samba”,Samba 使用了四种不同的端口:

  • 137 UDP。 网络基本输入/输出系统 (NetBIOS) 名称服务。
  • 138 UDP。 NetBIOS 数据报服务。
  • 139 TCP。 NetBIOS 会话服务。
  • 445 TCP。 直接托管TCP 上的 Common Internet File System [CIFS])。

清单 1 演示了一个策略,允许从 10.0.0.0/8 网络连接到 Samba 服务,也允许 web 服务器没有任何限制地进行操作。

清单 1. 在端口层操作的策略


iptables -A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW --dport 443 -j ACCEPT
iptables -A INPUT -p udp -s 10.0.0.0/8 --dport 137 -j ACCEPT
iptables -A INPUT -p udp -s 10.0.0.0/8 --dport 138 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -s 10.0.0.0/8 --dport 139 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -s 10.0.0.0/8 --dport 445 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -P INPUT DROP

清单 1 的策略比之前的策略复杂得多,因为它对不同的应用程序进行了设置,每个都有不同的策略。前两条规则匹配所有作为新会话-m state --state NEW)的一部分,并且发送到端口 80 或端口 443--dport 80、 --dport 443)的传入的 TCP 数据包-p tcp)。对于源地址没有任何限制,因此会支持所有人。

接下来的两行匹配所有从内部网络-s 10.0.0.0/8)发送到端口 137 或端口 138--dport 137、--dport 138)的 UDP 数据包-p udp)。UDP 没有状态,因此无需担心连接是新的还是已建立的。

第 5 行和第 6 行结合状态匹配器和源地址过滤器,仅仅允许端口 139 和端口 445 上来自内部网络的新连接。

最后两行与之前策略的操作相同。如果数据包与当前连接有关,则支持它。其他的将会被丢弃。

排除防火墙故障

防火墙问题很常见,因为会遇到没有想到的的需求或发现应用程序并没有按您预计的方式运行。规则本身的错误也很常见,尤其是处理一长串端口号和 IP 地址时。但也不是所有问题都与防火墙有关,因此您应该了解一些基本的网络故障排除步骤。

查看策略

使用 iptables 命令查看策略。-L 选项会列出策略,而 verbose-v)选项会添加额外的细节信息,比如数据包计数器。清单 2 显示了 清单 1 的策略。

清单 2. 查看详细策略


# iptables -L -v
Chain INPUT (policy DROP 47 packets, 5125 bytes)
 pkts bytes target  prot opt in   out  source      destination
    0     0 ACCEPT  tcp  --  any  any  anywhere    anywhere     state NEW tcp dpt:http
    0     0 ACCEPT  tcp  --  any  any  anywhere    anywhere     state NEW tcp dpt:https
    0     0 ACCEPT  udp  --  any  any  10.0.0.0/8  anywhere     udp dpt:netbios-ns
    0     0 ACCEPT  udp  --  any  any  10.0.0.0/8  anywhere     udp dpt:netbios-dgm
    0     0 ACCEPT  tcp  --  any  any  10.0.0.0/8  anywhere     state NEW tcp dpt:139
    0     0 ACCEPT  tcp  --  any  any  10.0.0.0/8  anywhere     state NEW tcp dpt:445
  214 15216 ACCEPT  all  --  any  any  anywhere    anywhere     state RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 292 packets, 35009 bytes)
 pkts bytes target     prot opt in     out     source               destination

明细统计数据会显示匹配头两列规则的数据包数目和字节数目。对于清单 2,您会看到该数据包只匹配最后一条规则。仔细看输出的第一行,您会看到默认的目标也有一个数据包数目。有 45 个数据包被丢弃,因为它们不匹配任何一条规则;这表示或者是未授权的用户试图访问主机,或者是合法的流量被不正确的防火墙策略所阻塞。

查看防火墙策略的另一用途是完整地了解策略。由于处理会在第一次匹配后停止,因此您应该从策略开头处开始,一直往下看,确定是否有一条规则会丢弃您的流量。

一个常见场景是不具体的规则出现在具体的规则之前。为了避免出现问题,将最具体的规则放在策略头部,以便首先发现例外。但这样的惯例并不总是有效,因此您应该自己查找那些不能连接到服务器的用户。

清单 3 显示了 Engineering 网络中一台服务器的策略。同一个网络中的用户无法连接到服务。

清单 3. 含有覆盖规则的策略


# iptables -L -v
Chain INPUT (policy DROP 21 packets, 2967 bytes)
target   prot opt in   out  source       destination
ACCEPT   tcp  --  any  any  anywhere     anywhere      state NEW tcp dpt:http
ACCEPT   tcp  --  any  any  anywhere     anywhere      state NEW tcp dpt:https
DROP     tcp  --  any  any  10.0.0.0/8   anywhere
ACCEPT   udp  --  any  any  10.2.3.0/24  anywhere      udp dpt:netbios-ns
ACCEPT   udp  --  any  any  10.2.3.0/24  anywhere      udp dpt:netbios-dgm
ACCEPT   tcp  --  any  any  10.2.3.0/24  anywhere      state NEW tcp dpt:netbios-ssn
ACCEPT   tcp  --  any  any  10.2.3.0/24  anywhere      state NEW tcp dpt:microsoft-ds
ACCEPT   all  --  any  any  anywhere     anywhere      state RELATED,ESTABLISHED

清单 3 中的服务器属于 Engineering 网络,它是 10.2.3.0/24。从公司其他地方,即 10.0.0.0/8 的访问也会被阻塞。10.2.3.0/24 网络是更大网络的子网,因此阻塞整个 10.0.0.0/8 网络的规则在 Server Message Block (SMB) 相关规则之前;因此,即使是 Engineering 用户也会被 DROP 捕获,因为 iptables 使用的是首次匹配,而非最佳匹配概念。

以上问题的解决方案是在具体规则处理之后阻塞公司网络。那样的话,将首先接受 Engineering 网络的包。

高级故障排除

您通常无法确定是防火墙的问题,还是网络其他地方出了问题。最简单的测试方法是关闭防火墙,看看连接是否成功。当然,并不总能这么做,如果不能关闭防火墙,那么其次的最佳方案是观察进入服务器的数据包。

tcpdump 工具能显示服务器看到的网络包,即使防火墙策略丢弃了该包。如果能看到来自服务器的连接尝试,那么您就知道数据包到达了服务器。假设服务正在运行,那么您很有可能得出防火墙丢弃数据包的结论。清单 4 显示了 tcpdump 工具正在执行。

清单 4. 被阻塞的 SMB 连接的数据包跟踪


# tcpdump -i eth0 tcp port 445
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
20:24:18.392106 IP CLIENT.search > SERVER.microsoft-ds: S ...
20:24:21.358458 IP CLIENT.search > SERVER.microsoft-ds: S ...
20:24:27.393604 IP CLIENT.search > SERVER.microsoft-ds: S ...

tcpdump 选项如下所示:

  • -i eth0。 监听 eth0 接口。
  • tcp port 445。 检查 TCP 端口 445 的数据包。

清单 4 的结果显示有三个数据包进入服务器。箭头表示数据流的方向:三个包在 microsoft-ds port 端口即 455)上从客户端到达服务器。行末的 S 表示连接尝试,没有响应表示服务器未响应。

连接失败的另一个迹象是连续数据包之间的差别。左侧的时间戳显示第二个包在第一个包之后约 3 秒钟才到达,第三个包又在这 6 秒钟后到达。大多数网络协议会实现指数后退 (exponential back-off) 算法,这意味着每次连续尝试之间的时间会翻倍。

原文:http://www.ibm.com/developerworks/cn/linux/l-lpic3-315-2/index.html?ca=drs-

相关内容