1.前言 Trustix Secure Linux 是针对以高品质的服务器所设计的Linux套件,或许读者会有个疑问: 为什么已经有这么多的Linux 套件为何还要创造Trustix Secure Linux ﹖在安装了其它各式的Linux套件后,我们达成了结论,那就是有许多的套件在服务器上是不需要的,例如 X windows系统,而且很难移除掉;大部分的安装套件有许多的服务预设是在执行的,在今天的网络上有许多计算机犯罪者,执行不必要的服务就等于开了个后门,是个禁忌。 Trustix 感觉到大部分的Linux都针对于桌面市场,然而决定去创造出Trustix Secure Linux --- 一套Linux distbution,焦点放在针对于对服务器的安全上。最值得注意的就是它没有了X windows系统,图形使用者界面(GUI)将只会浪费内存,CPU和硬盘空间。系统默认值的设定是任何的服务都不执行的,更容易让人知道什么是需要什么是不需要的,需要的时候才去执行。所以Trustix Secure Linux的设计就是减少不必要的程序和把焦点放在安全上(安装程序的数目大小和安全成反比),针对一些有经验的系统管理者能在短时间内能够去安装和设定,以及让无经验的使用者容易上手。 对于更详细的Trustix Secure Linux的设计目的可以参考 http://www.trustix.net/papers/whitepaper.html。 2. 安装系统 我们可以至 http://www.trustix.net/download/ 取的最新的版本,虽然目前稳定的版本是 1.01,不过由于在Linux 2.2.16 以前版本的核心有安全上的疑虑(见http://linuxfab.cx/indexNewsData.php3?NEWSID=2134),所以笔者在此建议使用 1.0.96 (http://www.trustix.net/download/tsl1096.php3) 来安装,附带提的是要获得一个安全的 Linux 系统第一步要做的就是去获得一个有安全保证的发行商所发行的套件,所谓的安全保证应不只是现在发行的套件没有安全上的疑虑,更要有完整服务、手册、更新、电子论坛 (mail listing) 的机制,不晓得读者对国内目前发行的 Linux 套件评价有多高呢﹖原则上不管读者决定安装那一个套件,最好去原发行商处取得, 如果读者从不信任的地方取得,一定要在安装之前去查证来源码,例如 PGP/GPG 签章或 MD5 checksum,确定是安全的才去安装。这听起来好象不是很重要的样子,但它经常是许多管理者忽略的地方,导致木马、后门在系统中作祟。 由于 Trustix 是源自 RedHat,所以安装过程也是相同的,只是没有烦人的图形安装界面,使用的是文字的安装方式,只是硬盘分割区的大小和选择安装软件须由安装者自己指定,安装程序并不代劳,有时想想这也是应该的,如果系统管理者无法决定上述的选项,如何提供使用者安全的服务呢﹖至于详细的安装过程就请读者参考一下 RedHat 是如何安装的,有经验的读者可以直接略过,或参考 http://www.trustix.net/doc/installation/installation.html, http://cle.linux.org.tw/CLE/docs/manual/index.shtml。 在此笔者还是对些应注意的事项再【老生常谈】一下,假如机器上只用来当 web/email/dns 服务器,只要建立一位使用者,因此要去设 root 密码和另一个帐号。建立另一个帐号的理由是尽量少用 root 去系统上工作,而是用一般的使用者去登入,做一般各种的检查,若有需要去执行root 级的权限,再执行 ‘sudo’命令去执行 root 的工作。而且由于不太可能使用 root 帐号作为对外 Email 用,所以请将 root 的 email 透过 aliases 转给一般的使用者,免得一些漏接一些重要的警告信而不自知。 对于侵入者,要获得系统的使权限最简单的方法之一就是利用其它使用者的帐号。密码是 UNIX 安全管制作业中最重要的一部分,如果侵入者得到一个使用者的密码,可以利用这个帐号登入系统中,继而用这个帐号的权限去做他想做的事,再严重一点的,如果获得的是 root 的密码,侵入者立刻就拥有了对系统的绝对控制权,如此整个系统就落入了他人手中,后果是很严重的,因此选择一个安全的密码是很重要的。 根据某项测试结果分析一般人选用的密码有几项特性: 1. 用跟帐号相同的密码(最多)。 2. 用自己的汉语拼音。 3. 用常用的英文单字。 4. 用计算机中常出现的字,还有操作系统的命令,如:command、host、copy….。 5. 简单的数字,例如12345、23232、888…等等。 6. 用自己出生日期,如:19791008。 选择密码的原则就是让人永远猜不到,这样可以让侵入者痛苦地不断猜测密码,即使是用字典法(暴力破解法)也无辄。(注一) · 不要使用跟帐号一样的密码。 · 不要使用任何人或任何东西的名称。 · 不要使用英文单字、或外文单字,或任何字的缩写。 · 不要使用从讨论计算机安全的书上看到的、用来举例的密码,不论它有多好。 · 使用数字和大小写字母混合的密码。 · 至少使用六个字母的密码。 · 不要使用帐户拥有者的个人相关资料,例如,不要使用姓名前缀缩写、电话号码、身分证号码、工作职称、单位名称等等。 · 不要使用键盘字母的排列顺序,如asdf。 · 不要使用上面各项的反序,或大写形式,或类似的变化。 · 不要使用全部是数字的密码。 · 使用看似随机选取的字母和数字。 在基本的安装及重新开机完成之后,然后要去做必需的 patches (修补)和增加必需的应用软件。首先,必需去下载及去应用 patch (修补),以 Trustix 为例在 ftp://ftp.trustix.com/pub/Trustix/updates/ 中,以 Redhat6.1 为例,那些 patch 档能够在 http://www.redhat.com/errata 中找到。那些 patch 檔有三种不同的形式,包含:安全咨询 (security advisories)、错误修正 (bug fixes) 及套件更新 (package updates)。接着在命令列下执行: rpm - Uvh filename.rpm 并且记得定时到网站去看看有没有新的修补档案,还要订阅相关的邮件论坛,例如有 tsl-announce, tsl-discuss, tsl-testers 详细的资料请参考 http://www.trustix.net/support/。 另一个要讨论安全问题的就是 LInux LOader (LILO),LILO 是激活管理程序,当一台计算机要使用许多种操作系统时,就可以用 LILO 来管理,LILO 也能够提示符号中去输入参数。 LILO 通常在安装完之后就大概会被忘记,然而它却存在着安全的危险,因为可能有恶意的使用者可以经由不同的LILO参数去通过安全的手段进而取得读者的系统。举例来说,如果有使用者在LILO的提示符号中输入这样的参数: linux init=/bin/sh 然后这个参数允许使用者直接去激活 linux 并且给予使用者 root 的权限(尽管它是在只读的型式)而不需要密码。因为可能会发生上述的事件,所以必须去对 LILO 做限制,这个控制包含在 /etc/lilo.conf 档案中,理想上这 /etc/lilo.conf 档案应该如下列所设定的一样: Boot=/dev/had map=/boot/map install=/boot/boot.b Prompt timeout=10 image=/boot/vmlinuz-2.2.12-20 label=linux initrd=/boot/initrd read-only root=/dev/hda1 restricted password=PASSWORD 结果为: LILO boot: Password: 这个例子中设定时间为 1 秒,如果没有命令参数在 1 秒内输入的话,它就会继续去激活预设的设定去开机,这样子就没有机会去输入参数。在这档案中另外一个重要的地方就是使用者必需要去输入密码,密码就是存放在这个档案中,可以任意去改变,格外要注意的是它的权限必须改成640,避免被人去读取,只能由 root 去读写这个档案。执行: chmod 640 /etc/lilo.conf 为了读者的 Linux 主机变的更安全,还有许多额外的步骤要去执行。首先必需要做的是对系统帐号对安全管制,在 /etc/passwd 档案中包含了许多预先设定好的帐号,这些帐号包括 gopher, news, mail, ftp 等等仅仅为了软件使用权等目的而设置,在这建议读者将这些帐号通通移除或用 ‘#‘ 批注掉。 在此有些帐号会没有去设定密码,必须要确定每个帐号都有密码保护着。执行下面指令,可以找出 /etc/passwd 中没有密码保护的帐号: awk –F: ‘$2 == “”’ /etc/passwd
当修改了 /etc/passwd 时,也必需去检查影子密码文件(shadow passwords),可以去执行 “pwconv“ and “grpconv“ 命令,去读取 /etc/passwd 檔,产生 shadow 档案出来。 注一:字典法 在passwd档里,使用crypt加密,过程为 1. 以明码正文形式取出密码。 2. 把密码做为关键词,用一系列0进行加密。 3. 把一个64位二进制值转变成56位变量基础的唯一的64位二进制值,作为关键词再加密。 crypt加密随机性大,56位关键词存在可为7x10E16个,所以要逆向译码是不可能的。使用比较法: 1. 获得一个字典文件,它是一个单字表。 2. 把单字用用户的加密程序加密(符合DES的标准)。 3. 把每个单字加密后的结果与目标加密后的结果进行比较,如果 符合,则该单字就是加密关键词,也就是密码。 这就是所谓的字典法。 3. 档案权限 Linux 档案系统跟其它的 UNIX 系统非常相似,每个档案都有它的权限在,包含:读取、写入、执行等3种权限。和大部分的 UNIX 一样,档案和目录权限会产生问题及被有心人利用来破坏或窃取读者宝贵的资料,所以系统上档案和目录必须设权根,只能给有权根的使用者去读取、写入和执行。 Read:该档案或目录可以被读取,对目录来说读取权限可以允许使用者去查看目录的内容,但不能对目录内的档案进行读取。 Write:该档案或目录可以被写入,对于目录来说,写入是指在此目录区中建立、删除档案及改名的能力,要注意的是移除档案的能力并不是由档案的权限控制的,而是由包含该档案的目录权限位所控制。 Execute:该档案或目录可以被执行(被搜寻),对目录而言是指允许该目录区能被搜寻的权限,即查看目录中档案的权限。 执行已编译的可执行档只需要设定该档案的执行权限即可,但执行 shell 指令文件则必需同时需要设定读取和执行两种权限,因为 shell 必须先能够从档案中读取指令,再去执行以 /bin/mount 这个档案举例来说(这档案是用来挂上某些装置,如 CD-ROM),它标准的权限是 -rwsr-xr-x,表示一般的使用者能够去执行这个档案。从安全的观点来看,一般的使用者不应该能够去执行这个档案。就这点来看,有许多系统的档案是被滥用的,谁都可以去执行。 不用说,最基本的就是去讨论重要的目录(例如:/etc, /bin, /usr/sbin, /usr/bin 等等) 和检查档案和目录是否有适当的权限,如果没有,赶快改成适当的权限。 去寻找所有使用者皆可以写入的档案: find / -perm –2 -print 去寻找不属于任何使用者的档案: find / -nouser –print 在 Linux 系统中,检查未经授权的 SUID 程序是相当重要工作,由于这些程序会授予执行它们的使用者特殊的权限,因此程序编写不当的话很可能会使得系统上的安全出现漏洞,因此管理者必需要去知道系统中所有 SUID 的档案。例如 /usr/bin/passwd 的权限设定: ls –l /usr/bin/passwd -r-s—x—x 1 root root 34828 Jun 6 13:48 /usr/bin/passwd 在使用者权限中有个 s 取代了 x,代表设定了 UID 位,这个档案只能由 UID 为 0 (即 root )才能执行。如果要把档案加入 SUID,执行: chmod 4000 file 执行下列命令去寻找SUID档案: find / -type f -perm +6000 -exec ls -l {} ; > suidfiles 这将会把 SUID 档案所有清单输出到 suidfiles 档案中,接着应该详细检查其中的每一个档案,确定它们是否确实应该拥有这些权限,尤其是在重要目录下的档案,更要注意。 4. 安全的服务 一般网站安全上会出现问题常是因为提供原来没有打算提供的服务而不自觉,因为有些服务是操作系统安装时预设安装的,如果这台主机在规划时并不打算提供 telnet 的服务,那应该先将该服务停掉,减少利用该服务出现的安全漏洞入侵的风险。 要针对上述的安全议题加以防范就必须了解网站的主机到底提供哪些服务﹐再针对个别的服务加以注意相关的安全议题。一般的网站管理者通常不会从外部来扫描自己管理的网站,但是面对来自世界各地的封包,其中就有不少是试探性的扫描,如果别人比读者更清楚网站所提供的服务,无疑将网站放在比较危险的情况之下。 因为如此,必需要去移除任何不需要的服务,首先要去检查的地方是 /etc/inetd.conf 这个档案,在命令列中执行: grep –v “^#” /etc/inetd.conf 会列出在inetd.conf中所开启的服务
看上面有什么服务是可以关掉的就关掉(用#批注掉),以增加安全性。而在 trustix 中是预设所有都关闭的。 然后去检查指令文件中不必要的服务,在 Trustix/RedHat 中的 /etc/rc.d 目录中又分出许多个副目录,init.d 和 rc0.d 到 rc6.d。 0-6 是指系统的执行等级或是执行 /usr/sbin/setup 来检查系统上所有可执行的服务,或是执行 ps aux | wc -l 查看目前系统上正在执行的服务。当执行完上列的步骤后,只要记住从安全的观点来看,愈少的激活指令文件执行,对读者的系统愈安全。 4.1 SSH 在 Trustix Secure Linux 中使用 ssh 来代替 telnet 做远程登入的工作,在使用 telnet 时,它是可被窃听的,但使用 ssh 的过程中是经过编码加密的,安全性较高。激活 sshd server,执行 setup 后,选择 System services 后,如下图选取 sshd。
执行 /etc/rc.d/init.d/sshd start 激活 sshd。 执行 ssh -l user hostname 例如: 至于 SSH 的详细使用方法如下: ssh [-l login_name] [hostname | user@hostname] [command] ssh [-afgknqtvxCPX246] [-c blowfish | 3des] [-e escape_char] [-i identity_file] [-l login_name] [-o option] [-p port] [-L port:host:hostport] [-R port:host:hostport] [hostname | user@hostname] [command] sshd 为执行 ssh 的 daemon,在读者使用 ssh 之前必须去激活 sshd,在此建议把它加在 /etc/init/rc.local 中,在每次开机时激活。 在执行 sshd 之前可以指定它的 port,例如:sshd –p 999 若有安装 SSL,可以指定 SSL 的 port 443,例如:sshd –p 443 这样就可以经过 SSL 及 SSH 双重的保护,但必须去指明使用的 port ssh –l user –p 443 mouse.oit.edu.tw 才行,若不指明则仍然使用预设的port 22 ssh 选项: -l login_name 指定登入于远程机器上的使用者,若没加这个选项,而直接打 ssh lost 也是可以的,它是以读者目前的使用者去做登入的动作。 例如: ssh –l shie mouse.oit.edu.tw -c blowfish|3des 在期间内选择所加密的密码型式。预设是3des,3des(作三次的资料加密) 是用三种不同的密码键作三次的加密-解密-加密。 blowfish 是一个快速区块密码编制器,它比3des更安全以及更快速。 -v Verbose 模式。使ssh 去印出关于行程的除错讯息,这在连接除错,认 证和设定的问题上有很的帮助。 -V 显示版本。 -a 关闭认证代理联机。 -f 要求ssh 在背景执行命令,假如ssh要询问密码或通行证,但是使用者 想要它在幕后执行就可以用这个方式,最好还是加上-l user 例如在远程场所上激活 X11,有点像是 ssh –f host xterm 。 -e character 设定跳脱字符。 -g 允许远程主机去连接本地指派的 ports。 -i identity_file 选择所读取的 RSA 认证识别的档案。预设是在使用者的家目录 中的 .ssh/identity 。 -n 重导 stdin 到 /dev/null (实际上是避免读取 stdin)。必须当 ssh 在幕后执 行时才使用。常见的招数是使用这选项在远程机器上去执行 X11 的程序 例如,ssh -n shadows.cs.hut.fi emacs &,将在 shadows.cs.hut.fi 上激活 emace,并且 X11 连接将自动地在加密的信道上发送。ssh 程序将把它放 在幕后。(假如ssh需要去询问密码时,这将不会动作) -p port 连接远程机器上的 port。 -P 使用非特定的 port 去对外联机。如果读者的防火墙不淮许从特定的 port去联机时,就可以使用这个选项。注意这个选项会关掉 RhostsAuthentication 和 RhostsRSAAuthentication。 -q 安静模式。把所有的警告和讯息抑制,只有严重的错误才会被显示。 -t 强制配置 pseudo-tty。这可以在远程机器上去执行任意的 screen-based 程 式,例如操作 menu services。 -C 要求压缩所有资料(包含 stdin, stdout,stderr 和 X11 和 TCP/IP 连接) 压缩演算规则与 gzip 相同,但是压缩的等级不能控制。在调制解调器或 联机速度很慢的地方,压缩是个很好的选择,但如果读者的网络速路很 快的话,速度反而会慢下来。 -L listen-port:host:port 指派本地的 port 到达端机器地址上的 port。 -R listen-port:host:port 指派远程上的 port 到本地地址上的 port。 -2 强制 ssh 去使用协议版本 2。 -4 强制 ssh 去使用 IPv4 地址。 -6 强制 ssh 去使用 IPv6 地址。 scp 使用 scp 在远程机器上 copy 档案 例如: copy 本地的档案到远程的机器上 scp /etc/lilo.conf
[email protected]:/home/k 会将本地的 /etc/lilo.conf 这个档案 copy 到 net67.ee.oit.edu.tw,使用者 k 的家目录下。 copy远程机器上的档案到本地来 scp
[email protected]:/etc/lilo.conf /etc 会将 net67.ee.oitdu.tw 中 /etc/lilo.conf 档案 copy 到本地的 /etc 目录下。 保持从来源 host 档案的属性 scp –p
[email protected]:/etc/lilo.conf /etc 在此必须注意使用者的权限是否可读取远程上的档案,若想知道更多关于 scp 的使用方法,可去看看 scp 的使用手册。 ssh-keygen 产生公开钥 (pulib key) 和私人钥 (private key),以保障 ssh 联机的安性, 当 ssh 连 shd 服务器,会交换公开钥上,系统会检查 /etc/ssh_know_hosts 内储存的 key,如果找到客户端就用这个 key 产生一个随机产生的session key 传给服务器,两端都用这个 key 来继续完成 ssh 剩下来的阶段。
它会产生 identity.pub、identity 两个档案,私人钥存放于identity,公开钥 存放于 identity.pub 中,接下来使用 scp 将 identity.pub copy 到远程机器的家目录下.ssh下的authorized_keys。 .ssh/authorized_keys(这个 authorized_keys 档案相当于协议的 rhosts 档案), 之后使用者能够不用密码去登入。RSA的认证绝对是比 rhosts 认证更来的安全可靠。 执行: scp identity.pub
[email protected]:.ssh/authorized_keys
若在使用 ssh-keygen 产生钥匙对时没有输入密码,则如上所示不需输入密码即可从 net67.ee.oit.edu.tw 去登入 linux1.ee.oit.edu.tw。在此,这里输入的密码可以跟帐号的密码不同,也可以不输入密码。 4.2 邮件服务器 由于 sendmail 在历史上曾有相当多的漏痛,所以 Trustix 选择邮件传输代理 (MTA)—Postfix,当作它的 mail 服务器,因为 Postfix 是基于安全而设计的,它也包含了 IMAP 和 POP daemon。安全的 IMAP(SIMAP)、POP3(SPOP3) 一般来说是比标准的 IMAP、POP3 来的更好,由于在使用这个协议时的资料 (使用者的密码和 E-mail) 经过网络传输是经过编码加密的,所以对数据比较有保障。 4.2.1 安装和设定 如果读者在安装 Trustix Secure Linux 时并没有选择 Mail Server,读者可以在之后 mount CD-ROM 去安装,或从 FTP、HTTP 下载 Postfix 的 rpm 档去安装。为了确定可以执行 postfix,可以打 ‘chkconfig postfix on’。 4.2.2 转寄root的信件 寄给 root 的信件必须转寄给系统的管理者,编辑 /etc/postfix/aliases 这个档案,在里面找到下面这一行: #root: you 将批注删除,并把 you 改为系统的管理者,之后将 aliases 复制到 /etc 下,执行 newaliases 指令,此指令会自动读取 /etc/aliases 文件的内容,让 aliases 生效。接下来请将该档放置一般使用者无法读取的地方。 4.2.3 读取信件 在 /etc/inetd.conf 中可以找到下列几行内容,现在邮件主机都是开 POP(Post Office Protocol)server 的功能,透过收信程序 (Outlook) 不断地向主机询问,使用者可以将 E-mail 从主机取回自己的计算机中阅读或保存,这对于以调制解调器联机的使用者而言,有不少的方便,或读者也可以开 imap 的 server。将 pop-3 这行的批注 ‘#‘ 给删除,执行 /etc/rc.d.d/init.d/inetd stop ;/etc/rc.d/init.d/inetd start 或是重开机即可。
4.2.3 设定 /etc/postfix/main.cf -- postfix 的设定档 在里面找到下列几项的内容: #myhostname = host.domain.name => myhostname = net28.ee.oit.edu.tw 设定读者的hostname #mydomain = domain.name => mydomain = ee.oit.edu.tw 设定读者的domain name #myorigin = $myhostname => myorigin = $myhostname 设定寄出信后所附加的 hostname,预设是$myhostnam ex:改为 myorigin = net99.ee.oit.edu.tw,则 k 所寄出的信件来源 为
[email protected],而不是 net28.ee.oit.edu.tw inet_interfaces = localhostinet_interfaces = all 设定在主机上激活的网络接口,在此将所有接口打开 #mydestination = $myhostname, localhost.$mydomain #relay_domains = $mydestination 如果读者要读者的服务器去让别的 domains 去 mail,加上 domains 到 mydestination 中,及删除 ‘#‘ 4.2.4 加密的邮件交换机 在 Trustix Secure Linux 中有一支程序”stunnel”能够在 inetd 上执行的服务上去产生 SSL 加密信道。在这里建议读者取代某些服务,例如未经过加密的 imap 和 pop3,改为 simap 和 spop3,若使用未经过加密的 imap 和 pop3,在收发 mail 时会去检查使用者、密码,这时的使用者、密码是没有加密的,可以被人用 sniffit 这支程序去窃听到,造成系统上的一大后门。例如下图即是没有使用一般的 imap 或是 pop3 而未经过 SSL 加密过的,使用者及密码可是一清二楚的呈现在读者的面前..... 在使用 stunnel 之前,读者必须去产生【认证】。许多安全的服务使用 OpenSSL 去达到加密的目地。首先读者需要去产生服务器认证和加密的 key,依下列步骤执行: 1. 切换目录 cd /etc/ssl/certs 2. 执行 RANDFILE=/dev/urandom openssl req –new –x509 –nodes -out server.pem –keyout server.pem –days 365 如下图中,输入本身的资料。
这会产生 RSA 私人的 key 和认证,并且把它放在 server.pem 这个档案中。 3. stunnel 能够被手动或是从 inted 激活,下面是手动的命令: /usr/sbin/stunnel –p /etc/ssl/certs/server.pem –d spop3 –l /usr/sbin/ipop3d -p 告诉程序去寻找它的认证在哪里 -d 使它在spop3的埠成为daemon在执行 -l 说明什么程序产生信道 4. 这个命令能够放在 /etc/rc.d/rc.local 中,使它每次开机时可以激活。 5. 设定outlook 在内送邮件-POP3(I)打勾,使用安全联机 SSL,预设的 port 是 995。
在设定完后,一样是收发 mail,读者可能感觉不到什么,但读者的 E-mail 的帐号、密码却是却是经过编码加密的。例如下图即是使用 spop3,是经过 SSL 加密过的,只看得到一堆的乱码,这读者就知道它的优点在哪了。
4.3 Apache-SSL Trustix 预设有 Apache-SSL,只要激活 /etc/rc.d/init.d/httpsd start 即可。 4.4 Ftpd 相同的由于 wu-ftpd 在历史上曾有相当多的漏洞,所以 Trustix 选择 ftpd-BSD 当作它的 ftp 服务器,只要激活 /etc/rc.d/init.d/ftpd start 即可。 结语 OSS 的安全问题虽然要比 Close System 好的许多,但是最重要的仍是取决于管理者的手上,有没有随时关心网络上的消息,随时监看系统的记录,并加以更新捕洞,希望笔者介绍的 Trustix 能让管理者的负担减轻些