Debian 有一个由五名成员和两位秘书组成的安全小组, 来处理 stable 发行版的安全问题. 处理安全问题意味着他们要跟踪记录软件出现的问题(查看论坛譬如 bugtraq, 或 vuln-dev) 并确定 stable 版是否受其影响.
同时, Debian 安全小组, 也是与上游开发者或组织进行问题协调的接触点, 如类似 CERT 可能有广泛影响的供应商. 也就是说, 当问题不在 Debian 时, 有两种方法与安全小组取得联系:
team@security.debian.org
其唯一的阅读者就是安全小组的成员.
security@debian.org
阅读者是 Debian 所有的开发者(包括安全小组).
发送到这个列表的邮件将不会在互联网上公布(这不是一个公开的邮件列表).
敏感问题应当发送到第一个地址, 并且在某些情况下, 应当使用 Debian 安全小组的公钥加密 (key ID 363CCD95).
一旦一个可能的问题被安全小组接受, 将会被调查其是否对 stable
版造成影响, 如果是, 将会做一个基于源代码的修复.
这修复有时包括上游制作的移植补丁(它通常比 Debian 发行的要高几个版本).
修复通过测试后, 将会准备新的软件包, 并在 security.debian.org
站点上发布,
这样就可以通过 apt
获取(见 进行安全更新, 第 4.2 节). 同时,
将会在web站点上发布Debian 安全公告(DSA), 并将其发送给包括 debian-security-announce
和 bugtraq 在内的邮件列表.
其它有关 Debian 安全小组的常见问题可以参阅有关 Debian 安全小组的问题, 第 11.3 节.
每当发现一个 Debian 软件包的安全漏洞时, 就会发布 Debian 安全公告. 公告由安全小组成员之一签署, 其包括版本影响信息和其 MD5sums. 此信息是:
DSAs 将在 Debian
主服务器的首页
, 和 Debian s安全页面
公布.
只有在网站重建时(每天一次)才发生这种情况, 因此它们并不能被及时公布.
更好的途径是通过 debian-security-announce 邮件列表来获取公告.
然而感兴趣的用户可以, (需要通过一些 Debian 相关端口来完成)使用 RDF
频道去自动下载 DSAs 到他们的计算机. 一些应用程序,譬如 Evolution
(电子邮件客户和个人信息助理) 和 Multiticker
(一个GNOME附属程序),可以用来自动获取公告. RDF 频道可以由 http://www.debian.org/security/dsa.rdf
处获得.
在网站上公布的 DSAs 也许在发送到公共邮件列表之后更新. 一次普通的更新将会添加对安全漏洞数据库交叉参考. 其它语言的译文[33]不会发送到安全邮件列表, 而是直接张帖在网站上.
Debian 提供一个包括所有自1998年以来所有发布公告的可用参照在内的完整的 crossreferenced
table
. 这个表是 reference map
available at CVE
的一个补充.
您会将会注意到这个表如 CVE 一样为 url
id="http://www.securityfocus.com/bid" name="Bugtraq">,
CERT/CC Advisories
和 US-CERT Vulnerability Notes
Database
提供了数据库参考. 这些参考方便使用,
只有CVE参考进行周期性的审核和引用. 这个特性是2002年6月添加到网站的.
添加交叉参考到漏洞数据库的一个优点是:
Debian 安全公告于2004 年2月24 日 Debian Security Advisories were 宣布通过CVE兼容认证
[34].
Debian 的开发者理解提供准确及时的有关 Debian 发行版安全信息的需求,
以及允许有户处理最新安全漏洞的风险. CVE 可以使我们能够为用户开发 启用
CVE的安全管理过程
提供规范的参考.
Common Vulnerabilities and Exposures
(CVE)
项目由 MITRE Corporation 负责维护,
并提供漏洞和安全问题的规范化名称列表.
Debian 相信为用户提供影响 Debian 发行版的安全问题的附加信息是非常重要的. 在公告中 CVE 名称有助于用户了解漏洞与某个 Debian 安全更新的关系, 这有助于减少花费在处理影响我们用户的漏洞上的时间. 同时, 也使得对于部署了支持 CVE 的安全工具的环境的安全问题的管理变得简单 - 譬如基于网络或主机的入侵检测系统, 或漏洞评估工具, 不管它是不是基于 Debian 发行版的.
Debian 从2002 年6月开始在 DSA 中提供 CVE 名称的, 现在为所有1998年9月以后发布的
DSA 提供 CVE 名称. 所有的公告,以及与新的安全漏洞相关的声明, 都能从 Debian 的
web 站点上获取, 它包含对应的 CVE 名称, 如果当时已经公布了的话.
带有CVE名称的公告可以通过 搜索引擎
直接搜索.
想要查询某个特定 CVE 的有户可以通过使用 debian.org 上提供的搜索引擎查询到与该
CVE 名称相关的公告(英文的或翻译成其它语种的). 每次可以使用具体的名称(比如
advisory CAN-2002-0001
)
或名称的一部分(如查询2002年所有的公告就搜索 CAN-2002
).
注意, 当您检索公告时, 应到同时输入单词 advisory 和 CVE 名称,
这样就可以只检索安全公告.
在某些情况下您也许在发布的公告中不能找到指定的 CVE 名称, 或许因为:
安全问题
被提交了,但是修复还没有测试和上载)
因为当前的 Debian 支持大多数的平台, 管理员有时想知道是不是某一平台的安全更新比其它平台需要更多的时间. 事实上除了极罕见的情况外, 所有平台都是同事更新的.
以前, 安全更新是手工完成的, 但是现在不是了(就如 Anthony Towns
在2002年6月8日发给 debian-devel-announce 邮件列表的 一封邮件
中描述的那样.)
软件包是由安全小组完成上载的(并在完成上载后十五分钟内附带上载到 security.debian.org:/org/security.debian.org/queue/unchecked
或 ftp://security.debian.org/pub/SecurityUploadQueue
一个用于检查签名的补丁, 完成后, 它们将被加入自动构建清单(这不再是每日的事务).
因此,软件包可以自动在它们被上载后的三十分钟货一个小时内完成基于各个平台的构建.
然而, 安全更新与平时的软件维护者完成的上载稍有不同, 在某些情况下, 在公布以前,
需要等待进一步测试, 得到测试报告, 或者需要等待一个周, 或者更久的时间,
以避免与软件的原始开发者修正这一错误发生冲突.
因而, 安全更新工作包括一下步骤(称作 "Accepted-Autobuilding"):
dpkg-scanpackages
,
dpkg-scansources
...)更新软件包, 源代码并在 security.debian.org
上发布文件
早先由手工完成的这些工作, 被测试后进入处于冻结阶段的 Debian 3.0 woody(2002年7月). 感谢这种机制, 使得安全小组可以在不到一天的时间内为所有的(大约二十种)平台更新 apache 和 OpenSSH.
此邮件是由 Wichert Akkerman 寄发了到 Debian-devel-announce
邮件列表
的, 描述了 Debian
开发者在处理他们的软件包中的安全问题时所做的工作.
其发表的目的即是为了开发者的利益,
同时也是为了用户更好的理解Debian中对于安全问题的处理.
请注意此处的更新参考源自Debian
开发者参考手册
不久将被删除.
如果开发者获知在他的或别人的软件包里存在一个安全问题, 则总应当与安全小组取得联系(通过team@security.debian.org). 他们将跟踪记录未解决的安全问题, 可以帮助维护者解决安全问题, 或者由他们自己解决, 并负责发送安全公告和维护security.debian.org.
请注意只有发行版才有安全公告, 测试版(testing), 非稳定版(unstable) (详见 对于 testing 和 unstable 版本其安全问题如何操作?, 第 11.3.7 节), 或旧的发行版(详见我使用的是旧版的 Debian, 还能从 Debian 安全小组获取支持吗?, 第 11.3.8 节) 是没有的.
开发者有几种获取安全问题的途径:
其中源自第一二项的信息是公开的, 并且需要尽快修补. 源自最后一项的信息可能不是公开的, 有几个可能的选择来处理这类问题:
不管何种途径, 如果某人要求不应向外透露其报告的问题, 则应当尊重其选择, 当然告知安全小组则明显不在此列(开发者应当确保其告诉安全小组的信息不会被泄露).
请注意如果需要开发者可以不把修复上载到 unstable区(或其它地方), 因为 unstable 的更新日志是公开的.
即使被请求/必须保密, 仍有两种情况需要公布这些信息:问题长期为人所知,或信息已经公开化.
为修补安全问题构建一个软件包的最重要的原则是尽可能少的产生变动. 人们通常依靠于发行版已构建的软件包, 因此其任何变动都有可能造成系统崩溃, 特别是对于库包: 开发者必须确保其没有修改 API 或 ABI, 即使是很细微的变动.
这意味着, 更新为一个新的上游版本并不是一个好的解决方法, 相反移植(backport)应该是更好的选择. 通常如果需要, 上游维护者是愿意提供帮助的, 即使不是 Debian 安全小组也能提供帮助.
在某些情况下是不可能通过移植来解决安全问题的, 例如大部分的原代码被修改或重写. 如果是这种情况, 则可能必须转向一个新的上游版本, 但是这必须有安全小组来预先协调.
与此相关的其它几个重要方面: 开发者必须对每次改动都进行测试. 如果是 exploit, 则开发者应当尝试确认是否只能在未打补丁的软件包上成功, 而在修补了的软件包上则不行. 开发者还应当测试一下一些常用的操作,有时候,安全修复会影响到软件的基本功能.
最后, 开发者应当记住几条技术方面的事项:
在开发开发者完成生成并测试了新的软件包后, 就需要将其上载, 这样就可以被安装到归档区中. 应上载到的安全上载区是 ftp://security.debian.org/pub/SecurityUploadQueue/ .
一旦安全队列中的一个上载被接受, 软件包将自动完成基于所有平台的构建, 并存储安全小组的确认.
等待接受或确认的上载只能由安全小组访问. 这是必须的, 因为这也许是对无法被透露的安全问题的修补.
如果安全小组的成员接受了一个软件包, 其将被安装到 security.debian.org 并在 ftp-master 或 non-US 归档区进行适当的 <codename>-proposed-updates .
安全公告由安全小组撰写和张贴. 但是他们也不介意有维护者为他们提供(一部分)文本. 在安全公告中应当提供的信息请参阅Debian 安全公告, 第 7.2 节.
本部分也可以"如何安全升级/更新您的Deian GNU/Linux系统"冠名, 它基本上应该作为一个独立的部分因为它是安全机制中很重要的一部分. 软件包签名是为避免镜象中发布的软件包被篡改和下载被中间攻击很重要的一环. 自动软件更新是一个很重要的特性, 但是移除在更新期间有助于木马分发和攻陷系统的威胁也很重要 [35]
就象现在(2003年 2月) Debian 并未为发行版提供签名的软件包, 并且 woody 发行版(3.0)也未继承此特性. 对于单个的软件包在下一个发行版(sarge)中将会, 有希望, 也许, 能够得到解决.
这个问题在V. Alex Brennen提供的 Strong
Distribution HOWTO
中有更详细的描述.
当前使用 apt
进行软件包签名检测的计划是:
下边的 MD5 sums apt
可以完成对于源自某个发行版的单个的软件包的校检.
这与对每个软件包签名相比不太灵活, 也许会与这个计划结合(参见下面).
当前, 在 apt 0.6 中完全提供
了这个方案, 这是一个 实验版本 发布. 其改变是基于实验版本提供的用于
apt
(可由 Bug
#203741
处获取) 的补丁. 请将其检出, 并为 BTS
提供用于将此包含到主发行版中的信息, 因为它仍然需要大量的测试.
注意, 使用实验版的 apt 并不需要特别的设置, 除非您使用的是 non-Debian 的源, 这时
apt-get 则需要一些而外的设置. 可以通过在 non-Debian 源中提供 Release 和
Release.gpg 来避免这中情况. Release
文件可由apt-ftparchive
(apt-utils 0.5.0或更高版本中提供)生成
Release.gpg 文件仅是一个附加签名. 下边简单的步骤可以生成这两个文件:
$ rm -f dists/unstable/Release $ apt-ftparchive release dists/unstable > dists/unstable/Release $ gpg --sign -ba -o dists/unstable/Release.gpg dists/unstable/Release
apt-key
为 apt 的 keyring 添加了新的 key, 默认只包括当前 Debian
归档区的签名 key.
在Debian]中的软件包签名已经被讨论了相当一段时间了, 更多信息参见: http://www.debian.org/News/weekly/2001/8/
和 http://www.debian.org/News/weekly/2000/11/
.
如果您现在就想使用附加的安全检测, 而又不愿使用实验版的 apt(虽然我门非常希望对其进行检测), 则可以使用 Anthony Towns 提供的下边这个脚本. 此脚本可以自动完成一些新的安全检测, 使得用户可以确认其下载的软件与 Debian 发行的相匹配. 这样就阻止了 Debian 开发者不负责的 通过提供上载到主归档, 或者镜象区, 的软件破坏别人的系统, 这与 Debian, 或其镜象提供带有已知漏洞的过期 unstable 拷贝不同.
示例代码,将其命名为 apt-check-sigs
, 可以通过下边的方法使用:
# apt-get update # apt-check-sigs (...results...) # apt-get dist-upgrade
首先, 您需要:
http://ftp-master.debian.org/ziyi_key_2003.asc
并将其添加到 ~/.gnupg/trustedkeys.gpg
(gpgv
默认使用的文件).
gpg --no-default-keyring --keyring trustedkeys.gpg --import ziyi_key_2003.asc
/etc/apt/sources.list
中所有没有正常使用 "dists"
的行, 或者修改脚本,以便对它们有效.
这是 apt-check-sigs
的示例代码,最新的版本可从 http://people.debian.org/~ajt/apt-check-sigs
处获取. 此代码当前为 beta 版, 更多信息参见 http://lists.debian.org/debian-devel/2002/debian-devel-200207/msg00421.html
.
#!/bin/bash # Copyright (c) 2001 Anthony Towns <ajt@debian.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. rm -rf /tmp/apt-release-check mkdir /tmp/apt-release-check || exit 1 cd /tmp/apt-release-check >OK >MISSING >NOCHECK >BAD arch=`dpkg --print-installation-architecture` am_root () { [ `id -u` -eq 0 ] } get_md5sumsize () { cat "$1" | awk '/^MD5Sum:/,/^SHA1:/' | MYARG="$2" perl -ne '@f = split /\s+/; if ($f[3] eq $ENV{"MYARG"}) { print "$f[1] $f[2]\n"; exit(0); }' } checkit () { local FILE="$1" local LOOKUP="$2" Y="`get_md5sumsize Release "$LOOKUP"`" Y="`echo "$Y" | sed 's/^ *//;s/ */ /g'`" if [ ! -e "/var/lib/apt/lists/$FILE" ]; then if [ "$Y" = "" ]; then # No file, but not needed anyway echo "OK" return fi echo "$FILE" >>MISSING echo "MISSING $Y" return fi if [ "$Y" = "" ]; then echo "$FILE" >>NOCHECK echo "NOCHECK" return fi X="`md5sum < /var/lib/apt/lists/$FILE | cut -d\ -f1` `wc -c < /var/lib /apt/lists/$FILE`" X="`echo "$X" | sed 's/^ *//;s/ */ /g'`" if [ "$X" != "$Y" ]; then echo "$FILE" >>BAD echo "BAD" return fi echo "$FILE" >>OK echo "OK" } echo echo "Checking sources in /etc/apt/sources.list:" echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" echo (echo "You should take care to ensure that the distributions you're downloading" echo "are the ones you think you are downloading, and that they are as up to" echo "date as you would expect (testing and unstable should be no more than" echo "two or three days out of date, stable-updates no more than a few weeks" echo "or a month)." ) | fmt echo cat /etc/apt/sources.list | sed 's/^ *//' | grep '^[^#]' | while read ty url dist comps; do if [ "${url%%:*}" = "http" -o "${url%%:*}" = "ftp" ]; then baseurl="${url#*://}" else continue fi echo "Source: ${ty} ${url} ${dist} ${comps}" rm -f Release Release.gpg lynx -reload -dump "${url}/dists/${dist}/Release" >/dev/null 2>&1 wget -q -O Release "${url}/dists/${dist}/Release" if ! grep -q '^' Release; then echo " * NO TOP-LEVEL Release FILE" >Release else origline=`sed -n 's/^Origin: *//p' Release | head -1` lablline=`sed -n 's/^Label: *//p' Release | head -1` suitline=`sed -n 's/^Suite: *//p' Release | head -1` codeline=`sed -n 's/^Codename: *//p' Release | head -1` dateline=`grep "^Date:" Release | head -1` dscrline=`grep "^Description:" Release | head -1` echo " o Origin: $origline/$lablline" echo " o Suite: $suitline/$codeline" echo " o $dateline" echo " o $dscrline" if [ "${dist%%/*}" != "$suitline" -a "${dist%%/*}" != "$codeline" ]; then echo " * WARNING: asked for $dist, got $suitline/$codeline" fi lynx -reload -dump "${url}/dists/${dist}/Release.gpg" >/dev/null 2>&1 wget -q -O Release.gpg "${url}/dists/${dist}/Release.gpg" gpgv --status-fd 3 Release.gpg Release 3>&1 >/dev/null 2>&1 | sed -n "s/^\[GNUPG:\] //p" | (okay=0; err=""; while read gpgcode rest; do if [ "$gpgcode" = "GOODSIG" ]; then if [ "$err" != "" ]; then echo " * Signed by ${err# } key: ${rest#* }" else echo " o Signed by: ${rest#* }" okay=1 fi err="" elif [ "$gpgcode" = "BADSIG" ]; then echo " * BAD SIGNATURE BY: ${rest#* }" err="" elif [ "$gpgcode" = "ERRSIG" ]; then echo " * COULDN'T CHECK SIGNATURE BY KEYID: ${rest %% *}" err="" elif [ "$gpgcode" = "SIGREVOKED" ]; then err="$err REVOKED" elif [ "$gpgcode" = "SIGEXPIRED" ]; then err="$err EXPIRED" fi done if [ "$okay" != 1 ]; then echo " * NO VALID SIGNATURE" >Release fi) fi okaycomps="" for comp in $comps; do if [ "$ty" = "deb" ]; then X=$(checkit "`echo "${baseurl}/dists/${dist}/${comp}/binary-${arch}/Release" | sed 's,//*,_,g'`" "${comp}/binary-${arch}/Release") Y=$(checkit "`echo "${baseurl}/dists/${dist}/${comp}/binary-${arch}/Packages" | sed 's,//*,_,g'`" "${comp}/binary-${arch}/Packages") if [ "$X $Y" = "OK OK" ]; then okaycomps="$okaycomps $comp" else echo " * PROBLEMS WITH $comp ($X, $Y)" fi elif [ "$ty" = "deb-src" ]; then X=$(checkit "`echo "${baseurl}/dists/${dist}/${comp}/source/Release" | sed 's,//*,_,g'`" "${comp}/source/Release") Y=$(checkit "`echo "${baseurl}/dists/${dist}/${comp}/source/Sources" | sed 's,//*,_,g'`" "${comp}/source/Sources") if [ "$X $Y" = "OK OK" ]; then okaycomps="$okaycomps $comp" else echo " * PROBLEMS WITH component $comp ($X, $Y)" fi fi done [ "$okaycomps" = "" ] || echo " o Okay:$okaycomps" echo done echo "Results" echo "~~~~~~~" echo allokay=true cd /tmp/apt-release-check diff <(cat BAD MISSING NOCHECK OK | sort) <(cd /var/lib/apt/lists && find . -type f -maxdepth 1 | sed 's,^\./,,g' | grep '_' | sort) | sed -n 's/^> //p' >UNVALIDATED cd /tmp/apt-release-check if grep -q ^ UNVALIDATED; then allokay=false (echo "The following files in /var/lib/apt/lists have not been validated." echo "This could turn out to be a harmless indication that this script" echo "is buggy or out of date, or it could let trojaned packages get onto" echo "your system." ) | fmt echo sed 's/^/ /' < UNVALIDATED echo fi if grep -q ^ BAD; then allokay=false (echo "The contents of the following files in /var/lib/apt/lists does not" echo "match what was expected. This may mean these sources are out of date," echo "that the archive is having problems, or that someone is actively" echo "using your mirror to distribute trojans." if am_root; then echo "The files have been renamed to have the extension .FAILED and" echo "will be ignored by apt." cat BAD | while read a; do mv /var/lib/apt/lists/$a /var/lib/apt/lists/${a}.FAILED done fi) | fmt echo sed 's/^/ /' < BAD echo fi if grep -q ^ MISSING; then allokay=false (echo "The following files from /var/lib/apt/lists were missing. This" echo "may cause you to miss out on updates to some vulnerable packages." ) | fmt echo sed 's/^/ /' < MISSING echo fi if grep -q ^ NOCHECK; then allokay=false (echo "The contents of the following files in /var/lib/apt/lists could not" echo "be validated due to the lack of a signed Release file, or the lack" echo "of an appropriate entry in a signed Release file. This probably" echo "means that the maintainers of these sources are slack, but may mean" echo "these sources are being actively used to distribute trojans." if am_root; then echo "The files have been renamed to have the extension .FAILED and" echo "will be ignored by apt." cat NOCHECK | while read a; do mv /var/lib/apt/lists/$a /var/lib/apt/lists/${a}.FAILED done fi) | fmt echo sed 's/^/ /' < NOCHECK echo fi if $allokay; then echo 'Everything seems okay!' echo fi rm -rf /tmp/apt-release-check
You might need to apply the following patch for sid since
md5sum
adds an '-' after the sum when the input is stdin:
@@ -37,7 +37,7 @@ local LOOKUP="$2" Y="`get_md5sumsize Release "$LOOKUP"`" - Y="`echo "$Y" | sed 's/^ *//;s/ */ /g'`" + Y="`echo "$Y" | sed 's/-//;s/^ *//;s/ */ /g'`" if [ ! -e "/var/lib/apt/lists/$FILE" ]; then if [ "$Y" = "" ]; then @@ -55,7 +55,7 @@ return fi X="`md5sum < /var/lib/apt/lists/$FILE` `wc -c < /var/lib/apt/lists/$FILE`" - X="`echo "$X" | sed 's/^ *//;s/ */ /g'`" + X="`echo "$X" | sed 's/-//;s/^ *//;s/ */ /g'`" if [ "$X" != "$Y" ]; then echo "$FILE" >>BAD echo "BAD"
这种附加签名方案是, 当其不再为其它现存软件包文件所参考时, 允许被检查, 甚至以前没有提供过软件包的第三方软件也允许在 Debian 中使用, 但这不是缺省的方案.
这份软件包签名方案, 可以通过使用 debsig-verify
和
debsigs
来完成. 这两个软件包可以签名和校验包含在 .deb
中的自身签名. Debian 已经据有有完成这项工作的实力,
但是实施策略和工具只会在下一个发行版中提供.
最新的 dpkg 版本(从1.9.21开始)已经加入了提供这个功能的 补丁
,
只要您安装了 debsig-verify
.
注: 当前 /etc/dpkg/dpkg.cfg
引入 "no-debsig" 为缺省值.
注2: 来自开发者的签名署名当它们进入软包的时候被剥离, 因为当前首选的方法还是使用前边描述的那种方法.
Securing Debian Manual
v3.2, Mon, 20 Jun 2005 08:01:11 +0000jfs@debian.org
etony@tom.com