13.2. 介绍

保安是每个人的责任,任何系统中的弱点都可让入侵者取得对关键信息的存取权并导致整个网络的浩劫。信息安全的其中一个核心原则便是CIA三字诀,代表着信息系统的机密性(Confidentiality)、完整性(Integrity)以及可用性(Availability)。

CIA三字诀是电脑安全的基石,就如同客户与使用者期望他们的数据得到保护一样重要。例如,一个客户会期望他们的信用卡信息被安全的保存(机密性)、他们的订单不会在私底下被窜改(完整性)以及他们随时可以存取他们的订单信息(可用性)。

要提供CIA,安全专家会应用防御深度的策略。防御深度的概念是增加数个保全阶层来避免单一阶层失效便导致整个安全系统瓦解。例如,系统管理者不能直接打开防火墙与评价网路或系统的安全性,还要同时稽查帐号、检查Binary的完整性与确保未被安装恶意工具。要执行有效的保安策略,必须了解威胁以及如何抵御威胁。

什么威胁影响到电脑安全性?威胁并不仅限于在远端尝试未经授权存取系统的远端攻击者,威胁也包含员工、恶意软件、未经许可的网络装置、天然灾害、安全性漏洞甚至是公司竞争对手。

系统与网络可以被未经授权存取,有时是因为意外,或是因远端攻击者,或在某些案例中,是因商业间谍或者前员工。做为使用者,重要的是做好防范准备以及当有失误造成安全漏洞能够承认并回报可能的问题给安全团队。做为管理者,重要的是了解威胁并准备在发生时能够减缓威胁。

当要应用保安到系统上时,建议由基本帐号以及系统设定开始保全,接着确保网络层,使其遵守系统政策以及组织的安全程序。许多组织已经有涵盖科技装置设置的安全性政策,该政策应包含工作站、台式机、行动装置、手机、上线服务器、开发服务器的安全设置。在大多数案例中,也都已经有标准操作程序(SOP),当有疑虑时,请向安全团队咨询。

简介接下来的部份将说明如何在FreeBSD系统上执行这些基础的安全设置。本章接下来的部份将介绍在FreeBSD系统执行安全性政策时会用到的特定工具。

13.2.1. 防止登入

要确保一个系统的安全最好的起点便是做好帐号的稽查,确保root使用了一个强而有力的密码,并这个密码未在其他地方使用过,然后关闭任何无须登入存取权的帐号。

要关闭帐号的存取权登入有两种方法,第一种是锁定帐号,以下示例会锁定toor帐号:

# pw lock toor

第二种方法是通过将 shell 更改为/usr/sbin/nologin来阻止登录访问。只有超级用户可以为其他用户更改 shell:

# chsh -s /usr/sbin/nologin toor

/usr/sbin/nologin shell可以避免系统分配Shell给尝试登入的使用者。

13.2.2. 帐号升级授权

在有一些案例,需要与其他使用者共享系统管理权限,FreeBSD有两种方式可以处理这种情况。第一种,也是较不建议的方式,是与wheel群组的成员共享root的密码,这种方式使用者可以在需要超级使用者的存取权时输入su然后输入wheel的密码,在完成需要管理存取权的指令之后,使用应输入exit离开。要加入使用者到这个群组,可编辑/ etc/group然后加入该使用者到wheel项目的最后,使用者必须以逗号字元分隔并不可有空白。

第二种方式,也是较建议的方式,安装security/sudo套件或Port来提升权限。这个软件提供了额外的稽查、更细微的使用者控制,然后可以设定锁定使用者只能执行特定需权限的指令。

在安装之后,使用visudo来编辑/usr/local/etc/sudoers。这个示例会建立新webadmin群组,并加入trhodes帐号到该群组,然后设定该群组可重新启动apache24的存取权:

# pw groupadd webadmin -M trhodes -g 6000
# visudo
%webadmin ALL=(ALL) /usr/sbin/service apache24 *

13.2.3. 密码编码方式

密码是信息技术的必要之恶,当必须使用密码时,应要有复杂且强大的哈希机制来加密储存在密码数据库中的密码。FreeBSD支持DESMD5SHA256SHA512以及Blowfish哈希算法于其crypt()程序库。预设使用SHA512,不建议改成更不安全的哈希算法,但可改成更安全的Blowfish算法。

注意:

Blowfish不是AES的一部份且不符合任何联邦信息处理标准(Federal Information Processing Standards,FIPS),在某些环境可能不会允许使用这种加密方式。

