2 Linux 安全和服务保护方法 #
在第 1 章 “通用准则”中,我们提到了 IBM 针对选定硬件子集倡议的通用准则 EAL 4+ 认证安装和设置。此认证版本为想要构建安全且经过强化的基本系统的客户奠定了良好的基础,但可能无法涵盖所有服务和许多客户感兴趣的软件。
下一部分将提供一个更通用的视图,并针对 SUSE Linux Enterprise Server 系统安全提供建议和指导。从上一部分来看,本部分的一些主题似乎是重复的,但其实上下文非常不同。更多细节将会在一些章节中提供,当然还提供了一些适用于大量服务的更通用的示例。
指南的本部分将只提供基本建议,而不是严格的规则。此部分中的过程和示例应可让您将安全增强技术应用于更多类型的基于服务器的服务和程序。
本章中的一些主题已在之前讨论过,但此处提供了更多细节和说明。精选的一般主题包括:
物理安全 – 保护服务器远离环境威胁(人员、地点、事物)。
安全策略和过程 – 服务器生命周期管理、磁盘/媒体回收、备份和存档安全。
系统监视 – 与事件通知/管理有关的过程。
系统自动化 – 适用于自动安全措施的机制和/或过程。启发、帐户控制、安全报告和修正、自动关闭等。
系统管理 – 获取软件包的方法、校验和签名密钥、修补过程和建议。
保护网络 – 添加程序、端口和服务封装程序 – iptables、tcpwrappers、services。
远程访问 – 额外的 SSH 信息和密钥联合身份验证。CA 集成。
通用服务 – 邮件、NFS 和自动装入。
保护内核和 init 进程 – 参数、systemd 目标和引导脚本。
访问控制 – 用户/组/权限。
口令安全和警告 – 正确设置口令和标题。
其他安全性 – 各种安全设置和杂项。
资源 – Web 链接、文档和示例参考、操作指南和一般信息、产品链接。
按主题层次结构再次对各章节进行组织,以确保连续性。请参见主目录以方便参考。
2.1 物理安全 #
物理安全应予以最大限度的关注。Linux 生产服务器应安放于加锁的数据中心之内,只有通过安全检查的人员才能访问。您也可以考虑使用引导加载程序口令,具体视环境和情况而定。
此外,还要考虑如下问题:
哪些人拥有主机的直接物理访问权限?
他们是否应拥有这些权限?
是否可以保护主机不被篡改,以及是否应进行此保护?
特定系统上所需的物理安全成本视情况而定,并且根据可用资金其成本也可能会有很大差别。
2.1.1 系统锁 #
数据中心内的大部分服务器机架都包含锁定功能。通常是位于机架正面的搭扣锁/圆筒锁,可让您转动插入锁定(或未锁定)位置的钥匙,以允许(或拒绝)进入。笼锁可防止有人篡改或窃取服务器的设备/介质,或者开箱直接操作/破坏硬件。防止系统重引导或从备用设备(例如 CD/DVD/USB 驱动器等)引导也很重要。
一些服务器还配有箱锁。根据系统供应商的设计和构造,这些锁可以发挥不同的作用。许多系统都设计为当尝试打开未开锁的系统时进行自我禁用。其他配有设备保护盖的系统将不允许插入或拔下键盘或鼠标。虽然有时锁是一项很实用的功能,但它们通常质量较差,很容易会被怀有不良意图的攻击者破坏。
2.2 锁定 BIOS #
本节仅介绍确保引导进程安全的基本方法。要了解使用 UEFI 和安全引导功能的更高级引导保护的相关信息,请参见第 13.1 节 “安全引导”。
BIOS(基本输入/输出系统)或其继承者 UEFI(统一可扩展固件接口)是 PC 类系统上最低级别的软件/固件。运行 Linux 的其他硬件类型(POWER、IBM Z)也配有执行与 PC BIOS 类似功能的低级别固件。当本文档提及 BIOS 时,通常指的是 BIOS 和/或 UEFI。BIOS 指示系统配置,使系统处于一个定义良好的状态,并提供访问低级别硬件的例程。BIOS 执行已配置的 Linux 引导加载程序(例如 GRUB 2)来引导主机。
大部分 BIOS 实施都可配置为阻止未经授权的用户操作系统及引导设置。通常通过设置 BIOS 管理员或引导口令来完成。只有更改系统配置时才需要输入管理员口令,但在每次正常引导时都需要引导口令。对于大多数用例,设置管理员口令并将引导限制为内置硬盘便已足够。这样,攻击者便无法只引导 Linux live CD 或 USB 闪存盘。虽然这并不会提供高级别的安全(可以重设置、去除或修改 BIOS – 假设用例访问权限),但它可以作为另一种保护措施。
许多 BIOS 固件具有各种其他安全相关设置。请与系统供应商联系,可查阅系统文档或在系统引导时检查 BIOS,来了解更多信息。
如果系统设置了引导口令,主机将不会在无人照管的情况下引导(例如当系统重引导或发生电源故障)。这是一种权衡。
首次设置系统时,通常不会要求提供 BIOS 管理员口令。请不要忘记该口令,否则您将需要通过硬件操作清除 BIOS 内存以再次获得访问权限。
2.3 通过引导加载程序提供的安全性 #
SUSE Linux Enterprise Server 中默认使用的 Linux 引导加载程序 GRUB 2 可设置引导口令。它还提供了口令功能,以便只有管理员才能启动交互操作(例如编辑菜单项和进入命令行界面)。如果指定了口令,在您按 C 键和 E 键并输入正确的口令之前,GRUB 2 将不允许任何交互控制。
有关示例,请参见 GRUB 2 手册页。
设置这些口令时请务必记住它们!此外,启用这些口令可能只会减缓入侵,而不一定能阻止入侵。同样,有些人可能会从移动设备引导,并装入您的根分区。如果您使用的是 BIOS 级别安全性和引导加载程序,较好的做法是禁用从您计算机 BIOS 中的移动设备进行引导的功能,然后还要通过口令来保护 BIOS 本身。
另请注意,需要将引导加载程序配置文件的模式更改为 600
(仅限 root
读取/写入)以对其进行保护,否则其他人将能够读取您的口令或哈希!
2.4 使用 seccheck 运行自动安全检查 #
seccheck
SUSE 安全检查器是一组外壳脚本,旨在定期自动检查系统的本地安全,并通过电子邮件向 root 用户或管理员配置的任何用户发送报告。
如果 seccheck 未安装(在您的系统上),请使用 sudo zypper in seccheck
进行安装。这些脚本由 systemd
计时器进行控制,该计时器默认未启用,必须由管理员进行启用。
有以下四种 seccheck
计时器:
/usr/lib/systemd/system/seccheck-daily.timer
/usr/lib/systemd/system/seccheck-monthly.timer
/usr/lib/systemd/system/seccheck-weekly.timer
/usr/lib/systemd/system/seccheck-autologout.timer
seccheck-daily.timer
、seccheck-monthly.timer
和 seccheck-weekly.timer
运行多项检查,如第 2.4.2 节 “每日、每周和每月检查”中所述。seccheck-autologout.timer
可注销非活动用户,请参见第 2.4.3 节 “自动注销”。
您可以将 seccheck 邮件的收件人由 root 更改为 /etc/sysconfig/seccheck
中的任何用户。以下示例将其更改为名为 firewall
的管理员用户:
SECCHK_USER="firewall"
2.4.1 启用 Seccheck 计时器 #
使用 systemctl
管理您的计时器,如同任何其他 systemd 计时器一样。以下示例启用并启动 seccheck-daily.timer
:
tux >
sudo
systemctl enable --now seccheck-daily.timer
列出所有活动计时器:
tux >
sudo
systemctl list-timers
列出所有已启用的活动和非活动计时器:
tux >
sudo
systemctl list-timers --all
2.4.2 每日、每周和每月检查 #
seccheck
执行下列每日检查:
|
字段的长度/数量/内容,具有相同 UID 的帐户,UID/GID 为 0 或 1 的帐户(除了 root 和 bin)。 |
|
字段的长度/数量/内容,没有口令的帐户 |
|
字段的长度/数量/内容 |
用户 root 检查 |
安全 umask 和 |
|
检查是否将重要的系统用户置于此处 |
|
检查执行程序的邮件别名 |
|
检查用户的 |
用户主目录 |
检查主目录是否可写入或被其他用户拥有 |
点文件检查 |
检查主目录中的众多点文件是否可写入或被其他用户拥有 |
邮箱检查 |
检查用户邮箱是否被用户拥有以及是否可读取 |
NFS 导出检查 |
不应进行全局导出 |
NFS 导入检查 |
NFS 装入应设置 |
混杂检查 |
检查网卡是否处于混杂模式 |
列表模块 |
列出装载的模块 |
列表套接字 |
列出打开的端口 |
下表列出了每周检查:
口令检查 |
运行 |
RPM md5 检查 |
通过 RPM 的 MD5 校验和功能检查已更改文件 |
suid/sgid 检查 |
列出所有 suid 和 sgid 文件 |
可执行文件组写入 |
列出组可写/全局可写的所有可执行文件 |
可写入检查 |
列出全局可写的所有文件(包括可执行文件) |
设备检查 |
列出所有设备 |
john
审计口令要启用口令审计,必须先安装软件包 john,即 John the Ripper 快速口令破解程序。该软件包可从 https://build.opensuse.org/package/show/security/john 上的 openSUSE Build Service 获取。
每月检查会列显一份完整的报告,每日检查和每周检查的列显内容则不相同。
2.4.3 自动注销 #
seccheck-autologout.timer
计时器每隔 10 分钟运行一次,检查远程和本地终端会话是否处于非活动状态,并在超过空闲时间后终止会话。
在 /etc/security/autologout.conf
文件中配置您需要的超时。参数包括默认的空闲和注销延迟时间,以及限制特定于用户、组、TTY 设备和 SSH 会话的最大空闲时间的配置。/etc/security/autologout.conf
包含多个配置示例。
2.5 淘汰包含敏感数据的 Linux 服务器 #
安全策略通常包含即将被淘汰或被处置的储存媒体的一些处理过程。磁盘和媒体擦除过程常常被描述为媒体的完全销毁。您可以在因特网上找到多个免费工具。搜索“dod 磁盘擦除实用程序”将返回多个搜索结果。要淘汰包含敏感数据的服务器,请务必确保无法从硬盘恢复数据。要确保已去除所有数据痕迹,可以使用 scrub
等擦除实用程序。许多擦除实用程序都会多次重写数据。这样可确保即使使用复杂的方法,也无法取回已擦除数据的任何部分。一些工具甚至可通过可引导移动设备进行操作,并根据美国国防部 (DoD) 标准去除数据。请注意,许多政府机构都会指定自己的数据安全标准。一些标准可能强于其他标准,但可能需要更多的实施时间。
一些设备(例如 SSD)使用耗损均衡功能,不一定会在同一物理位置写入新数据。此类设备通常会提供自己的删除功能。
2.5.1 scrub:磁盘重写实用程序 #
scrub
利用重复模式来重写硬盘、文件和其他设备,旨在让从这些设备恢复数据变得更困难。它有三种基本操作模式:在字符或块设备上、在文件上或在指定目录上。有关详细信息,请参见手册页 man 1 scrub
。
- nnsa
用于清理可移动硬盘和不可移动硬盘的 4 轮 NNSA Policy Letter NAP-14.1-C (XVI-8),需要使用伪随机模式重写所有位置两次,然后使用一种已知模式:ran- dom(x2)、0x00、verify。
- dod
用于清理可移动和不可移动 rigid 磁盘的 4 轮 DoD 5220.22-M 第 8-306 节程序 (d),需要使用一个字符、其补充、一个随机字符重写所有可寻址位置,然后进行校验。注意:scrub 首先执行一轮随机,以使校验更容易:random、0x00、0xff、verify。
- bsi
德国信息技术安全中心 (http://www.bsi.bund.de) 建议的 9 轮方法:0xff、0xfe、0xfd、0xfb、0xf7、0xef、0xdf、0xbf、0x7f。
- gutmann
下面引述的 Gutmann 文献中对规范化 35 轮序列进行了说明。
- schneier
Bruce Schneier 在“Applied Cryptography”(应用密码学,1996)中介绍的 7 轮方法:0x00、0xff、random(x5)
- pfitzner7
Roy Pfitzner 的 7 轮随机方法:random(x7)。
- pfitzner33
Roy Pfitzner 的 33 轮随机方法:random(x33)。
- usarmy
US Army AR380-19 方法:0x00、0xff、random。(注意:与 DoD 522.22-M 第 8-306 节的过程 (e) 相同,用于清理磁芯内存)。
- fillzero
1 轮模式:0x00。
- fillff
1 轮模式:0xff。
- random
1 轮模式:random(x1)。
- random2
2 轮模式:random(x2)。
- old
6 轮预发行版 1.7 擦除方法:0x00、0xff、0xaa、0x00、0x55、verify。
- fastold
5 轮模式:0x00、0xff、0xaa、0x55、verify。
- custom=string
1 轮自定义模式。字符串可能包含 C 样式数字转义符:\nnn(八进制)或 \xnn(十六进制)。
2.6 备份 #
如果您的系统被入侵,可以使用备份来恢复先前的系统状态。发生 bug 或意外时,也可以使用备份将当前系统与旧版本进行比较。对于生产系统而言,请务必针对灾难等情况进行一些非现场备份(例如磁带/可刻录媒体的非现场储存,或非现场发起的储存)。
出于法律原因,一些公司和组织必须谨慎考虑备份过多信息以及保留时间过长的情况。如果您的环境设有销毁旧纸质文件的相关政策,您可能还需要将此政策扩展至 Linux 备份磁带。
有关服务器的物理安全的规则也适用于备份。此外,还建议您对备份数据进行加密。可对单个备份存档执行此操作,也可对整个备份文件系统执行此操作(如适用)。如果备份媒体丢失(例如在运输途中),加密可保护数据免受未经授权的访问。如果备份系统本身遭到入侵,则适用相同的规则。在某种程度上,加密还可确保备份的完整性。但请注意,相应人员需要能够在紧急情况下解密备份。此外,还应考虑加密密钥本身被入侵而需要替换的情况。
如果已知某个系统被入侵或疑似被入侵,请务必确定备份的完整性状态。如果在较长一段时间内都未检测到系统入侵,则有可能备份已包含被操控的配置文件或恶意程序。请保留足够长的备份历史以便检查可能的不合理差异。
即使不存在任何已知安全违规,也应定期检查各备份中重要配置文件之间的差异,这有助于发现安全问题(甚至可能的意外错误配置)。此方法最适合内容不会频繁发生更改的文件和环境。
2.7 磁盘分区 #
服务器至少应该具有以下独立文件系统:/
、/boot
、/usr
、/var
、/tmp
和 /home
。如此可避免一些问题,例如,/var
和 /tmp
下的日志记录空间和临时空间填满根分区。第三方应用程序也应位于独立的文件系统,例如在 /opt
下。
独立文件系统的另一项优势是可以选择只适合文件系统层次结构中某些区域的特殊装入选项。一些相关的装入选项包括:
noexec
:阻止文件执行。nodev
:阻止使用字符或块特殊设备。nosuid
:阻止set-user-ID
或set-group-ID
位生效。ro
:以只读
方式装入文件系统。
在对分区装入应用上述选项之前,需要仔细考虑每个选项。否则应用程序可能会停止工作,或者可能会违反支持状态。如果正确应用,装入选项有助于抵御某些类型的安全攻击或避免错误配置。例如,无需将 set-user-ID
二进制文件置于 /tmp
中。
建议您查看第 1 章 “通用准则”。请务必了解是否需要将可能影响运行中系统的分区进行分隔(例如,日志文件会填满 /var/log
,因此有必要将 /var
从 /
分区分隔出来)。另一个注意事项是您可能需要利用 LVM 或其他卷管理器,或者至少是扩展分区类型,来解决 PC 类系统上的四个主分区的限制。
SUSE Linux Enterprise Server 中的另一项功能是将分区甚至是充当容器的单个目录或文件进行加密。有关详细信息,请参见第 13 章 “对分区和文件进行加密”。
2.8 防火墙 (iptables) #
本指南中不会详细介绍如何从头设置 Linux 防火墙。大多数公司都会使用专用防火墙或设备来保护其生产网络中的服务器。强烈建议设置防火墙以确保环境安全。
SUSE Linux Enterprise Server 还包括 firewalld
。这是一个防火墙守护程序,可使用 firewall-cmd
通过命令行进行配置,也可使用 firewall-config
在图形用户界面中配置。还可以通过 YaST 防火墙接口配置 firewalld
的基本设置。有关 firewalld
工作原理的详细信息,请参见 http://www.firewalld.org/documentation/。
如果您还对使用 iptables
直接编写防火墙规则的脚本感兴趣,因特网上提供了众多指南可供参考。相关资源请见附录。有关大量的 iptables 教程和示例,请参见 http://www.linuxguruz.com/iptables/。还有称为 nftables
的下一代 Linux 防火墙实施。编写防火墙规则的脚本时,使用该防火墙实施会更简单且功能更强大。https://wiki.nftables.org/wiki-nftables/index.php/Main_Page 中提供了有关 nftables
的详细信息。
2.9 内核中的安全功能 #
以下列表显示您可用于保护 Linux 服务器免受攻击的可调内核参数。其中一些为 SLE 发行套件中已包含的默认参数。要查看任何这些设置的当前状态,您可以查询内核(/proc/sys/...
内容)。例如,源路由设置位于 /proc/sys/net/ipv4/conf/all/accept_source_route
文件中。只显示文件的内容,以查看当前运行的内核是如何设置的。
对于显示的每个可调内核参数,可修改需要受到影响的项更改,或将其添加到 /etc/sysctl.conf
配置文件中以使在重引导后保留更改。
您可以使用以下命令,获取当前内核设置列表:
root #
sysctl -a
通过将 sysctl
命令的输出重定向到文件来储存内核设置的输出(以供比较或参考)是一个很好的方法,例如
root #
sysctl -A > /root/sysctl.settings.store
由于 SUSE Linux Enterprise Server 默认包含专注于安全的内核微调参数,您会看到将稀疏填充现有 /etc/sysctl.conf
文件。您可以选择使用上述储存全部内核设置的“目录”方法,然后选择您要在重引导时重置的那些参数。您可以将这些参数置于 /etc/sysctl.conf
文件中,重引导时便可以在此处提取它们,也可以通过运行命令 sysctl
-p
将它们立即插入(到正在运行的内核中)。
Oracle、SAP、DB2、Websphere 等众多第三方应用程序建议更改内核参数,以确保高性能的 I/O 或 CPU 处理。获取当前设置的完整列表有助于日后参考。
2.9.1 启用 TCP SYN Cookie 保护(SUSE Linux Enterprise Server 15 SP2 中的默认设置) #
SYN 攻击是一种拒绝服务攻击,会消耗掉计算机上的所有资源。连接到网络的任何服务器都可能会受到此攻击。要启用 TCP SYN Cookie 保护,请编辑 /etc/sysctl.conf
文件,并确保包含下面一行和值:
net.ipv4.tcp_syncookies = 1
忽略配置选项的名称,它也适用于 IP6。
2.9.2 禁用 IP 源路由(SUSE Linux Enterprise Server 15 SP2 中的默认设置) #
源路由用于指定从来源到目标的网络路径或路由。联网用户可以使用此功能进行问题诊断。但如果入侵者能够将源路由包发送到网络,他们便可以截获答复,而您的服务器可能并不知道其未与可信的服务器进行通讯。
net.ipv4.conf.all.accept_source_route = 0
或
net.ipv6.conf.all.accept_source_route = 0
2.9.3 禁止接受 ICMP 重定向 #
路由器使用 ICMP 重定向来告知服务器还有比服务器所选网络路径更好的其他网络路径。不过,入侵者可能会使用 ICMP 重定向包,通过让流量使用您不想使用的路径来更改主机的路由表。要禁止接受 ICMP 重定向,请编辑 /etc/sysctl.conf
文件并添加下面一行:
net.ipv4.conf.all.accept_redirects = 0
或
net.ipv6.conf.all.accept_redirects = 0
2.9.4 启用 IP 欺骗保护(SUSE Linux Enterprise Server 15 SP2 中的默认设置) #
IP 欺骗是一种入侵者通过操控源地址以发送声称来自其他主机的包的技术。拒绝服务攻击经常会使用 IP 欺骗。有关 IP 欺骗的详细信息,请参见 http://en.wikipedia.org/wiki/IP_address_spoofing。
net.ipv4.conf.all.rp_filter = 1
2.9.5 启用忽略 ICMP 请求 #
如果您希望或需要 Linux 忽略 ping
请求,请编辑 /etc/sysctl.conf
文件并添加下面一行:
net.ipv4.icmp_echo_ignore_all = 1
在许多环境中都无法执行此操作,因为一些监视系统会使用基本 ICMP (ping) 来确定网络上设备的运行状况(或者至少能够做出响应)。
2.9.6 启用忽略广播请求(SUSE Linux Enterprise Server 15 SP2 中的默认设置) #
如果您希望或需要 Linux 忽略广播请求,请添加下面一行。
net.ipv4.icmp_echo_ignore_broadcasts = 1
2.9.7 启用不良错误消息保护(SUSE Linux Enterprise Server 15 SP2 中的默认设置) #
要提醒您网络中的不良错误消息,请添加下面一行。
net.ipv4.icmp_ignore_bogus_error_responses = 1
2.9.8 启用欺骗包、源路由包、重定向包的日志记录 #
要开启欺骗包、源路由包和重定向包的日志记录,请编辑 /etc/sysctl.conf
文件并添加下面一行:
net.ipv4.conf.all.log_martians = 1
由于设置 SUSE Linux Enterprise Server(使用 rsyslog)以进行网络事件跟踪的方式,这可能会导致记录大量消息。
2.9.9 缓冲溢出攻击缓解措施 #
从 2.6.x 内核版本开始,Linux 提供地址空间布局随机化 (ASLR) 和不执行(NX 位)功能来缓解缓冲区溢出攻击。有关更多信息,请参见:
从版本 12 开始,SUSE Linux Enterprise Server 随附了一些缓冲区溢出攻击缓解技术,默认会启用这些技术。
默认情况下,ASLR 处于启用状态。您可使用以下命令通过输出进行校验。预期结果为 2:
tux >
cat /proc/sys/kernel/randomize_va_space
2
这将会随机分配动态关联库的堆、堆栈和装载地址。已使用特殊编译器标志(PIE 和 _FORTIFY_SOURCE)构建运行特权或处理网络数据的程序,以便更充分地利用随机分配文本和数据段。
可执行文件的空间保护功能可防止执行预期不会执行的内存空间。Linux 使用不执行位。SUSE Linux Enterprise Server 内核 x86 和 AMD64/Intel 64 体系结构上默认会启用此功能。每个程序都必须支持使用 NX 位。您可以检查您的系统是否支持 NX 位:
tux >
dmesg | grep '[NX|DX]*protection'
[ 0.000000] NX (Execute Disable) protection: active
如果 NX 处于禁用状态,请检查您的 BIOS 或 UEFI 的设置是否启用该功能,并确保您的 CPU 支持该功能。
此外,从版本 12 开始,SUSE Linux Enterprise Server 可通过设置 kptr_restrict
来防止泄漏内部内核地址,使入侵内核的难度增加。
tux >
cat /proc/sys/kernel/kptr_restrict
1
在支持该功能的 CPU(更新的 AMD64/Intel 64 CPU)上,内核默认还会使用 SMEP 保护,可阻止从内核内部直接执行用户空间代码。攻击者通常会利用这一点入侵内核,因此这是一项很好的强化措施。
2.9.10 文件系统强化 #
为了减少通过特权程序(tmp-races、TOCTOU)访问不安全文件系统的漏洞,Linux 内核提供了两个 sysctl
变量,SUSE Linux Enterprise Server 15 SP2 上默认应已启用了这些变量:fs.protected_hardlinks
和 fs.protected_symlinks
或其相应的 /proc
项:
tux >
cat /proc/sys/fs/protected_hardlinks
1
通过将此项设为 1
,用户将无法创建其不拥有的文件的软链接和硬链接。这将会减少不小心调用 open(2)、creat(2) 或类似函数的程序的常见漏洞入侵途经。
tux >
cat /proc/sys/fs/protected_symlinks
1
通过将此项设为 1
,仅当在粘滞全局可写目录之外,或者当链接的 UID 与跟踪块匹配,或者当目录拥有者与符号链接拥有者匹配时,才允许跟踪符号链接。
2.9.11 增加的 dmesg
限制 #
dmesg
提供各种系统内部信息,例如内核地址、服务崩溃以及本地攻击者可能使用的类似信息。这就是为何对 dmesg
的访问默认仅限于 root
的原因所在。相应行为由 kernel.dmesg_restrict
选项(默认值为 1)进行控制。如果设置为 0,则任何用户都可以查看 dmesg
的输出。
2.9.12 过滤对 /dev/mem
的访问(SUSE Linux Enterprise Server 12 中的默认设置) #
/dev/mem
中会存储系统主内存的映像,包括内核和用户空间内存。允许对此信息的未经过滤访问是危险的,因此已对 SUSE Linux Enterprise Server 上的内核进行了编译,启用了 CONFIG_STRICT_DEVMEM
。此设置会将对 /dev/mem
的用户空间访问限制为内存映射的外设。
2.10 AppArmor #
AppArmor 包含在 SUSE Linux Enterprise Server 中,是一种旨在为您的应用程序提供易于使用的安全框架的应用程序安全工具。AppArmor 可通过强制执行特定行为以及防止一些未知的应用程序缺陷被恶意利用,来主动保护操作系统和应用程序免受外部或内部威胁,甚至是零时差攻击。AppArmor 安全策略(称为“配置文件”)完整地定义了每个应用程序可访问的系统资源和文件。配置文件还定义了访问模式,例如读取或写入。AppArmor 随附多个默认配置文件,并结合使用高级静态分析和基于学习的工具,甚至在几个小时内便能成功部署适用于非常复杂的应用程序的 AppArmor 配置文件。
AppArmor 由以下部分组成:
强制执行安全配置文件的内核扩展。
RPM 的集合,还随附有提供了以下项目的 SUSE Linux Enterprise Server:
SUSE Linux Enterprise Server 随附有适用于众多程序的一组 AppArmor 配置文件。
用于创建和管理新的和现有的 AppArmor 配置文件的工具。
用于管理安全事件的报告和通知的 YaST 用户界面。
有关 AppArmor 工具的文档。
最好在完成安装之后重引导系统,以便 AppArmor 能够限制所有系统守护程序。
有关 AppArmor 的使用和配置的其他细节和逐步说明,您还可以参见第 IV 部分 “通过 AppArmor 限制特权”。
2.11 SELinux #
除了传统的读取、写入或执行权限之外,SELinux 还提供更精细的访问控制。例如,您可以控制取消链接、追加或移动文件的人员。您可以控制对除文件以外的许多资源(例如网络资源和进程间通讯)的访问。此功能与基本启用一起随附于 SUSE Linux Enterprise Server 15 SP2 中。SUSE Linux Enterprise Server 上支持 SELinux 框架;SLES 提供在您的服务器上使用 SELinux 所需的所有二进制文件和库。有关详细信息,请参见第 V 部分 “SELinux 对比”的“配置 SELinux”一章。
2.12 FTP、telnet
和 rlogin
(rsh) #
FTP 的程序/协议、telnet
和 rlogin
(rsh
) 都容易遭到窃听,这是改用 ssh
、scp
或 sftp
等安全替代方案的主要原因之一。强烈建议您不要运行这些不安全的服务。由于存在高风险,本指南未涵盖这些服务(vsftp 除外)。最好不要在系统上安装 FTP 和 Telnet 服务器 RPM(作为我们的指导的一部分,请参见下一节)。请注意,EAL 4+ 评估安装了 vsftp。“vs”表示“非常安全”,与常规 FTP 相比,具有竞争优势。
2.13 去除不需要的软件包 (RPM) #
保护 Linux 系统的一个非常重要的步骤就是确定 Linux 服务器的主要功能或角色。否则,就很难了解需要保护哪些方面,并且对这些 Linux 系统的保护可能是无效的。因此,请务必查看默认的软件包列表,并去除任何与您定义的安全策略不符的不需要的软件包。
一般而言,RPM 软件包包含以下各项:
在安装时写入到 RPM 数据库的软件包元数据。
软件包的文件和目录。
安装和去除之前和之后执行的脚本。
除非软件包包含以下项目,否则一般不会给系统带来任何安全风险:
任何已安装文件上的 setuid 或 setgid 位
组可写或全局可写的文件或目录
在安装时激活或默认激活的服务。
假设上述三个条件均不适用,软件包只是文件集合。安装或卸载此类软件包对系统的安全价值不会产生影响。
但无论如何,将您系统中的已安装软件包限制为最少数量都会很有用。当发布安全警报和补丁时,限制最少数量将使得需要更新的软件包更少,并将简化维护工作。最好的做法是不要在生产服务器上安装开发软件包或桌面软件包(例如 X 服务器)。如果您不需要这些软件包,您也不应该安装它们,例如 Apache Web 服务器或 Samba 文件共享服务器。
Oracle 和 IBM 等许多第三方供应商需要桌面环境和开发库来运行安装程序。为避免它对生产服务器的安全产生影响,许多组织都会通过在开发实验室中创建静默安装(响应文件)来解决此问题。
此外,除非有正当的理由,否则也不应安装 FTP 和 Telnet 守护程序等其他软件包。应改用 ssh
、scp
或 sftp
替代方案,请参见第 2.12 节 “FTP、telnet
和 rlogin
(rsh)”。
最先执行的操作中的一项操作应该是创建仅包含系统和应用程序所需 RPM 以及维护和查错目的所需 RPM 的 Linux 映像。较好的做法是从 RPM 最少列表开始,然后根据需要添加软件包。此过程比较耗时,但通常是值得的。
SUSE Appliance Program 包含一个称为 JeOS(最精简操作系统,Just Enough Operating System)的组件。JeOS 的占用量非常小,并且可以对其进行自定义,以满足系统开发人员的特定需求。JeOS 主要用于硬件/软件设备或虚拟机开发。JeOS 的主要优点是高效、高性能、高安全性以及管理简单。
如果您无法选择 JeOS,较好的选择是最小安装模式。
要生成所有已安装软件包的列表,请使用以下命令:
root #
zypper packages -i
要检索有关特定软件包的细节,请运行:
root #
zypper info PACKAGE_NAME
要在删除某个软件包时检查并报告可能的冲突或依赖项,请运行:
root #
zypper rm -D PACKAGE_NAME
此命令非常有用,因为在未测试的情况下就运行去除命令常常会产生大量投诉,并且需要手动寻找递归依赖项。
去除软件包时,请小心不要去除任何基本的系统软件包。这可能会使您的系统受损,无法再引导或修复。如果您对此不确定,最好是先对您的系统进行完整的备份,然后再去除任何软件包。
对于使用以下 zypper
命令并添加“-u”开关最后去除的一个或多个软件包,这将导致由于移除指定软件包而变为未使用的任何依赖项也将被去除:
root #
zypper rm -u PACKAGE_NAME
2.14 修补 Linux 系统 #
为补丁管理构建基础结构是构成主动且安全的 Linux 生产环境的另一个非常重要的部分。
建议您实施书面安全策略和程序,以处理 Linux 安全更新和问题。例如,安全策略应详细指出评估、测试和发布补丁的时间范围。与网络有关的安全漏洞应具有最高优先级,并应在短时间内立即予以解决。评估阶段应发生于测试实验室内,并应首先在开发系统中进行初始发布。
独立的安全日志文件应包含有关已接收的 Linux 安全公告、已研究和已评估的补丁、补丁的应用时间等细节。
SUSE 发布以下三类补丁:安全、推荐和可选。可以使用一些选项来确保系统获得修补、是最新的且安全。每个系统都可以注册,然后使用附带的 YaST 工具(YaST 联机更新)通过 SUSE 更新网站来检索更新。SUSE 还创建了储存库镜像工具 (RMT),它可以有效地维护可用/已发布补丁/更新/修复的本地储存库,以便系统随后可从该储存库中提取相应补丁/更新/修复,减少了因特网流量。SUSE 还提供 SUSE Manager,用于维护、修补、报告和集中管理 Linux 系统,不仅仅是 SUSE,其他分发包也提供有该工具。
2.14.1 YaST 联机更新 #
可使用 YaST 联机更新工具基于每台服务器安装重要的更新和改进。可通过包含补丁的产品特定更新目录获取 SUSE Linux Enterprise 系列的当前更新。使用 YaST 并选择
组中的 完成更新和改进的安装。已将您系统当前可用的所有新补丁(可选补丁除外)标记为待安装。单击 将会自动安装这些补丁。2.14.2 自动联机更新 #
YaST 还可设置自动更新。选择
› 。配置每日或每周更新。有些补丁(如内核更新)需要用户交互,交互可能会导致自动更新停止。请选中 使更新过程自动进行。在这种情况下,请手动运行联机更新安装需要交互的补丁。
选中rpm
或 zypper
对其进行手动安装。
2.14.3 储存库镜像工具 — RMT #
适用于 SUSE Linux Enterprise 的储存库镜像工具比联机更新进程更进一步,建立了具有储存库和注册目标的代理系统。这有助于客户在每个系统上的防火墙内集中管理软件更新,同时维护其公司安全政策和法规合规性。
可下载的 RMT (http://download.suse.com/) 与 SUSE Customer Center (https://scc.suse.com/) 集成在一起,并提供与其同步的储存库和注册目标。这对于跟踪大型部署中的权利非常有帮助。RMT 可维护 SUSE Customer Center 的所有功能,同时允许更安全的集中部署。它随每个 SUSE Linux Enterprise 订购提供,因此完全受支持。
RMT 提供了默认配置的替代配置,需要打开出站连接的防火墙,然后每个设备才能接收更新。此要求通常会违反公司安全策略,并且可能被某些组织视为对法规遵从的威胁。RMT 与 SUSE Customer Center 集成,可确保每个设备都可以接收相应的更新,而无需打开防火墙,也没有冗余带宽要求。
RMT 还让客户能够在本地跟踪整个企业中的 SUSE Linux Enterprise 设备(即服务器、桌面或服务点终端)。现在,客户可以轻松确定帐单周期结束时有多少权利需要续约,而不必走到数据中心来手动更新电子表格。
RMT 会向 SUSE Linux Enterprise 设备告知任何可用的软件更新。每个设备随后可从 RMT 获取所需的软件更新。RMT 的引入改进了网络中的 SUSE Linux Enterprise 设备之间的交互,并简化了这些设备接收系统更新的方式。RMT 支持每个安装实例均拥有一个适用于数百个 SUSE Linux Enterprise 设备的基础结构(取决于特定的使用配置文件)。这使服务器跟踪更精确、更有效。
简单来说,适用于 SUSE Linux Enterprise 的储存库镜像工具向客户提供:
防火墙和法规遵从保证
软件更新期间缩减的带宽使用率
来自 SUSE 的完全支持(依照活动订阅)
对与 SUSE Customer Center 的现有客户接口的维护
准确的服务器授权跟踪以及对订购使用情况的有效测量
自动化的过程以便轻松计算权利总数(不再需要电子表格!)
简单的安装过程,该过程会自动与 SUSE Customer Center 同步服务器权利
2.14.4 SUSE Manager #
SUSE Manager 可自动进行 Linux 服务器管理,可让您更快且更准确地对服务器进行配置和维护。它会通过单个控制台监视每台 Linux 服务器的运行状况,以便您可以在服务器性能问题对业务产生影响之前识别出该问题。SUSE Manager 还可让您在物理、虚拟和云环境中全面管理您的 Linux 服务器的同时提高数据中心效率。SUSE Manager 为 Linux 提供全面的生命周期管理:
资产管理
置备
软件包管理
补丁管理
配置管理
重新部署
有关 SUSE Manager 的详细信息,请参见 https://www.suse.com/products/suse-manager/。
2.15 保护网络 — 开放网络端口检测 #
为了保护服务器安全需要您了解其所提供的服务,即正在运行的服务。默认的服务器安装可能会包含非自显运行且使用开放网络端口的服务。因此最重要的任务之一就是检测并关闭不需要的网络端口。要获取监听网络端口(TCP 和 UDP 套接字)的列表,您可以使用 netstat
服务运行以下命令:
root #
ss -tulpn
请注意,ss
输出的宽度可能大于默认终端屏幕的宽度。如果屏幕太窄,上述选项将可能导致输出换行,并且可读性变差。
下面是上述命令的一个输出示例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 0.0.0.0%eth0:68 0.0.0.0:* users:(("wickedd-dhcp4",pid=541,fd=8)) tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1562,fd=3)) tcp LISTEN 0 100 127.0.0.1:25 0.0.0.0:* users:(("master",pid=1701,fd=13)) tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1562,fd=4)) tcp LISTEN 0 100 [::1]:25 [::]:* users:(("master",pid=1701,fd=14))
从上面的输出可以看到,有 2 个基于 TCP 的服务和 1 个基于 UDP 的服务正在运行和监听:master、sshd 和 wickedd。应停止不需要的服务。使用其他计算机中的端口扫描进行确认。请务必获取适当的权限,以扫描生产网络上的计算机。
一些组织将未经许可的端口扫描视为安全违规。
使用 nmap
命令可执行此类扫描:
root #
nmap -sS -sU REMOTE_HOST
Starting nmap 3.70 ( http://www.insecure.org/nmap/ ) at 2004-12-10 22:51 CST
Interesting ports on venus (192.168.2.101):
(The 3131 ports scanned but not shown below are in state: closed)
PORT STATE SERVICE
22/tcp open ssh
69/tcp open auth
Nmap run completed -- 1 IP address (1 host up) scanned in 221.669 seconds
请注意,默认情况下,运行 nmap
命令将只会扫描某些知名端口。如果您要扫描所有端口,则需要指定 -p 1-65535
。执行此操作将明显降低扫描速度。特别是对于 UDP 扫描,建议使用 masscan (https://software.opensuse.org/package/masscan) 等异步扫描仪。
root #
masscan REMOTE_HOST/32 -p 1-65535
Starting masscan 1.0.4 (http://bit.ly/14GZzcT) at 2017-11-28 10:51:58 GMT
-- forced options: -sS -Pn -n --randomize-hosts -v --send-eth
Initiating SYN Stealth Scan
Scanning 1 hosts [65535 ports/host]
Discovered open port 222/tcp on 192.168.1.2
Discovered open port 443/tcp on 192.168.1.2
Discovered open port 25/tcp on 192.168.1.2
Discovered open port 9030/tcp on 192.168.1.2
Discovered open port 587/tcp on 192.168.1.2
Discovered open port 80/tcp on 192.168.1.2
要扫描 UDP,请使用 U:
前缀指定端口:masscan REMOTE_HOST/32 -p U:1-65535
。
扫描结果之间可能会有较大差别,并且可能不会显示所有监听网络套接字,具体视防火墙状态而定。
从上面运行的第一个示例中,您会看到 tftpd
守护程序正在端口 auth(端口 69)上监听 IDENT
。您还可以看到 sendmail 未监听远程传入网络连接。
另一种列出程序正在主机上监听的所有 TCP 和 UDP 套接字的方法是使用 lsof
命令,它会列出打开的文件:
root #
lsof -i -n | egrep 'COMMAND|LISTEN|UDP'
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 2317 root 3u IPv6 6579 0t0 TCP *:ssh (LISTEN)
tftpd 2328 root 5u IPv4 6698 0t0 TCP *:auth (LISTEN)
sendmail 2360 root 3u IPv4 6729 0t0 TCP 127.0.0.1:smtp (LISTEN)
您应始终检查使用外部扫描通过在计算机上运行命令获得的结果。
2.16 保护 Postfix #
Postfix 是 Sendmail 的替代方案,与 Sendmail 相比具有多项安全优势。Postfix 是 SUSE Linux Enterprise Server 中的默认邮件系统,并包含多个小程序,每个程序都可以执行各自的小型任务,大部分此类程序都在 chroot jail 中运行。这是建议使用 Postfix 来替代 Sendmail 的原因之一。
不属于专用邮件或中继服务器的 Linux 服务器不应接受外部电子邮件。但对于生产服务器来说,将本地电子邮件发送到中继服务器很重要 — 可以配置一些安全设置(例如 seccheck 脚本)以向除 root
以外的其他人发送电子邮件,甚至发送到本地系统之外。
校验 /etc/postfix/main.cf
中是否已设置下列参数,以确保 Postfix 仅接受传递本地电子邮件(请直达文件底部,因为前面的部分主要是注释掉的示例项和解释):
mydestination = $myhostname, localhost.$mydomain, localhost inet_interfaces = localhost
mydestination
参数列出用于接收电子邮件的所有域。inet_interfaces
参数指定要在其上监听的网络。重新配置 Postfix 之后,必须重启动邮件系统。
root #
systemctl restart postfix
从其他主机运行下面其中一个命令,以校验 Postfix 是否未监听网络请求(传入):
nmap -sT -p 25 REMOTE_HOST telnet <remote_host> 25
在本地主机上运行这些命令将提供不准确的结果,因为 Postfix 预期接受来自本地节点的连接。请使用外部主机,以获取正确结果。
2.17 文件系统:保护 NFS #
NFS(网络文件系统)允许服务器通过网络共享文件。但使用 NFS 的所有网络服务都存在风险。
下面是一些基本规则:
在不需要使用 NFS 的情况下,不应将其启用。
如果确实需要 NFS,请使用 TCP 封装程序来限制远程访问。
请确保只导出到确实需要访问的主机。
使用完全限定的域名减少任何欺骗尝试。
在可能的情况下,只以只读方式导出。
只通过 TCP 使用 NFS。
如果您没有要导出的共享目录,则应确保未启用 NFS 服务,也未在系统上运行该服务。
检查 NFS 服务状态:
root #
systemctl status nfsserver
检查当前目标:
root #
ls /etc/systemd/system/*.wants/nfsserver.service
2.17.1 启用和启动 NFS 服务器 #
如果必须使用 NFS,可以使用以下命令在 SUSE Linux Enterprise Server 上将其激活,或者可以使用更简便安全的 YaST 插件 (ncurses) 进行激活。直接通过带有 yast nfs_server
或 yast nfs_client
的命令行进行访问,或者手动访问:
root #
systemctl enable nfs
systemctl start nfs
Portmapper 信息:
root #
rpcinfo -p SERVERNAME
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100005 1 udp 623 mountd
100005 1 tcp 626 mountd
100005 2 udp 623 mountd
100005 2 tcp 626 mountd
100005 3 udp 623 mountd
100005 3 tcp 626 mountd
如果您通过“不可信”服务器或网络运行该命令,会收到以下输出:
root #
rpcinfo -p SERVERNAME
No remote programs registered.
2.17.2 导出 NFS #
要允许客户端访问文件系统或目录,请将 /etc/exports
文件充当访问控制列表。要授予网络“network.example.com”对 /pub
的只读访问权限,/etc/exports
中的项应如下所示:
/pub *.network.example.com(ro,sync)
如果不是绝对需要,请勿授予对 NFS 客户端的写入访问权限!默认情况下,/etc/exports
中的导出项为只读(ro
选项)。要允许服务器 sles-ha1
、sles-ha2
和 sles-ha3
拥有对 /data/MYSQL
目录的读写访问权限,/etc/exports
中的项应如下所示:
/data/MYSQL sles-ha1.example.com(rw,sync) sles-ha2.example.com(rw,sync) sles-ha3.example.com(rw,sync)
请注意,选项不得使用空格来分隔主机名或网络。此外,还应始终使用完全限定的域名,以减少欺骗尝试。默认情况下,会使用 root_squash
选项(“根权限压缩”)导出 /etc/exports
中的所有项。这意味着客户端计算机上的 root 用户没有导出的 NFS 上文件的 root 特权(root 访问权限)。不建议使用 no_root_squash
选项关闭“根权限压缩”!将您的所有项放入 /etc/exports
之后,便可以使用以下命令导出所有文件系统/目录:
root #
exportfs -a
要取消导出所有共享文件系统/目录,请运行:
root #
exportfs -ua
要查看所有共享文件系统/目录,请运行:
root #
showmount -e localhost
Export list for localhost:
/pub *.network.example.com/data/MYSQL
sles-ha1.example.com,sles-ha2.example.com,sles-ha3.example.com
2.17.3 通过 TCP 使用 NFS #
如果您需要 NFS,建议仅通过 TCP 使用 NFS,因为通过 UDP 使用 NFS 并不安全。所有 2.4 及更高版本的内核都支持在客户端通过 TCP 使用 NFS。服务器支持 2.4 及以上版本的内核使用 TCP。要通过 TCP 使用 NFS 来装入共享目录,必须使用 proto=tcp
装入选项:
root #
mount -o proto=tcp SERVERNAME:/pub /usr/local/pub
校验客户端上是否存在目标目录(此示例中为 /usr/local/pub
):
root #
mount [...] SERVERNAME:/pub on
/usr/local/pub type nfs (rw,proto=tcp,addr=192.168.1.110)
要于引导时在客户端上装入共享目录,请使用 /etc/fstab
文件。对于上述示例,/etc/fstab
项如下所示:
SERVERNAME:/pub /usr/local/pub nfs rsize=8192,wsize=8192,timeo=14,intr,tcp 0 0
2.18 在未提供登录提示的情况下使用 SSH 复制文件 #
在某些情况下,需要此示例,以便在未提供交互式登录提示的情况下使用 SSH 通过网络来复制文件。此操作允许设置可信主机 — 即是一种联合。
SSH 允许使用“command”选项的强制命令。使用此选项可以禁用 scp(安全复制)并强制忽略每个已传递的 ssh
命令。在您要检索其中文件的服务器端,将以下项添加到 ~/.ssh/authorized_keys
文件中 SSH 密钥的开头(~
表示特定的用户主目录 – root
的主目录为 /root
– 其他用户通常位于 /home/USERNAME
):
command="/bin/cat ~/<file_name>" ssh-rsa AAAAB3N...{etc}
要立即从远程服务器复制文件,请运行以下命令:
ssh USER@SERVERNAME LOCAL_FILE
由于在服务器端运行了 /bin/cat
,需要将其输出重定向到本地文件。
另一种方法是使用您自己的脚本替换 /bin/cat
(上文中提及),该脚本通过读取环境变量 $SSH_ORIGINAL_COMMAND
检查已传递的 SSH 命令。例如:
#!/bin/ksh if [[ $SSH_ORIGINAL_COMMAND = "File1" || $SSH_ORIGINAL_COMMAND = "File2" ]] then /bin/cat $SSH_ORIGINAL_COMMAND else echo "Invalid file name!" exit 1 fi
因此在 ~/.ssh/authorized_keys
中使用脚本名称替换 /bin/cat
部分,然后运行以下命令以复制 Foo1
:
tux >
ssh USER@SERVERNAME Foo1 > LOCAL_FILE
要复制 Foo 2
,请运行:
tux >
ssh USER@SERVERNAME Foo2 > LOCAL_FILE
完成上述修改后,其他任何一种已传递参数都将返回错误。
2.19 检查文件权限和所有权 #
以下几节介绍修改默认权限和文件设置以提高主机安全性的一些方法。请务必注意 seccheck
等默认 SUSE Linux Enterprise Server 实用程序的使用 - 可运行该实用程序进行锁定,提高一般文件安全性并改善用户环境。但最好了解如何修改这些项目。
SUSE Linux Enterprise Server 主机包含以下三个默认文件权限设置:permissions.easy
、permissions.secure
和 permissions.paranoid
,这三者均位于 /etc
目录中。这些文件用于定义特殊权限(如全局可写目录),或为文件定义 setuser ID 位(设置了 setuser ID 位的程序未以启动该程序的用户权限运行,而是以文件拥有者权限运行,通常为 root
)。
管理员可以使用文件 /etc/permissions.local
添加自己的设置。实施上述其中一个默认权限规则集最简单的方法就是使用 YaST 中的 模块。
将由某个选定规则集修改以下每一个主题,但请务必了解其自身信息。
2.20 默认的 umask #
umask
(用户文件创建模式掩码)命令是一个外壳内置命令,决定了新创建文件和目录的默认文件权限。它可被系统调用重写,但许多程序和实用程序都使用 umask
。默认情况下,umask
设置为 022
。您可以更改 /etc/profile
中的值以全局修改此设置,也可针对外壳启动文件中的每个用户进行更改。
要确定活动的 umask,请使用 umask
命令:
tux >
umask
022
如果至少设置了一个位,则将从访问模式 777
去除 umask。
使用默认的 umask,您将会看到大多数用户预期可在 Linux 系统上看到的行为。
tux >
touch atux >
mkdir btux >
ls -on total 16 -rw-r--r--. 1 17086 0 Nov 29 15:05 a drwxr-xr-x. 2 17086 4096 Nov 29 15:05 b
您可以指定任意 umask 值,具体取决于您的需求。
tux >
umask 111tux >
touch ctux >
mkdir dtux >
ls -on total 16 -rw-rw-rw-. 1 17086 0 Nov 29 15:05 c drw-rw-rw-. 2 17086 4096 Nov 29 15:05 d
根据您的线程模型,您可以使用 037
等更严格的 umask,以防止意外数据泄漏。
tux >
umask 037tux >
touch etux >
mkdir ftux >
ls -on total 16 -rw-r-----. 1 17086 0 Nov 29 15:06 e drwxr-----. 2 17086 4096 Nov 29 15:06 f
2.21 SUID/SGID 文件 #
如果在可执行文件上设置 SUID(设置用户 ID)位或 SGID(设置组 ID)位,它会以可执行文件拥有者的 UID 或 GID 来执行,而不是以执行人员的 UID 或 GID 来执行。举例来说,这意味着会以 root
的 UID 执行设置了 SUID 位且由 root
拥有的所有可执行文件。passwd
命令就是一个典型的示例,它允许普通用户更新由 root
拥有的 /etc/shadow
文件中的口令字段。
但当可执行文件存在安全漏洞时,SUID/SGID 位可能会被滥用。因此,您应该搜索整个系统中的 SUID/SGID 可执行文件并进行记录。要搜索整个系统中的 SUID 或 SGID 文件,您可以运行以下命令:
root #
find /bin /boot /etc /home /lib /lib64 /opt /root /sbin /srv /tmp /usr /var -type f -perm '/6000' -ls
如果您有其他文件系统结构,则需要扩展搜索的目录列表。
SUSE 仅在确实需要时才会在二进制文件上设置 SUID/SGID 位。不是绝对必要的情况下,请确保代码开发人员未在其程序上设置 SUID/SGID 位。通常,您可以使用诸如去除世界/其他可执行文件位等解决方法。但更好的方法是更改软件设计或使用权限。
SUSE Linux Enterprise Server 支持文件权限,可授予程序更精细的特权,而不是 root
的全部权限:
root #
getcap -v /usr/bin/ping
/usr/bin/ping = cap_new_raw+eip
上一个命令只会为执行 ping
的人员授予 CAP_NET_RAW 权限。如果 ping
的内部存在漏洞,攻击者最多可以获得此权限,而不是 root
的全部权限。可能的情况下,应选择文件权限以支持 SUID 位。但仅当二进制文件的 suid 设置为 root
,而不是其他 news
、lp
等类似用户时,这一条才适用。
2.22 全局可写文件 #
全局可写文件存在安全风险,因为系统上的任何用户都可以对其进行修改。此外,全局可写目录允许任何人添加或删除文件。要查找全局可写文件和目录,您可以使用以下命令:
root #
find /bin /boot /etc /home /lib /lib64 /opt /root /sbin /srv /tmp /usr /var -type f -perm -2 ! -type l -ls
如果您有其他文件系统结构,则需要扩展搜索的目录列表。
! -type l
参数可跳过所有符号链接,因为符号链接始终为全局可写。但只要链接的目标不是全局可写(由上述查找命令进行检查),就不会发生问题。
带有粘滞位的全局可写目录(例如 /tmp
目录)不允许任何人(文件拥有者除外)在此目录中执行文件删除或重命名操作。粘滞位使文件与其创建用户相关联,可防止其他用户删除和重命名该文件。因此,带有粘滞位的全局可写目录通常都不会发生问题,具体视目录的用途而定。例如 /tmp
目录:
tux >
ls -ld /tmp
drwxrwxrwt 18 root root 16384 Dec 23 22:20 /tmp
输出中的 t
模式位表示粘滞位。
2.23 孤立文件或无拥有者的文件 #
未被任何用户或组拥有的文件本身不一定会发生安全问题。但无拥有者的文件可能会在将来发生安全问题。例如,如果创建了新用户,并且该新用户获得的 UID 刚好与无拥有者文件的 UID 相同,则该新用户将自动成为这些文件的拥有者。
要查找未被任何用户或组拥有的文件,请使用以下命令:
root #
find /bin /boot /etc /home /lib /lib64 /opt /root /sbin /srv /tmp /usr /var -nouser -o -nogroup
如果您有其他文件系统结构,则需要扩展搜索的目录列表。
另一个问题是未通过打包系统安装因此未收到更新的文件。您可以使用以下命令检查此类文件:
tux >
find /bin /lib /lib64 /usr -path /usr/local -prune -o -type f -a -exec /bin/sh -c "rpm -qf {} &> /dev/null || echo {}" \;
因为经过设计的文件名可能会导致命令执行,会以不可信用户(例如“没有任何用户”)运行此命令。这不应成为一个问题,因为这些目录只能由 root
进行写入,但仍不失为一项良好的安全预防措施。
这将会显示 /bin
、/lib
、/lib64
和 /usr
(/usr/local
中的文件除外)下软件包管理器未跟踪的所有文件。这些文件可能不代表安全问题,但您应注意未跟踪的文件,并执行必要的预防措施确保这些文件是最新的。
2.24 限制访问可移动媒体 #
在某些环境中,需要限制访问可移动媒体,例如 USB 储存或光学设备。udisks2
软件包随附的工具有助于进行此类配置。
创建允许用户装入和弹出移动设备的用户组,例如 mmedia_all:
tux >
sudo
groupadd mmedia_all向新组添加特定用户
tux
:tux >
sudo
usermod -a -G mmedia_alltux
创建包含以下内容的
/etc/polkit-1/rules.d/10-mount.rules
文件:tux >
cat /etc/polkit-1/rules.d/10-mount.rules polkit.addRule(function(action, subject) { if (action.id =="org.freedesktop.udisks2.eject-media" && subject.isInGroup("mmedia_all")) { return polkit.Result.YES; } }); polkit.addRule(function(action, subject) { if (action.id =="org.freedesktop.udisks2.filesystem-mount" && subject.isInGroup("mmedia_all")) { return polkit.Result.YES; } });重要:规则文件命名规则文件的名称必须以数字开头,否则将忽略该名称。
规则文件按字母顺序进行处理。函数按其添加的顺序进行调用,直到其中一个函数返回值为止。因此,要添加在其他规则之前处理的授权规则,请将其放入 /etc/polkit-1/rules.d 中名称排序在其他规则文件之前的某个文件,例如
/etc/polkit-1/rules.d/10-mount.rules
。每个函数应从polkit.Result
返回值。重启动
udisks2
:root #
systemctl restart udisks2重启动
polkit
root #
systemctl restart polkit
2.25 各种帐户检查 #
2.25.1 未锁定的帐户 #
请务必锁定未用于登录的所有系统帐户和供应商帐户。要获取您系统中未锁定帐户的列表,您可以查找不含以 !
或 *
开头(在 /etc/shadow
文件中)的加密口令字符串的帐户。如果使用 passwd
-l
锁定帐户,将会在加密口令之前添加 !!
,以有效禁用该口令。如果使用 usermod
-L
锁定帐户,将会在加密口令之前添加 !
。默认情况下,许多系统和共享帐户通常都由口令字段中的 *
或 !!
进行锁定,这会让加密口令变为无效字符串。因此,要获取所有未锁定(可加密)帐户的列表,请运行(使用 egrep
以允许使用正则表达式):
root #
egrep -v ':\*|:\!' /etc/shadow | awk -F: '{print $1}'
同时确保所有帐户在 /etc/passwd
中的口令字段中都有 x
。以下命令列出口令字段中没有 x
的所有帐户:
root #
grep -v ':x:' /etc/passwd
口令字段中的 x
表示该口令已阴影化,例如需要在 /etc/shadow
文件中查找加密口令。如果 /etc/passwd
中的口令字段为空,则系统将不会查找阴影文件,并且不会在出现登录提示时提示用户提供口令。
2.25.2 未使用的帐户 #
应从系统中去除未被用户、应用程序、系统或守护程序使用的所有系统帐户或供应商帐户。您可以使用以下命令,查找特定帐户是否拥有任何文件:
root #
find / -path /proc -prune -o -user ACCOUNT -ls
在此示例中,-prune
选项用于跳过 /proc 文件系统。如果您确定可以删除某个帐户,可以使用以下命令去除该帐户:
root #
userdel -r ACCOUNT
如果没有 -r
选项,userdel
将不会删除用户的主目录和邮件假脱机目录 (/var/spool/mail/USER
)。请注意,许多系统帐户都没有主目录。
2.26 启用口令时效 #
口令失效是一种普遍采用的最佳实践,但对于一些系统帐户和共享帐户(例如 Oracle 等)而言,可能需要将其排除。如果应用程序帐户失效,这些帐户上的失效口令可能会导致系统服务中断。
通常情况下,应针对系统帐户和共享帐户的口令更改规则/程序制定相应的公司政策。但常规用户帐户口令应该会自动失效。以下示例显示如何针对各个用户帐户设置口令失效。
使用 useradd
命令创建新帐户时,可以使用下表中的文件和参数。将在 /etc/shadow
文件中为每个用户帐户储存此类设置。如果使用 YaST 工具( )添加用户,则会为每个用户提供该设置。下面是各种不同的设置,其中一些也可能是系统范围的设置(例如修改 /etc/login.defs
和 /etc/default/useradd
):
|
|
口令保持有效的最大天数。 |
|
|
自上次更改到用户下次可更改口令之前的最小天数。 |
|
|
口令更改提醒启动时的天数。 |
|
|
口令失效后帐户处于禁用状态的天数。 |
|
|
帐户失效日期(采用 YYYY-MM-DD 格式)。 |
在这些修改之前创建的用户不受影响。
请确保在 /etc/login.defs
和 /etc/default/useradd
文件中更改上述参数。审阅 /etc/shadow
文件将显示在添加用户之后如何储存这些设置。
要创建新用户帐户,请执行以下命令:
root #
useradd -c "TEST_USER" -g USERS TEST
-g
选项指定此帐户的主组:
root #
id TEST
uid=509(test) gid=100(users) groups=100(users)
为 /etc/shadow
文件中的测试用户在 /etc/login.defs
和 /etc/default/useradd
中记录的设置如下所示:
root #
grep TEST /etc/shadow
test:!!:12742:7:60:7:14::
可使用 chage
命令随时修改口令时效。要禁用系统帐户和共享帐户的口令时效,您可以运行以下 chage
命令:
root #
chage -M -1 SYSTEM_ACCOUNT_NAME
要获取口令失效信息,请运行:
root #
chage -l SYSTEM_ACCOUNT_NAME
例如:
root #
chage -l TEST
Minimum: 7
Maximum: 60
Warning: 7
Inactive: 14
Last Change: Jan 11, 2015
Password Expires: Mar 12, 2015
Password Inactive: Mar 26, 2015
Account Expires: Never
2.27 实施更强的口令 #
在经审计的系统上,请务必限制用户使用可被轻松破解的简单口令。可以将复杂的口令记下来,只要妥善保管即可。有些人主张通过强口令来保护您免受字典攻击,并可通过数次失败尝试之后锁定帐户来防御此类攻击。但此方法并非始终有效。如果进行此类设置,锁定系统帐户可能会使应用程序和系统服务中断,这无异会产生另一个问题 — 拒绝服务攻击。
但无论怎样,实施有效的口令管理安全措施都很重要。大多数公司会要求口令至少包含一个数字、一个小写字母和一个大写字母。虽政策各不相同,但有时要在口令强度/复杂性和管理之间取得平衡并不容易。
2.28 使用 PAM 进行口令和登录管理 #
Linux-PAM(适用于 Linux 的可插入身份验证模块)是一组共享库,可让本地系统管理员选择应用程序该如何对用户进行身份验证。
强烈建议您熟悉 PAM 的功能以及如何利用此体系结构为某个环境提供最佳身份验证设置。可以立即完成此配置并在所有系统中进行实施(标准),也可以针对各个主机进行增强(增强安全性 – 按主机/服务/应用程序进行增强)。重点了解该体系结构的灵活性。
要了解有关 PAM 体系结构的详细信息,请参见 /usr/share/doc/packages/pam
目录中的 PAM 文档(提供多种格式)。
下面讨论的是如何修改默认 PAM 堆栈的示例(特别是围绕口令政策展开),例如口令强度、口令重复使用和帐户锁定。虽然只涉及了少数几种可能性,但它们是一个良好的开端,向您展示了 PAM 的灵活性。
pam-config
限制
pam-config
工具可用于配置包含全局选项的 common-{account,auth,password,session} PAM 配置文件。这些文件包含以下注释:
# This file is autogenerated by pam-config. All changes # will be overwritten.
个别服务文件(例如 login、password、sshd
和 su
)必须直接编辑。您可以选择直接编辑所有文件,而不使用 pam-config
,虽然 pam-config
包含转换较旧配置、更新当前配置和健全性检查等有用功能。有关详细信息,请参见 man 8 pam-config
。
2.28.1 口令强度 #
SUSE Linux Enterprise Server 可利用 pam_cracklib
库测试弱口令,并在确定口令明显较弱时建议使用较强的口令。以下参数示例可能属于公司口令策略的一部分,或者由于审计约束而需要的某些设置。
PAM 库遵循定义的流程。通常,设计完美堆栈的最佳方式是考虑所有要求和策略并绘制流程图。
|
|
口令的最小长度为 8 |
|
|
小写字母的最少数量为 1 |
|
|
大写字母的最少数量为 1 |
|
|
数字的最少数量为 1 |
|
|
其他字符的最少数量为 1 |
要设置这些口令限制,请使用 pam-config
工具指定您要配置的参数。例如,可使用如下命令修改最小长度参数:
tux >
sudo
pam-config -a --cracklib-minlen=8 --cracklib-retry=3 \ --cracklib-lcredit=-1 --cracklib-ucredit=-1 --cracklib-dcredit=-1 \ --cracklib-ocredit=-1 --cracklib
现在校验新口令限制是否适用于新口令。只需登录非 root 帐户并使用 passwd
命令更改口令。请注意,如果您在 root 下运行 passwd
命令,则不会强制执行上述要求。
2.28.2 限制使用先前的口令 #
pam_pwhistory 模块可用于配置无法重复使用的先前口令数量。以下命令可在系统上实施口令限制,如此至少六个月内无法重复使用某个口令。
tux >
sudo
pam-config -a --pwhistory --pwhistory-remember=26
回想一下,在第 2.26 节 “启用口令时效”中我们将 PASS_MIN_DAYS
设置为 7
,该选项指定了两次口令更改之间的最少天数。因此,如果 pam_unix
配置为记住 26
个口令,则至少六个月(26*7 天)内无法重复使用先前曾使用过的口令。
pam-config
命令生成的 PAM 配置 (/etc/pam.d/common-auth
) 如下所示:
auth required pam_env.so auth required pam_unix.so try_first_pass account required pam_unix.so try_first_pass password requisit pam_cracklib.so password required pam_pwhistory.so remember=26 password optional pam_gnome_keyring.so use_authtok password required pam_unix.so use_authtok nullok shadow try_first_pass session required pam_limits.so session required pam_unix.so try_first_pass session optional pam_umask.so
2.28.3 登录失败次数太多后锁定用户帐户 #
在到达所定义的 ssh、login、su 或 sudo 失败尝试次数后锁定帐户是一种常见的安全做法。但如果应用程序、管理员或 root 用户被锁定,则可能会导致服务中断。实际上,如果故意大量制造登录失败,就很容易会导致拒绝服务攻击。幸好可以直接通过 PAM 来控制此情况。
默认情况下,PAM 允许所有 root 登录。使用 pam_tally2
可控制所有其他用户(包括人类用户和系统用户)的失败登录行为。将下面一行添加到 /etc/pam.d/login
上方可在六次登录失败之后锁定所有用户(root 用户除外),并在十分钟后自动解锁帐户:
auth required pam_tally2.so deny=6 unlock_time=600
下面是一个完整的 /etc/pam.d/login
文件示例:
#%PAM-1.0 auth requisite pam_nologin.so auth include common-auth auth required pam_tally2.so deny=6 unlock_time=600 account include common-account account required pam_tally2.so password include common-password session required pam_loginuid.so session include common-session #session optional pam_lastlog.so nowtmp showfailed session optional pam_mail.so standard
您也可以锁定 root 用户,不过显然您必须非常确定要执行此操作:
auth required pam_tally2.so deny=6 even_deny_root unlock_time=600
您可以为 root 用户定义其他锁定时间:
auth required pam_tally2.so deny=6 root_unlock_time=120 unlock_time=600
如果您想要求管理员解锁帐户,请不要使用 unlock_time
选项。下面两个示例命令显示失败的登录尝试次数以及如何锁定用户帐户:
root #
pam_tally2 -u username
Login Failures Latest failure From username 6 12/17/19 13:49:43 pts/1root #
pam_tally2 -r -u username
尝试访问的默认位置记录在 /var/log/tallylog
中。
如果用户在登录超时失效后或在管理员重设置其帐户之后成功登录,计数器将重设置为 0。
配置其他登录服务,以在 /etc/pam.d/
下其各自的配置文件中使用 pam_tally2
:sshd、su、sudo、sudo-i
和 su-l
。
2.29 限制 root
登录 #
默认情况下,为 root
用户分配了口令,并且该用户可以使用各种方法进行登录 — 例如,在本地终端上、在图形会话中,或者通过 SSH 远程登录。应尽可能限制使用这些方法登录。应避免共享使用 root 帐户。而是由各个管理员使用 su
或 sudo
等工具(有关详细信息,请键入 man 1 su
或 man 8 sudo
)获取提升的特权。如此可将 root
登录与特定用户相关联。同时还可增加另一层安全保护;不仅仅是 root
口令,还有管理员常规帐户的 root
以及口令都需要破解后才能获得完全的 root 访问权限。本节说明如何限制在不同级别系统上的直接 root 登录。
2.29.1 限制本地文本控制台登录 #
TTY 设备通过控制台提供文本模式的系统访问权限。对于桌面系统,通过本地键盘进行访问;或如果是服务器系统,则通过连接到 KVM 交换机或远程管理卡(ILO、DRAC 等)的输入设备进行访问。默认情况下,Linux 提供 6 个不同的控制台,在文本模式下运行时,可通过组合键 Alt–F1 到 Alt–F6 进行切换;或在图形会话中运行时,可通过组合键 Ctrl–Alt–F1 到 Ctrl–Alt–F6 进行切换。关联的终端设备则相应地名为 tty1
..tty6
。
下面的步骤限制对第一个 TTY 的 root 访问。此访问方法仅作为系统的紧急访问方式,绝不应将其用于日常系统管理任务。
此处显示的步骤根据 PC 体系结构(x86 和 AMD64/Intel 64)进行定制。在 POWER 等体系结构上,可能会使用除 tty1
以外的其他终端设备名称。请小心不要因为指定了错误的终端设备名称而将您自己完全锁定。您可以通过运行 tty
命令,确定当前登录的终端的设备名称。请注意不要在虚拟终端(例如通过 SSH)或图形会话(设备名称 /dev/pts/N
)中执行此操作,而只通过实际登录终端(可通过 Alt–FN 访问)进行操作。
请确保 PAM 堆栈配置文件
/etc/pam.d/login
包含auth
块中的pam_securetty
模块:auth requisite pam_nologin.so auth [user_unknown=ignore success=ok ignore=ignore auth_err=die default=bad] pam_securetty.so noconsole auth include common-auth
在本地控制台上进行身份验证过程中,将包含
pam_securetty
模块,该模块会将root
限制为仅在文件/etc/securetty
中列出的 TTY 设备上登录。去除
/etc/securetty
中除这一项外的其他所有项。这将限制对 TTY 设备的 root 访问。# # This file contains the device names of tty lines (one per line, # without leading /dev/) on which root is allowed to login. # tty1
检查是否会拒绝
root
登录其他终端。应立即拒绝在tty2
等终端上登录,甚至无需查询帐户口令。同时确保您仍可以成功登录tty1
,因此不会完全锁定系统的root
。
请不要将 pam_securetty
模块添加到 /etc/pam.d/common-auth
文件中。这将破坏 su
和 sudo
命令,因为这些工具也会拒绝 root
身份验证。
这些配置更改还将导致拒绝在 /dev/ttyS0
等串行控制台上进行 root 登录。如果您需要此类用例,则需要在 /etc/securetty
文件中额外列出相应的 tty 设备。
2.29.2 限制图形会话登录 #
要提高您服务器的安全性,请完全避免使用图形环境。通常,图形程序不会设计为以 root
身份运行,因此与控制台程序相比更可能包含安全问题。如果您需要图形登录,请使用非 root
登录。配置您的系统,禁止通过 root
登录图形会话。
为了防止通过 root
登录图形会话,您可以采用第 2.29.1 节 “限制本地文本控制台登录”中概述的相同基本步骤。只需将 pam_securetty
模块添加到属于显示管理器的 PAM 堆栈文件 — 例如,GDM 的 /etc/pam.d/gdm
。图形会话还会在 TTY 设备上运行:默认为 tty7
。因此,如果您限制 root
登录到 tty1
,将拒绝通过 root
登录图形会话。
2.29.3 限制 SSH 登录 #
默认情况下,还允许 root
用户通过 SSH 网络协议(如果 SSH 端口未被防火墙阻止)远程登录计算机。要限制此类登录,请对 OpenSSH 配置进行以下更改:
编辑
/etc/ssh/sshd_config
并调整以下参数:PermitRootLogin no
重启动
sshd
服务以使更改生效:systemctl restart sshd.service
对于 OpenSSH,不适合使用 PAM pam_securetty
模块,因为在授权期间并非所有 SSH 登录都会通过 PAM 堆栈进行(例如使用 SSH 公共密钥身份验证时)。此外,攻击者能够区分错误口令和策略只能在稍后予以拒绝的成功登录。
2.30 为交互式外壳会话设置无活动超时 #
最好在一段无活动时间之后终止交互式外壳会话。例如,为了阻止打开的无人监管会话或为了避免浪费系统资源。
默认情况下,外壳没有无活动超时。如此当外壳处于打开状态且在几天甚至几年内未被使用时,也不会有任何反应。您可以通过在一段时间后自动终止空闲会话的方式配置大多数外壳。以下示例显示如何为一些常见类型的外壳设置无活动超时。
可仅为登录外壳配置无活动超时,也可以为所有交互式外壳配置无活动超时。对于后者,将针对每个外壳实例单独运行无活动超时。这意味着超时将会累积。当启动子外壳时,会为子外壳开始新的超时,并且仅在此超时过后,才会继续运行父外壳的超时。
下表包含 SUSE Linux Enterprise Server 随附的常见外壳选集的配置详细信息:
软件包 | 外壳特点 | 外壳变量 | 时间单位 | 只读设置 | 配置路径(仅登录外壳) | 配置路径(所有外壳) |
---|---|---|---|---|---|---|
|
|
| 秒 |
|
|
|
|
|
| 秒 |
|
|
|
|
|
| 分钟 |
|
|
|
|
|
| 秒 |
|
|
|
每个列出的外壳支持使用一个内部超时外壳变量,可将该变量设置为某个特定时间值以触发无活动超时。如果您要防止用户覆盖超时设置,可以将相应的外壳超时变量标记为只读。上表中还提供了相应的变量声明语法。
此功能仅有助于避免因用户疏忽或遵循不安全做法而导致的风险。而无法防范恶意用户。超时只适用于外壳的交互式等待状态。恶意用户总是能找到绕过超时的方法,使得无论在任何情况下,都可以让其会话保持打开状态。
要配置无活动超时,您需要为每个外壳的启动脚本添加匹配的超时变量声明。可仅为登录外壳使用一种路径,或为所有外壳使用一种路径,如表中所列。以下示例使用适合 bash
和 ksh
的路径和设置,以设置无法被用户覆盖的只读登录外壳超时。使用以下内容创建文件 /etc/profile.d/timeout.sh
:
# /etc/profile.d/timeout.sh for SUSE Linux # # Timeout in seconds until the bash/ksh session is terminated # in case of inactivity. # 24h = 86400 sec readonly TMOUT=86400
建议使用 screen
工具在注销前分离会话。screen
会话不会终止,一旦有需要便可重新挂接。可以在未注销的情况下锁定活动会话(有关细节,请阅读 man screen
中的 Ctrl–a–x / lockscreen
)。
2.31 防止意外拒绝服务 #
Linux 允许您对用户和组可以使用的系统资源量设置限制。如果因为程序中的 bug 导致用户和组使用太多资源(例如内存泄漏)、减慢计算机速度,甚至使系统无法使用,此项设置也非常有用。错误的设置可允许程序使用过多资源,导致服务器无法响应新连接,甚至无法响应本地登录(例如,如果某个程序用掉主机上的所有可用文件句柄)。如果允许某人用掉所有系统资源并因此导致拒绝服务攻击(无论是未计划还是更糟的计划攻击),这也会成为一个安全问题。设置用户和组的资源限制可能是一种有效的系统保护方法,具体视环境而定。
2.31.1 限制系统资源示例 #
以下示例演示了设置或限制 Oracle 用户帐户的系统资源使用的实际用法。有关系统资源设置列表,请参见 /etc/security/limits.conf
或 man limits.conf
。
Bash 等大多数外壳都提供有基于用户的各种资源控制(例如最大的可打开文件描述符数目或最大进程数)。要检查外壳中的所有当前限制,请执行:
root #
ulimit -a
有关 Bash 外壳的 ulimit
的详细信息,请查看 Bash 手册页。
使用 SSH 会话时,设置“硬”和“软”限制可能无法如预期般起效。要查看有效行为,可能需要以 root 身份登录,然后再使用 su 命令转为具有限制的身份(例如,在这些示例中为 oracle
)。假设在引导过程中已自动启动应用程序,资源限制也应正常起效。如果对资源限制的更改似乎未起效(通过 SSH),可能需要将 /etc/ssh/sshd_config
中的 UsePrivilegeSeparation
设置为“no”,并重启动 SSH 守护程序 (systemctl restart sshd
)。但一般不建议您这样做,因为这会降低系统安全性。
ssh
进行的口令登录
您可以通过禁用 SSH 的口令身份验证来为服务器增加一定程度的安全性。请记住,您需要配置 SSH 密钥,否则无法访问服务器。要禁用口令登录,请在 /etc/ssh/sshd_config
中添加下面几行:
UseLogin no UsePAM no PasswordAuthentication no PubkeyAuthentication yes
在此示例中,可通过以 root
身份编辑 /etc/security/limits.conf
并进行以下更改,来更改用户 oracle
可使用的文件句柄数或打开的文件数:
oracle soft nofile 4096 oracle hard nofile 63536
第一行中的软限制定义了登录后 oracle
用户将拥有的文件句柄(打开的文件)数目限制。如果用户看到有关文件句柄用尽的错误消息,则可以执行以下命令,将此示例中所示的文件句柄数增加到硬限制(在此示例中为 63536):
root #
ulimit -n 63536
必要时,您可以设置更高的软限制和硬限制。
请务必合理利用 ulimit。允许某个用户的“nofile”的“硬”限制(相当于内核限制 (/proc/sys/fs/file-max
))会非常糟糕!如果用户用完所有可用的文件句柄,则系统将无法启动新登录,因为无法访问(打开)执行登录所需的 PAM 模块。
您还需要确保在 /etc/pam.d/common-auth
中全局配置 pam_limits
,或者针对以下文件中的 SSH、su、login 和 telnet 等个别服务进行配置:
/etc/pam.d/sshd (用于 SSH) |
/etc/pam.d/su (用于 su) |
/etc/pam.d/login (本地登录和 telnet) |
如果您不想为所有登录启用该配置,会有一个特定 PAM 模块读取 /etc/security/limits.conf
文件。PAM 配置指令中的项如下所示:
session required /lib/security/pam_limits.so session required /lib/security/pam_unix.so
请务必注意,更改不会立即生效,需要新的登录会话:
root #
su – oracletux >
ulimit -n 4096
请注意,这些示例特定于 Bash 外壳 - 其他外壳的 ulimit
选项会有所不同。用户 oracle
的默认限制为 4096
。要将用户 oracle
可使用的文件句柄数增加至 63536
,请执行:
root #
su – oracletux >
ulimit -n 4096tux >
ulimit -n 63536tux >
ulimit -n 63536
要使此项成为永久设置,需要向用户配置文件(~/.bashrc
或 ~/.profile
文件)添加设置 ulimit -n 63536
(仍是适用于 Bash),该配置文件为 SUSE Linux Enterprise Server 上的 Bash 外壳的用户启动文件(用于校验您的外壳运行:echo $SHELL
)。要执行此操作,您只需针对用户 oracle
的 Bash 外壳键入(或复制/粘贴 - 如果您是在系统上读取)以下命令:
root #
su - oracletux >
cat >> ~oracle/.bash_profile << EOF ulimit -n 63536 EOF
2.32 显示登录标题 #
出于法律/审计政策原因,或者为了向用户提供安全说明,通常有必要在所有服务器上的登录屏幕上设置一个标题。
如果您想要在用户登录文本型终端(例如,使用 SSH 或在本地控制台上)后列显登录标题,可以使用文件 /etc/motd
(motd = 当天的消息)。默认情况下,该文件存在于 SUSE Linux Enterprise Server 上,但是空文件。只需向适用的/组织所需的文件中添加内容。
请尽量将登录标题内容放在一个终端页面(或更少)中,如果一页容纳不下而需要滚动屏幕,会使阅读变得更加困难。
您也可以在用户登录文本型终端前列显登录标题。如果是本地控制台登录,您可以编辑 /etc/issue
文件,这会导致在出现登录提示前显示标题。如果是通过 SSH 进行登录,您可以编辑 /etc/ssh/sshd_config
文件中的“标题”参数,这会在出现 SSH 登录提示前相应地显示标题文本。
如果是通过 GDM 进行的图形登录,您可以遵循 GNOME 管理员指南设置登录标题。此外,您可以进行以下更改,要求用户通过选择 或 来确认法律标题。编辑 /etc/gdm/Xsession
文件,并在脚本开头添加下面几行:
if ! /usr/bin/gdialog --yesno '\nThis system is classified...\n' 10 10; then /usr/bin/gdialog --infobox 'Aborting login' exit 1; fi
需要将文本 This system is classified... 替换为所需的标题文本。请务必注意,此对话框不会阻止登录进行。有关 GDM 脚本的详细信息,请参见 GDM 管理员手册。
2.33 杂项 #
2.33.1 基于主机的 Linux 监视和入侵检测 #
将主机置于生产环境甚至是网络之前,请考虑使用 seccheck
(已在第 2.4 节 “使用 seccheck 运行自动安全检查”中讨论)等系统完整性检查器,以便在发生未授权更改时发出通知。此外,还请考虑使用 AIDE(高级入侵检测环境)等入侵检测环境。
AIDE 是一种 GPL 许可的开源入侵检测系统。可视为一种系统指纹机制。AIDE 的工作方式是创建一个包含您系统上文件的相关信息的数据库。该数据库遵循配置文件 aide.conf 中规定的规则进行创建。AIDE 运行时,将参考此数据库来检查是否有更改(或首次创建)。假设运行的是比较检查,将会报告配置文件不允许的任何更改。
通过利用 AIDE(在一个安全的位置储存主机数据库的副本)并进行比较(定期或作为取证工作的一部分),系统完整性/保证就是一个直观且程序化的事项。如果入侵者入侵您的系统,比较工作可让管理员或安全专员了解主机上发生的更改。将系统部署到生产环境前,最后一步应是创建初始数据库。
Linux 监视和详细的入侵检测系统 (IDS) 或解决方案不在本文的讨论范围内,不过,您可在 Web 上找到大量有关配置 AIDE 或其他解决方案的信息以及众多内容丰富的文章。
2.33.2 连接统计实用程序 #
下面是您可以用于获取有关用户登录的数据的命令列表:
who
:
列出当前登录的用户。
w
:
显示登录者及其执行的操作。
last
:
显示上次登录的用户列表,包括登录时间、注销时间、登录 IP 地址等。
lastb
:
与 last
相同(除了默认显示 /var/log/btmp
),包含所有无效登录尝试。
lastlog
:
此命令报告 /var/log/lastlog
中维护的数据,该文件是用户上次登录的记录。
ac
:
安装 acct
软件包之后提供。按每个用户或每天等条件列显连接时间(以小时为单位)。此命令读取 /var/log/wtmp
。
dump-utmp
:
将原始数据从 /var/run/utmp 或 /var/log/wtmp
转换为 ASCII 可分析格式。
此外,如果未运行任何日志记录工具,请检查 /var/log/messages
文件或 journalctl
的输出。有关 systemd
日记的详细信息,请参见第 17 章 “journalctl
:查询 systemd
日记”。
2.33.3 其他 #
最后,以下各项也与系统安全性相关,如果配置错误可能会导致许多问题,因此也应进行审阅:
解析程序(
/etc/hosts
、/var/run/netconfig/resolv.conf
、/etc/nsswitch.conf
)。/etc/resolv.conf
是指向/run/netconfig/resolv.conf
的符号链接。NTP 配置 (
/etc/chrony.conf
)。