破解你的便携式 Linux 服务器
在过去的几个月里,围绕着西部数据 MyBook II(一款流行的平装书大小的外部硬盘驱动器)形成了一个小型社区。人们很快发现,这款支持以太网的版本由一个嵌入式 Linux 系统驱动,并且在网络上开始了破解其安全性的过程,以获取 SSH 访问权限、安装额外的服务、调整功能等等。这类似于友好的破解设备 Linksys WRT54G 所引发的现象,尽管规模较小。
我对所看到的一切感到兴奋,开始考虑构建自己的小型设备,而西部数据突然对其产品线进行改造,使得旧型号在 eBay 上的价格降至 100 美元以下,这与我的经理要求我制定一项每日备份方案的要求不谋而合,该方案应能在我的笔记本电脑发生最坏情况时,将停机时间控制在一天以内。
因此,我开始着手破解我自己的基于 Linux 的 NAS。我购买了两台设备:较小的单驱动器 500GB 型号(在撰写本文时在 eBay 上的价格低于 100 美元)和较大的支持 RAID 的双驱动器型号,容量为 1TB(二手设备的价格为 300 美元)。鉴于硬件价格不断下降和产品范围不断扩大,您应该能够以更低的价格或更大的容量购买到这些产品。还值得注意的是,没有什么可以阻止您小心翼翼地打开设备的内部,并将封闭的 SATA 驱动器更换为更大容量的驱动器。最后一条购物建议:本文中讨论的驱动器是支持以太网的 World Edition 型号,所有型号都具有全白色外壳。
初次检查时,该设备就像一本小书,边缘有穿孔的摩尔斯电码图案,可以通风——如果您真的解码了该信息,您会发现其中有几个单词和一些错别字。该设备非常安静,产生的噪音不超过普通硬盘驱动器。设备正面有两个同心 LED 环,环绕着一个用于打开和关闭设备的按钮。除了显示设备的开/关状态外,LED 还用于可视化磁盘活动以及提供时尚的磁盘容量计(图 1)。
内部有一个或两个 500GB 7,200 RPM SATA 驱动器和一个小型电路板,该电路板装有一个 Oxford Semiconductor 0XE800 ARM CPU,带有 ARM926EJ-S 内核、一个 32MB Hynix RAM 芯片和 Via Cicada Simpliphy vt6122 千兆以太网芯片组。该设备还包括一个外部可访问的 USB 端口,用于补充 RJ-45 以太网连接器,并且它支持硬件 AES-128 加密。尽管其 RAM 容量有限,但 Linux 对资源的保守使用几乎没有限制您可以发挥创造力来合理使用该设备。但是,不要计划饱和千兆以太网链路,因为 CPU 不会让您超过 5MB/秒——这种限制不会影响单用户备份或涉及多个用户的应用程序。
在 World Edition 系列中,驱动器格式化为 ext-3,因为 NAS 访问将主要的 Windows 和 Macintosh 用户群体与实际的文件系统选择隔离开来——这是一个非常方便的细节,因为它允许您从设备中取出驱动器并在任何 Linux 主机中挂载它们以进行恢复,以防支持板发生故障。
最初,您需要启动到您系统的“魔兽世界”分区——运行其中一个专有操作系统的分区——并安装西部数据 MioNet 访问工具。您只需要这些工具用于初始步骤——找出您的尚未通信的设备从 DHCP 收到的 IP 地址;之后您将不需要 WD 工具。如果您设置了网络嗅探器,那么您可以更快地捕获 DHCP 分配事件,并节省注册和下载的时间。您还可以检查您的 DHCP 服务器表(如果您有权访问它们),或者只是从安装工具后将设置的已挂载的 Windows 共享中读取数据。无论哪种方式,一旦您拥有了设备正在使用的 IP 地址,您就可以将 Web 浏览器指向它,并配置 Web 界面公开的设置。系统会要求您提供身份验证,这将与您在 WD 设置过程中创建的凭据相匹配,或者,如果您使用了更特殊的流程,它将使用系统默认值(“admin”,密码为“123456”)。
该设备内置的 WD 共享存储管理器(图 2)是一个非常轻量级且有用的应用程序,即使在这种以 Linux 为中心的设置中,您也会保持启用状态,因为它是一种创建用户和执行最常见配置任务的便捷方式。我建议您花时间配置此处公开的大多数设置,作为您初始自定义的一部分,因为这种便利性是无与伦比的。至少,您应该遍历“常规设置”部分,并配置您的设备名称和工作组(这些配置 Samba)、日期和时间,并查看您的网络设置。作为下一步的准备工作,您需要创建一个用户(文件共享→用户管理),您将使用该用户登录控制台,因为不允许通过您现有的 Web 管理员帐户进行访问。
此时您应该考虑的另一个更改是是否设置 RAID。该设备支持两种操作模式:数据条带化 (RAID 0),它具有性能优势并提供两个驱动器的总容量;以及数据镜像 (RAID 1),它仅提供一个驱动器的存储容量,但通过创建两个完全冗余的数据副本来保护您。默认设置(驱动器管理→更改驱动器类型)是数据条带化——如果您想更改它,现在是时候了。一旦 RAID 重建开始,驱动器的共享、非系统部分上的所有数据都将丢失。更重要的是,尽管驱动器共享将在重建仍在进行中时在几分钟内变为可写,但请等到它完全完成后再进行操作,因为接下来您需要修改设备的固件升级路径(并且在 RAID 阵列重建时触发重启肯定会引诱命运让您的设备变砖)。只需让它运行过夜,然后在第二天早上再回到它。您可以通过检查共享存储管理器中的驱动器状态来查看重建是否已完成;它将从同步切换回正常。
要开始解锁这个出色设备的多方面功能,您首先需要获得控制台访问权限。需要明确的是,这将使设备的保修失效,因为西部数据显然不从事支持各种可能配置和软件选项的 Linux 服务器的业务,而这种灵活性正是我们所追求的。请记住,尽管这些步骤经过认真研究和验证,但作者和 Linux Journal 不对因这些说明导致您的设备无法运行承担任何责任——您需要自行承担风险。
WD 破解社区是由 Martin Hinner 创建的后门程序引发的,该程序使用驱动器的内置固件更新过程来重置设备的 root 密码、生成 SSH 守护程序并生成 SSH 主机密钥。与其他人一样,让我们前往 Martin 的网页(参见“资源”)并按照其中的说明进行操作。实际上,您只需导航到设备上的 URL 即可。该 URL 包含一个 GET 参数,用于运行升级脚本。该参数引用 Martin 站点上的一个脚本,但此脚本不会执行升级,而是生成 SSH 密钥、清除 root 密码并启动 SSH 守护程序。
一旦“升级”启动,您将不会在 Web 页面上收到有关其已完成的反馈,并且您可能不应在此期间对您的设备执行任何操作,以免惹恼那些变砖小精灵。只需等待三分钟,然后开始尝试使用您先前在共享存储管理器中创建的用户(不是管理员,也不是 root)帐户通过 SSH 登录。一旦您看到 SSH 守护程序响应登录提示,您就会知道破解成功了。如果您正确设置了您的用户帐户,您将能够登录。如果您在登录时遇到问题,请注意您的用户名是否以大写字母拼写 (ssh USER@ipaddress),因为您会注意到用户管理 Web 界面以这种方式创建所有帐户。还有一个故障排除技巧:最新的固件版本实际上会输出一条更新失败的消息,尽管 SSH 守护程序实际上已成功生成并已准备好进行连接。
成功登录到您的设备后,您可以通过将用户切换为 root (su -) 来提升您的权限,因为超级用户密码现在为空。您需要执行一些任务——第一个任务是将 SSH 守护程序添加到默认启动列表,以确保您新获得的访问权限在下次重启后仍然有效。前往 /etc/inittab,并在系统启动部分后添加以下内容
# Start a few good daemons ::sysinit:/usr/sbin/sshd
在进行更改后,请确保通过执行“sync”将其写入磁盘,并修复用户帐户的一些详细信息,例如授予您自己的主目录以及可能的 小写用户名。在重新启动之前,完成所有 /etc/passwd 和 /etc/shadow 的内务处理,以验证 SSH 守护程序现在默认生成,并且您的用户帐户按预期工作。
您已经度过了最困难的时刻;现在您可以继续探索系统并随意调整它。除非您计划使用 MioNet 服务,否则有些人建议关闭其守护程序,因为它是一个 Java 进程,会占用 CPU 和 RAM。由于 MioNet 服务支持广域文件共享,我选择关闭该服务,但为了干净地关闭它,以防万一我决定毕竟需要该功能。编辑 /etc/init.d/post_network_start.sh,并注释掉脚本的第 17 行
$SCRIPTS_PATH/crond.sh start # $SCRIPTS_PATH/mionet.sh start touch $POST_NETWORK_STARTED_FILE
这会阻止守护程序在启动时自动生成,但如果您需要其服务,您可以根据需要从共享存储管理器界面(常规设置→WD Anywhere Access)启动它,从而为您提供两全其美的效果。
该系统围绕 2.6.17.14 内核构建,BusyBox 集中了许多命令行工具。没有手册页,但该系统是其他方面合理的最小 Linux 实例,包括大多数常见的管理杠杆(ps、top、free、ifconfig、wget 等)以及带有所有装饰的开发工具链(gcc 3.4.2、gmake 等),使您能够构建任何可能缺少的软件。挂载显示了设备的良好概况
# df -h Filesystem Size Used Avail Use% Mounted on rootfs 2.8G 277M 2.4G 11% / /dev/root 2.8G 277M 2.4G 11% / /dev/md3 950M 19M 884M 3% /var /dev/md4 455G 199M 455G 1% /shares/internal
还值得一提的是,在双驱动器设备上,系统分区默认是镜像的,无论共享空间的 RAID 状态如何
# cat /proc/mdstat Personalities : [linear] [raid1] md1 : active raid1 sdb1[1] sda1[0] 2939776 blocks [2/2] [UU] md2 : active raid1 sdb2[1] sda2[0] 104320 blocks [2/2] [UU] md3 : active raid1 sdb3[1] sda3[0] 987904 blocks [2/2] [UU] md4 : active linear sdb4[1] sda4[0] 1945407104 blocks 64k rounding unused devices: <none>
另一个重要的细节是电源按钮的行为:由一个也控制 LED 的小型守护程序调节,如果按下两秒钟,它将使设备正常重启;如果按住四秒钟,它将导致软关机——训练自己通过在发出软件重启时查看设备来识别灯光方案(设备背面有一个硬复位按钮,以防它严重卡住)。除了看起来非常酷之外,LED 环还可视化磁盘活动和可用磁盘空间,以及 RAID 故障,将形式和功能结合在一起。
如果您按照我的建议在之前设置了设备名称和工作组,那么您的主机名已经处理好了。设备默认以 DHCP 模式启动,对于那些想要一个微型、节能但相当居家的服务器供他们支配的人来说,可以轻松更改此模式。然而,我发现 WDMBII 最大的前景在于其易于移动性,这引出了一个问题,如何在新的环境中快速识别其位置——没有什么好的脚本不能解决的。
对此的第一种方法是让设备在启动时通知您其 IP 地址。我个人利用即时消息进行此类系统通知,并且在我的联系人列表中有一个“自动化”组,其中包含几个看起来像 Borg 的头像,这些头像被授权在情况需要时向我发送各种警报。此脚本的关键是 SendXMPP 工具(参见“资源”),它提供了从控制台轻松发送即时消息的能力。SendXMPP 带有几个 Perl 模块依赖项,您需要从 CPAN 存档下载并构建它们。通过 wget 检索 tar 文件,解压缩并按照惯例perl Makefile.PL; make; make install以 root 身份执行过程——CPAN shell 似乎在 WDMBII 的严格 RAM 限制下无法工作。在构建两到三个模块后,您将能够在 /etc/init.d/post_network_start.sh(第 20 行)中包含以下一行魔法
# $SCRIPTS_PATH/mionet.sh start touch $POST_NETWORK_STARTED_FILE # Announce IP address of operation to admin OUT=`ifconfig | grep -A2 "eth0"`; \ echo -e "(lander) now operational: \n$OUT" \ | /usr/local/bin/sendxmpp -r lander-notifier \ -f /root/.sendxmpprc lucifred@jabber.org fi
该脚本解析当前网络配置,并使用适当的文本换行和一个描述设备的 XMPP 资源 (-r) 将其发送到我的一个通知帐户。用户 ID 和密码从 /root/.sendxmpprc (-f) 中检索。安装脚本后,设备将在每次启动时在任何启用 DHCP 且对相关 Jabber 服务器的访问未受限制的网络中通知我其 IP 地址。结果消息在帮助我定位设备甚至排除偶尔的连接故障方面非常有效
(lander) now operational: eth0 Link encap:Ethernet HWaddr 00:90:A9:15:DD:73 inet addr:164.99.120.96 Bcast:164.99.121.255 Mask:255.255.254.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
这种方法将服务于大多数愿意忍受连接到 IP 地址的公路战士。但是,控制自己域名的超级用户可以做得更好。通过设置动态 DNS 子域名,可以使设备在启动时更新完全限定的域名,该域名对整个 Internet 有效。DNS 区域配置的复杂性超出了本文的范围,但利用正确配置的域名的 Perl 脚本仍然相对简单
# Variables to configure the script's operation my $hostname = 'ooga'; # Device hostname my $domain = 'dynamic.booga.org.'; # Domain name my $nameserver = 'ns1.booga.org'; # Primary nameserver # for your zone my $keyname = 'md5key'; # Name of the key my $key = 'se64bAsE64BASE64BasE64=='; # HMAC-MD5 TSIG key my $interface = 'eth0'; # Interface whose IP # is to be published
有关作者维护脚本的网页的参考,请参阅本文的“资源”部分。这种更广泛的解决方案使我们公文包友好的快速启动迷你服务器成为 Internet 的正式参与者。
我们的便携式服务器最明显的工作负载是以文件为中心的:该系统配备了来自 Samba 的 SMB 支持和内置于内核的 NFS 支持,以及 lighttpd Web 服务器和 rsync 客户端,已准备好在此领域大放异彩。有进取心的用户已经构建了 HOWTO,描述了如何进一步扩展服务阵列到 FTP 甚至 BitTorrent,但我不应忘记提及,该系统具有健康的必要守护程序补充:ntp、cron 甚至 Apple 的 mDNS 都可供您开箱即用。
内置工具链支持本地编译软件包,但对于需要比设备可用 RAM 更多的作业,交叉编译也是一种可能性。然而,可以找到许多服务的预构建软件包,因为该设备与许多其他设备共享 ARM 内核,其最接近的表亲是 Gumstix 微型板(在开始大型交叉编译构建之前,请检查许多 Gumstix 站点以获取合适的二进制文件)。
WD Mybook II World Edition 显然是一款值得硬件黑客关注的设备,他们正在寻找一个小型、廉价、低功耗的平台来构建他们的项目。西部数据在不剥离设备系统部分方面的智慧应该得到认可,因为它为我们提供了一个绝佳的修补目标。尽管仅具有 98 BogoMIPS,但其硬件具有不寻常的功能(硬件 AES 加密和对 Java 字节码的本机支持等),这些功能为我们的设备构建项目提供了进一步的应用杠杆。我在这里介绍了硬件、其功能、如何突破其安全性以及如何在几乎任何网络上启动时使用一流的网络配置来启用它。我希望您,读者,将跟随我和其他人一起探索我们的想象力可以使这个小型硬件奇迹变成什么样。
资源
在 MyBook World Edition 上启用 SSH 访问,作者:Martin Hinner:martin.hinner.info/mybook/sshaccess.php
如何设置 My Book World Edition II,作者:Paul Henman:henman.livejournal.com/1161953.html
SendXMPP:sendxmpp.platon.sk
CPAN(Comprehensive Perl Archive Network):www.cpan.org
无守护程序的广域 DNS 更新,作者:Federico Lucifredi:primates.ximian.com/~flucifredi/dns-update.html
在西部数据 MyBook Word 上使用 SSH 和 FTP,作者:Edouard Brière:www.nanalegumene.net/using-ssh-and-ftp-on-western-digital-mybook-world
BiTtorrent on Mybook World:完成,作者:Edouard Brière:www.nanalegumene.net/bittorrent-on-mybook-world-done
Gumstix 板的二进制文件:www.nslu2-linux.org/wiki/Optware/Gumstix
Federico Lucifredi 是 “man” 的维护者,也是 Novell OpenSUSE 和 SUSE Linux Enterprise 产品线的产品管理经理。他喜欢摆弄旧硬件并构建让他的同事困惑的装置。