不少人开始广泛谈论入侵网路主机的话题, 而 Linux 与 FreeBSD 则成为近日主要的攻击对象, 包括像 imapd 与 BIND 程式里的 buffer overflow 问题 。
每天, 各式各样的「系统漏洞」, 都会在 BUGTRAQ 邮递论坛中宣布, 此一邮递论坛已有将近 20,000 位订阅者。 ( 若是您只想订阅一份系统安全相关的邮递论坛, 那麽这个不容错过 )。
假设上述的 19,305 位订阅者当中, 有至少一位打算写个 for() 回圈, 配合公开的系统漏洞攻击程式, 藉以快速取得网路上主机的控制权... 事实上这样的假设并不为过。
如此一来, 您的电脑早晚会成为下一个遭受攻击的目标, 到时候, 您可能就措手不及了。
或许有些「专家」已经让您以为, 安装及维护一部安全的电脑, 有如「太空科学」般地复杂, 事实上没那麽难啦。 拥有一套完善而健全的系统管理措施, 才能保障您免於来自全球网路的威胁, 而本文讨论的便是, 我在规画 Red Hat Linux 网路系统时, 一般会采取的预防措施。 虽然文中提供了保障系统安全的指引, 但它绝不是一份完整的参考说明。
下列的步骤, 用意在使您的系统, 不要成为网路程式安全漏洞公开後的受害者。 请特别注意: 如果您不确定清楚自己在做什麽, 那麽就别动手。 有些步骤是假设, 您已经具备程度之上的相关知识。 文末另外还附上一些建议的参考读物。
系统安全之实作步骤
1. 将系统中所有没必要的网路服务全部移除。
可以连到您电脑的方式越少, 表示入侵者恶闯的途径越少。 把 /etc/inetd.conf 档案中, 所有不需要的项目都加注取消, 如果系统并不需要 telnet, 那就将它取消, 诸如 ftpd、 rshd、 rexecd、 gopher、 chargen、 echo、 pop3d 等, 也是同样的处理原则。 改完 inetd.conf 档案後, 别忘了要做个 'killall -HUP inetd' 动作。 另外, 也别忽略 /etc/rc.d/init.d 目录里的东西, 有些网路服务 ( 像 BIND、 印表机伺服程式 ) 是独自执行的程式, 透过目录里的命令稿来启动。
2. 安装 SSH。
SSH 是一个用来取代 'r' 系列指令的程式, 原本那些 Berkeley 版本的程式已经老旧了。 下列是摘自 http://www.cs.hut.fi/ssh 网页的资料:
Ssh (Secure Shell) 是一个用来登入网路主机、在远端主机上执行指令、 或是在两台主机间搬移档案的程式。它提供了强大的认证功能, 并确保能够在网路上进行安全的资料通讯。它额外还能够处理一些事情, 可能会是有心钻研之高手所感兴趣的。 请由 http://ftp.rge.com/pub/ssh 下载 SSH 程式。
3. 使用 vipw(1) 把所有不淮登入的帐号全都锁起来。 值得注意的是, 那些没有指定 login shell 的帐号, Red Hat Linux 会预设将它们指定为 /bin/sh, 这种情况可能不是你所期望的。 同时要确定, 您的使用者帐号中没有把密码栏给空下来, 下列是一个正常之密码档案的部份内容:
daemon:*:2:2:daemon:/sbin:/bin/sync
adm:*:3:4:adm:/var/adm:/bin/sync
lp:*:4:7:lp:/var/spool/lpd:/bin/sync
sync:*:5:0:sync:/sbin:/bin/sync
shutdown:*:6:0:shutdown:/bin:/sync
halt:*:7:0:halt:/sbin:/bin:/sync
mail:*:8:12:mail:/var/spool/mail:/bin/sync
news:*:9:13:news:/var/spool/news:/bin/sync
uucp:*:10:14:uucp:/var/spool/uucp:/bin/sync
operator:*:11:0:operator:/root:/bin/sync
games:*:12:100:games:/usr/games:/bin/sync
gopher:*:13:30:gopher:/usr/lib/gopher-data:/bin/sync
ftp:*:14:50:FTP User:/home/ftp:/bin/sync
nobody:*:99:99:Nobody:/:/bin/sync
4. 移除所有 root 所拥有之程式的 's' 位元权限, 如果它根本不需要这样的权限。 这个动作可以由 'chmod a-s' 指令完成, 後面接的参数, 便是您要改的档名。
上述所提之程式包括以下各类, 但不限於此:
您从来不会去使用的程式
您不希望 root 之外的使用者会去执行的程式
偶而会用, 但以 su(1) 变成 root 再去执行, 也无所谓的程式
我把自己会取消权限的程式列在下面, 并在前面放了星号 (*)。 记住, 由於您的系统仍然需要一些 suid root 的程式, 才能正常地执行, 因此要特别地小心。
另一种方式, 您可以建立一个叫做 'suidexec' 的特殊群组名称, 然後将可信赖的使用者帐号设在里面, 使用 chgrp(1) 指令将所有 suid 的程式改成属於 suidexec 此一群组, 并将其他使用者可以执行的权限除掉。
# find / -user root -perm "-u+s"
*/bin/ping
*/bin/mount -- 应该只有 root 才可以挂上档案系统
*/bin/umount -- 同上
/bin/su -- 别乱改它啊!
/bin/login
/sbin/pwdb_chkpwd
*/sbin/cardctl -- PCMCIA 卡的控制工具程式
*/usr/bin/rcp -- 改用 ssh
*/usr/bin/rlogin -- 同上
*/usr/bin/rsh -- "
*/usr/bin/at -- 改用 cron, 或两者都停用
*/usr/bin/lpq -- 改装 LPRNG
*/usr/bin/lpr -- "
*/usr/bin/lprm -- "
*/usr/bin/mh/inc
*/usr/bin/mh/msgchk
/usr/bin/passwd -- 别乱改它啊!
*/usr/bin/suidperl -- 每个新版的 suidperl 好像都有buffer overflow 的问题
*/usr/bin/sperl5.003 -- 只有必要时才用它
/usr/bin/procmail --
*/usr/bin/chfn
*/usr/bin/chsh
*/usr/bin/newgrp
*/usr/bin/crontab
*/usr/X11R6/bin/dga -- X11 里也有许多 buffer overflow 的问题
*/usr/X11R6/bin/xterm -- "
*/usr/X11R6/bin/XF86_SVGA -- "
*/usr/sbin/usernetctl
/usr/sbin/sendmail
*/usr/sbin/traceroute -- 您应该可以忍受偶而打一下 root 密码吧
5.升级 sendmail。 从 ftp://ftp.sendmail.org/pub/sendmail 下载最新的原始码档案, 解开後阅读其说明文件, 如果您还有点多余的时间, 可以安装 smrsh ( 附随在 sendmail 里 ), 许多人所关心的 sendmail 安全问题, 如寄信给某些危害安全的程式, 这个程式大都考虑到了。 最後编辑 sendmail.cf 档案, 把 'PrivacyOptions' 选项设定为 'goaway':
O PrivacyOptions=goaway
如果您不打算收取网际网路上的电子邮件, 千万不要将 sendmail 以收信状态 (sendmail -bd) 来执行! 在上述的情况下, 请将 /etc/rc.d/init.d/sendmail.init 取消, 并执行 'killall -TERM sendmail' 命令。 不过, 您还是可以寄信到外面的。
6.如果您有使用 BIND, 也要记得升级。 最新版的 BIND 可以在 http://www.isc.org 找到, 不然, 请将它们全部关闭掉。
7.重新编译核心程式。 如果预设的核心程式太大, 我通常就会重新编译它。 提示: 请将有关防火墙的选项全部打开, 即使您的电脑并不是防火墙。
CONFIG_FIREWALL=y
CONFIG_NET_ALIAS=y
CONFIG_INET=y
# CONFIG_IP_FORWARD is not set
# CONFIG_IP_MULTICAST is not set
CONFIG_SYN_COOKIES=y
CONFIG_RST_COOKIES=y
CONFIG_IP_FIREWALL=y
CONFIG_IP_FIREWALL_VERBOSE=y
# CONFIG_IP_MASQUERADE is not set
# CONFIG_IP_TRANSPARENT_PROXY is not set
CONFIG_IP_ALWAYS_DEFRAG=y
CONFIG_IP_ACCT=y
# CONFIG_IP_ROUTER is not set
# CONFIG_NET_IPIP is not set
CONFIG_IP_ALIAS=m
8.进行程式修补 所有已知的软体问题, 都可以在 RedHat 的「修正网页」上找到, ( 请查阅 http://www.redhat.com/support/docs/errata.html, 找出适合您版本的修补程式码 ), RedHat 在维护更新这些网页上, 确实做得相当不错。 同时, 这些网页还包括一些 RPM 档案的连结, 您应该用得著, 请依照说明指示进行安装。
9.设定 tcp_wrappers: tcp_wrappers 可以用来管理网路上, 哪些电脑可以与您的电脑进行「沟通」。 这一套程式, 是由一位系统安全高手 Wieste Venema 所写成, 它会管理那些经由 inetd ( 或与 inetd 程式库相连结 ) 所启动的程式, 分析它们的设定档案, 以决定是否拒绝或同意某一个网路连线要求。 举例来说, 为了允许您从家里能够透过 ISP 进行 telnet 及 ftp, 同时间又要拒绝所有其他的连线, 可以在 /etc/hosts.allow 档案里写入:
in.ftpd : .dialup.your-isp.com : allow
all : all : deny
像 SSH、 sendmail 及其他程式, 都可以做成与 tcp_wrappers 相互支援
。 请阅读 tcpd(1) 的说明文件, 以取得进一步的资讯。
Solar Designer 所提供的 Secure Linux patches:
http://www.false.com/security/linux/
replay.com 提供的 RedHat crypto pages:
http://www.replay.com/redhat/
Breaking Into it 所提供的 Improving the Security of Your Site:
http://www.alw.nih.gov/Security/Docs/admin-guide-to-cracking.101.html
Slashdot 提供最新而及时的消息:
http://www.slashdot.org
想要知道最新的软体更新状况, 请参考 FreshMeat regularly:
http://www.freshmeat.net
Smashing the stac:
http://reality.sgi.com/nate/machines/security/P49-14-Aleph-One