要知道目前用何种哈希算法来加密某位使用者密码,超级使用者可以检视在FreeBSD密码数据库中该使用者的哈希,每个哈希的一开始便会以符号标示其用来加密密码所使用的哈希机制。若使用DES则开始不会有任何符号,而MD5的符号则是$SHA256SHA512的符号是$6$,Blowfish的符号是$2a$。在以下例子中dru的密码使以预设的SHA512算法加密,因为其哈希的开始为$6$。注意,该加密过的哈希,不是原来的密码,会储存于密码数据库中:

# grep dru /etc/master.passwd
dru:$6$pzIjSvCAn.PBYQBA$PXpSeWPx3g5kscj3IMiM7tUEUSPmGexxta.8Lt9TGSi2lNQqYGKszsBPuGME0:1001:1001::0:0:dru:/usr/home/dru:/bin/csh

哈希机制是设定在该使用者的登入类别(Login class),以此为例,该使用者属于default登入类别,且哈希算法是以下行设定在/etc/login.conf

        :passwd_format=sha512:\

要更改算法为Blowfish,可修改该行如下:

        :passwd_format=blf:\

然后依第 13.13.1 节 “设置登入类别”中所描述的方式执行cap_mkdb /etc/login.conf。注意,这个动作不会影响任何已存在的密码哈希,但这代表必须要求所有使用者执行passwd来更改其密码才有办法重新加密所有密码。

针对远端登入,应使用双重认证(Two-factor authentication),举例来说您同时要有某样东西,如:钥匙,以及知道某个信息,如:密码。自从OpenSSH是FreeBSD基础系统的一部份,所有来算网络的登入应透过加密过的联机且使用以密钥为基础的认证来替代密码。要了解更多信息请参考第 13.8 节 “OpenSSH”。Kerberos的使用者可能会需要多做一些额外的更改才能在其网络上使用OpenSSH,这些更改在第 13.5 节 “Kerberos中会有说明。

13.2.4. 强制密码政策

强制在本地帐号使用高强度密码的政策是系统安全的基础之一。在FreeBSD密码长度、密码强度以及密码复杂性可使用内置的可插拔认证模块(Pluggable Authentication Modules,PAM)来执行。

本节将示范如何设定密码长度下限与上限以及使用pam_passwdqc.so来强制使用混合字元的密码,此模块可在使用者更改其密码时强制要求。

要设定此模块,需要先成为超级使用者,然后取消注释在/etc/pam.d/passwd中含有pam_passwdqc.so的行。然后编辑该行来配合密码政策:

password        requisite       pam_passwdqc.so         min=disabled,disabled,disabled,12,10 similar=deny retry=3 enforce=users

这个例子会设定新密码所需符合的需求。min设定可以控制密码长度下限,它有五个值因为这个模块根据密码的复杂度定义了五种类型。而复杂度是由必须在密码中存在的字元类型来定义,例如:文字、数字、符号以及大小写,这些密码类型在pam_passwdqc(8)有详细的说明。在这个例子,密码类型的前三项为关闭的,代表不会接受只满足这些复杂度的密码,不论长度为何。12设定密码政策可接受满足三种字元类型复杂度且至少12个字元的密码,10设定密码政策接受满足四种字元类型复杂度且至少10个字元的密码。

similar设定则会拒绝以使用者前一次类似的密码。retry设定会提供使用者三次输入新密码的机会。

一这个档案储存之后,更改密码的使用者将会看到如下的信息:

% passwd
Changing local password for trhodes
Old Password:

You can now choose the new password.
A valid password should be a mix of upper and lower case letters,
digits and other characters.  You can use a 12 character long
password with characters from at least 3 of these 4 classes, or
a 10 character long password containing characters from all the
classes.  Characters that form a common pattern are discarded by
the check.
Alternatively, if no one else can see your terminal now, you can
pick this as your password: "trait-useful&knob".
Enter new password:

若输入了一个不符何密码政策的密码,则会被拒绝并显示警告,然后使用者会有机会再重试,直到超过设定的允许重试次数。

大多数密码政策会让密码在多日过后过期。要在FreeBSD设定密码年龄日期,可在/etc/login.conf中该使用者的登入类别设定passwordtime。在default登入类别已有设定示例:

#       :passwordtime=90d:\

