所需材料
以下是步骤
购买或以其他方式获得 RedHat 7.0(以下简称 RH,更新时最新版本号为 7.0)发行版和 兼容的 硬件。可以从 http://www.cheapbytes.com 以大约 3.00 美元(包括运费和手续费)的价格获得完整的 RH CDROM。此版本不包含安全 Web 服务器和额外的软件等奢侈品。对于这些,您应该访问 RedHat 网站。或者,对于某些人来说,购买预装 Linux RH 的 PC 可能也是一个选择。
按照*包装上的说明*安装 RH(稍后可能会在此处添加)。CDROM 安装非常容易执行。我建议使用文本模式设置,在我的情况下,他们的图形界面设置完全失败了。当询问安装类型(服务器/工作站/自定义)时,选择服务器或自定义(如果您知道自己在做什么)- 您始终可以在以后添加软件。进一步概述了一些其他重要的安装决策。对于 RH 6.0 和 6.1,您可能还能够向工作站设置添加软件包,但在 RH 6.2 及更高版本 (7.0) 中,所有服务器服务都被禁用,并且需要进行大量调整 - 因此强烈建议仅使用服务器或自定义。
如果您的硬件确实是 兼容的,则安装过程将正确检测并配置它。否则,请参阅相应的文档以解决网卡、调制解调器、显卡等问题(主要是 HOWTO 和 mini-HOWTO,其中一些在下面的参考部分中)。
以下是一些关于磁盘空间分区的想法。阅读 Linux 分区 HOWTO(有点过时)以了解有关分区功能及其在不同类型的服务器设置中的大小的一些一般提示。
假设我们正在为一百个以下的用户设置服务器。我们将需要单独的 /tmp、/var 和 /home 分区(当然还有交换分区)。如果您的硬盘驱动器约为 4 GB,则大约 300 MB 是 /tmp,100MB 交换分区,1 GB /var(您需要充足的日志记录),以及 1GB /home。剩余的 1.6GB 将是根分区(没有单独的 /usr)。/home 和 / 之间的划分可能取决于您计划托管的网页数量 - 页面越多,/home 的空间就越大。为了增强安全性,最好对 /tmp、/var 和 /home 分区(在 /etc/fstab 中)设置一些限制(类似于我的 公共浏览器工作站 HOWTO 中描述的那些)。
如果您的网卡被正确检测到,系统会要求您输入机器的 IP 地址、网关地址和网络掩码以及 DNS 服务器的地址(如果您计划以这种方式设置,则可能是您自己的机器)。准备好所有这些信息。此外,系统还会要求您输入机器名称和域名。我们将使用示例域名 you.com,并将机器命名为 ns(这给了我们一个完全限定域名 (FQDN) ns.you.com)。您应该使用您注册的任何域名(请参阅下面的参考部分中的“设置新域名 Mini-HOWTO”链接)并打算用作您的主域名(而不是虚拟域名)。对于网关地址,我们将使用示例地址 111.222.333.111。网关很可能是将您的机器(或您的 LAN)连接到外部世界的路由器。
启用 shadow 和 MD5 密码以提高安全性。前者使包含加密密码的文件只能由 root
用户读取,后者允许更长且更难破解的密码。由于它将是一台独立机器,因此不要启用 NIS/NFS。
安装完成后,机器重新启动,您将看到登录提示。输入登录名和密码(对于 root 帐户),然后开始配置您的新 Linux 工作站。
首先(也是最快的),在你的 /etc/hosts.deny 文件中添加一行:ALL:ALL
。这将(在一定程度上)阻止其他人在您进行配置时访问您的机器。这也将阻止您自己这样做。对于进一步的配置工作(可以通过远程方式完成),建议使用 安全 shell。从众多站点之一下载 RH 的 RPM 软件包,并使用以下命令(以 root 身份)安装它: rpm -U ssh*rpm 或类似命令(取决于版本)。您将必须同时获取客户端和服务器软件包(如果您想从这台机器以及到这台机器进行 ssh 连接)。安装后,RPM 软件包会自动运行所有必要的安装后命令(如服务器密钥生成)。您将必须使用命令 /etc/rc.d/init.d/sshd start 手动启动服务器。一些早期版本的 ssh1 以及所有使用 RSAREF 库编译的 ssh1 版本都包含缓冲区溢出漏洞。使用 ssh2 或不带 RSAREF 的最新版本的 ssh1。如果您这样做,您将必须在 /etc/hosts.allow 文件中允许从某些受信任的机器(稍后描述)使用 ssh 进行访问。RedHat 7.0 现在包含 OpenSSH 克隆,它同时支持 ssh1 和 ssh2 协议。它的配置几乎与 ssh 相同。它在配置方面比 ssh 有一些小的优势(例如,默认情况下不进行 X11 转发),否则是相同的。Sshd(作为守护程序运行时)也将参考 /etc/hosts.deny 和 /etc/hosts.allow 进行访问控制。
如果您想真正严格地进行配置,请通过给出命令 init 1 进入单用户模式,在这种情况下,所有工作都将在本地完成,并且您将无法测试您的网络相关配置,因为网络在此模式下不可用。
为了进一步增强您的安全性,可以使用 ipchains 软件(通常是您的 Linux 发行版的一部分)(有关此信息,请参阅 IPCHAINS HOWTO,参考部分中的链接)。配置它比 TCP wrappers 需要更多的工作,尽管也有一些自动化工具可用于此。
现在让我们处理不必要的服务。请注意,我对“不必要”的想法可能与您的想法并非 100% 相同。此外,现在许多人认为 telnet 不仅是不必要的,而且实际上是完全不受欢迎的。使用 ssh,永远忘记 telnet!
注释掉所有行,但以下行除外
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -L -l -i -a
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
使用命令检查这一点:grep -v '\#' /etc/inetd.conf如果您将使用安全 shell (ssh),则 telnet 也是不必要的,可以删除。安全 shell 可以作为守护程序在系统启动时启动,也可以作为 /etc/inetd.conf 中的服务启动。默认配置(由 RPM 软件包使用)是将其作为守护程序启动。可以编译 Sshd 以参考 /etc/hosts.allow 文件进行访问控制。在这种情况下,虽然您的 /etc/inetd.conf 中没有它,但它仍然会使用 /etc/hosts.allow 和 /etc/hosts.deny 中的设置。此方法的优点是连接速度更快,因为 sshd 不必在每次有人连接时都重新生成服务器密钥。另一方面,如果您从 /etc/inetd.conf 启动它,它将与外部世界更加隔离。将根据需要向 /etc/inetd.conf 添加更多行(POP3 是其中之一)。
以下是 RedHat 7.0 用户的注意事项。Inetd 守护程序(虽然仍然存在于发行版中)现在被 xinetd 取代。其配置文件格式如下
#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST RECORD
}
includedir /etc/xinetd.d
其中 /etc/xinetd.d 目录看起来像(在您的情况下可能包含更多文件)
-rw-r--r-- 1 root root 498 Aug 23 00:17 tftp
-rw-r--r-- 1 root root 414 Jul 21 08:43 rsh
-rw-r--r-- 1 root root 362 Jul 21 08:43 rexec
-rw-r--r-- 1 root root 361 Jul 21 08:43 rlogin
-rw-r--r-- 1 root root 347 Aug 9 05:55 wu-ftpd
目录中的文件配置各个服务,如 finger、telnet 或 ftp。它们的格式是(此服务 ftp,在 RedHat 7.0 股票版中默认为 on)
# default: on
# description: The wu-ftpd FTP server serves FTP connections. It uses \
# normal, unencrypted usernames and passwords for authentication.
service ftp
{
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.ftpd
server_args = -l -a
log_on_success += DURATION USERID
log_on_failure += USERID
nice = 10
}
或者(此服务 tftp,在 RedHat 7.0 股票版中默认为 off)
# default: off
# description: The tftp server serves files using the trivial file transfer \
# protocol. The tftp protocol is often used to boot diskless \
# workstations, download configuration files to network-aware printers, \
# and to start the installation process for some operating systems.
service tftp
{
socket_type = dgram
wait = yes
user = nobody
log_on_success += USERID
log_on_failure += USERID
server = /usr/sbin/in.tftpd
server_args = /tftpboot
disable = yes
}
因此,要禁用服务,请将“disable= yes”添加到相应文件的末尾,或者直接删除该文件。
使用以下命令检查正在运行的服务:ps ax。您将获得类似于下面 sample
输出的内容
PID TTY STAT TIME COMMAND
1 ? S 0:04 init
2 ? SW 0:30 [kflushd]
3 ? SW 0:32 [kupdate]
4 ? SW 0:00 [kpiod]
5 ? SW 0:03 [kswapd]
6 ? SW< 0:00 [mdrecoveryd]
296 ? SW 0:00 [apmd]
349 ? S 0:00 syslogd -m 0
360 ? S 0:00 klogd
376 ? S 0:00 /usr/sbin/atd
392 ? S 0:00 crond
412 ? S 0:00 inetd
454 ttyS0 S 0:00 gpm -t ms
533 tty2 SW 0:00 [mingetty]
534 tty3 SW 0:00 [mingetty]
535 tty4 SW 0:00 [mingetty]
536 tty5 SW 0:00 [mingetty]
537 tty6 SW 0:00 [mingetty]
667 tty1 SW 0:00 [mingetty]
4540 ? S 0:00 httpd
5176 ? S 0:00 httpd
5177 ? S 0:00 httpd
5178 ? S 0:00 httpd
5179 ? S 0:00 httpd
5180 ? S 0:00 httpd
5181 ? S 0:00 httpd
5182 ? S 0:00 httpd
5183 ? S 0:00 httpd
7321 ? S 0:00 /usr/sbin/sshd <<< only after you installed sshd to run on startup
7323 pts/0 S 0:00 -bash
7336 pts/0 R 0:00 ps ax
让我们专注于监听网络的进程,例如 lpd。由于我们不打算将我们的服务器用于打印(我们当然可能会,我只是不在此处描述它),我建议我们通过以下方式删除打印机守护程序:rpm -e lpd 。如果 rpm 抱怨任何依赖项(例如,在我的情况下,printfilter 和 rhprinttool),请将它们添加到您的 rpm -e 命令中并重复它。如果错误地安装了其他应删除的服务,则为 NFS、NIS、samba 等。确保您删除 NFS/NIS(如果您不使用它们),因为经常在其中发现错误。同样,这些都是有用的东西,我只是遵循*黄金法则* “删除您当前不使用的软件”。而且,使用 RH RPM,将来随时添加它真的很容易。
可以从 Armoring Linux 论文中获得更多基本安全设置。正如那里建议的那样,让我们创建一个 wheel 组,其中包含受信任的用户(在我们的例子中,只有用户 you
才能执行 /bin/su
并运行 cron 作业(与 root 一起)。
vi /etc/group
,添加一行(如果它不存在)wheel:x:10:root,you如果行存在,只需在末尾添加
you
,如图所示。您不必使用 vi(并且我以某种方式非常理解这一点 ;-)),只需使用您最喜欢的编辑器(对于一个不错的、相当用户友好的非 X 编辑器,请尝试 pico
,它与邮件程序 pine
一起分发,后者是大多数 Linux 发行版的一部分)/bin/chgrp wheel /bin/su将
/bin/su
的组所有权更改为 wheel
组/bin/chmod 4750 /bin/su更改
/bin/su
的模式要仅允许 root
和 you
提交 cron 作业,请创建一个名为 /etc/cron.allow 的文件,其中包含您希望能够运行 cron 作业的用户名。此文件可能如下所示
root
you
为什么要限制 cron 作业?对于某些版本的 cron,存在本地漏洞,可以将权限从例如 nobody
提升到 root
。我建议您不要安装 X Windows,因为它会带来您可能没有准备好处理的新问题。
现在我们准备好启用我们的机器来处理用于虚拟主机的多个 IP 地址。此时,IP 别名 HOWTO 可能会派上用场(请参阅参考部分中的链接)。由于多种原因,基于 IP 的虚拟主机更好(如果您有足够的 IP 地址)。例如,如果从浏览器端完成反向查找,则反向查找将成功。对于托管加密启用的网站(通常称为“安全网站”)也可能需要它。较旧的浏览器(不支持 HTTP 1.1)也会感到不高兴。
更改将集中在 /etc/rc.d/ 目录中。要启用多个 IP 地址,您的内核应该支持此功能。在全新安装的 RH Linux 上,它支持此功能。要验证它,应该查看用于编译内核的配置文件。在我的情况下,它是 /usr/src/linux/configs/kernel-2.2.17-i686.config,因为机器具有 Pentium III 处理器。如果安装了 kernel-source
RPM 软件包,则此文件存在。如果文件中存在行 CONFIG_IP_ALIAS=y
,则您就可以了。当我们在这里时,我们还可以确认转发 IP 数据包的能力(拨号用户 PPP 所需)。此功能存在,但默认情况下未启用(要启用它,请执行以下命令 echo 1 > /proc/sys/net/ipv4/ip_forward
或在 /etc/sysctl.conf 中添加一行)。还需要对 PPP 协议的支持(行 CONFIG_PPP=m
,这意味着 PPP 支持编译为内核可加载模块,CONFIG_PPP=y
也可以)。
示例将使用来自 C 块 111.222.333.0 的荒谬 IP 地址 111.222.333.444-111.222.333.777。111.222.333.444 是真实主机 IP(在 RH 安装期间配置),111.222.333.555-777 是虚拟地址,111.222.333.888 是拨号用户地址(可以有更多)。
假设我们要配置 3 个虚拟主机。
将使用两组命令
/sbin/ifconfig eth0:0 111.222.333.555
/sbin/ifconfig eth0:1 111.222.333.666
/sbin/ifconfig eth0:2 111.222.333.777
这些命令会将 IP 地址绑定到(虚拟)接口 eth0:0-eth0:2
。
/sbin/route add -host 111.222.333.555 dev eth0
/sbin/route add -host 111.222.333.666 dev eth0
/sbin/route add -host 111.222.333.777 dev eth0
这些命令将为这些地址添加路由,并将它们连接到真实接口 eth0
(网卡)。
ifconfig
) 将如下所示
eth0 Link encap:Ethernet HWaddr 02:60:8C:4D:24:CE
inet addr:111.222.333.444 Bcast:255.255.255.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:901597 errors:33 dropped:0 overruns:0 frame:823
TX packets:433589 errors:0 dropped:0 overruns:0 carrier:0
collisions:128327 txqueuelen:100
Interrupt:5 Base address:0x280
eth0:0 Link encap:Ethernet HWaddr 02:60:8C:4D:24:CE
inet addr:111.222.333.555 Bcast:111.222.333.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:5 Base address:0x280
eth0:1 Link encap:Ethernet HWaddr 02:60:8C:4D:24:CE
inet addr:111.222.333.666 Bcast:111.222.333.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:5 Base address:0x280
eth0:2 Link encap:Ethernet HWaddr 02:60:8C:4D:24:CE
inet addr:111.222.333.777 Bcast:111.222.333.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:5 Base address:0x280
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:3924 Metric:1
RX packets:26232 errors:0 dropped:0 overruns:0 frame:0
TX packets:26232 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
所有命令都可以添加到 /etc/rc.d/rc.local 的底部,以便在重新启动后保存更改。严格来说,添加新 IP 地址不需要重新启动机器。请务必记录您对机器所做的所有更改。许多优秀的系统管理员(或者,我应该说不太好的系统管理员?)都在职业生涯的某个时刻因此而受挫。测试更改
执行:
ping 虚拟地址,例如
ping 111.222.333.555 ping 111.222.333.666 ping 111.222.333.777
应该得到:
接口应已启动
现在我们准备好配置 DNS。最简单的方法是将我们希望世界看到的主机名(真实的和所有虚拟的)添加到已经运行 bind(DNS 守护程序)的某些机器的配置中。但是,由于我们正在设置盒式 ISP,我们可能无法避免“DNS 乐趣”。
现在,也让我尝试为选择“过时”版本的 bind 4.9.7(8 系列之前的最后一个版本)辩护(这是有问题的)。我知道我的论点可能会被击败,现在甚至 bind 9 都出来了,但我认为 bind 4.9.7 经过了更多时间的考验,并且更加稳定。升级到 8.x 的论据(在 http://www.acmebw.com/askmrdns/00444.htm 和 http://www.dns.net/dnsrd/servers.html 以及,我想,在许多其他地方提供。这是来自 Theo de Raadt 本人(OpenBSD 开发负责人)的 消息,他在其中证明了选择 bind 4 作为 OpenBSD(最安全的 UNIX 操作系统)的一部分是合理的。他还对 OpenBSD 审计团队在 BIND 8 源代码中看到的错误数量感到震惊)仍然没有说服很多人。而且,让我们不要忘记“1999 年的漏洞” - ADMROCKS,它为几乎所有运行 bind 版本早于 8.1.2 patch 3 的 Linux 机器提供远程 root 访问权限。根据 INCIDENTS 邮件列表判断,如果未安装推荐的升级,这仍然是攻击 RH 版本 5.0-6.1 的一种非常流行的方式。据称,named(无论哪个版本)应始终在 chroot jail 中运行。
以下是说明,大致遵循 O'Reilly 的 DNS 书籍(一本好书,强烈推荐给所有人,但非常适合休闲 DNS 用户)。
这就是它们的样子(如果您不熟悉 bind 4.x 配置文件格式,请阅读 O'Reilly DNS 书籍或任何 HOWTO 或 bind 页面上的文档,或者,最好是所有上述内容。您还可以选择在不理解它们的情况下使用它们,但这通常是一个坏主意)
/etc/named.boot
这是 bind 4.9.x 的主配置文件。
directory /etc/namedb
;cache-obtained from internic, usually
cache . db.cache
;main config files
primary you.com db.you
;reverse lookups
primary 333.222.111.in-addr.arpa db.111.222.333
;localhost.localnet configs
primary 0.0.127.in-addr.arpa db.127.0.0
;virtual Domains
primary yoursite1.net db.yoursite1
primary yoursite2.net db.yoursite2
primary yoursite3.net db.yoursite3
/etc/namedb/db.you
; defines our local hosts at you.com, just one in our case, and its aliases
@ IN SOA ns.you.com. root.ns.you.com. (
2000012190 7200 1800 3600000 7200 )
;name servers and mail servers
IN NS ns.you.com.
IN MX 10 ns.you.com.
IN A 111.222.333.444
ns IN A 111.222.333.444
;address of the canonical names
localhost IN A 127.0.0.1
gateway IN A 111.222.333.111
;aliases (to use in ftp: ftp ftp.you.com etc, for clarity)
www CNAME ns
mail CNAME ns
ftp CNAME ns
pop3 CNAME ns
/etc/namedb/db.111.222.333
;reverse mapping of our IP addresses
.
;origin is 333.222.111.in-addr.arpa
333.222.111.in-addr.arpa. IN SOA ns.you.com. root.ns.you.com. (
1999121501 7200 1800 3600000 7200 )
;name Servers
IN NS ns.you.com.
;addresses point to canonical name
444.333.222.111.in-addr.arpa. IN PTR ns.you.com.
;dialins
888 IN PTR dialup.you.com.
;virtual hosts
555 IN PTR yoursite1.com.
666 IN PTR yoursite2.com.
777 IN PTR yoursite3.com.
;local loop config file
0.0.127.in-addr.arpa. IN SOA ns.you.com. root.ns.you.com. (
1997072200 7200 1800 3600000 7200 )
IN NS ns.you.com.
1 IN PTR localhost.
; yoursite1.com
@ IN SOA virtual root.virtual (
1999092201 ; Serial: update each time the file is changed
7200 ; refresh, sec
1800 ; retry, sec
3600000 ; expire, sec
7200 ) ; minimum TTL
;name servers
IN NS ns.you.com.
IN MX 10 virtual
IN A 111.222.333.555
;address of the canonical names
localhost IN A 127.0.0.1
gateway IN A 111.222.333.111
virtual IN A 111.222.333.555
IN MX 10 virtual
;aliases
www CNAME virtual
mail CNAME virtual
ftp CNAME virtual
pop3 CNAME virtual
; yoursite2.com
@ IN SOA virtual root.virtual (
1999092201 ; Serial: update each time the file is changed
7200 ; refresh, sec
1800 ; retry, sec
3600000 ; expire, sec
7200 ) ; minimum TTL
;name servers
IN NS ns.you.com.
IN MX 10 virtual
IN A 111.222.333.666
;address of the canonical names
localhost IN A 127.0.0.1
gateway IN A 111.222.333.111
virtual IN A 111.222.333.666
IN MX 10 virtual
;aliases
www CNAME virtual
mail CNAME virtual
ftp CNAME virtual
pop3 CNAME virtual
; yoursite3.com
@ IN SOA virtual root.virtual (
1999092201 ; Serial: update each time the file is changed
7200 ; refresh, sec
1800 ; retry, sec
3600000 ; expire, sec
7200 ) ; minimum TTL
;name servers
IN NS ns.you.com.
IN MX 10 virtual
IN A 111.222.333.777
;address of the canonical names
localhost IN A 127.0.0.1
gateway IN A 111.222.333.111
virtual IN A 111.222.333.777
IN MX 10 virtual
;aliases
www CNAME virtual
mail CNAME virtual
ftp CNAME virtual
pop3 CNAME virtual
测试更改
执行:
检查地址解析
nslookup www.you.com nslookup www.yoursite1.com nslookup www.yoursite2.com nslookup www.yoursite3.com
应该得到:
nslookup 为所有主机名返回正确的 IP 地址
要服务 html 页面,使用 httpd 守护程序。RH 7.0 附带 Apache 1.3.12(当前最新版本为 1.3.14,即将推出的 2.0 的 alpha 版本已发布)。此时,明智的做法是检查 RH 站点或其镜像( RH 镜像)以获取更新。
我们即将进行的大多数更改都集中在 /etc/httpd/httpd.conf 中(Apache 配置的 RH 标准位置)。html 页面的默认位置(当您访问 www.you.com 时显示)是 /home/httpd/html。您可以在同一 /home/httpd 中为虚拟主机分配目录,下面显示了它们的以下位置:/home/httpd/yoursite1、/home/httpd/yoursite2 和 /home/httpd/yoursite3。
下面我提供了您的 /etc/httpd/httpd.conf 文件所需的最低限度更改
<VirtualHost 111.222.333.555>
ServerAdmin webmaster@you.com
DocumentRoot /home/httpd/yoursite1
ServerName www.yoursite1.com
ErrorLog yoursite1-error_log
TransferLog yoursite1-access_log
</VirtualHost>
<VirtualHost 111.222.333.666>
ServerAdmin webmaster@you.com
DocumentRoot /home/httpd/yoursite2
ServerName www.yoursite2.com
ErrorLog yoursite2-error_log
TransferLog yoursite2-access_log
</VirtualHost>
<VirtualHost 111.222.333.777>
ServerAdmin webmaster@you.com
DocumentRoot /home/httpd/yoursite3
ServerName www.yoursite3.com
ErrorLog yoursite3-error_log
TransferLog yoursite3-access_log
</VirtualHost>
该配置将导致所有站点的所有日志都存储在一个目录中(无论指定为什么)。如果不需要这样做,则可以更改 ErrorLog 和 TransferLog 指令,以便分别为每个虚拟主机指向正确的位置。“真实” www.you.com 的页面将存储在默认位置 /home/httpd/html 中。
有关更多信息,请访问 https://apache.ac.cn,Apache http 服务器主页。他们有很多支持页面,包括用于虚拟主机设置的页面(基于 IP 和基于名称的 [仅使用 1 个 IP 地址])。Linux WWW HOWTO(参考部分中的链接),虚拟主机部分也很有用。
测试更改
执行:
通过 Lynx 浏览器或 telnet 访问端口 80 来访问测试页面
lynx http://www.you.com lynx http://www.yoursite1.com lynx http://www.yoursite2.com lynx http://www.yoursite3.com
应该得到:
将返回测试页面(如果您将它们放在正确的目录中)
现在我们将处理 sendmail。同样,建议对股票 RH /etc/sendmail.cf 和 /etc/sendmail.cw 进行最低限度的必要更改。
Dj$w.foo.com
开头的行,并将其更改为指向您的主(“真实”的,而不是虚拟的)服务器名称(you.com,因此它看起来像这样 Dj$w.you.com
)。
# sendmail.cw - include all aliases for your machine here.
you.com
ns.you.com
mail.you.com
yoursite1.com
mail.yoursite1.com
yoursite2.com
mail.yoursite2.com
yoursite3.com
mail.yoursite3.com
这些是必要的,以便 sendmail 接受这些域的邮件。这没有解决 user@yoursite1.com
和 user@yoursite2.com
邮件进入不同邮箱的问题。为此,请查看 /etc/mail/virtusertable
功能(/etc/sendmail.cw 中的相应行是 Kvirtuser hash -o /etc/mail/virtusertable
,详细信息可能会稍后在此处添加)。http://www.sendmail.org/virtual 上有关于虚拟主机的 sendmail 参考的优秀文档。
值得补充的是,linuxconf 提出了一种稍微不同的虚拟电子邮件方案,为所有域使用单独的假脱机目录(这干净地解决了上述“名称冲突”问题),但这需要特殊的虚拟感知 POP/IMAP 服务器(包含在 RH 中),并且稍微复杂一些。建议用于电子邮件量较大的站点,每个域内有许多用户。
关于 sendmail 的几句话,最好(从安全角度来看)从 inetd.conf 运行 sendmail,而不是作为独立守护程序运行。为此,我们需要将其添加到 /etc/inetd.conf,从 /etc/rc.d/init.d 中删除它,并将 sendmail 队列处理添加到 cron。以下是您必须执行的操作
smtp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/sendmail -bs
或者,如果使用 xinetd,请在 /etc/xinetd.d/ 中创建一个类似于以下的 sendmail 文件
# default: on
service sendmail
{
socket_type = stream
wait = no
user = root
server = /usr/bin/sendmail -bs
}
exit 0
(可能不是最好的方法,请务必记录您对这些文件所做的更改),以便此文件不执行任何操作而不是启动 sendmail*/20 * * * * /usr/sbin/sendmail -q这将每 20 分钟处理一次 sendmail 队列(如果存在)。描述的步骤将简化 sendmail 访问控制,并让您控制谁可以与您的 25 端口对话,而不仅仅是谁可以通过您发送电子邮件。/etc/hosts.allow 中的行允许来自 .com 和 .org 域的所有机器向您发送电子邮件,如下所示
sendmail: .com .org请注意,此处使用守护程序名称,而不是协议名称(sendmail,而不是 smtp)。
这将允许您的系统处理所有这些域的电子邮件。
问题: 您尝试发送的邮件被拒绝,并显示消息 Relaying denied
解决方案:查看您的 /etc/sendmail.cw。您确定您的主机名和虚拟主机名的所有可能变体都在这里吗?查看消息头,看看是从哪台机器拒绝的:它看起来像是您遗漏的另一个名称吗?
测试更改
执行:
通过 telnet 访问 SMTP 端口 25
telnet www.you.com 25 telnet www.yoursite1.com 25 telnet www.yoursite2.com 25 telnet www.yoursite3.com 25
应该得到:
Sendmail 应该响应提示符和版本号!键入 QUIT 以退出提示符。
POP3 配置很简单(此设置不需要“虚拟化”)。RH 配备了 imapd IMAP 服务器。如果您不想使用 IMAP 功能,或者不喜欢此特定实现(在某个时候发现了缓冲区溢出漏洞),那么使用来自 Eudora 的免费 POP3 守护程序 qpopper
是一个好主意 http://www.eudora.com/freeware/qpop.html。在撰写本文时,发布的版本是 qpopper 3.0.2。重要的是要注意,早于 2.5 的版本包含缓冲区溢出错误,该错误允许执行远程 root 漏洞利用。同样的问题也困扰着直到 3.0 release 21 的“公共 beta 版”。使用 2.53 或最新的 3.0(前者经过更好的审核,后者更适合 RH - 与 PAM 身份验证无缝协作)。我建议使用 3.0,因此以下说明适用于这种情况。截至 4 月 13 日,Qpopper 3.0 不再是 beta 版,而是常规软件。截至最近,即使在 Qpopper 2.53 中也发现了漏洞,攻击者可以获得组 ID 为“mail”的 shell,从而可能允许对所有邮件进行读/写访问。
wget ftp://ftp.qualcomm.com/eudora/servers/unix/popper/qpopper3.0.tar.Z
从 Eudora 站点检索存档。
tar zxvf qpopper3.0.tar.Z
解压缩并解压缩内容。
cd qpopper
如果您需要此步骤的解释,请停止阅读文档。
./configure --enable-specialauth --with-pam --enable-log-login --enable-shy
此处的选项为
--enable-specialauth
:允许 MD5 和 shadow 密码
--with-pam
:允许使用 RH Pluggable Authentication Modules (PAM) 技术
--enable-log-login
:记录成功登录,而不仅仅是失败登录(实际上并没有那么有用,因为它无论如何都会使用 tcpd wrappers 日志记录)
--enable-shy
:隐藏版本号(是的,有点小气的“通过模糊实现安全”的表现)
make
这会编译 popper
/bin/cp popper/popper /usr/local/bin
将二进制文件复制到 /usr/local/bin
-rwx------ 1 root root 297008 Feb 16 15:41 /usr/local/bin/popper通过使用命令
chmod 700 /usr/local/bin/popper
pop3 stream tcp nowait root /usr/sbin/tcpd /usr/local/bin/popper -s这将导致 tcpd wrapper 控制对 popper 的访问。在 /etc/hosts.allow 中添加的行是
popper: .good.com .nice.org这将允许来自域
good.com
和 nice.org
的人员通过 POP3 客户端从您的机器读取电子邮件。要使 qpopper 使用 PAM 身份验证,必须在 /etc/pam.d/
目录中为 POP3 服务创建一个文件。文件应命名为“pop3”(与 /etc/services
和 qpopper 编译时选项中的行相同)。该文件如下所示
auth required /lib/security/pam_pwdb.so shadow
account required /lib/security/pam_pwdb.so
password required /lib/security/pam_cracklib.so
password required /lib/security/pam_pwdb.so nullok use_authtok md5 shadow
session required /lib/security/pam_pwdb.so
pop3 110/tcp # pop3 service
问题: 您正在使用有效的密码和用户名连接到您的 POP 服务器,但它们被拒绝,并显示消息 Password incorrect
。
解决方案: PAM 不喜欢您的设置。此消息对于 qpopper 2.53 很常见,请使用 3.0,它应该会消失。否则,请查看您创建的 /etc/pam.d/pop3
。它正常吗?
测试更改
执行:
通过 telnet 访问 POP3 端口 110
telnet www.you.com 110
应该得到:
Qpopper 应该响应提示符和版本号!键入 QUIT 以退出提示符。
我们将仅使用匿名 ftp,并且不允许任何非匿名用户进行任何访问。在这里,我们描述允许匿名上传的匿名 ftp 服务器设置。任何有自尊的关于该主题的指南都会告诉您“这是一件坏事”。但是,允许用户从不受信任的位置 ftp 并以明文形式传输他们的密码,这又有什么更糟糕的呢?并非所有人(尤其是使用 Windows 的人)都可以轻松地通过 ssh 设置 ftp 隧道。但是您绝对应该通过 tcp wrappers 限制访问,并注意“warez puppies”(如果允许无限制下载,他们将尝试通过您的 ftp 站点交换被盗软件的人!)。
我建议使用股票 RH wu-ftpd(撰写本文时为 2.6.1 版)。虽然有传言说有“更安全”的 ftp 守护程序(Pro-ftpd),但 wu-ftp 似乎是最常用的守护程序之一。最近,wu-ftp(甚至在 2.6.x 版本中)再次发现了一系列错误,并且它作为最流行的 ftp 守护程序的声誉似乎正在下降。CERT 已发布关于 WU-FTPD 和所有从 BSD 最终版本派生的 ftp 守护程序的咨询。
RH 默认在服务器配置中安装 wu-ftpd(软件包 wu-ftpd-2.6.1-1)。鼓励您检查更新,因为运行 ftp 是一个重要的安全问题。还有一个单独的 rpm 软件包,它为匿名 ftp 主目录创建一个单独的目录结构(anonftp-2.8-1)。由于匿名 ftp 始终执行 chroot()
系统调用(将用户置于受限文件系统中),因此需要所有必要的二进制文件和库。典型的目录如下所示(/home/ftp 中的 ls -lRa 的输出)
.:
total 20
d--x--x--x 2 root root 4096 Feb 15 06:22 bin
d--x--x--x 2 root root 4096 Feb 15 06:22 etc
drwxrws-wt 2 root wheel 4096 Feb 18 19:51 incoming
drwxr-xr-x 2 root root 4096 Feb 15 06:22 lib
drwxr-sr-x 3 root ftp 4096 Feb 15 23:34 pub
bin:
total 344
---x--x--x 1 root root 15204 Mar 21 1999 compress
---x--x--x 1 root root 52388 Mar 21 1999 cpio
---x--x--x 1 root root 50384 Mar 21 1999 gzip
---x--x--x 1 root root 29308 Mar 21 1999 ls
---------- 1 root root 62660 Mar 21 1999 sh
---x--x--x 1 root root 110668 Mar 21 1999 tar
lrwxrwxrwx 1 root root 4 Feb 15 06:22 zcat -> gzip
etc:
total 40
-r--r--r-- 1 root root 53 Mar 21 1999 group
-rw-r--r-- 1 root root 31940 Mar 21 1999 ld.so.cache
-r--r--r-- 1 root root 79 Mar 21 1999 passwd
incoming:
total 0
lib:
total 1212
-rwxr-xr-x 1 root root 77968 Mar 21 1999 ld-2.1.1.so
lrwxrwxrwx 1 root root 11 Feb 15 06:22 ld-linux.so.2 -> ld-2.1.1.so
-rwxr-xr-x 1 root root 1031004 Mar 21 1999 libc-2.1.1.so
lrwxrwxrwx 1 root root 13 Feb 15 06:22 libc.so.6 -> libc-2.1.1.so
-rwxr-xr-x 1 root root 77196 Mar 21 1999 libnsl-2.1.1.so
lrwxrwxrwx 1 root root 15 Feb 15 06:22 libnsl.so.1 -> libnsl-2.1.1.so
-rwxr-xr-x 1 root root 33596 Mar 21 1999 libnss_files-2.1.1.so
lrwxrwxrwx 1 root root 21 Feb 15 06:22 libnss_files.so.2 -> libnss_fi
les-2.1.1.so
pub:
total 0
但请注意,无论出于何种原因,RH 都在 /home/ftp/bin 中放置了 /bin/sh 的副本。我对在那里拥有它感觉不好,所以通过 chmod 0 sh 将其 chmod 为 0(也可以完全删除,但是如果您尝试在之后删除软件包,RPM 可能会有点不高兴)。
应仔细考虑 /home/ftp 目录和文件的权限。在上面的示例中,所有系统文件都归 root 所有,并且仅对所有人可读(在必要时可执行)。bin 中的文件仅可执行(目录本身也是如此,以防止列出其内容)。
有趣的部分是 pub 和 incoming 的权限。
以下是 ftp 守护程序(/etc/ftpaccess)的配置文件。它被充分注释,以至于不言自明
#ideas from <htmlurl url="ftp://ftp.wu-ftpd.org/pub/wu-ftpd/upload.configuration.HOWTO" name="ftp://ftp.wu-ftpd.org/pub/wu-ftpd/upload.configuration.HOWTO">
#only allow anonymous users-no other classes defined
class anonftp anonymous *
#number of users restriction with message shown when too many
limit remote 10 Any /toomany.msg
#prevent uploads everywhere (for now)
upload /home/ftp * no
#display the contents of some files upon login/cd
readme README* login
readme README* cwd=*
message /welcome.msg login
message .message cwd=*
#log all file transfers DISABLED
#log transfers anonymous
#prevent these file operations for anon users
delete no anonymous
overwrite no anonymous
#fast cd and aliasing for the same reason (not really necessary, but convenient)
alias inc: /incoming
cdpath /incoming
cdpath /pub
cdpath /
#what is allowed in paths
path-filter anonymous /etc/pathmsg ^[-A-Za-z0-9_\.]*$ ^\. ^-
#prevent the retrieval of some file
noretrieve .notar
#allow upload with NO subdirectory creation by anon users
upload /home/ftp /incoming yes root wheel 0400 nodirs
#allow upload with subdirectory creation by anon users DISABLED
#upload /home/ftp /incoming yes root wheel 0400 dirs
#prevent anon users to GET files from incoming (you might not like it, but it
#is a good idea-to prevent some people from using your ftp server to store
#their own stuff, pics, warez etc)
noretrieve /home/ftp/incoming
这将仅允许匿名用户以某种(!)受控方式进行下载和上传。确保下次升级 RPM 软件包后更新您更改的文件的权限。
访客 FTP 用户是那些具有有效用户名和密码的用户(与匿名用户不同),但无权访问整个目录结构(与真实用户不同)。因此,他们在身份验证后被 chroot。访客用户可以在此配置中进行上传。
下面提供了简单的 21 步 说明 ;-)
使用的软件:wu-ftpd-2.6.1
将创建示例用户名:ftpguy,用户 ID=505。
她的组将是:lusers,组 ID=701。
如果您想要更多相同类型的用户,他们应该成为同一组的成员。为此,最好稍微更改目录结构,以便他们都使用相同的 passwd 文件和相同的静态 ls
。但是,为了更好的分离,您可以为他们每个人提供自己的文件。
adduser ftpguy
在 /etc/passwd 中创建一个条目
passwd ftpguy
将密码更改为任何内容ftpguy:x:505:701::/home/ftpguy/./:/etc/ftponly是的,那是他的主目录之后的“斜杠”-“点”-“斜杠”。
/etc/ftponly此文件必须存在于某些较新的 Linux 发行版中(与 Guest FTP HOWTO 中声明的相反)。有时可以将 /bin/true 放在其位置。
lusers:x:701:ftpguy
cd /home
chown ftpguy.lusers ftpguy此目录由 adduser 命令创建
cd ftpguy; mkdir etc bin ; chown root.daemon etc bin这为 chroot 创建目录树
chmod 111 etc bin这为 chrooted 树中的目录设置了非常保守的权限
cp ~/static_ls /home/ftpguy/bin/ls获取静态(不调用任何库)版本的 /bin/ls:此目录( http://www.stanford.edu/group/itss-ccs/security/binaries/linux/redhat/)包含许多 RH 6.x/7.x 兼容实用程序的静态版本,包括 ls(本地副本是 http://www.chuvakin.org/ispdoc/ls.gz,运行
gunzip ls.gz
)cd bin ; chown root.bin ls
chmod 111 ls这为 chroot 中的二进制文件设置了非常保守的权限
cd ../etc
root:*:0:0::/:/etc/ftponly
ftpguy:*:505:701::/home/ftpguy/./:/etc/ftponly
root::0:root
lusers::701:ftpguy
chown root.daemon passwd group这设置了这些文件的正确所有权
chmod 444 passwd group这设置了该文件的最低必要权限
cd ~ftpguy; touch .forward这创建了 .forward 文件
chown root.root .forward ; chmod 400 .forward并出于安全原因锁定它
cd /etc
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
class anonftp guest,anonymous *
delete no anonymous,guest # delete permission?
overwrite no anonymous,guest # overwrite permission?
rename no anonymous,guest # rename permission?
chmod no anonymous,guest # chmod permission?
umask no anonymous,guest # umask permission?
guestgroup lusers
limit remote 10 Any /toomany.msg
upload /home/ftp * no
readme README* login
readme README* cwd=*
message /welcome.msg login
message .message cwd=*
alias inc: /incoming
cdpath /incoming
cdpath /pub
cdpath /
path-filter anonymous /etc/pathmsg ^[-A-Za-z0-9_\.]*$ ^\. ^-
noretrieve .notar
upload /home/ftp /incoming yes root wheel 0400 nodirs
noretrieve /home/ftp/incoming
让我们测试一下这个野兽
localhost[anton]#1008: ftp localhost
Connected to anton.
220 anton FTP server (Version wu-2.6.1(1) Mon Feb 28 10:30:36 EST 2000) ready.
Name (localhost:anton): ftpguy
331 Password required for ftpguy.
Password:
230 User ftpguy logged in. Access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -la
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 4
drwx------ 4 505 701 1024 Apr 8 02:16 .
drwx------ 4 505 701 1024 Apr 8 02:16 ..
-r-------- 1 0 0 0 Apr 8 02:16 .forward
d--x--x--x 2 0 2 1024 Apr 8 02:09 bin
d--x--x--x 2 0 2 1024 Apr 8 02:15 etc
226 Transfer complete.
ftp> mkdir TEST
257 "/TEST" new directory created.
ftp> ls -l
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 3
-r-------- 1 0 0 0 Apr 8 02:16 .forward
drwxr-xr-x 2 505 701 1024 Apr 8 02:32 TEST
d--x--x--x 2 0 2 1024 Apr 8 02:09 bin
d--x--x--x 2 0 2 1024 Apr 8 02:15 etc
226 Transfer complete.
ftp>
等等。
测试更改
执行:
使用 ftp 客户端访问 ftp 服务器
ftp www.you.com
应该得到:
ftp 守护程序应响应提示符和版本号!
现在有趣的部分开始了。我们希望这台机器允许通过连接的(或插入的?)调制解调器进行拨号接入。它将提供常规 shell 或受限 shell(仅执行 pppd 守护进程)。Windows 95/98 用户应该能够使用他们计算机的所有默认设置轻松拨号接入。
为了处理通过串行线路的登录,需要某种版本的 getty
程序。该程序监视串行线路(在本文档中将始终使用 /dev/ttyS1,详情请参阅 serial HOWTO),并在连接时显示登录提示符或启动程序。
我建议使用 mgetty 程序(因为它比一些竞争对手具有更多功能且更易于设置)。
RH 自带 mgetty-1.1.21-2
,它还具有接收传真和语音邮件的扩展功能(如果调制解调器支持)。通过执行以下命令检查 mgetty 是否已安装:rpm -qa | grep mgetty。
安装 mgetty 后,需要进行一些重新配置。以下是需要更改的文件和详细信息
这使得 mgetty 能够在系统启动时启动并相应地重新生成。这些行应添加到文件末尾。
#for dialins use mgetty
#note this S1 in the beginning of the line and ttyS1 in the end
S1:2345:respawn:/sbin/mgetty ttyS1
此文件控制 pppd 守护进程的每次启动。这里的一些选项是可选的(嘿,这就是它们被称为选项的原因,对吧?)。
auth -chap +pap login modem crtscts debug proxyarp lock
ms-dns 111.222.333.444
以下是它们的简要含义
这里还需要注意一点。有些人报告说,他们在验证 Windows 和 Linux 拨号客户端时,使用 +chap -pap 更成功。如果您遇到问题,请尝试更改 /etc/ppp/options
以包含 +chap -pap。在这种情况下,应创建新文件 /etc/ppp/chap-secrets(内容与推荐的 /etc/ppp/pap-secrets 相同)。
另一些人报告说,使用 /etc/mgetty+sendfax/login.config 中的默认行也能正常工作。我很高兴听到这一点,我从未声称我的设置方式是唯一正确的方式。
此文件的用途与前一个文件类似,但仅适用于特定的调制解调器线路。它指定分配给远程计算机的 IP 地址(在某种意义上是动态的,如果您有多条线路)以及本地 IP。
111.222.333.444:111.222.333.888
此文件是 mgetty 的主要控制文件。Mgetty 具有 Windows-PPP 感知能力,因此它具有在收到来自 Windows 计算机的连接时自动启动 pppd 的功能。
应存在以下行
/AutoPPP/ - - /usr/sbin/pppd
在添加它们之前,请检查是否已存在其他版本的类似命令(默认情况下已注释掉)。
这类似于 /etc/password 文件,但仅用于拨号接入,并且包含明文密码(显然,只有 root 用户可见)。您希望能够拨号接入的所有用户都必须在此文件中列出其用户名和密码。他们应在 Windows 拨号网络配置中输入相同的用户名和密码。
# Secrets for authentication using PAP
# these two users below can use dialin
# client server secret pword remote IP addresses
dialinuser1 * b1ab1a!? 111.222.333.888
dialinuser2 * p8sSw0rD 111.222.333.888
通过查看 ps ax
命令的输出中是否有类似的行来检查 mgetty 是否正在运行。
4625 ? S 0:00 /sbin/mgetty ttyS1
现在这台机器将允许来自任何 Windows 95/98 计算机的调制解调器呼叫。
正如一位读者指出的那样,需要采取一些步骤来防止用户与他人共享其拨号密码。一个简单的 perl/shell 脚本可以通过杀死和记录使用相同用户名的连接来完成这项工作。
此外,如果希望阻止用户拨号接入,则不应将他们的用户名放入 /etc/ppp/pap-secrets 。
这真的非常简单。
测试更改
操作:
尝试使用终端程序拨号接入(UNIX:minicom /Windows:terminal 或其他)
应得到:
Mgetty 应该响应提示符和您的 Linux 发行版版本!
现在,在测试所有服务之后,我们准备开放对这台机器的访问。在我们的案例中,主要的访问控制工具是 TCP wrappers (tcpd)。在 RH 7 的情况下,xinetd 将自行检查相同的访问控制文件,而无需使用 /usr/sbin/tcpd 包装服务。这些工具由 2 个文件 /etc/hosts.allow 和 /etc/hosts.deny 控制,正如在 посвященных 各种网络服务的部分中提到的那样。TCP wrappers 配置可以通过 2 种不同的方式完成,我们将采用最简单的方式。
让我们的 /etc/hosts.deny 包含 ALL:ALL
子句,从而拒绝所有主机和其上的所有用户访问所有服务(从 /etc/inetd.conf 启动)。现在我们可以在 /etc/hosts.allow 中显式允许我们需要的内容,从而遵循 “凡未明确允许的均被拒绝” 的原则。
假设我们希望允许人们读取和发送电子邮件,我们希望一些受信任的主机更新网页内容,并且我们希望管理员工作站拥有完全访问权限。因此,我们得到了以下 /etc/hosts.allow
#
# hosts.allow This file describes the names of the hosts which are
# allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
#
ALL: 127.0.0.1 adminbox.some.net
#we rely on anti-relaying features of sendmail 8.9+ to fight spam
#and also restrict some sites that we don't want to see email from
sendmail: ALL EXCEPT .kr .cn
popper: .com .edu .gov .mil
#these people can upload/download stuff, make it restrictive to avoid warez!
in.ftpd: .this.net .that.net