第十六章 安全16.1. 简介16.2. 引言16.3. 保护帐户16.3.1. 阻止登录16.3.2. 密码哈希16.3.3. 密码策略执行16.3.4. 使用sudo共享管理16.3.5. 使用Doas共享管理16.4. 入侵检测系统(IDS)16.4.1. 生成规范文件16.4.2. 规范文件结构16.4.3. 验证规范文件16.5. 安全级别16.5.1. 安全级别定义16.5.2. 修改安全级别16.6. 文件标志16.6.1. 使用文件标志16.7. OpenSSH16.7.1. 使用SSH客户端实用程序16.7.2. 基于密钥的身份验证16.7.3. SSH隧道16.7.4. 启用SSH服务器16.7.5. 配置公钥身份验证方法16.7.6. SSH服务器安全选项16.8. OpenSSL16.8.1. 生成证书16.8.2. 配置FIPS提供程序16.9. Kerberos16.9.1. 建立Heimdal KDC16.9.2. 配置服务器以使用Kerberos16.9.3. 配置客户端以使用Kerberos16.9.4. MIT差异16.9.5. Kerberos提示、技巧和故障排除16.9.6. 减轻Kerberos限制16.9.7. 资源和更多信息16.10. TCP包装器16.10.1. 初始配置16.10.2. 高级配置16.11. 访问控制列表16.11.1. 在UFS中启用ACL支持16.11.2. 获取ACLs信息16.11.3. 使用ACLs16.12. Capsicum16.3. 进程审计16.3.1. 启用和利用进程审计16.14. 资源限制16.14.1. 资源类型16.14.2. 配置登录类16.14.3. 启用和配置资源限制16.15. 监控第三方安全问题16.16. FreeBSD安全公告16.16.1. 安全公共的格式
关于如何保护系统和网络,已经编写了数百种标准实践,作为FreeBSD的用户,了解如何防范攻击和入侵者是必须的。
本章将讨论几个基本原理和技术。FreeBSD系统具有多层安全性,可以添加更多的第三方实用程序来增强安全性。
本章涵盖:
•基本的FreeBSD系统安全概念。
•FreeBSD中可用的各种加密机制。
•如何配置TCP包装器以与 inetd(8) 一起使用。
•如何在FreeBSD上设置Kerberos。
•如何在FreeBSD上配置和使用OpenSSH。
•如何在FreeBSD上使用OpenSSL。
•如何使用文件系统ACL。
•如何使用pkg审核从Ports Collection安装的第三方软件包。
•如何使用FreeBSD安全公告。
•什么是流程会计(Process Accounting)以及如何在FreeBSD上启用它。
•如何使用登录类或资源限制数据库控制用户资源。
•什么是辣椒(Capsicum)和一个基本例子。
由于其复杂性,某些主题可以在【33. 防火墙】、【18. 强制访问控制】等专用章节以及 IPsec上的VPN 等文章中找到。
安全是每个人的责任。任何系统中的弱入口点(weak entry point)都可能允许入侵者访问关键信息,并对整个网络造成严重破坏。信息安全的核心原则之一是CIA三元组(CIA triad),代表信息系统的机密性、完整性和可用性。
CIA三元组(Confidentiality,Integrity,Availability)是计算机安全的基本概念,因为客户和用户希望他们的数据得到保护。例如,客户希望他们的信用卡信息得到安全存储(confidentiality,机密性),他们的订单不会在幕后更改(integrity,完整性),并且他们可以随时访问他们的订单信息(availability,可用性)。
为了向CIA提供信息,安全专业人员应用了深度防御策略。深度防御的理念是增加几层安全,以防止一层故障和整个安全系统崩溃。例如,系统管理员不能简单地打开防火墙并认为网络或系统是安全的。还必须审计帐户,检查二进制文件的完整性,并确保没有安装恶意工具。要实施有效的安全战略,必须了解威胁以及如何防御。
什么是计算机安全威胁?威胁不仅限于试图在未经远程位置许可的情况下访问系统的远程攻击者。威胁还包括员工、恶意软件、未经授权的网络设备、自然灾害、安全漏洞,甚至竞争对手。
系统和网络可以在未经许可的情况下被访问,有时是偶然的,有时是远程攻击者,在某些情况下是通过企业间谍或前雇员。作为用户,重要的是要做好准备,承认错误导致安全漏洞,并向安全团队报告可能的问题。作为管理员,了解威胁并做好减轻威胁的准备非常重要。
在对系统应用安全性时,建议首先保护基本帐户和系统配置,然后保护网络层,使其符合系统策略和组织的安全程序。许多组织已经制定了涵盖技术设备配置的安全策略。该策略应包括工作站、台式机、移动设备、电话、生产服务器和开发服务器的安全配置。在许多情况下,标准操作程序(standard operating procedures,SOPs)已经存在。如有疑问,请咨询安保团队。
在FreeBSD中维护安全帐户对于数据机密性、系统完整性和权限分离(privilege separation)至关重要,因为它可以防止未经授权的访问、恶意软件和数据泄露,同时确保合规性并保护组织的声誉。
在保护系统时,一个好的起点是对账户进行审计。禁用任何不需要登录权限的帐户。
xxxxxxxxxx确保root用户有一个强密码,并且该密码不被共享。要拒绝登录帐户,有两种方法。
第一个是锁定帐户,这个例子展示了如何锁定 imani 帐户:
xxxxxxxxxx# pw lock imani第二种方法是通过将shell更改为 /usr/sbin/nologin 来阻止登录访问。 nologin(8) shell可防止系统在用户尝试登录时为其分配shell。
只有超级用户可以为其他用户更改shell:
xxxxxxxxxx# chsh -s /usr/sbin/nologin imani密码是技术中不可或缺的邪恶。当必须使用它们时,它们应该很复杂,并且应该使用强大的哈希机制来加密存储在密码数据库中的版本。FreeBSD在其 crypt() 库中支持多种算法,包括SHA256、SHA512和Blowfish哈希算法,详见 crypt(3) 。
SHA512的默认值不应更改为安全性较低的哈希算法,但可以更改为更安全的Blowfish算法。
xxxxxxxxxxBlowfish不是AES的一部分,也不符合任何联邦信息处理标准(Federal Information Processing Standards,FIPS)。在某些环境中可能不允许使用。要确定使用哪种哈希算法加密用户的密码,超级用户可以在FreeBSD密码数据库中查看该用户的哈希。每个哈希值都以一个符号开头,该符号表示用于加密密码的哈希机制的类型。
如果使用DES,则没有开始符号。对于MD5,符号是$ 。对于SHA256和SHA512,符号为 $6$ 。对于Blowfish来说,符号是 $2a$ 。在这个例子中,使用默认的SHA512算法对 imani 的密码进行哈希运算,因为哈希值以 $6$ 开头。请注意,密码数据库中存储的是加密的哈希值,而不是密码本身:
xxxxxxxxxx# grep imani /etc/master.passwdimani:$6$pzIjSvCAn.PBYQBA$PXpSeWPx3g5kscj3IMiM7tUEUSPmGexxta.8Lt9TGSi2lNQqYGKszsBPuGME0:1001:1001::0:0:imani:/usr/home/imani:/bin/sh哈希机制在用户的登录类中设置。
可以运行以下命令来检查当前使用的哈希机制:
xxxxxxxxxx% grep passwd_format /etc/login.conf:passwd_format=sha512:\例如,要将算法更改为Blowfish,请将该行修改为如下形式:
xxxxxxxxxx:passwd_format=blf:\然后,必须执行 cap_mkdb(1) 来升级 login.conf 数据库:
xxxxxxxxxx# cap_mkdb /etc/login.conf请注意,此更改不会影响任何现有的密码哈希值。这意味着所有密码都应该通过要求用户运行 passwd 来更改密码,从而重新散列。
对本地帐户实施强密码策略是系统安全的一个基本方面。在FreeBSD中,密码长度、密码强度和密码复杂性可以使用内置的可插拔身份验证模块(Pluggable Authentication Modules,PAM)来实现。
本节演示如何使用 pam_passwdqc(8) 模块配置最小和最大密码长度以及混合字符的强制执行。当用户更改密码时,此模块将强制执行。
要配置此模块,请成为超级用户,并在 /etc/pam.d/passwd 中取消对包含 pam_passwdgc.so 的行的注释。
然后,编辑该行以匹配密码策略:
xxxxxxxxxxpassword requisite pam_passwdqc.so min=disabled,disabled,disabled,12,10 similar=deny retry=3 enforce=users参数的解释可以在 pam_passwdqc(8) 中找到。
保存此文件后,更改密码的用户将看到类似以下内容的消息:
x% passwdChanging local password for userOld 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 longpassword with characters from at least 3 of these 4 classes, ora 10 character long password containing characters from all theclasses. Characters that form a common pattern are discarded bythe check.(有效的密码应该是大小写字母、数字和其他字符的组合。您可以使用包含这4个类中至少3个类字符的12个字符长的密码,或包含所有类字符的10个字符长密码。形成共同模式的字符将被检查丢弃。)Alternatively, if no one else can see your terminal now, you canpick this as your password: "trait-useful&knob".(或者,如果现在没有其他人可以看到你的终端,你可以选择这个作为你的密码:“trait-useful&knob”。)Enter new password:如果输入的密码与策略不匹配,则会被拒绝并发出警告,用户将有机会重试,最多可重试配置的次数(上面例子为3次)。
如果组织的策略要求密码过期,FreeBSD支持/etc/login.conf中用户登录类中的密码时间
默认登录类包含一个示例:
xxxxxxxxxx# :passwordtime=90d:\因此,要为此登录类设置90天的过期时间,请删除注释符号(#),保存编辑,然后执行以下命令:
xxxxxxxxxx# cap_mkdb /etc/login.conf要设置单个用户的到期时间,请将到期日期或到期天数以及用户名传递给pw:
xxxxxxxxxx# pw usermod -p 30-apr-2025 -n user如图所示,到期日期以日、月和年的形式设置。有关更多信息,请参阅 pw(8) 。
系统管理员通常需要能够向用户授予增强的权限,以便他们可以执行特权任务。允许团队成员访问FreeBSD系统以执行其特定任务的想法给每个管理员带来了独特的挑战。这些团队成员只需要超出正常最终用户级别的一部分访问权限;然而,他们几乎总是告诉管理层,没有超级用户的访问权限,他们无法执行任务。值得庆幸的是,没有理由向最终用户提供这种访问权限,因为存在管理这一确切要求的工具。
xxxxxxxxxx即使是管理员也应该在不需要时限制他们的权限。到目前为止,安全章节已经涵盖了允许授权用户访问和试图防止未经授权的访问。一旦授权用户可以访问系统资源,就会出现另一个问题。在许多情况下,一些用户可能需要访问应用程序启动脚本,或者管理员团队需要维护系统。传统上,标准用户和组、文件权限,甚至 su(1) 命令都会管理这种访问。随着应用程序需要更多的访问权限,随着更多的用户需要使用系统资源,需要更好的解决方案。目前使用最多的应用程序是Sudo。
Sudo允许管理员配置对系统命令的更严格访问,并提供一些高级日志记录功能。作为一个工具,它可以从Ports Collection中作为 security/sudo 或使用 pkg(8) 实用程序获得。
执行以下命令进行安装:
xxxxxxxxxx# pkg install sudo安装完成后,安装的 visudo 将使用文本编辑器打开配置文件。强烈建议使用 visudo ,因为它附带了一个内置的语法检查器,可以在保存文件之前验证没有错误。
配置文件由几个小节组成,允许进行广泛的配置。在以下示例中,web应用程序维护者 user1 需要启动、停止和重新启动称为 webservice 的web应用程序。要授予此用户执行这些任务的权限,请将此行添加到 /usr/local/etc/sudoers 的末尾:
xxxxxxxxxxuser1 ALL=(ALL) /usr/sbin/service webservice *用户现在可以使用以下命令启动Web服务:
xxxxxxxxxx% sudo /usr/sbin/service webservice start虽然这种配置允许单个用户访问Web服务;然而,在大多数组织中,都有一个完整的web团队负责管理服务。一条线路也可以访问整个组。这些步骤将创建一个web组,将用户添加到此组,并允许该组的所有成员管理服务:
xxxxxxxxxx# pw groupadd -g 6001 -n webteam使用相同的 pw(8) 命令,用户被添加到 webteam 组:
xxxxxxxxxx# pw groupmod -m user1 -n webteam最后,/usr/local/etc/sudoers 中的这一行允许 webteam 组的任何成员管理 webservice :
xxxxxxxxxx%webteam ALL=(ALL) /usr/sbin/service webservice *与 su(1) 不同, sudo(8) 只需要最终用户密码。这避免了共享密码,那是一种糟糕的做法。
允许使用 sudo(8) 运行应用程序的用户只需输入自己的密码。这比 su(1) 更安全,也提供了更好的控制,在 su(1) 中,输入根密码,用户获得所有根权限。
xxxxxxxxxx大多数组织正在或已经转向双因素身份验证模型。在这些情况下,用户可能没有密码可以输入。sudo(8)可以通过使用NOPASSWD变量配置为允许双因素身份验证模型。将其添加到上面的配置中,将允许webteam组的所有成员管理服务,而不需要密码:%webteam ALL=(ALL) NOPASSWD: /usr/sbin/service webservice *doas(1) 是从OpenBSD移植的命令行实用程序。它是类Unix系统中广泛使用的 sudo(8) 命令的替代品。
使用doas,用户可以以提升的权限(通常是root用户)执行命令,同时保持简化和安全意识的方法。与 sudo(8) 不同,doas强调简单性和极简主义,专注于简化权限委托,而不需要大量的配置选项。
执行以下命令进行安装:
xxxxxxxxxx# pkg install doas安装后,必须将 /usr/local/etc/doas.conf 配置为授予用户特定命令或角色的访问权限。
最简单的条目如下,它授予用户 local_user root权限,而无需在执行doas命令时询问其密码。
xxxxxxxxxxpermit nopass local_user as root安装和配置 doas 实用程序后,现在可以使用增强的权限执行命令,例如:
xxxxxxxxxx$ doas vi /etc/rc.conf有关更多配置示例,请阅读 doas.conf(5) 。
Intrusion Detection System —— IDS
系统文件和二进制文件的验证很重要,因为它为系统管理和安全团队提供了有关系统更改的信息。监视系统变化的软件应用程序称为入侵检测系统(IDS)。
FreeBSD为一个名为 mtree(8) 的基本IDS系统提供了本机支持。虽然夜间安全电子邮件会通知管理员更改,但信息存储在本地,恶意用户有可能修改此信息以隐藏他们对系统的更改。因此,建议创建一组单独的二进制签名,并将其存储在只读的根目录上,或者最好存储在可移动的USB磁盘或远程服务器上。
还建议在每次更新后运行 freebsd-update IDS 。
内置的 mtree(8) 实用程序可用于生成目录内容的规范(specification)。种子(seed)或数字(numeric)常量用于生成规范,并且需要检查规范是否没有更改。这使得确定文件或二进制文件是否已被修改成为可能。由于攻击者不知道种子值,因此伪造或检查文件的校验和值几乎是不可能的。
xxxxxxxxxx建议为包含二进制文件和配置文件的目录以及包含敏感数据的任何目录创建规范。通常,为 /bin、/sbin、/usr/bin、/usr/sbin、usr/local/bin等和/usr/local/等创建规范。以下示例生成一组sha512哈希,/bin 中的每个系统二进制文件对应一个哈希,并将这些值保存到用户主目录 /home/user/.bin_chksum_mtree 中的隐藏文件中:
xxxxxxxxxx# mtree -s 123456789 -c -K cksum,sha512 -p /bin > /home/user/.bin_chksum_mtreemtree: /bin checksum: 3427012225xxxxxxxxxx123456789值表示种子,应随机选择。这个值应该被记住,但不应该被分享。重要的是要对恶意用户隐藏种子值和校验和输出。mtree格式是一种描述文件系统对象集合的文本格式。此类文件通常用于创建或验证目录层次结构。
mtree文件由一系列行组成,每行提供有关单个文件系统对象的信息。前导空格总是被忽略。
上面创建的规范文件将用于解释格式和内容:
xxxxxxxxxx# user: root ①# machine: machinename ②# tree: /bin ③# date: Thu Aug 24 21:58:37 2023 ④# ./set type=file uid=0 gid=0 mode=0555 nlink=1 flags=uarch ⑤. type=dir mode=0755 nlink=2 time=1681388848.239523000 ⑥ \133 nlink=2 size=12520 time=1685991378.688509000 \ cksum=520880818 \ sha512=5c1374ce0e2ba1b3bc5a41b23f4bbdc1ec89ae82fa01237f376a5eeef41822e68f1d8f75ec46b7bceb65396c122a9d837d692740fdebdcc376a05275adbd3471 cat size=14600 time=1685991378.694601000 cksum=3672531848 \ ⑦ sha512=b30b96d155fdc4795432b523989a6581d71cdf69ba5f0ccb45d9b9e354b55a665899b16aee21982fffe20c4680d11da4e3ed9611232a775c69f926e5385d53a2 chflags size=8920 time=1685991378.700385000 cksum=1629328991 \ sha512=289a088cbbcbeb436dd9c1f74521a89b66643976abda696b99b9cc1fbfe8b76107c5b54d4a6a9b65332386ada73fc1bbb10e43c4e3065fa2161e7be269eaf86a chio size=20720 time=1685991378.706095000 cksum=1948751604 \ sha512=46f58277ff16c3495ea51e74129c73617f31351e250315c2b878a88708c2b8a7bb060e2dc8ff92f606450dbc7dd2816da4853e465ec61ee411723e8bf52709ee chmod size=9616 time=1685991378.712546000 cksum=4244658911 \ sha512=1769313ce08cba84ecdc2b9c07ef86d2b70a4206420dd71343867be7ab59659956f6f5a458c64e2531a1c736277a8e419c633a31a8d3c7ccc43e99dd4d71d630① 创建规范的用户。
② 机器的主机名。
③ 目录路径。
④ 创建规范的日期和时间。
⑤ /set 特殊命令,定义从分析的文件中获得的一些设置。
⑥ 指解析后的目录,并指示其类型、模式、硬链接数量以及修改后的UNIX格式时间。
⑦ 引用文件并显示大小、时间和哈希列表,以验证完整性。
要验证二进制签名是否没有更改,请将目录的当前内容与之前生成的规范进行比较,并将结果保存到文件中。
此命令需要用于生成原始规范的种子:
xxxxxxxxxx# mtree -s 123456789 -p /bin < /home/user/.bin_chksum_mtree >> /home/user/.bin_chksum_output这应该为 /bin 生成与创建规范时相同的校验和。如果此目录中的二进制文件没有发生任何更改,/home/user/.bin_chksum_output 输出文件将为空。
要模拟更改,请使用 touch(1) 更改 /bin/cat 上的日期,然后再次运行验证命令:
xxxxxxxxxx# touch /bin/cat再次运行验证命令:
xxxxxxxxxx# mtree -s 123456789 -p /bin < /home/user/.bin_chksum_mtree >> /home/user/.bin_chksum_output然后检查输出文件的内容:
xxxxxxxxxx# cat /root/.bin_chksum_outputcat: modification time (Fri Aug 25 13:30:17 2023, Fri Aug 25 13:34:20 2023)xxxxxxxxxx这只是执行命令时显示的内容的一个示例,以显示元数据中会发生的更改。securelevel是在内核中实现的一种安全机制。当安全级别为正时,内核会限制某些任务;即使是超级用户(root)也不允许执行这些操作。
安全层机制限制了以下能力:
•取消设置某些文件标志,如 schg(系统不可变标志)。
•通过 /dev/mem 和 /dev/kmem 写入内核内存。
•加载内核模块。
•更改防火墙规则。
内核以五个不同的安全级别运行。任何超级用户进程都可以提高级别,但没有进程可以降低级别。
安全定义如下:
-1 —— Permanently insecure mode
永久不安全模式,始终在不安全模式下运行系统。这是默认的初始值。
0 —— Insecure mode
不安全模式,不可变和仅附加标志可能会被关闭。所有设备都可以根据其权限进行读取或写入。
1 —— Secure mode
安全模式,系统不可变和系统仅附加标志可能不会被关闭;已挂载文件系统的磁盘 /dev/mem 和 /dev/kmem 可能无法打开进行写入; /dev/io (如果平台有)可能根本无法打开;内核模块(见 kld(4) )可能无法加载或卸载。不能使用 debug.kdb.enter sysctl进入内核调试器。不能使用 debug.kdb.panic 、 debug.kdb.panic_str 和其他sysctl强制执行panic或陷阱。
2 —— Highly secure mode
高度安全模式,与安全模式相同,此外,无论是否装载,磁盘都可能无法打开进行写入(mount(2) 除外)。此级别通过卸载文件系统来防止篡改文件系统,但也禁止在系统为多用户时运行 newfs(8) 。
3 —— Network secure mode
网络安全模式,与高度安全模式相同,加上IP数据包过滤规则(见 ipfw(8) 、 ipfirewall(4) 和 pfctl(8))不能更改,dummynet(4) 或 pf(4) 配置不能调整。
xxxxxxxxxx总之,FreeBSD安全级别中永久不安全模式和不安全模式的关键区别在于它们提供的安全程度。永久不安全模式完全解除了所有安全限制,而不安全模式放宽了一些限制,但仍保持一定程度的控制和安全。为了更改系统的安全级别,有必要通过执行以下命令激活 kern_securevel_enable :
xxxxxxxxxx# sysrc kern_securelevel_enable="YES"并将 kern_securelevel 的值设置为所需的安全级别:
xxxxxxxxxx# sysrc kern_securelevel=2要检查正在运行的系统上安全级别的状态,请执行以下命令:
xxxxxxxxxx# sysctl -n kern.securelevel输出包含安全级别的当前值。如果它大于0,则至少启用了安全级别的一些保护。
文件标志允许用户在基本权限(permissions)和所有权(ownership)之外向文件和目录附加其他元数据或属性。这些标志提供了一种控制文件的各种行为和属性的方法,而无需创建特殊目录或使用扩展属性。
文件标志可用于实现不同的目标,例如防止文件删除、使文件仅附加、同步文件更新等。FreeBSD中一些常用的文件标志包括“immutable"(不可变)标志,它防止修改或删除文件,以及“appendonly”标志,只允许将数据添加到文件末尾,但不允许修改或删除。
这些标志可以使用FreeBSD中的 chflags(1) 命令进行管理,为管理员和用户提供了对其文件和目录的行为和特征的更大控制。值得注意的是,文件标志通常由root或具有适当权限的用户管理,因为它们可以影响文件的访问和操作方式。一些标志可供文件所有者使用,如 chflags(1) 所述。
在这个例子中,用户主目录中名为 ~/important.txt 的文件希望受到保护,防止删除。
执行以下命令以设置 schg 文件标志:
xxxxxxxxxx# chflags schg ~/important.txt当任何用户(包括root用户)尝试删除文件时,系统将显示以下消息:
xxxxxxxxxxrm: important.txt: Operation not permitted要删除文件,需要通过执行以下命令删除该文件的文件标志:
xxxxxxxxxx# chflags noschg ~/important.txtchflags(1) 中列出了支持的文件标志及其功能。
xxxxxxxxxxarch, archivedset the archived flag (super-user only)设置存档标志(仅限超级用户)nodumpset the nodump flag (owner or super-user only)设置不转储标志(仅限所有者或超级用户)opaqueset the opaque flag (owner or super-user only)设置不透明标志(仅限所有者或超级用户)sappnd, sappendset the system append-only flag (super-user only)设置系统仅附加标志(仅限超级用户)schg, schange, simmutableset the system immutable flag (super-user only)设置系统不可变标志(仅限超级用户)snapshotset the snapshot flag (filesystems do not allow changing this flag)设置快照标志(文件系统不允许更改此标志)sunlnk, sunlinkset the system undeletable flag (super-user only)设置系统不可删除标志(仅限超级用户)uappnd, uappendset the user append-only flag (owner or super-user only)设置用户仅附加标志(仅限所有者或超级用户)uarch, uarchiveset the archive flag (owner or super-user only)设置存档标志(仅限所有者或超级用户)uchg, uchange, uimmutableset the user immutable flag (owner or super-user only)设置用户不可变标志(仅限所有者或超级用户)uhidden, hiddenset the hidden file attribute (owner or super-user only)设置隐藏文件属性(仅限所有者或超级用户)uoffline, offlineset the offline file attribute (owner or super-user only)设置脱机文件属性(仅限所有者或超级用户)urdonly, rdonly, readonlyset the DOS, Windows and CIFS readonly flag (owner or super-user only)设置DOS、Windows和CIFS只读标志(仅限所有者或超级用户)usparse, sparseset the sparse file attribute (owner or super-user only)设置稀疏文件属性(仅限所有者或超级用户)usystem, systemset the DOS, Windows and CIFS system flag (owner or super-user only)设置DOS、Windows和CIFS系统标志(仅限所有者或超级用户)ureparse, reparseset the Windows reparse point file attribute (owner or super-user only)设置Windows重分析点文件属性(仅限所有者或超级用户)uunlnk, uunlinkset the user undeletable flag (owner or super-user only)设置用户不可删除标志(仅限所有者或超级用户)
OpenSSH是一组网络连接工具,用于提供对远程计算机的安全访问。此外,TCP/IP连接可以通过SSH连接进行隧道传输或安全转发。OpenSSH对所有流量进行加密,以消除窃听、连接劫持和其他网络攻击。
OpenSSH由OpenBSD项目维护,默认安装在FreeBSD中。
当数据以未加密的形式通过网络发送时,客户端和服务器之间的任何网络嗅探器都可以窃取用户/密码信息或会话期间传输的数据。OpenSSH提供了各种身份验证和加密方法来防止这种情况发生。
有关OpenSSH的更多信息,请参阅 网页 。
本节概述了用于安全访问其他系统和从FreeBSD系统安全传输文件的内置客户端实用程序。然后,它描述了如何在FreeBSD系统上配置SSH服务器。
xxxxxxxxxx如前所述,本章将介绍OpenSSH的基本系统版本。OpenSSH的一个版本也可以在 security/openssh-portable 中找到,它提供了额外的配置选项,并更定期地更新新功能。要登录SSH服务器,请使用 ssh(1) 并指定该服务器上存在的用户名和服务器的IP地址或主机名。如果这是第一次连接到指定的服务器,系统将提示用户首先验证服务器的指纹:
xxxxxxxxxx# ssh user@example.comThe authenticity of host 'example.com (10.0.0.1)' can't be established.ECDSA key fingerprint is 25:cc:73:b5:b3:96:75:3d:56:19:49:d2:5c:1f:91:3b.Are you sure you want to continue connecting (yes/no)? yesPermanently added 'example.com' (ECDSA) to the list of known hosts.Password for user@example.com: user_passwordSSH利用密钥指纹系统在客户端连接时验证服务器的真实性。当用户在首次连接时键入 yes 接受密钥的指纹时,密钥的副本将保存到用户主目录中的 ~/.ssh/known_hosts 。未来的登录尝试将根据保存的密钥进行验证,如果服务器的密钥与保存的密钥不匹配, ssh(1) 将显示警报。如果发生这种情况,用户应在继续连接之前首先验证密钥更改的原因。
xxxxxxxxxx如何执行此检查超出了本章的范围。使用 scp(1) 将文件安全地复制到远程计算机或从远程计算机复制文件。
此示例将远程系统上的COPYRIGHT复制到本地系统当前目录中同名的文件中:
xxxxxxxxxx# scp user@example.com:/COPYRIGHT COPYRIGHTPassword for user@example.com: *******COPYRIGHT 100% |*****************************| 4735由于此主机的指纹已经过验证,因此在提示输入用户密码之前,会自动检查服务器的密钥。
传递给 scp(1) 的参数类似于 cp(1) 。要复制的文件是第一个参数,要复制到的目标是第二个参数。由于文件是通过网络获取的,因此一个或多个文件参数采用以下形式 user@host:<path_to_remote_file> 。在递归复制目录时,请注意 scp(1) 使用 -r ,而 cp(1) 则使用 -R 。
要打开用于复制文件的交互式会话,请使用 sftp(1) 。
有关 sftp(1) 会话中可用命令的列表,请参阅 sftp(2) 。
客户端可以配置为使用密钥连接到远程计算机,而不是使用密码。出于安全原因,这是首选方法。
ssh-keygen(1) 可用于生成身份验证密钥。要生成公钥和私钥对,请指定密钥类型并按照提示进行操作。建议使用令人难忘但难以猜测的密码保护密钥。
xxxxxxxxxx% ssh-keygen -t rsa -b 4096Generating public/private rsa key pair.Enter file in which to save the key (/home/user/.ssh/id_rsa):Created directory '/home/user/.ssh/.ssh'.Enter passphrase (empty for no passphrase):Enter same passphrase again:Your identification has been saved in /home/user/.ssh/id_rsa.Your public key has been saved in /home/user/.ssh/id_rsa.pub.The key fingerprint is:SHA256:54Xm9Uvtv6H4NOo6yjP/YCfODryvUU7yWHzMqeXwhq8 user@host.example.comThe key's randomart image is:+---[RSA 2048]----+| || || || . o.. || .S*+*o || . O=Oo . . || = Oo= oo..|| .oB.* +.oo.|| =OE**.o..=|+----[SHA256]-----+私钥存储在 ~/.ssh/id_rsa 中,公钥存储在 ~/.sh/id_rsa.pub 中。必须将公钥复制到远程计算机上的 ~/.ssh/authorized_keys ,才能进行基于密钥的身份验证。
xxxxxxxxxx为OpenSSH密钥使用密码(passphrase)是一种关键的安全实践,为未经授权的访问提供了额外的保护,并增强了整体网络安全。在丢失或被盗的情况下,这增加了另一层安全性。OpenSSH能够创建一个隧道,将另一个协议封装在加密会话中。
下面的命令告诉 ssh(1) 创建一个隧道:
xxxxxxxxxx% ssh -D 8080 user@example.com此示例使用以下选项:
-D
指定本地“dynamic"(动态)应用程序级端口转发。
user@foo.example.com
在指定的远程SSH服务器上使用的登录名。
SSH隧道的工作原理是在指定的本地端口上的localhost上创建一个监听套接字。此方法可用于包装任何数量的不安全TCP协议,如SMTP、POP3和FTP。
除了提供内置的SSH客户端实用程序外,FreeBSD系统还可以配置为SSH服务器,接受来自其他SSH客户端的连接。
xxxxxxxxxx如前所述,本章将介绍OpenSSH的基本系统版本。请不要与security/openssh-portable混淆,后者是FreeBSD ports附带的openssh版本。为了在重新启动时启用SSH服务器,请执行以下命令:
xxxxxxxxxx# sysrc sshd_enable="YES"然后执行以下命令以启用服务:
xxxxxxxxxx# service sshd start当sshd首次在FreeBSD系统上启动时,系统的主机密钥将自动创建,指纹将显示在控制台上。为用户提供指纹,以便他们在第一次连接到服务器时进行验证。
有关启动sshd时可用选项的列表以及关于身份验证、登录过程和各种配置文件的完整讨论,请参阅 sshd(8) 。
此时,sshd应该对系统上具有用户名和密码的所有用户可用。
配置OpenSSH使用公钥身份验证通过利用非对称加密进行身份验证来增强安全性。这种方法消除了与密码相关的风险,如弱密码或传输过程中的拦截,同时阻止了各种基于密码的攻击。然而,确保私钥得到妥善保护以防止未经授权的访问至关重要。
第一步将是配置 sshd(8) 以使用所需的身份验证方法。
编辑 /etc/ssh/sshd_config 并取消注释以下配置:
xxxxxxxxxxPubkeyAuthentication yes配置完成后,用户必须向系统管理员发送他们的公钥,这些密钥将添加到 .ssh/authorized_keys 中。生成密钥的过程在【16.7.2. 基于密钥的身份验证】中进行了描述。
然后执行以下命令重新启动服务器:
xxxxxxxxxx# service sshd reload强烈建议遵循【16.7.6. SSH服务器安全选项】中指示的安全改进。
虽然sshd是FreeBSD中使用最广泛的远程管理工具,但暴力破解和驱动器攻击在任何暴露于公共网络的系统中都很常见。
有几个额外的参数可以防止这些攻击的成功,本节将对此进行描述。所有配置都将在 /etc/ssh/sshd_config 中完成。
xxxxxxxxxx不要将/etc/ssh/sshd_config与/etc/ssh/ssh_config混淆(注意第一个文件名中的额外d)。第一个文件配置服务器,第二个文件配置客户端。有关可用客户端设置的列表,请参阅ssh_config(5)。默认情况下,可以使用pubkey和密码进行身份验证。要只允许pubkey身份验证(强烈建议这样做),请更改变量:
xxxxxxxxxxPasswordAuthentication no最好限制哪些用户可以登录SSH服务器,以及在OpenSSH服务器配置文件中从何处使用 AllowUsers 关键字。例如,要只允许 user 从 192.168.1.32 登录,请在 /etc/ssh/sshd_config 中添加以下行:
xxxxxxxxxxAllowUsers user@192.168.1.32要允许用户从任何地方登录,请列出该用户而不指定IP地址:
xxxxxxxxxxAllowUsers user多个用户应列在同一行,如下所示:
xxxxxxxxxxAllowUsers root@192.168.1.32 user进行所有更改后,在重新启动服务之前,建议通过执行以下命令验证所做的配置是否正确:
xxxxxxxxxx# sshd -t如果配置文件正确,则不会显示输出。如果配置文件不正确,它将显示如下内容:
xxxxxxxxxx/etc/ssh/sshd_config: line 3: Bad configuration option: sdadasdasdasads/etc/ssh/sshd_config: terminating, 1 bad configuration options进行更改并检查配置文件是否正确后,告诉sshd通过运行以下命令重新加载其配置文件:
xxxxxxxxxx# service sshd reloadOpenSSL是一个加密工具包,实现了安全套接字层(Secure Sockets Layer,SSL)和传输层安全(Transport Layer Security,TLS)网络协议以及许多加密例程。
openssl 程序是一个命令行工具,用于从shell使用OpenSSL加密库的各种加密函数。它可以用于:
• 创建和管理私钥、公钥和参数 • 公钥加密操作 • 创建X.509证书、CSR和CRL • 消息摘要的计算 • 使用密码进行加密和解密 • SSL/TLS客户端和服务器测试 • 处理S/MIME签名或加密邮件 • 时间戳请求、生成和验证 • 对加密例程进行基准测试
有关OpenSSL的更多信息,请阅读免费的 OpenSSL Cookbook 。
OpenSSL支持生成证书,既可以由CA验证,也可以供自己使用。
运行命令 openssl(1) ,使用以下参数为CA生成有效证书。此命令将在当前目录中创建两个文件。证书请求 req.pem 可以发送到CA,CA将验证输入的凭据,对请求进行签名,并返回签名的证书。第二个文件 cert.key 是证书的私钥,应存储在安全位置。如果这落入他人之手,它可以用来冒充用户或服务器。
执行以下命令生成证书:
xxxxxxxxxx# openssl req -new -nodes -out req.pem -keyout cert.key -sha3-512 -newkey rsa:4096Generating a RSA private key..................................................................................................................................+++++......................................+++++writing new private key to 'cert.key'-----You are about to be asked to enter information that will be incorporated into your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [AU]:ESState or Province Name (full name) [Some-State]:Valencian CommunityLocality Name (eg, city) []:ValenciaOrganization Name (eg, company) [Internet Widgits Pty Ltd]:My CompanyOrganizational Unit Name (eg, section) []:Systems AdministratorCommon Name (e.g. server FQDN or YOUR name) []:localhost.example.orgEmail Address []:user@FreeBSD.orgPlease enter the following 'extra' attributesto be sent with your certificate requestA challenge password []:123456789An optional company name []:Another name或者,如果不需要CA的签名,可以创建自签名证书。这将在当前目录中创建两个新文件:私钥文件 cert.key 和证书本身 cert.crt 。这些应该放在一个目录中,最好放在 /etc/ssl/ 下,只有root才能读取。0700 权限适用于这些文件,可以使用 chmod 设置。
执行以下命令生成证书:
xxxxxxxxxx# openssl req -new -x509 -days 365 -sha3-512 -keyout /etc/ssl/private/cert.key -out /etc/ssl/certs/cert.crtGenerating a RSA private key........................................+++++...........+++++writing new private key to '/etc/ssl/private/cert.key'Enter PEM pass phrase:Verifying - Enter PEM pass phrase:-----You are about to be asked to enter information that will be incorporated into your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [AU]:ESState or Province Name (full name) [Some-State]:Valencian CommunityLocality Name (eg, city) []:ValenciaOrganization Name (eg, company) [Internet Widgits Pty Ltd]:My CompanyOrganizational Unit Name (eg, section) []:Systems AdministratorCommon Name (e.g. server FQDN or YOUR name) []:localhost.example.orgEmail Address []:user@FreeBSD.org随着OpenSSL 3导入到基础系统(在FreeBSD 14和更高版本上),它的提供者模块的新概念被引入到系统中。除了库中内置的默认提供程序模块外,遗留模块还实现了现在可选的已弃用的加密算法,而 fips 模块将OpenSSL实现限制为FIPS标准集中存在的加密算法。OpenSSL的这一部分受到特别关注,包括相关安全问题列表,并定期接受FIPS 140验证过程。FIPS验证版本列表也可用。这允许用户在使用OpenSSL时确保FIPS合规性。
重要的是,fips_module(7) 受到额外安全措施的保护,防止在未通过完整性检查的情况下使用它。本地系统管理员可以设置此检查,允许OpenSSL 3的每个用户加载此模块。如果配置不正确,FIPS模块预计会出现以下故障:
xxxxxxxxxx# echo test | openssl aes-128-cbc -a -provider fips -pbkdf2aes-128-cbc: unable to load provider fipsHint: use -provider-path option or OPENSSL_MODULES environment variable.00206124D94D0000:error:1C8000D5:Provider routines:SELF_TEST_post:missing configdata:crypto/openssl/providers/fips/self_test.c:275:00206124D94D0000:error:1C8000E0:Provider routines:ossl_set_error_state:fips moduleentering error state:crypto/openssl/providers/fips/self_test.c:373:00206124D94D0000:error:1C8000D8:Provider routines:OSSL_provider_init_int:self testpost failure:crypto/openssl/providers/fips/fipsprov.c:707:00206124D94D0000:error:078C0105:common libcrypto routines:provider_init:initfail:crypto/openssl/crypto/provider_core.c:932:name=fips可以通过在 /etc/ssl/fipsmodule.cnf 中创建一个文件来配置该检查,然后在OpenSSL的主配置文件 /etc/ssl/openssl.cnf 中引用该文件。OpenSSL提供了 openssl-fipsinstall(1) 实用程序来帮助完成此过程,其使用方法如下:
xxxxxxxxxx# openssl fipsinstall -module /usr/lib/ossl-modules/fips.so -out /etc/ssl/fipsmodule.cnfINSTALL PASSED然后应该修改 /etc/ssl/openssl.cnf ,以便:
•包括上面生成的 /etc/ssl/fipsmodule.cnf 文件, •暴露FIPS模块以备使用, •并明确激活默认模块。
xxxxxxxxxx[...]# For FIPS# Optionally include a file that is generated by the OpenSSL fipsinstall# application. This file contains configuration data required by the OpenSSL# fips provider. It contains a named section e.g. [fips_sect] which is# referenced from the [provider_sect] below.# Refer to the OpenSSL security policy for more information..include /etc/ssl/fipsmodule.cnf[...]# List of providers to load[provider_sect]default = default_sect# The fips section name should match the section name inside the# included fipsmodule.cnf.fips = fips_sect# If no providers are activated explicitly, the default one is activated implicitly.# See man 7 OSSL_PROVIDER-default for more details.## If you add a section explicitly activating any other provider(s), you most# probably need to explicitly activate the default provider, otherwise it# becomes unavailable in openssl. As a consequence applications depending on# OpenSSL may not work correctly which could lead to significant system# problems including inability to remotely access the system.[default_sect]activate = 1完成此操作后,应该可以确认FIPS模块有效可用并正常工作:
xxxxxxxxxx# echo test | openssl aes-128-cbc -a -provider fips -pbkdf2enter AES-128-CBC encryption password:Verifying - enter AES-128-CBC encryption password:U2FsdGVkX18idooW6e3LqWeeiKP76kufcOUClh57j8U=每次修改FIPS模块时,例如在执行系统更新后,或在基础系统中应用影响OpenSSL的安全修复程序后,都必须重复此过程。
Kerberos是一种网络身份验证协议,最初由麻省理工学院(MIT)创建,用于在潜在的敌对网络中安全地提供身份验证。Kerberos协议使用强大的密码学,因此客户端和服务器都可以证明自己的身份,而无需在网络上发送任何未加密的秘密。Kerberos可以被描述为身份验证代理系统和可信的第三方身份验证系统。用户使用Kerberos进行身份验证后,可以对其通信进行加密,以确保隐私和数据完整性。
Kerberos的唯一功能是为网络上的用户和服务器提供安全身份验证。它不提供授权或审计功能。建议将Kerberos与提供授权和审计服务的其他安全方法一起使用。
该协议的当前版本是RFC 4120中描述的版本5。该协议有几种免费实现,涵盖了广泛的操作系统。麻省理工学院继续开发他们的Kerberos软件包。它在美国通常被用作加密产品,并且历来受到美国出口法规的约束。在FreeBSD中,MITKerberos作为 security/krb5 包或端口提供。Heimdal Kerberos实现是在美国境外明确开发的,以避免出口法规。Heimdal Kerberos发行版包含在基本FreeBSD安装中,另一个具有更多可配置选项的发行版在Ports Collection中作为 security/Heimdal 提供。
在Kerberos中,用户和服务被标识为 principals (主体),它们包含在一个称为 realm (领域)的管理分组中。典型的用户主体形式如下 user@REALM (领域传统上是大写的)。
本节提供了如何使用FreeBSD中包含的Heimdal发行版设置Kerberos的指南。
为了演示Kerberos安装,命名空间如下:
• DNS域(zone,区域)将是 example.org 。
• Kerberos领域将是 EXAMPLE.ORG 。
xxxxxxxxxx设置Kerberos时使用真实域名,即使它将在内部运行。这避免了DNS问题,并确保了与其他Kerberos领域的互操作。密钥分发中心(Key Distribution Center,KDC)是Kerberos提供的集中式身份验证服务,是系统的“受信任的第三方”。它是发出Kerberos票证的计算机,用于客户端向服务器进行身份验证。由于KDC被Kerberos领域的所有其他计算机认为是可信的,因此它加剧了安全问题。应限制对KDC的直接访问。
虽然运行KDC需要很少的计算资源,但出于安全原因,建议使用仅充当KDC的专用机器。
首先,请按照以下步骤安装 security/heimdal 软件包:
xxxxxxxxxx# pkg install heimdal接下来,使用 sysrc 更新 /etc/rc.conf ,如下所示:
xxxxxxxxxx# sysrc kdc_enable=yes# sysrc kadmind_enable=yes接下来,按如下方式编辑 /etc/krb5.conf :
xxxxxxxxxx[libdefaults] default_realm = EXAMPLE.ORG[realms] EXAMPLE.ORG = { kdc = kerberos.example.org admin_server = kerberos.example.org }[domain_realm] .example.org = EXAMPLE.ORG在此示例中,KDC将使用完全限定的主机名 kerberos.example.org 。KDC的主机名必须在DNS中可解析。
Kerberos还可以使用DNS来定位KDC,而不是 /etc/krb5.conf 中的 [realm] 部分。对于拥有自己的DNS服务器的大型组织,上述示例可以简化为:
xxxxxxxxxx[libdefaults] default_realm = EXAMPLE.ORG[domain_realm] .example.org = EXAMPLE.ORGexample.org 区域文件中包含以下行:
xxxxxxxxxx_kerberos._udp IN SRV 01 00 88 kerberos.example.org._kerberos._tcp IN SRV 01 00 88 kerberos.example.org._kpasswd._udp IN SRV 01 00 464 kerberos.example.org._kerberos-adm._tcp IN SRV 01 00 749 kerberos.example.org._kerberos IN TXT EXAMPLE.ORGxxxxxxxxxx为了让客户端能够找到Kerberos服务,他们必须有一个完全配置的/etc/krb5.conf或一个最低配置的/etc/krb5.conf和一个正确配置的DNS服务器。接下来,创建Kerberos数据库,其中包含用主密码加密的所有主体(用户和主机)的密钥。不需要记住此密码,因为它将存储在 /var/heimdal/m-key 中;为此目的使用45个字符的随机密码是合理的。要创建主密钥,请运行kstash并输入密码:
xxxxxxxxxx# kstashMaster key: xxxxxxxxxxxxxxxxxxxxxxxVerifying password - Master key: xxxxxxxxxxxxxxxxxxxxxxx创建主密钥后,应初始化数据库。Kerberos管理工具 kadmin(8) 可以在KDC上以直接在数据库上操作的模式使用,而无需使用 kadmind(8) 网络服务,如 kadmin -l 。这解决了在创建数据库之前尝试连接数据库的鸡蛋问题。在 kadmin 提示符下,使用 init 创建域的初始数据库:
xxxxxxxxxx# kadmin -lkadmin> init EXAMPLE.ORGRealm max ticket life [unlimited]:最后,在 kadmin 中,使用 add 创建第一个主体。暂时坚持主体的默认选项,因为稍后可以通过 modify 来更改这些选项。在提示符下输入 ? 查看可用选项。
xxxxxxxxxxkadmin> add tillmanMax ticket life [unlimited]:Max renewable life [unlimited]:Principal expiration time [never]:Password expiration time [never]:Attributes []:Password: xxxxxxxxVerifying password - Password: xxxxxxxx接下来,通过运行以下命令启动KDC服务:
xxxxxxxxxx# service kdc start# service kadmind start虽然此时不会运行任何经过kerberized的守护进程,但可以通过获取刚刚创建的主体的票证来确认KDC正在运行:
xxxxxxxxxx% kinit tillmantillman@EXAMPLE.ORG's Password:使用 klist 确认已成功获得票证:
xxxxxxxxxx% klistCredentials cache: FILE:/tmp/krb5cc_1001 Principal: tillman@EXAMPLE.ORG Issued Expires PrincipalAug 27 15:37:58 2013 Aug 28 01:37:58 2013 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG测试结束后,临时票可以销毁:
xxxxxxxxxx% kdestroy配置服务器以使用Kerberos身份验证的第一步是确保它在 /etc/krb5.conf 中具有正确的配置。KDC的版本可以按原样使用,也可以在新系统上重新生成。
接下来,在服务器上创建 /etc/krb5.keytab 。这是 Kerberizing 服务的主要部分,它对应于生成服务和KDC之间共享的秘密。这个秘密是一个加密密钥,存储在“密钥表”中。keytab包含服务器的主机密钥,这允许它和KDC验证彼此的身份。它必须以安全的方式传输到服务器,因为如果密钥被公开,服务器的安全性可能会被破坏。通常,密钥表是在管理员信任的机器上使用 kadmin 生成的,然后安全地传输到服务器,例如使用 scp(1) ;如果与所需的安全策略一致,也可以直接在服务器上创建它。以安全的方式将密钥表传输到服务器非常重要:如果其他方知道密钥,则该方可以向服务器冒充任何用户!在服务器上直接使用 kadmin 很方便,因为KDC数据库中主机主体的条目也是使用 kadmin 创建的。
当然, kadmin 是一个基于kerberized的服务;需要Kerberos票证来对网络服务进行身份验证,但为了确保运行 kadmin 的用户确实存在(并且他们的会话没有被劫持),kadmin 将提示输入密码以获取新的票证。必须允许对 kadmin 服务进行身份验证的主体使用 kadmin 接口,如 /var/heimdal/kadmind.acl 中所述。有关设计访问控制列表的详细信息,请参阅 info heimdal 中标题为“远程管理”的部分。管理员可以通过本地控制台或 ssh(1) 安全地连接到KDC,并使用 kadmin -l 在本地执行管理,而不是启用远程 kadmin 访问。
安装 /etc/krb5.conf 后,在 kadmin 中使用 add --random-key 。这会将服务器的主机主体添加到数据库中,但不会将主机主体密钥的副本提取到密钥表中。要生成密钥表,请使用 ext 将服务器的主机主体密钥提取到其自己的密钥表中:
xxxxxxxxxx# kadminkadmin> add --random-key host/myserver.example.orgMax ticket life [unlimited]:Max renewable life [unlimited]:Principal expiration time [never]:Password expiration time [never]:Attributes []:kadmin> ext_keytab host/myserver.example.orgkadmin> exit请注意, ext_keytab 默认将提取的密钥存储在 /etc/krb5.keytab 中。当在经过kerberized的服务器上运行时,这很好,但当在其他地方提取keytab时,应该使用 --keytab path/to/file 参数:
xxxxxxxxxx# kadminkadmin> ext_keytab --keytab=/tmp/example.keytab host/myserver.example.orgkadmin> exit然后,可以使用 scp(1) 或可移动介质将密钥表安全地复制到服务器。请确保指定一个非默认的按键名称,以避免将不需要的按键插入系统的按键中。
此时,服务器可以使用存储在 krb5.keytab 中的共享密钥从KDC读取加密消息。现在已准备好启用Kerberos使用服务。最常见的此类服务之一是 sshd(8) ,它通过GSS-API支持Kerberos。在 /etc/ssh/sshd_config 中,添加以下行:
xxxxxxxxxxGSSAPIAuthentication yes进行此更改后,必须重新启动 sshd(8) 才能使新配置生效:service sshd restart 。
与服务器一样,客户端需要在 /etc/krb5.conf 中进行配置。将文件复制到位(安全)或根据需要重新输入。
通过使用客户端的 kinit 、 klist 和 kdestroy 来测试客户端,以获取、显示并删除现有主体的票证。Kerberos应用程序还应该能够连接到启用Kerberos的服务器。如果这不起作用,但获得票证起作用,则问题可能出在服务器上,而不是客户端或KDC上。在使用kerberized ssh(1) 的情况下,GSS-API在默认情况下是禁用的,因此使用 ssh -o GSSAPIAuthentication=yes hostname 进行测试。
在测试Kerberized应用程序时,尝试使用 tcpdump 等数据包嗅探器来确认没有以明文形式发送敏感信息。
有各种Kerberos客户端应用程序可用。随着桥接的出现,使用SASL进行身份验证的应用程序也可以使用GSS-API机制,从Jabber客户端到IMAP客户端,大型客户端应用程序都可以使用Kerberos进行身份验证。
域内的用户通常将其Kerberos主体映射到本地用户帐户。有时,需要将本地用户帐户的访问权限授予没有匹配Kerberos主体的人。例如,tillman@EXAMPLE.ORG 可能需要访问本地用户帐户 webdevelopers 。其他主体也可能需要访问该本地帐户。
放置在用户主目录中的 .k5login 和 .k5users 文件可用于解决此问题。例如,如果以下 .k5login 放置在 webdevelopers 的主目录中,则列出的两个主体都可以访问该帐户,而不需要共享密码:
xxxxxxxxxxtillman@example.orgjdoe@example.org有关 .k5users 的更多信息,请参阅 ksu(1) 。
MIT和Heimdal实现之间的主要区别在于, kadmin 具有不同但等效的命令集,并使用不同的协议。如果KDC是MIT,则Heimdal版本的 kadmin 不能用于远程管理KDC,反之亦然。
客户端应用程序也可能使用略有不同的命令行选项来完成相同的任务。遵循以下说明 http://web.mit.edu/Kerberos/www/ 是推荐的。注意路径问题:默认情况下,MIT port安装在 /usr/local/ 中,如果PATH首先列出系统目录,则FreeBSD系统应用程序会运行而不是MIT版本。
在FreeBSD上将MIT Kerberos用作KDC时,执行以下命令将所需的配置添加到 /etc/rc.conf :
xxxxxxxxxx# sysrc kdc_program="/usr/local/sbin/krb5kdc"# sysrc kadmind_program="/usr/local/sbin/kadmind"# sysrc kdc_flags=""# sysrc kdc_enable="YES"# sysrc kadmind_enable="YES"在配置和排除Kerberos故障时,请记住以下几点:
host/ 主体并更新密钥表。这也适用于特殊的键表条目,如用于Apache的 www/mod_auth_kerb 的 HTTP/ 主体。Kerberos5 refuses authentication because Read req failed: Key table entry not found (Kerberos5拒绝身份验证,因为读取请求失败:找不到密钥表条目)。ksu 的权限设置为setuid root 。这意味着 ksu 不起作用。这是一个权限问题,而不是KDC错误。kadmin(8) 提示符下使用 modify_principal 更改相关主体和 krbtgt 主体的 maxlife 。然后,主体(principal)可以使用 kinit -l 请求一张寿命更长的票。kinit 时,在KDC上运行数据包嗅探器以帮助排除故障时,即使在键入密码之前,也会立即发送票证授予票证(Ticket Granting Ticket,TGT)。这是因为Kerberos服务器可以自由地向任何未经授权的请求传输TGT。但是,每个TGT都使用从用户密码导出的密钥进行加密。当用户键入密码时,密码不会发送到KDC,而是用于解密已经获得的TGT。如果解密过程产生具有有效时间戳的有效票证,则用户具有有效的Kerberos凭据。这些凭据包括用于将来与Kerberos服务器建立安全通信的会话密钥,以及使用Kerberos服务器自己的密钥加密的实际TGT。第二层加密允许Kerberos服务器验证每个TGT的真实性。krb5.dict 以防止使用 kadmind(8) 中所述的特定错误密码时,请记住,它仅适用于分配了密码策略的主体。krb5.dict 中使用的格式是每行一个字符串。创建一个指向 /usr/share/dict/words 的符号链接可能会很有用。由于Kerberos是一种全有或全无的方法,因此必须修改网络上启用的每个服务以使用Kerberos,或者以其他方式保护其免受网络攻击。这是为了防止用户凭据被盗和重复使用。一个例子是,所有远程shell上都启用了Kerberos,但非Kerberized POP3邮件服务器以纯文本形式发送密码。
KDC是一个单点故障。按照设计,KDC必须与其主密码数据库一样安全。KDC上不应该运行任何其他服务,并且应该是物理安全的。危险性很高,因为Kerberos存储了所有使用相同主密钥加密的密码,该主密钥作为文件存储在KDC上。
泄露的主密钥并不像人们担心的那么糟糕。主密钥仅用于加密Kerberos数据库,并作为随机数生成器的种子。只要对KDC的访问是安全的,攻击者就无法对主密钥进行太多操作。
如果KDC不可用,则网络服务不可用,因为无法执行身份验证。通过使用单个主KDC和一个或多个从KDC,以及使用PAM仔细实现二次或回退身份验证,可以缓解这种情况。
Kerberos允许用户、主机和服务之间进行身份验证。它没有向用户、主机或服务验证KDC的机制。这意味着安装了木马的 kinit 可以记录所有用户名和密码。像 security/tripwire 这样的文件系统完整性检查工具可以缓解这种情况。
• Designing an Authentication System: a Dialog in Four Scenes 【无法访问】
• RFC 4120, The Kerberos Network Authentication Service (V5)
• MIT Kerberos home page 【无法访问】
• Heimdal Kerberos project wiki page
TCP Wrappers是一个基于主机的网络访问控制系统。通过在传入网络请求到达实际网络服务之前拦截它们,TCP包装器根据配置文件中的预定义规则评估源IP地址是被允许还是被拒绝访问。
然而,虽然TCP包装器提供了基本的访问控制,但不应将其视为更强大的安全措施的替代品。为了提供全面的保护,建议使用防火墙等先进技术,以及适当的用户身份验证实践和入侵检测系统。
默认情况下, inetd(8) 中启用了TCP包装器。因此,第一步将是启用 inetd(8) 执行以下命令:
xxxxxxxxxx# sysrc inetd_enable="YES"# service inetd start然后,正确配置 /etc/hosts.allow 。
xxxxxxxxxx与TCP Wrappers的其他实现不同,在FreeBSD中不推荐使用hosts.deny。所有配置选项都应该放在/etc/hosts.allow中。在最简单的配置中,守护进程连接策略设置为允许或阻止,具体取决于 /etc/hosts.allow 中的选项。FreeBSD中的默认配置是允许所有与 inetd 启动的守护进程的连接。
基本配置通常采用 daemon : address : action 的形式,其中 daemon 是 inetd 启动的守护进程, address 是有效的主机名、IP地址或中括号([])中的IPv6地址, action 是 allow 或 deny 。TCP Wrappers使用第一规则匹配语义(first rule match semantic),这意味着从一开始就扫描配置文件以查找匹配规则。当找到匹配项时,应用规则并停止搜索过程。
例如,要允许通过 mail/qpopper 守护进程进行POP3连接,应将以下行附加到 /etc/hosts.allow:
xxxxxxxxxxqpopper : ALL : allow每当编辑此文件时,请重新启动 inetd :
xxxxxxxxxx# service inetd restartTCP Wrappers提供了高级选项,允许对连接的处理方式进行更多控制。在某些情况下,向某些主机或守护进程连接返回注释可能是合适的。在其他情况下,应记录日志条目或向管理员发送电子邮件。其他情况可能需要使用仅用于本地连接的服务。通过使用通配符、扩展字符和外部命令执行等配置选项,这一切都是可能的。要了解有关通配符及其相关功能的更多信息,请参阅 hosts_access(5) 。
访问控制列表(Access Control Lists,ACLs)扩展了传统的UNIX®文件权限,允许对每个文件或每个目录的用户和组进行细粒度的访问控制。每个ACL条目都定义了一个用户或组以及相关的权限,如读取、写入和执行。FreeBSD提供了 getfacl(1) 和 setfacl(1) 等命令来管理ACL。
ACL在需要比标准权限更具体的访问控制的场景中很有用,通常用于多用户环境或共享主机。然而,复杂性可能是不可避免的,但需要仔细规划,以确保提供所需的安全属性
xxxxxxxxxxFreeBSD支持在UFS和OpenZFS中实现NFSv4 ACL。请注意,setfacl(1)命令的某些参数仅适用于POSIX ACL,而其他参数则适用于NFSv4 ACL。ACLs由装载时管理标志 acls 启用,该标志可以添加到 /etc/fstab 中。
因此,有必要访问 /etc/fstab ,并在选项部分添加 acls 标志,如下所示:
xxxxxxxxxx# Device Mountpoint FStype Options Dump Pass#/dev/ada0s1a / ufs rw,acls 1 1可以使用 getfacl(1) 检查文件或目录的ACLs。
例如,要查看 ~/test 文件上的ACL设置,请执行以下命令:
xxxxxxxxxx% getfacl test# file: test# owner: freebsduser# group: freebsduser owner@:rw-p--aARWcCos:-------:allow group@:r-----a-R-c--s:-------:allow everyone@:r-----a-R-c--s:-------:allow在使用POSIX.1e ACLs的情况下,输出应类似于以下内容:
xxxxxxxxxx# file: test# owner: freebsduser# group: freebsduseruser::rw-group::r--other::r--setfacl(1) 可用于在文件或目录中添加、修改或删除ACL。
如上所述,setfacl(1) 的一些参数不适用于NFSv4 ACL,反之亦然。本节介绍如何执行POSIX ACL和NFSv4 ACL的命令,并显示了这两个命令的示例。
例如,要设置POSIX.1e默认ACLs的强制元素:
xxxxxxxxxx% setfacl -d -m u::rwx,g::rx,o::rx,mask::rwx directory另一个示例为文件所有者的POSIX.1e ACLs条目设置读取、写入和执行权限,并为文件上的组邮件设置读取和写入权限:
xxxxxxxxxx% setfacl -m u::rwx,g:mail:rw file要在NFSv4 ACL中执行与前一个示例相同的操作:
xxxxxxxxxx% setfacl -m owner@:rwxp::allow,g:mail:rwp::allow file要删除POSIX.1e ACLs中文件中除三个必需项之外的所有ACL项,请执行以下操作:
xxxxxxxxxx% setfacl -bn file要删除NFSv4 ACL中的所有ACL条目:
xxxxxxxxxx% setfacl -b file有关这些命令可用选项的更多信息,请参阅 getfacl(1) 和 setfacl(2) 。
Capsicum是一个轻量级的操作系统功能和沙盒框架,实现了混合功能系统模型。能力是不可伪造的授权令牌,可以委托,必须提供才能执行操作。Capsicum将文件描述符转化为功能。
Capsicum可用于应用程序和库分区,将较大的软件体分解为隔离的(沙盒)组件,以实施安全策略并限制软件漏洞的影响。
进程审计(process accounting)是一种安全方法,管理员可以跟踪所使用的系统资源及其在用户之间的分配,提供系统监控,并最低限度地跟踪用户的命令。
进程审计既有优点也有缺点。积极的一面是,入侵可能会被缩小到入口点。缺点是进程审计生成的日志量,以及它们可能需要的磁盘空间。本节将向管理员介绍进程审计的基础知识。
xxxxxxxxxx如果需要更细粒度的审计,请参阅【19. 安全事件审计】。在使用进程审计之前,必须使用以下命令启用它:
xxxxxxxxxx# sysrc accounting_enable=yes# service accounting start审计信息存储在 /var/account 中的文件中,如有必要,accounting 服务首次启动时会自动创建该文件。这些文件包含敏感信息,包括所有用户发出的所有命令。对文件的写入权限仅限于root,读取权限仅限于根和控制盘组的成员。为了防止wheel成员读取文件,请更改 /var/account 目录的模式,仅允许root访问。
启用后,审计将开始跟踪CPU统计信息和执行的命令等信息。所有审计日志都是非人类可读的格式,可以使用 sa(8) 查看。如果发出时没有任何选项,sa(8) 将打印与每个用户调用次数、总运行时间(以分钟为单位)、总CPU和用户时间(以分为单位)以及平均I/O操作次数相关的信息。有关控制输出的可用选项列表,请参阅 sa(8) 。
要显示用户发出的命令,请使用 lastcomm 。
例如,此命令通过 ttyp1 终端上的 trhodes 打印出 ls 的所有使用情况:
xxxxxxxxxx# lastcomm ls trhodes ttyp1存在许多其他有用的选项,并在 lastcomm(1) 、 acct(5) 和 sa(8) 中进行了解释。
在FreeBSD中,资源限制是指控制和管理各种系统资源分配给进程和用户的机制。这些限制旨在防止单个进程或用户消耗过多的资源,这可能会导致性能下降或系统不稳定。资源限制有助于确保系统上所有活动进程和用户之间的公平资源分配。
FreeBSD为管理员提供了几种方法来限制个人可能使用的系统资源量。
传统方法通过编辑 /etc/login.conf 来定义登录类。虽然这种方法仍然受到支持,但任何更改都需要一个多步骤的过程,包括编辑此文件、重建资源数据库、对 /etc/master.passwd 进行必要的更改以及重建密码数据库。这可能会变得耗时,具体取决于要配置的用户数量。
rctl(8) 可用于提供一种更细粒度的方法来控制资源限制。此命令不仅支持用户限制,还可以用于设置进程和jails的资源限制。
本节从传统方法开始演示控制资源的两种方法。
FreeBSD为各种类型的资源提供了限制,包括:
表30. 资源类型
| 类型 | 说明 |
|---|---|
| CPU时间 | 限制进程可以消耗的CPU时间 |
| 内存 | 控制进程可以使用的物理内存量 |
| 打开文件 | 限制进程可以同时打开的文件数量 |
| 进程 | 控制用户或进程可以创建的进程数 |
| 文件大小 | 限制进程可以创建的最大文件大小 |
| 内核转储 | 控制是否允许进程生成核心转储文件 |
| 网络资源 | 限制进程可以使用的网络资源(例如套接字)的数量 |
有关类型的完整列表,请参阅 login.conf(5) 和 rctl(8) 。
在传统方法中,登录类和应用于登录类的资源限制在 /etc/login.conf 中定义。每个用户帐户都可以分配给一个登录类,其中 default 是默认登录类。每个登录类都有一组与其关联的登录功能。登录功能是一个 name=value 对,其中 name 是一个众所周知的标识符, value 是一个任意字符串,根据名称进行相应处理。
配置资源限制的第一步是通过执行以下命令打开 /etc/login.conf :
xxxxxxxxxx# ee /etc/login.conf然后找到要修改的用户类的部分。在这个例子中,让我们假设用户类被命名为 limited ,如果它不存在,请创建它。
xxxxxxxxxxlimited:\ ① :maxproc=50:\ ② :tc=default: ③① 用户类的名称。
② 将 limited 类中用户的最大进程数(maxproc)设置为50。
③ 表示此用户类继承了 default 类的默认设置。
修改 /etc/login.conf 文件后,运行 cap_mkdb(1) 生成FreeBSD用于应用这些设置的数据库:
xxxxxxxxxx# cap_mkdb /etc/login.confchpass(1) 可用于通过执行以下命令将类更改为所需的用户:
xxxxxxxxxx# chpass username这将打开一个文本编辑器,在其中添加新的 limited 类,如下所示:
xxxxxxxxxx#Changing user information for username.Login: usernamePassword: $6$2H.419USdGaiJeqK$6kgcTnDadasdasd3YnlNZsOni5AMymibkAfRCPirc7ZFjjvDVsKyXx26daabdfqSdasdsmL/ZMUpdHiO0Uid [#]: 1001Gid [# or name]: 1001Change [month day year]:Expire [month day year]:Class: limitedHome directory: /home/usernameShell: /bin/shFull Name: User &Office Location:Office Phone:Home Phone:Other information:现在,分配给受限类的用户将具有50的最大进程限制。请记住,这只是使用 /etc/login.conf 文件设置资源限制的一个示例。
请记住,在更改 /etc/login.conf 文件后,用户需要注销并重新登录才能使更改生效。此外,在编辑系统配置文件时,尤其是在使用特权访问时,请务必谨慎。
rctl(8) 系统提供了一种更细粒度的方式来设置和管理单个进程和用户的资源限制。它允许为特定进程或用户动态分配资源限制,而不管其用户类别如何。
使用 rctl(8) 的第一步是启用它,将以下行添加到 /boot/loder.conf 并重新启动系统:
xxxxxxxxxxkern.racct.enable=1然后通过执行以下命令启用并启动 rctl(8) 服务:
xxxxxxxxxx# sysrc rctl_enable="YES"# service rctl start然后, rctl(8) 可用于为系统设置规则。
规则语法( rctl.conf(5) )通过使用主题、主题id、资源和动作来控制,如本示例规则所示:
xxxxxxxxxxsubject:subject-id:resource:action=amount/per例如,要限制用户添加不超过10个进程,请执行以下命令:
xxxxxxxxxx# rctl -a user:username:maxproc:deny=10/user要检查应用的资源限制,可以执行 rctl(8) 命令:
xxxxxxxxxx# rctluser:username:maxproc:deny=10如果规则已被添加到 /etc/rctl.conf 中,则它们将在重新启动时持续存在。格式是规则,没有前面的命令。例如,前面的规则可以添加为:
xxxxxxxxxxuser:username:maxproc:deny=10近年来,安全领域在处理漏洞评估方面做出了许多改进。随着第三方实用程序的安装和配置几乎适用于当今任何可用的操作系统,系统入侵的威胁也在增加。
漏洞评估是安全的关键因素。虽然FreeBSD为基础系统发布公告,但为每个第三方实用程序发布公告超出了FreeBSD项目的能力范围。有一种方法可以减轻第三方漏洞,并警告管理员已知的安全问题。一个名为 pkg 的FreeBSD附加实用程序包含了明确用于此目的的选项。
pkg 对数据库进行安全问题轮询。该数据库由FreeBSD安全团队和端口开发人员更新和维护。
安装提供了用于维护 pkg 审计数据库的 periodic(8) 配置文件,并提供了一种保持其更新的编程方法。
安装后,为了随时审计作为 Ports Collection 一部分的第三方实用程序,管理员可以选择通过调用以下命令来更新数据库并查看已安装软件包的已知漏洞:
xxxxxxxxxx% pkg audit -Fvulnxml file up-to-datechromium-116.0.5845.96_1 is vulnerable: chromium -- multiple vulnerabilities CVE: CVE-2023-4431 CVE: CVE-2023-4427 CVE: CVE-2023-4428 CVE: CVE-2023-4429 CVE: CVE-2023-4430 WWW: https://vuxml.FreeBSD.org/freebsd/5fa332b9-4269-11ee-8290-a8a1599412c6.html samba413-4.13.17_5 is vulnerable: samba -- multiple vulnerabilities CVE: CVE-2023-3347 CVE: CVE-2023-34966 CVE: CVE-2023-34968 CVE: CVE-2022-2127 CVE: CVE-2023-34967 WWW: https://vuxml.FreeBSD.org/freebsd/441e1e1a-27a5-11ee-a156-080027f5fec9.html 2 problem(s) in 2 installed package(s) found.通过将web浏览器指向显示的URL,管理员可以获得有关漏洞的更多信息。
这将包括受FreeBSD移植版本影响的版本,以及可能包含安全建议的其他网站。
与许多高质量操作系统的生产商一样,FreeBSD项目有一个安全团队,负责确定每个FreeBSD版本的生命周期结束(End-of-Life,EoL)日期,并为尚未达到EoL的受支持版本提供安全更新。有关FreeBSD安全团队和支持版本的更多信息,请访问 FreeBSD安全页面 。
安全团队的一项任务是应对FreeBSD操作系统中报告的安全漏洞。一旦确认漏洞,安全团队就会验证修复漏洞所需的步骤,并使用修复程序更新源代码。然后,它将详细信息作为“安全咨询”发布。安全公告发布在 FreeBSD网站 上,并邮寄到 FreeBSD安全通知邮件列表 、 FreeBSD安全邮件列表 和 FreeBSD公告邮件列表 。
以下是FreeBSD安全公告的示例:
xxxxxxxxxx-----BEGIN PGP SIGNED MESSAGE-----Hash: SHA512=============================================================================FreeBSD-SA-23:07.bhyve Security Advisory The FreeBSD Project Topic: bhyve privileged guest escape via fwctlCategory: coreModule: bhyveAnnounced: 2023-08-01Credits: Omri Ben Bassat and Vladimir Eli Tokarev from MicrosoftAffects: FreeBSD 13.1 and 13.2Corrected: 2023-08-01 19:48:53 UTC (stable/13, 13.2-STABLE) 2023-08-01 19:50:47 UTC (releng/13.2, 13.2-RELEASE-p2) 2023-08-01 19:48:26 UTC (releng/13.1, 13.1-RELEASE-p9)CVE Name: CVE-2023-3494For general information regarding FreeBSD Security Advisories,including descriptions of the fields above, security branches, and thefollowing sections, please visit <URL:https://security.FreeBSD.org/>.I. Backgroundbhyve(8)'s fwctl interface provides a mechanism through which guestfirmware can query the hypervisor for information about the virtualmachine. The fwctl interface is available to guests when bhyve is runwith the "-l bootrom" option, used for example when booting guests inUEFI mode.bhyve is currently only supported on the amd64 platform.II. Problem DescriptionThe fwctl driver implements a state machine which is executed when theguest accesses certain x86 I/O ports. The interface lets the guest copya string into a buffer resident in the bhyve process' memory. A bug inthe state machine implementation can result in a buffer overflowing when copying this string.III. ImpactA malicious, privileged software running in a guest VM can exploit thebuffer overflow to achieve code execution on the host in the bhyveuserspace process, which typically runs as root. Note that bhyve runsin a Capsicum sandbox, so malicious code is constrained by thecapabilities available to the bhyve process.IV. WorkaroundNo workaround is available. bhyve guests that are executed without the"-l bootrom" option are unaffected.V. SolutionUpgrade your vulnerable system to a supported FreeBSD stable orrelease / security branch (releng) dated after the correction date.Perform one of the following:1) To update your vulnerable system via a binary patch:Systems running a RELEASE version of FreeBSD on the amd64, i386, or(on FreeBSD 13 and later) arm64 platforms can be updated via thefreebsd-update(8) utility:# freebsd-update fetch# freebsd-update installRestart all affected virtual machines.2) To update your vulnerable system via a source code patch:The following patches have been verified to apply to the applicableFreeBSD release branches.a) Download the relevant patch from the location below, and verify thedetached PGP signature using your PGP utility.[FreeBSD 13.2]# fetch https://security.FreeBSD.org/patches/SA-23:07/bhyve.13.2.patch# fetch https://security.FreeBSD.org/patches/SA-23:07/bhyve.13.2.patch.asc# gpg --verify bhyve.13.2.patch.asc[FreeBSD 13.1]# fetch https://security.FreeBSD.org/patches/SA-23:07/bhyve.13.1.patch# fetch https://security.FreeBSD.org/patches/SA-23:07/bhyve.13.1.patch.asc# gpg --verify bhyve.13.1.patch.ascb) Apply the patch. Execute the following commands as root:# cd /usr/src# patch < /path/to/patchc) Recompile the operating system using buildworld and installworld asdescribed in <URL:https://www.FreeBSD.org/handbook/makeworld.html>.Restart all affected virtual machines.VI. Correction detailsThis issue is corrected by the corresponding Git commit hash or Subversionrevision number in the following stable and release branches:Branch/path Hash Revision- -------------------------------------------------------------------------stable/13/ 9fe302d78109 stable/13-n255918releng/13.2/ 2bae613e0da3 releng/13.2-n254625releng/13.1/ 87702e38a4b4 releng/13.1-n250190- -------------------------------------------------------------------------Run the following command to see which files were modified by aparticular commit:# git show --stat <commit hash>Or visit the following URL, replacing NNNNNN with the hash:<URL:https://cgit.freebsd.org/src/commit/?id=NNNNNN>To determine the commit count in a working tree (for comparison againstnNNNNNN in the table above), run:# git rev-list --count --first-parent HEADVII. References<URL:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-3494>The latest revision of this advisory is available at<URL:https://security.FreeBSD.org/advisories/FreeBSD-SA-23:07.bhyve.asc>-----BEGIN PGP SIGNATURE-----iQIzBAEBCgAdFiEEthUnfoEIffdcgYM7bljekB8AGu8FAmTJdsIACgkQbljekB8AGu8Q1Q/7BFw5Aa0cFxBzbdz+O5NAImj58MvKS6xw61bXcYr12jchyT6ENC7yiR+KqCqbe5TssRbtZ1gg/94gSGEXccz5OcJGxW+qozhcdPUh2L2nzBPkMCrclrYJfTtMcnmQKjg/wFZLUVr71GEM95ZFaktlZdXyXx9Z8eBzow5rXexpl1TTHQQ2kZZ41K4KKFhup91dzGCIj02cqbl+1h5BrXJe3s/oNJt5JKIh/GBh5THQu9n6AywQYl18HtjVfMb1qRTAS9WbiEP5QV2eEuOG86ucuhytqnEN5MnXJ2rLSjfb9izs9HzLo3ggy7ybhN3tlbfIPjMEwYexieuoyP3rzKkLeYfLXqJU4zKCRnIbBIkMRy4mcFkfcYmI+MhFNPh2R9kccemppKXeDhKJurH0vsetr8ti+AwOZ3pgO21+9w+mjE+EfaedIi+JWhiphwqeFv03bAQHJdacNYGV47NsJ91CY4ZgWC3ZOzBZ2Y5SDtKFjyc0bf83WTfU9A/0drC0z3xaJribah9e6k5d7lmZ7L6aHCbQ70+aayuAEZQLr/N1doB0smNi0IHdrtY0JdIqmVX+d1ihVhJ05prC460AS/Kolqiaysun1igxR+ZnctE9Xdo1BlLEbYu2KjT4LpWvSuhRMSQaYkJU72SodQc0FM5mqqNN42Vx+X4EutOfvQuRGlI==MlAY-----END PGP SIGNATURE-----每个安全公告都使用以下格式:
每份安全公告均由安保人员的PGP密钥签署。安全官的公钥可以在OpenPGP密钥中验证。
安全咨询的名称始终以 FreeBSD SA- (表示FreeBSD安全咨询)开头,后跟两位数格式的年份(23:),后跟当年的咨询号(07.),再后跟受影响的应用程序或子系统的名称(bhyve)。
Topic 字段总结了漏洞。
Category 是指系统的受影响部分,可能是core(核心)、contrib(控制)或ports之一。
Module 字段是指组件位置。在这个例子中,bhyve 模块受到了影响;因此,此漏洞会影响随操作系统安装的应用程序。
Announced 字段反映了安全公告的发布日期。这意味着安全团队已经验证了问题的存在,并且已经向FreeBSD源代码库提交了补丁。
Credits 字段为注意到漏洞并报告漏洞的个人或组织提供信用。
Affects 字段解释了哪些FreeBSD版本受到此漏洞的影响。
Corrected 字段表示已纠正的日期、时间、时间偏移和版本。括号中的部分显示了已合并修复的每个分支,以及该分支的相应版本号。发布标识符本身包括版本号,如果合适,还包括补丁级别。补丁级别是字母 p 后跟一个数字,表示补丁的序列号,允许用户跟踪哪些补丁已经应用于系统。
CVE Name 字段列出了公共CVE.mitre.org安全漏洞数据库中的咨询号(如果存在)。
Background 字段提供受影响模块的描述。
Problem Description 字段解释了漏洞。这可能包括有关有缺陷的代码以及如何恶意使用该实用程序的信息。
Impact 字段描述了问题可能对系统产生的影响类型。
Workaround 字段指示无法立即修补系统的系统管理员是否可以使用解决方法。
Solution 字段提供了修补受影响系统的说明。这是一种经过逐步测试和验证的方法,用于修补系统并确保其安全运行。
Correction Details 字段显示每个受影响的Subversion或Git分支,以及包含更正代码的修订号。
References 字段提供了有关漏洞的其他信息来源。