因此,要设定此登入类别的密码在90天之后过期只需要移除注释符号(#),然后储存编辑结果并执行cap_mkdb /etc/login.conf

要在个别使用者设定期限,可将有效日期或到期的天数与使用者名称传给pw

# pw usermod -p 30-apr-2015 -n trhodes

如这个例子,有效日期的格式为天、月以及年。要取得更多资讯可参考pw(8)

13.2.5. 侦测Root工具(Rootkit)

rootkit指的是尝试未经授权取得系统root存取权的软件。一旦安装之后,这个恶意软件将可以光明正大的开启给另一个给攻击者进入的大门。现实上,一但系统已被rootkit渗透且执行了搜索动作之后,该系统就应该从头重新安装,因为即使非常谨真的资安或系统工程式也可能会遗漏攻击者留下的动西。

Rootkit 对管理者而言唯一有帮助的是:一但侦测到,便代表某处已经被渗透,但这类型的应用程序躲藏的非常好,本节将会示范一个可以用来侦测 rootkit 的工具,security/rkhunter

安装此套件或Port之后,系统便可使用以下指令检查。该指令提供许多信息且会需要手动按下ENTER确认:

# rkhunter -c

该程序完成之后,目前状态的信息便会显示在画面上。这个信息包含了已检查过多少档案、可疑的档案、可能的rootkit以及其他更多资讯。在检查的过程中,可能会产生一些有关隐藏档案、OpenSSH通信协定选择及已安装软件已知漏洞版本的通用的安全性警告、这些问题可以立即处理或在更详细的分析之后再处理。

每位管理者应了解在系统上执行了那些程序以及这些程序的用途。第三方工具如rkhuntersysutils/lsof以及原生指令如netstatps可以系统上大量的信息,记录下那一些是正常的,当有不适当的程序出现时提出疑问,然后找出答案。虽然理想要避免渗透,但也必须侦测是否已被渗透了。

13.2.6. Binary检验

检验系统档案与Binary是很重要的,因为它可以提供系统管理者与资安团队有关系统变更的信息,能够监视系统变更的软件应用程序称为入侵侦测系统(Intrusion Detection System,IDS)。

FreeBSD原生提供了基础的IDS系统,虽然每天晚上会有安全性的信件会通知管理者相关的变更,但这些信息是储存在本地的,这让恶意的使用者有机会能够修改这些信息来隐藏其对系统的变更。也因此,会建议建立一个独立的Binary签名并将这些签名储存在唯度、root拥有的目录或在可移除的USB磁盘或远端rsync服务器更好。

内置mtree工具可以对一个目录中的内容产生一个规格档,产生规格档会用到一个种子码(Seed)或常数,然后在检查规格是否有更改过时会也会需要使用这个种子码或常数。这让检查一个档案或Binary是否被修改变成可能的一件事。由于攻击者并不知道种子码,要仿冒或检查档案的校验码(Checksum)数值是几乎不可能的。以下例子会产生一组SHA256哈希,每一个在/bin的系统Binary都会有一个,并姐会将这些值以隐藏党储存在root的家目录,/root/.bin_chksum_mtree

# mtree -s 3483151339707503 -c -K cksum,sha256digest -p /bin > /root/.bin_chksum_mtree
# mtree: /bin checksum: 3427012225

3483151339707503代表种子码,这个值应要记录下来且不可给其它人看。

检视/root/.bin_cksum_mtree应会产生类似以下的输出结果:

#          user: root
#       machine: dreadnaught
#          tree: /bin
#          date: Mon Feb  3 10:19:53 2014

# .
/set type=file uid=0 gid=0 mode=0555 nlink=1 flags=none
.               type=dir mode=0755 nlink=2 size=1024 \
                time=1380277977.000000000
    \133        nlink=2 size=11704 time=1380277977.000000000 \
                cksum=484492447 \
                sha256digest=6207490fbdb5ed1904441fbfa941279055c3e24d3a4049aeb45094596400662a
    cat         size=12096 time=1380277975.000000000 cksum=3909216944 \
                sha256digest=65ea347b9418760b247ab10244f47a7ca2a569c9836d77f074e7a306900c1e69
    chflags     size=8168 time=1380277975.000000000 cksum=3949425175 \
                sha256digest=c99eb6fc1c92cac335c08be004a0a5b4c24a0c0ef3712017b12c89a978b2dac3
    chio        size=18520 time=1380277975.000000000 cksum=2208263309 \
                sha256digest=ddf7c8cb92a58750a675328345560d8cc7fe14fb3ccd3690c34954cbe69fc964
    chmod       size=8640 time=1380277975.000000000 cksum=2214429708 \
                sha256digest=a435972263bf814ad8df082c0752aa2a7bdd8b74ff01431ccbd52ed1e490bbe7

机器的主机名称、建立规格档的日期与时间、以及建立此规格档的使用者名称皆会记录在此报告当中,报告当中还会有在目录中每个Binary的校验码、大小、时间以及SHA256编码。

要检验Binary签名是否有被变更过,可使用先前产生的规格档比对目前目录的内容,然后储存结果到档案。这个指令需要当初产生原规格档所使用的种子码:

# mtree -s 3483151339707503 -p /bin < /root/.bin_chksum_mtree >> /root/.bin_chksum_output
# mtree: /bin checksum: 3427012225

这个动作应会产生与上次建立/bin规格档时产生的校验码相同,若在此目录的Binary没有被变更过,那么/root/.bin_chksum_output这个输出档将会是空的。要模拟变更,可以使用touch更改/root/.bin_chksum_output的日期然后再执行检验指令一次:

# touch /bin/cat
# mtree -s 3483151339707503 -p /bin < /root/.bin_chksum_mtree >> /root/.bin_chksum_output
# more /root/.bin_chksum_output
cat changed
	modification time expected Fri Sep 27 06:32:55 2013 found Mon Feb  3 10:28:43 2014

建议对含有Binary以及配置文件的目录建立规格档,对含有敏感数据的目录也是。通常会为/bin/sbin/usr/bin/usr/sbin/ usr/local/bin/etc/usr/local/etc建立规格档。

也有更进阶的IDS系统,例如security/aide。大多数情况mtree已可提供管理者所需的功能。将种子码与校验码结果保存在恶意使用者无法存取的地方是非常重要的一件事。更多有关mtree的信息可在mtree(8)找到。

13.2.7. 系统安全性调校

在FreeBSD,有许多系统功能可以使用sysctl调校,本节会涵盖少数可以调校来避免阻断服务(Denial of Service,DoS)攻击的安全性功能。更多有关使用sysctl的信息包含:如何暂时更改数值及如何在测试之后做永久更改可在第 11.9 节 “使用sysctl(8)调校”找到。

注意:

任何时间使用第 11.9 节 “使用sysctl(8)调校”做的设定变更都会让造成不想要的伤害的可能性上升,影响到系统的可用性。因此应要对所有的变更做监视,若可能的话,先在测试系统上实验,再到上线的系统上使用。

预设FreeBSD核心会使用安全性层级-1来开机,这又称作不安全模式,因为不可变(Immutable)档案旗标可以被关闭且可以读取或写入所有的装置。除非有使用 sysctl或在启动Script设定修改该值,否则安全性层级将会在-1。安全性层级可以在系统启动时透过在/etc/rc.conf设定kern_securelevel_enableYES以及设定kern_securelevel的值为想要的安全层级来提升。请参考security(7)以及init(8)以取得更多与这些设定及可用的安全性层级相关的信息。

警告:

提高securelevel会导致Xorg无法执行以及造成其他问题,请做好除错的准备。

net.inet.tcp.blackhole以及net.inet.udp.blackhole设定可以用来丢弃在已关闭连接埠(Port)收到的SYN封包且不会回传RST响应,预设的动作是会回传RST来表示该连接埠已被关闭,更改预设的动作可对连接埠扫描(用在查看在系统上执行的应用程序)提供一定程度的保护,要这么做可设定net.inet.tcp.blackhole2net.inet.udp.blackhole1。请参考blackhole(4)以取得更多有关这些设定的信息。

net.inet.icmp.drop_redirect以及net.inet.ip.redirect设定可以帮助避免重新导向攻击(Redirect attacks),重新导向攻击是DoS的一种,会传送大量ICMP类型5的封包,由于这些封包并不是必要的,设定net.inet.icmp.drop_redirect1以及设定net.inet.ip.redirect0可丢弃这些封包。

来源路由(Source routing)是一种侦测与存取在内部网络中不可路由位址的方法,由于不可路由位址通常是固故让它不可路由的,因此可以关闭这个功能。要关闭这个功能可设定 net.inet.ip.sourceroute以及net.inet.ip.accept_sourceroute0

当一台在网路上的机器需要传送信息给所有在子网络上的主机时,会发送ICMP响应请求信息到广播位址。然而,外部的主机是没有理由可以执行这个动作的。要拒绝所有来自外部的广播请求可设定net.inet.icmp.bmcastecho0

还有一些额外的设定在security(7)有说明。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.