这篇文章是在REDHAT 6.1 FOR SPARC 和INTEL基础上进行解释的,也对MANDRAKE 7.0 FOR INTEL 做了测试。 目录: 准备工作 初始化操作系统安装 安装SSH Bastille: 介绍,运行,检查和问题 安全工具和系统管理软件 补丁和LOG记录 完整性检查和备份 安装,测试和安全安装应用程序 启动 常规维护 其他注意点 1,准备工作 -使事情尽量简单化:最好的期望是在主机上只运行一或者两个服务。并且把运行 的服务尽量在分散在多台机器,因为这样要比在所有事情都同在一台机器上运行 要安全的多,这样可以方便的隔离应用程序,使其更牢固,更容易查找错误和 升级软硬件。一切运行的规则是你所需服务的最低限度要求。 -硬件部分:如果你有Sun/SPARC硬件,考虑通过串行口控制台(console)来进行 安装,去掉键盘屏幕和帧缓冲区(framebuffer),避免使用X11并是使用熟悉的 命令行进行操作。 -安全地下载:安全过程需要在一个隔离的或者没有路由网络来安装,在这种情 况下,你可以通过控制台以ROOT身份FTP到系统,或者从新的系统中下载。如果 你没有隔离的网络(这通常不推荐),那就改变ROOT的密码以方便的下载文件, 完成后再次改变密码,马上关闭网络系统。这样就减少存在潜在攻击者危险的 机会。 -明确知道系统究竟要干什么和硬件将被怎样配置等等,着重注意一些如要调用 RPC的应用程序。 -理解应用程序是怎样工作是非常重要的一步(他们使用的端口,设备和文件)。 判断使用某些程序有可能所承受的安全风险。 2,安全操作系统 在x86硬件上,屏幕,键盘和鼠标是必须的,从CDROM或者启动软盘启动并选择 安装。 在SPARC硬件上,整个的安装可以不使用屏幕和键盘(称为"headless sever"), 连接串口控制台,开机,通过发送Stop-A(如~#,~%b或者F5,具体是依据你是使用 tip,cu或者vt100终端)出现OK提示符,再开始安装过程:boot cdrom -安装。 REDHAT的安装过程有点不符常理并且安装版本的不同,选项也各有不同: -理论上"定制安装(custom install)"是用来安装一些需要的模块,但其中有点 不正常,如FTP服务器没有安装(在SPARC版本中,可以使用rpm -i /mnt/cdrom/RedHat/RPMS/wu-ftpd-2.6.0-1.sparc.rpm)来进行修正。 -Gnome永远是被安装的,即使你选者KDE或者选者不包括GNOME。可以使用startx 来启动GNOME和使用kde来启动KDE -在所有安装模式中,国际键盘映射对于命令行和GUI没有进行正确的设置。 MANDRAKE 7.0安装中没有这些问题 在此,选择server或者custom安装,设置主机名,IP参数,时区等等。不要激活 任何名字服务如NIS和NFS,选者手工磁盘分区: -考虑一个独立的,容量较大的/var文件系统作为syslog/web/news/proxy服务 或者防火墙过滤器。 -一些包含很多数据的服务,如WEB,FTP,应该使用独立的磁盘来进行数据处理。 -如果你不想要以只读方式来安装(mount)分区,并且没有LOG记录数据和应用 程序数据,就考虑把整个启动盘放在根目录下。 -对于2G磁盘的分区建议:500MB/(root+var),200MB交换分区,1300MB/usr分区. -对于1G磁盘的分区建议: 300MB/(root+var),200MB交换分区,500MB/usr分区. -推荐使用8G大小来作为LOG服务器空间数据:100MB/root,300MB/交换分区, 800MB/usr,6.9G/var -请查看[9]来获得更多的磁盘分区讨论 为ROOT设置一个强壮的密码(至少8个由字母,数字和标点符号组成),建立一个额外 的test用户,因为你不能通过以ROOT身份来登录网络."init level"必须设置为3 级(是命令行登录级别),这比设置为5(图形形式登录级别)更安全,如果确实需要 GUI,可以使用startx手工来启动GUI系统. 通过串行端口登录对于安装故障检查和熟悉命令行是很有帮助的.想要在X86硬件 上通过串行口A来进行登录,可以在/etc/inittab增加下面的一行文字: con:23:respawn:/sbin/getty ttyS0 VC 上面的设置对于SPARC机器是不需要的,因为SPARC机是自动配置好这工作的,如果 要允许通过这个串行口来允许ROOT登录,则必须在/etc/securetty增加ttsS0. 3,安装SSH 安装SSH,对于保护SHELL很有好处.Bastille can do this.但你需要有INTERNET 访问能力,我在SPARC问题上存在问题并且更喜欢知道在编译SSH时到底使用了什么 选项.I had problems with SPARC, and prefer to know exactly what options are used to compile SSH. 对于Linux中'ssh1'和'OpenSSH'有两个KEY来实施,这里我们使用ssh1来做例子, OpenSSH在某些方法上更具戏剧性,但ssh1还支持securid,请在[7]这里查看SSH 的具体讨论. 可以使用下载源代码和RPM来获得SSH(可以在[7]下查看网站列表: 1)源代码使用下面的方法来安装: zcat ssh-1.2.27.tar.gz | tar xf - cd ssh-1.2.27; ./configure --prefix=/usr --without-none --without-rsh --without-idea make && make install 2)RPMS使用下面的方法来安装(下面是SPARC的例子): rpm -i ssh-1.2.27-7i.sparc.rpm ssh-clients-1.2.27-7i.sparc.rpm rpm -i ssh-extras-1.2.27-7i.sparc.rpm ssh-server-1.2.27-7i.sparc.rpm 拷贝一启动文件(如sshd)到/etc/rc.d/init.d/ssh并且设置连接。 正确配置/etc/ssh_config文件(查看[7]),使只有有"知名公共钥匙"(known public keys) 命名的主机可以访问,并且不启用rhosts认证方式来避免信任方式来访问,只 允许特定的用户和主机来访问SSH。 拒绝守护程序(daemon)帐号访问系统,如确定下面守护程序帐号不能访问系统: DenyUsers daemon bin sync adm lp shutdown halt mail news uucp nobody operator sympa, squid, postgres, gopher, postfix, xfs. ------------------------------------------- 4,Bastille 介绍 Bastille是一套开放源代码脚本,设计目的是用来使REDHAT 6.0或者6.1系统安装 更强壮更安全(此脚本将很快支持6.2版本)。第一版本在1999年的12月推出并 作出了一些重大的改进。现在使用的2000年3月15号V1.0.4版本。 那Bastille究竟做什么样的工作呢:不起用不需要的守护程序,起用和改进LOG记 录,提高SUID和文件权限的严格使用性,提高帐号安全问题和甚至为DNS服务提供 chroot环境。但请注意Bastille在其他如SUSE变种的LINUX上不适用,因为各个 LINUX系统变种有自己的运行机制和不同的启动文件。 Bastille启用自动化的和交互的接口,基于文本菜单的交互式安装能非常有帮助的解释 有关的各种选项和生成用来在下一步实际配置收紧系统安全使用的配置文件 (tuigenerated-raw-config)。此配置文件可以编辑和拷贝到其他同样系统中 以用来更快的配置系统安全。 --运行Bastille 1,下载Bastille并展开到/root目录下。 2,在这阶段停止网络接口,如下面所示(接口名字在各个系统中各不相同): ifconfig eth0 down 3,运行Bastille交互式脚本: CD /root/run-Bastille; ./InteractiveBastille.pl 注意:在SPARC机器上此交互脚本不能很好的工作,会出现下面的错误提示: Can't load './Curses.so' for module Curses: ./Curses.so: ELF file data encoding not big-endian at /usr/lib/perl5/5.00503/sparc-linux/DynaLoader.pm line 169. 可以按照下面的方法来进行修补以在SPARC机器上工作: 从CPAN中下载Curses-1.02.tar.gz并按如下方法来进行补丁安装: perl Makefile.PL; make && make install 在改变至Bastille目录和去掉Curses库: CD /root/run-Bastille; mv Curses.* /tmp; 在再次运行InteractiveBastille.pl脚本。 InteractiveBastille.pl的运行可以逐步的来更安全的设置,提示那些你系统 需要更加加强哪些不需要,你可以通过提示来关闭不需要的守护程序,起用LOG 记录,加强SUID和文件的权限设置,提高帐号安全和为DNS服务提供chroot环境。 下面的这个脚本默认接受的配置(查看tuigenerated-raw-config): --SUID:除了ping和Traceroute关闭所有SUID属性工具,启用shadow密码档。 --检查并设置无第二个UID为0的帐号。 --没有LILO密码 --不启用编译器(只有ROOT可以访问)。 --守护程序设置:关闭SENDMAIL服务,并通过cron来运行SENMAIL,下载SSH, 启用Apache,CGI,关闭打印,关闭匿名FTP服务。 --关闭所有RPC服务,即使你需要使用KDE。 回顾你所选择的设置,可以通过view等编辑器来查看tuigenerated-raw-config 配置文件。 4,下面是运行实际的系统安全收紧操作: ./BackEnd.pl < tui-generated-raw-config > screen.log 检查结果 --检查安全收紧操作的LOG记录:/root/bastille-action-log --重新启动 --以ROOT身份登录并检查进程列表,其结果应该是如下所示: tests# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 10 17:07 ? 00:00:03 init [3] root 2 1 0 17:07 ? 00:00:00 [kflushd] root 3 1 0 17:07 ? 00:00:00 [kupdate] root 4 1 0 17:07 ? 00:00:00 [kpiod] root 5 1 0 17:07 ? 00:00:00 [kswapd] root 6 1 0 17:08 ? 00:00:00 [mdrecoveryd] root 276 1 1 17:08 ? 00:00:00 syslogd -m 0 -a /home/dns/dev/lo root 286 1 0 17:08 ? 00:00:00 klogd root 301 1 0 17:08 ? 00:00:00 crond root 310 1 3 17:08 ? 00:00:00 /usr/sbin/sshd root 369 1 0 17:08 ttyS0 00:00:00 login -- root root 370 1 0 17:08 tty1 00:00:00 /sbin/mingetty tty1 root 371 1 0 17:08 tty2 00:00:00 /sbin/mingetty tty2 root 372 1 0 17:08 tty3 00:00:00 /sbin/mingetty tty3 root 373 1 0 17:08 tty4 00:00:00 /sbin/mingetty tty4 root 374 1 0 17:08 tty5 00:00:00 /sbin/mingetty tty5 root 375 1 0 17:08 tty6 00:00:00 /sbin/mingetty tty6 root 378 369 1 17:08 ttyS0 00:00:00 -bash root 390 378 0 17:08 ttyS0 00:00:00 Ps -ef --检查网络连接,如: # netstat -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:ssh *:* LISTEN raw 0 0 *:icmp *:* 7 raw 0 0 *:tcp *:* 7 Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path unix 3 [ ] DGRAM 239 /dev/log UNIX 0 [ ] STREAM CONNECTED 108 @0000000f UNIX 0 [ ] DGRAM 241 /home/dns/dev/log UNIX 0 [ ] DGRAM 353 UNIX 0 [ ] DGRAM 282 UNIX 0 [ ] DGRAM 254 BASTILLE存在问题和限制性 Bastille Linux hardening脚本存在一些应该注意的问题: --此脚本运行只运行在一个干净的原始的安装系统。 --Bastille脚本不允许你使用Ctrl-C来退出并且窗口必须和菜单的大小相符合。 --在"MiscellaneousDaemons.pm Module 10 of 16" 后的默认菜单指向是"back" 其实NEXT,可以使用手工来选择"next". --配置系统不足之处: --一些不需要的帐号如uucp, games, LP, operator, xfs没有移除。而且它们 SHELL没有设置为/dev/null或者/bin/false. --xfs(X字符服务系统)还在运行,当然X FONT SERVER不存在重大安全漏洞, 但还是有一些细小的漏洞(可以在BUGTRAQ中发现XFS漏洞的描述)。 修补方法:不启动XFS服务并重新启动:chkconfig --del xfs 重点:你不要在控制台上长期使用KDE或者X11服务,但偶尔也需要使用到,所以 你必须在你需要的时候手工启动FONT服务/etc/rc.d/init.d/xfs start --许多系统帐号需要增加到/etc/ftpusers文件中,如下所示: sympa, squid, postgres, gopher, postfix, xfs. --如果SSH已经安装,改变sshd_config (DenyUser) 配置文件,禁止/etc/ftpusers 配置文件中的账号登录。 --改变在/etc/passwd 文件中的ROOT描述,把"root" 改为 "root MACHINENAME" 。 --此Bastille脚本没有使用CHROOT配置来设置FTP,CHROOT环境可以把用户从系统 文件中隔离开来。使用CHROOT环境来设置FTP服务是非常有用的。 ---------------------------------------------------- 5,安装工具和Sysadmin系统管理软件 在这阶段将安装标准工具。这些工具必须以近个编译好和在其他系统上测试过的。 这些工具一般在CD上或者通过FTP进行作为tar文件来传递。 下面是一些工具可以通过linuxconf来进行设置: --环境:/.cshrc,/.profile,/.bashrc,/etc/profiel,/etc/bashrc:设置umask 077 权限或者027权限。 --Mount 磁盘:为了减少木马的危险和未授权的修改,在/etc/vfstab必须以"nosuid" 方式在mount /var目录数据或者其他数据。 --在/etc/hosts文件中设置鉴定过的主机列(那些不需要通过DNS解析的主机)。 --DNS客户端:在/etc/resolv.conf中增加域名和DNS服务器。在/etc/nsswitch.conf 文件中增加主机的DNS入口(并移除NIS和NISPLUS入口)。 --键盘安全:如果你的主机在一个安全的房间,你可以保留键盘,但必须禁止如下 部分的功能键(这就是说如果你想要你的主机有物理上的安全就存在一定的不便利)。 --在SPARC机器上:在/etc/sysconfig/init文件中enable/disable STOP-A键 盘顺序以立即到eprom中的提示。 --disable启动时候的交互热键,在/et/sysconfig/init文件中设置PROMPT=no, --在x86机器上:如果你要允许ctrl-alt-delete可以关闭系统,可以在 /etc/inittab文件中加入如下命令语句: # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now 重新启动系统或者使用"killall -HUP init"来激活命令。 --使用默认路由:在/etc/sysconfig/network中增加路由器的IP地址。 --在/etc/inetd.conf文件中,应该先关闭所有服务,在选择一些你必须使用的 服务。并要对/etc/hosts.allow和/etc/hosts.deny进行控制。 --EMAIL:如果主机不要求在子网外发送邮件,就不需要配置MAILHOST别名,如果你 不需要任何类型的EMAIL,你需要删除/usr/lib/sendmail程序。否则: --编辑/etc/mail/aliases文件(至少要对ROOT指向一个真实的地址)。 --在/etc/hosts中设置MAILHOST并且为这台机器增加一 hostname.YOURDOMAIN.COM别名。 --在/etc/mail/sendmail.cf中设置如下来保证所有向外的EMAIL流经MAILHOST 这台机器: Dj$w.YOURDOMAIN.COM. [only needed if sendmail complains] DSmailhost [smart relay] DRmailhost [send emails with no host/domain here] DHmailhost [skip this if local delivery is allowed] O FallbackMXhost=mailhost --发送一封测试信检测配置: mail -v -s test_email root </dev/null --如果有多人管理一台比较敏感的主机时,考虑使用sudo工具,请看[9]. --如果在系统中允许普通用户的帐号,考虑对下面工具作出相应的限制: --cron:通过编辑配置/etc/cron.allow和cron.deny(请看[9])。 --at: 通过编辑配置/etc/al.allow和at.deny. --ftp: 不允许使用在/etc/ftpusers中列出的用户。 --ssh:/etc/sshd_config(查看AllowUsers DenyUsers AllowHosts DenyHosts 条目). --常规的inetd中的服务:/etc/hosts.allow和hosts.deny. --文件系统组:/etc/groups和使用文件的权限等。 ----------------------------------------------------------- 6,补丁和LOG记录 补丁程序 对于Red Hat 6.1,补丁可以在下面的站点里找到: http://www.redhat.com/errata. 其中提供安全建议,BUG修补和工具包升级。 Mandrake在下面的站点提供补丁程序和一些升级程序: http://www.linux-mandrake.com/en/fupdates.php3,Mandrake提供一些在KDE 下不错的补丁程序检查和安全工具。 一般你如果升级下载的补丁,可以采用下面的命令进行安装和更新: rpm - Uvh filename.rpm 那里还有一些特殊的内核补丁程序用来增加内核系统的安全性,如crypto,请看[9]. 配置LOG记录: syslog logging:通过Bastille用来增加syslog配置是很有帮助的,但这适用 于本地LOG的主机或者LOGHOSTS(专门的syslog服务器). syslog "clents":建议大多数重要的主机把LOG指向一专门的syslog服务器-- loghost,可以通过在/etc/syslog.conf中进行如下配置: # syslog.conf for clients # # send all messages to "loghost": *.* @loghost *.emerg * # Save boot messages also to boot.log local7.* /var/log/boot.log # Log all logins to /var/log/loginlog auth.*;user.*;daemon.none /var/log/loginlog # Log additional data to the Alt-F7 and Alt-F8 screens (TTY 7 and 8) *.info;mail.none;authpriv.none /dev/tty7 authpriv.* /dev/tty7 *.warn;*.err /dev/tty7 kern.* /dev/tty7 mail.* /dev/tty8 ########### Syslog "loghost" :在loghost主机上设置一巨大的/var磁盘空间来存放 LOG文件. 按下面的描述来设置几个LOG记录: --Root cron条目: --LINUX上的cron程序比UNIX的要好,/etc/crontab文件中包含标准的 运行脚本,可以以小时,日,星期,月来运行(当然以ROOT身份)。 --logrotate可以在/etc/logrotate.conf中配置,它是用来修剪整理 系统和应用程序的LOG记录的。应用程序可以增加脚本到/etc/logrotate.d, 默认状况下syslog, ftp, apache, cron 和 linuxconf应用程序有相应 的条目。此特征确实比有些商业的UNIX要好。建议按如下方式来改变 /etc/logrotate.conf中的默认条目以得到更好的LOG控制: rotate 30 [保持 30 星期的LOG记录-前提是你有足够的空间] compress [压缩一些老的LOG记录] 并在/var/log/wtmp和/var/log/lastlog部分增加设置'rotate 24',这样 可以使记录和最后LOGIN登陆信息保存两年。 --使用rdate工具来设置时间日期(考虑使用NTP,它更精确,但比较复杂, 会增加额外的带宽和安全问题)。 ## 同步时间: 0,15,30,45 * * * * /usr/bin/rdate timehost1 >/dev/null 2>&1 # 在一周内每小时处理邮件队列: 0 * * * 1-5 /usr/lib/sendmail -q 文件权限: 设置更严格的权限,并限制ROOT部分工具或者不启动这些工具: chmod u-s /usr/sbin/sendmail #不适合邮件网关机器或者多用户主机。 chmod 400 /.shosts /etc/sshd_config /etc/ssh_known_hosts 建立文档记录 在文本文件如/etc/mods中对配置进行归档,对每一次改变配置,需对日期 改动者,影响文件,描述记录和更新在归档文件中,如: cat > /etc/mods <<EOF 10.4.00 sb New install of RH6.1+Bastille & tools according to hardening guidelines EOF BANNER(标语)设置 改变LOGIN BANNER(标语)来警告非授权的访问--如果你对非授权的访问 要进行起诉你必须这样做。编辑/etc/issue和/etc/motd。Bastille并不自动 改变/etc/issue.你要修改issue文件中一些操作系统类型的指示和增加相应的 警告BANNER(标语)(特别是控制台不在安全的房间中)。 重新启动。 测试: SSH和标准工具,服务是否能正常工作? 检查LOG条目并检查控制台上的信息。 系统是否按照你所期望的行为在运行? ----------------------------------------------------------- 7,完整性检查和备份 把系统备份在两盘磁带中,一盘放在安全的地方(最好是刻盘)。 在这阶段,我们需要对安装的文件使用安全的hashing(散列)算法进行完整性检查, 初始化它的数据库并运行合格的检查以便来监视以后的改变。如果可能,把主数据 库存放在离线的另外一台机器上,或者写入一次性媒质上。 对于数据完整性的我们需要那些项目? --下面的意思是RPM可以用来报告文件的改变(但本人有点对这句英文不理解, 所以只好贴上原文,惭愧): The RPM commands also be used to report changes to rpm installed files "poor man's tripwire": for file in $(rpm -qa); do rpm -V $file; done > rpm_changes 它可以打印出一列表,指示Size, MD5 hash, Links, Time (mtime), Device, User, Group, Mode (permissions)等是否改变: S.5....T c /etc/host.conf S.5....T c /etc/hosts.allow S.5....T c /etc/motd S.5....T c /etc/securetty S.5....T c /etc/services S.5....T c /etc/localtime S.5....T c /etc/nsswitch.conf .M...... /usr/sbin/rpcinfo 你可以存储一份拷贝并在以后作为对比的基准。 --Tripwire [5]:此程序有商业和免费两种版本。REDHAT X86是唯一正式使用 商业信息的的LINUX: --免费的版本如果使用适当可以工作的不错,但存在一些BUG,提供源 代码,在很大的磁盘上出现过崩溃现象。 --商业版本相对来说比较贵,报告也相对来说比较冗长(你需要使用过滤 的脚本来查找你所需的东西),提供多个配置样板文件,相对于免费版本较稳定。 可以在UNIX和NT平台上很好的运行,通过一些政策化和配置化的文件提高安全性。 但售后支持不是很好(即使你付了不少钱,呵呵)。 --两个版本在定义方针化规则时都不支持正常表达式,如你不能为 "/home/*/www/cgi-bin"下的文件特定一规则。 --也可以使用PGP,通过对文件的签名来得到保护的作用,并写一有效脚本来 检查有效正确的签名。但PGP的不好之处是对文件的权限,连接,字节和修改的 日期等改变不能进行检验。 --MD5签证也可以作为文件效验,如果要更好的保护MD5,最好使用PGP签名或者 使用其他方法加密。 --在OPENBSD中可以使用mtree工具。或许这个工具不久会在LINUX上搭带。 --Aide是一新的GPL效验工具,可能不久的将来将会代替tripwire. 下面是使用免费Tripwire v1.2的例子: --在x86存在RPM包,在SPARC中的RPM已经被编译了,下载[5]并安装RPM工具包。 --安装后Tripwire两进制程序在/usr/sbin目录下,配置文件位于/etc/tw.config, 并且其通过/etc/cron.daily/tripwire.verify由cron进行每天的检测。数据库存放 在/var/spool/tripwire下,也可以使用MAN查看使用方法:tripwire(8), twconvert(8), tw.config(5). --在安装后,需要保存系统的初始化状态("initial state"),可以使用下面的方法: /usr/sbin/tripwire -initialise 上面的命令会在/var/spool/tripwire下建立一新的数据库。 --要通知Tripwire你所改变的文件或者整个目录,可以使用下面的方法: /usr/sbin/tripwire -update [path] --可以由cron或者手工来每天进行系统检查: /etc/cron.daily/tripwire.verify --使用带"-i 2"的选项来运行Tripwire可以增加其检查速度(此选项关闭了 一个检验算法snerfu,但SHA1和MDS5还是继续使用)。 --为了增强安全性和自动检查多个系统,你可以把Tripwire存放在一绝对安全 的主机,拷贝Tripwire和它的数据库到安全主机并使用SSH远程的进行维护。在效验 某一主机后,删除目标机上的数据库,这可以让攻击者不轻易发现你在使用tripwire 进行系统检验。另外,立即更新tripwire数据库,这样可以在连续运行的情况下 知道与原来的不同之处。你可以查看下面的 <a href=http://www.boran.com/security/sp/linux/trip_linux.sh>Trip_linux.sh</a> 的脚本。如果使用这个脚本,你需要使用下面的方法来关闭本地检测功能: mv /etc/cron.daily/tripwire.verify /etc/cron.daily/.tripwire.verify --拷贝一份备份的配置文件和数据库到软盘或者一次性介质。 8,安装,测试和更严格控制应用程序 综述 --根据服务器所需的相应功能,而采用相应的应用程序如ftpd,BIND,proxy等。 WEB SERVER和防火墙更特别,需要很复杂和小心的配置,下面是server/application 需要遵守的规则列表: --对于重要应用程序考虑安装在独立的分区,这分区在安装和测试阶段 需要安装为读写状态,但在这些过程后最好需要把属性改变为只读属性。 --在应用程序启动或者之前使用umask设置严格的属性,如(022)。 --检查应用程序是否以最低权限的非ROOT用户运行?其本身的密码是否 "禁用"并对其设置/dev/null类的SHELL。如果确实需要使用其本身密码来运行, 是不是把其密码的标准设置为最小为8个字符并是字母,数字和符号混合的类型。 --如果某应用程序以ROOT的身份,绑定一个低点的端口,要清楚其是否 可以立即派生(fork)出一没有特权的用户来最小化减低危险程序? --应用程序有关的所有文件的权限是否设置正确,即四否只有应用程序 可以读写,检查是否有全局可读写的文件,检查并正确设置。 --检查应用程序写LOG记录的权限是否安全?检查应用程序是否把有关的 密码写入LOG记录(这样的事情很多)。 --是否可以把应用程序设置CHROOT环境? FTP服务(ftpd) --如果你使用Washington University的wu-ftpd,它的LOG记录和访问控制及 其他特征有一定的独特程序,但必须要参考一些以前的BUG(请参看http://www.cert.org/ 站点的关于wu-ftpd的安全建议:advisories CA-93:06, CA-94:07, CA-95:16和 Auscert AA-97.03 和 AA-1999.02). 必须使用V2.6.0以上的版本。 --在/etc/ftpusers(相当于黑名单)中加入系统帐号,使这些系统帐号不能 用来FTP(如你要求ROOT不允许FTP,你把"root"加入到/etc/ftpusers文件中)。 在一个全新的系统中,你可以使用下面的方法把所有系统帐号加入到ftpusers: awk -F: '{print $1}' /etc/passwd > /etc/ftpusers --可以先把全部帐号加入到/etc/ftpusers中,在把需要FTP的帐号挑选出来, 在进行相应设置(必须在ftpusers去掉相应的帐号)。或者使用下面的技巧:对于 那些没有FTP访问的用户,给他们一个不是标准的SHELL(如tcsh),并不要把这个 新的SHELL加入到/etc/shells中去,FTP的访问就会被拒绝,如果想要正常工作就 必须在/etc/shells里面加入相应的SHELL。 --FTP可以使用IP地址或者主机名来控制,请看/etc/hosts.allow和/etc/hosts.deny. --如果需要匿名FTP,必须非常小心,你必须使用chroot环境,Bastille可以为 你设置这方面的环境。 --如果使用正常的"user ftp",推荐使用chroot。 --把FTP的数据存放在一个独立的分区并把起安装为nosuid. DNS 服务 使用最新版本的BIND(Berkeley Internet Name Server),请查看下面的站点: http://www.isc.org/products/BIND 是哟功能8.2.2-P5或者更新的版本,在zone transfers文件中限制次级的IP地址 (在/etc/named.conf)。 可以使用Bastille来设置DNS服务器,它会自动设置下面的配置: --建立一"dns"用户和组并使用"named -u dns"来启动DNS,这样BIND可以派生 (fork)和改变身份为dns用户。必须提供dns用户可以读BIND配置文件的权利( 然而它们原属于ROOT)。 --把BIND设置在chrooted的环境中(/home/dns)。 发现并修补故障(Troubleshooting): --使用nslookup或者dig来检查服务器的配置结果。 --客户端:如果你有DNS客户端问题,检查/etc/nsswitch.conf和/etc/resolv.conf 文件,并使用带有"-d2"选项的nslookup来获得调试信息。 --服务器端:使用debug选项"-d"来启动named守护程序,并阅读控制台和LOG 信息,代表性的LOG可以在syslog的"daemon"部分找到。 --下面站点的工具对于测试激活的守护程序有非常大的帮助: http://www.uniplus.ch/direct/testtool/dnstest.html --要从name服务中获得统计信息,可以使用下面的方法: kill -ABRT `cat /etc/named.pid` 其中的统计文件会存放在/usr/tmp/named.stats文件中。 --最后对named发送HUP信号,使其重新读取新的配置文件: kill -HUP `cat /etc/named.pid` HTTP服务 如果WEB的内容很少改变,把内容存储在CD-ROM中,这样可以很简单的防止黑客很 常见的喜好"篡改站点"。因为HTTPD服务有缓存页面的能力,必须保证其访问速度 不依靠CD-ROM的速度。 把"simple read-only"内容的服务从电子商务的服务器中分离出来。 请查看http://www.ciac.org/公告http://ciac.llnl.gov/ciac/bulletins/j-042.shtml, 其中对怎样更好的设置INTERNET WEB服务器做了很好的描述。 使用ServerAdmin设置WEBMASTER的电子邮件,在APACHE设置中不启用UserDir( 除非用户确实允许从他们的HOME目录发布页面),可以把ServerSignature设置值为 NO,这样可以避免泄露APACHE版本信息。不起用/manual/alias,除非你确实需要 发布APACHE的文档信息。不要启动server-info, server-status 或 perl-status 设置。 RedHat 下apache其设置如下(在RH6.1上是apache 1.3.9): --配置文件存放在/etc/httpd/conf目录下 --HTML的目录根部为/home/httpd/html --使用nobody运行apache --服务器状态(Server-stats) 和服务器信息(server-info)连接是关闭的 ------------------------------------------------ 运行系统 运行整个系统前的准备 考虑安装一脚本来检查重要守护程序的运行,安装 http://www.boran.com/security/sp/linux/monitor_processes.pl脚本文件并 把其加入到cron文件中: ## Check that important processes are running during office hours: ## [If you run 7x24, modify accordingly] 0,30 8-19 * * 1-5 /secure/monitor_processes.pl inetd sshd httpd 在应用程序安装和测试阶段,如果数据分区必须安装为读写状态,现在考虑是否 安装为只读状态。 重新初始化tripwire(或者类似的完整性检查软件)。 把系统备份两个磁带中去(即两份),一份妥善保管。 在系统上运行网络扫描器,保证只有一些自己必须的服务在运行。可以使用商业 工具ISS或者免费免费工具Nessus,nmap或者Satan来进行相应的检查,打印出结果 并保存结果。 如果可能,尽量使用多个人员来进行最后的测试,以防止忘记某些东西进行设置。 可以测试下面的工作--什么运行了?什么禁止了?检查console/log条目,你的 系统按照你的设想在工作吗,在系统开头几天经常检查LOG。 开始运转系统 详细测试,检查LOG条目,系统是否正常运行的检查? 对所有应用程序进行详细测试,通过不同的人员和不同的观点和不同的网络来 进行测试。 常规维护 下面的行为必须是每月或者每天,星期或者每小时维护,其频率依据系统的 安全程度来决定: --检查所有新出补丁的情况,更新必须的补丁,注意每个内核补丁( 在没有应用程序的机器上测试),安装一些软件确实需要的补丁,因为大多数 守护程序在主机上是关闭的。 --检查所有错误和不寻常的活动LOG记录:/var/log/* 和所有的应用程序LOG。 --写一脚本程序用于报告:重要系统PING不通,一些重要守护程序崩溃。 --经常运行tripwire(或者其他类似完整性检查)。 --订阅一些新的漏洞和安全信息的MAILLIST,可以在 http://www.cert.org/;http://www.ciac.org/;http://www.securityfocus.com 站点订阅。 ------------------------------------------------------------- 附加注意信息 上面的文章用于一些系统,当然每一个安全管理员有自己的方式来配置, 也必须要考虑每一个站点的不同来安全配置自己的站点 --RedHat提供一个自动安装的设备,并提供了一安装说明的文本,可以 很好的提示用户来安装系统,可以在下面的站点找到类似的说明: http://www.redhat.com/mirrors/LDP/HOWTO/KickStart-HOWTO.html --Mandrake:Mandrake是一个完全兼容RED HAT的LINUX发行版本,但其中 有自己独特的地方: --它提供更好的安装向导,有很好的GUI界面可以使安装更加 直观。 --ROOT的密码必须是8位的长度(应该指的是7.0的版本)。 --Mandrake提供MSEC工具包(Mandrake Security)允许你为 系统设置安全级别,但MSEC有些有趣的地方: 要改变安全级别,运行/et/security/msec/init.sh X,默认状态 X的级别是3,当我们把其转变为4的级别后重新启动 ,系统会询问一运行 级别的数字,如果输入3,系统会停止在那里知道一个关于找不到运行级别错误为止, 并且所有其他的TTYS将不可使用。 --MSEC:init.sh可以使用"custom"参数来运行,这样系统会提示一系列 安全问题并允许你想对什么样的安全条目进行安装。注意这个参数的运行会不允许 ROOT通过串行来进行登录,如果你确实需要通过ROOT来登录,你就在/etc/securetty 中加入ttyS0条目。 --Mandrake的硬件适应性:它不支持Sun SuperSPARCs,但支持UltraSPARC 版本已经是BETA版了,另外支持Compaq Alpha BETA版也以支持。 --如果发现某些工具包没有安装,可以在/mnt/cdrom/Mandrake/RPMS找到 工具包,并使用rpm -i进行安装。 --Mandrake提供一个非常漂亮的GUI工具--darkxconf:可以列出所有服务 并可以停止和继续运行服务。还可以adduserdrake --增加用户,diskdarke一个 非常优秀的磁盘分区GUI工具,drakesec允许低/中/高安全级别。 --命令行工具chkconfig可以用来启用/关闭服务,可以使用下面的方法来列 表服务:chkconfig --list ,如chk |