Linux系统安全相关技术
1 操作系统安全概述
1.1 信息安全的设计原则
从概念到落地,一般都需要方法论提供一个“起点”。CIA铁三角,就是被广泛使用的信息安全起点。
- 机密性(Confidentiality):信息仅仅能够被已授权的个人、组织、系统和流程访问;防止信息被泄露给未授权的实体。
- 完整性(Integrity):在全生命周期内,保持数据的准确性(accuracy)和完整性(completeness);防止数据被非授权的或不可检测的篡改。
- 可用性(Availability):信息可以在任何需要时提供给合法的授权用户访问;防止信息在需要时无法访问。
在其他领域都有所谓的黄金法则,计算机安全也不意外。黄金法则主要包含三部分:认证(Authentication)、授权(Authorization)、审计(Audit)。为什么称它为“黄金”呢?一方面是因为,它包含的这三部分重要且通用;另一方面是因为,这三个单词的前两个字母都是 Au,而 Au 在元素周期表中代表着“金”。
1.2 操作系统安全的设计目标
操作系统安全的主要设计目标有以下4点:
(1)按系统安全策略对用户的操作进行访问控制,防止用户对计算机资源的非法访问(窃取、篡改和破坏)。
(2)实现用户标识和身份鉴别。
(3)监督系统运行的安全性。
(4)保证系统自身的安全性和完整性。
在使用操作系统安全这个概念时,通常应该注意两层含义:一是操作系统在设计时,提供的权限访问控制、信息加密保护、完整性鉴定等安全机制所实现的安全;二是操作系统在使用过程中,应该进行系统配置,以尽量避免由于现实的缺陷和具体应用环境因素而导致的安全风险。
2 Linux系统的安全机制
2.1 Linux系统的用户账号
在Linux系统中,用户账号可以分为以下几个类别:
-
超级用户(root): 超级用户是系统中最高权限的用户,拥有对系统的所有权限。超级用户通常用于进行系统管理和配置,执行潜在危险的操作。超级用户的用户名是 "root",其UID为0。
-
普通用户: 普通用户是系统中的一般用户,拥有有限的权限,通常只能访问自己的文件和一些共享资源。普通用户的UID是一个大于0的整数,但不是0。
-
系统用户: 系统用户是用于运行系统服务和进程的用户,它们通常不具有登录系统的权限,其UID一般小于1000。系统用户的目的是安全地运行系统服务而不关联到特定的个体用户。
-
伪用户: 伪用户是一种特殊的用户,它们用于代表某些系统资源而不是实际的人。例如,
nobody
用户通常用于运行特定服务的进程,以降低潜在的风险。
这些用户类别有助于组织和管理系统中的用户,确保每个用户具有适当的权限,并根据其功能进行适当的隔离。
2.2 Linux文件系统的权限
在Linux文件系统中,文件和目录的权限由三组用户权限(User)、组权限(Group)和其他用户权限(Others)构成。每组权限包括读(Read)、写(Write)和执行(Execute)权限,分别表示对文件或目录的读取、写入和执行操作的权限。
权限分别用字符表示为:
-
读权限(r): 表示用户具有读取文件或目录的权限。对于目录,读权限表示用户可以列出目录中的内容。
-
写权限(w): 表示用户具有写入文件或目录的权限。对于目录,写权限表示用户可以在目录中创建、删除和重命名文件。
-
执行权限(x): 表示用户具有执行文件或访问目录的权限。对于目录,执行权限表示用户可以进入该目录。
每个文件或目录的权限字符串由三组权限(User、Group、Others)组成,形如 rwxr-xr--
。以文件为例,该字符串的含义如下:
rwx
表示用户(文件所有者)具有读、写和执行权限。r-x
表示文件所属组具有读和执行权限,但没有写权限。r--
表示其他用户具有只读权限,没有写和执行权限。
在文件和目录的权限字符串中,每一组权限的位置和含义都是固定的。根据权限字符串的位置,可以依次理解每组用户对文件或目录的权限。权限字符串的解释是从左到右的。
例如,rwxr-xr--
表示用户具有读、写和执行权限,文件所属组具有读和执行权限,其他用户具有只读权限。
chmod
命令用于修改文件或目录的权限。以下是 chmod
命令的一些常用选项:
-
chmod +x file1:
- 解释: 添加执行权限。
+x
表示添加执行权限。
- 解释: 添加执行权限。
-
chmod -w file2:
- 解释: 移除写权限。
-w
表示移除写权限。
- 解释: 移除写权限。
-
chmod u+r file3:
- 解释: 添加用户(文件所有者)的读权限。
u+r
表示用户添加读权限。
- 解释: 添加用户(文件所有者)的读权限。
-
chmod go-rwx file4:
- 解释: 移除组和其他用户的所有权限。
go-rwx
表示组和其他用户移除读、写、执行权限。
- 解释: 移除组和其他用户的所有权限。
-
chmod a+rw file5:
- 解释: 添加所有用户的读和写权限。
a+rw
表示所有用户添加读和写权限。
- 解释: 添加所有用户的读和写权限。
-
chmod 755 file6:
- 解释: 设置文件权限为
rwxr-xr-x
。 - 说明: 数字模式可以直接指定权限。每个数字对应一组权限,分别是用户、组和其他用户的权限。其中,数字表示权限的三个位的组合,r 对应 4,w 对应 2,x 对应 1。所以
rwx
是 4+2+1=7,r-x
是 4+0+1=5。
- 解释: 设置文件权限为
-
chmod -R 644 directory:
- 解释: 递归地将目录及其子目录下的所有文件的权限设置为
rw-r--r--
。 - 说明:
-R
表示递归。
- 解释: 递归地将目录及其子目录下的所有文件的权限设置为
这些是 chmod
命令的一些常用选项及其解释。该命令允许用户根据需要更改文件和目录的权限。
2.3 Linux的日志文件
在Linux系统中,日志文件用于记录系统和应用程序的各种活动、事件和错误。以下是一些常见的Linux日志文件:
-
/var/log/messages:
- 内容: 通用的系统消息和事件。
- 作用: 记录系统的一般运行情况,包括启动、关机、登录等。
-
/var/log/syslog:
- 内容: 系统消息。
- 作用: 记录系统的各种事件和消息,包括内核、系统守护进程等的消息。
-
/var/log/auth.log:
- 内容: 身份验证日志。
- 作用: 记录用户身份验证信息,包括登录和 su 等活动。
-
/var/log/kern.log:
- 内容: 内核日志。
- 作用: 记录与内核相关的消息,如硬件故障、内核错误等。
-
/var/log/boot.log:
- 内容: 启动日志。
- 作用: 记录系统启动时的消息。
-
/var/log/dmesg:
- 内容: 内核环行缓冲区。
- 作用: 包含系统在启动时显示的有关硬件检测和驱动程序加载的信息。
-
/var/log/daemon.log:
- 内容: 守护进程日志。
- 作用: 记录各种守护进程的消息。
-
/var/log/cron:
- 内容: 计划任务日志。
- 作用: 记录定期运行的计划任务的输出和错误。
-
/var/log/mail.log:
- 内容: 邮件系统日志。
- 作用: 记录邮件系统的消息,如邮件服务器的传输和接收。
-
/var/log/secure:
- 内容: 安全日志。
- 作用: 记录与系统安全相关的消息,包括 ssh 登录尝试、su 操作等。
这些日志文件对于系统管理员和用户来说都是非常有用的,可以用于排查问题、监视系统活动以及了解系统运行状况。
3 Linux系统的访问控制
3.1 概述
系统访问控制示意图:
在 Linux
系统中,我们所有的操作实质都是在进行进程访问文件的操作。我们访问文件需要先取得相应的访问权限,而访问权限是通过 Linux
系统中的安全模型获得的。
对于 Linux
系统中的安全模型,我们需要知道下面两点
-
Linux
系统上最初的安全模型叫DAC
, 全称是Discretionary Access Control
,翻译为自主访问控制。 -
后来又增加设计了一个新的安全模型叫
MAC
, 全称是Mandatory Access Control
, 翻译为强制访问控制。
注意, MAC
和 DAC
不是互斥的, DAC
是最基本的安全模型,也是通常我们最常用到的访问控制机制是 Linux
必须具有的功能, 而 MAC
是构建在 DAC
之上的加强安全机制,属于可选模块。访问前, Linux系统通常都是先做 DAC
检查, 如果没有通过则操作直接失败; 如果通过 DAC
检查并且系统支持 MAC
模块,再做 MAC
权限检查。
为区分两者,我们将支持 MAC
的 Linux
系统称作 SELinux
, 表示它是针对 Linux
的安全加强系统。
3.2 Linux Capabilities
从内核 2.2 开始,Linux 将传统上与超级用户 root 关联的特权划分为不同的单元,称为 capabilites。Capabilites 作为线程(Linux 并不真正区分进程和线程)的属性存在,每个单元可以独立启用和禁用。如此一来,权限检查的过程就变成了:在执行特权操作时,如果进程的有效身份不是 root,就去检查是否具有该特权操作所对应的 capabilites,并以此决定是否可以进行该特权操作。比如要向进程发送信号(kill()),就得具有 capability CAP_KILL;如果设置系统时间,就得具有 capability CAP_SYS_TIME。
capability 名称 | 描述 |
CAP_AUDIT_CONTROL | 启用和禁用内核审计;改变审计过滤规则;检索审计状态和过滤规则 |
CAP_AUDIT_READ | 允许通过 multicast netlink 套接字读取审计日志 |
CAP_AUDIT_WRITE | 将记录写入内核审计日志 |
CAP_BLOCK_SUSPEND | 使用可以阻止系统挂起的特性 |
CAP_CHOWN | 修改文件所有者的权限 |
CAP_DAC_OVERRIDE | 忽略文件的 DAC 访问限制 |
CAP_DAC_READ_SEARCH | 忽略文件读及目录搜索的 DAC 访问限制 |
CAP_FOWNER | 忽略文件属主 ID 必须和进程用户 ID 相匹配的限制 |
CAP_FSETID | 允许设置文件的 setuid 位 |
CAP_IPC_LOCK | 允许锁定共享内存片段 |
CAP_IPC_OWNER | 忽略 IPC 所有权检查 |
CAP_KILL | 允许对不属于自己的进程发送信号 |
CAP_LEASE | 允许修改文件锁的 FL_LEASE 标志 |
CAP_LINUX_IMMUTABLE | 允许修改文件的 IMMUTABLE 和 APPEND 属性标志 |
CAP_MAC_ADMIN | 允许 MAC 配置或状态更改 |
CAP_MAC_OVERRIDE | 覆盖 MAC(Mandatory Access Control) |
CAP_MKNOD | 允许使用 mknod() 系统调用 |
CAP_NET_ADMIN | 允许执行网络管理任务 |
CAP_NET_BIND_SERVICE | 允许绑定到小于 1024 的端口 |
CAP_NET_BROADCAST | 允许网络广播和多播访问 |
CAP_NET_RAW | 允许使用原始套接字 |
CAP_SETGID | 允许改变进程的 GID |
CAP_SETFCAP | 允许为文件设置任意的 capabilities |
CAP_SETPCAP | 参考 capabilities man page |
CAP_SETUID | 允许改变进程的 UID |
CAP_SYS_ADMIN | 允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等 |
CAP_SYS_BOOT | 允许重新启动系统 |
CAP_SYS_CHROOT | 允许使用 chroot() 系统调用 |
CAP_SYS_MODULE | 允许插入和删除内核模块 |
CAP_SYS_NICE | 允许提升优先级及设置其他进程的优先级 |
CAP_SYS_PACCT | 允许执行进程的 BSD 式审计 |
CAP_SYS_PTRACE | 允许跟踪任何进程 |
CAP_SYS_RAWIO | 允许直接访问 /devport、/dev/mem、/dev/kmem 及原始块设备 |
CAP_SYS_RESOURCE | 忽略资源限制 |
CAP_SYS_TIME | 允许改变系统时钟 |
CAP_SYS_TTY_CONFIG | 允许配置 TTY 设备 |
CAP_SYSLOG | 允许使用 syslog() 系统调用 |
CAP_WAKE_ALARM | 允许触发一些能唤醒系统的东西(比如 CLOCK_BOOTTIME_ALARM 计时器) |
3.3 AppArmor
AppArmor(Application Armor)是一种Linux安全模块,用于强化系统对特定应用程序的安全性。它是一种应用层的安全性增强工具,允许管理员定义程序的访问控制策略,以限制程序对系统资源的访问。
以下是AppArmor的一些关键特点和功能:
-
应用程序特定的安全策略: AppArmor允许系统管理员为每个应用程序定义特定的安全策略。这种粒度的控制使得可以根据应用程序的需要和风险来定制安全规则。
-
基于文件路径的控制: AppArmor的策略是基于文件路径的,可以限制应用程序对特定文件或目录的访问。这有助于减少应用程序对系统资源的滥用。
-
轻量级: AppArmor的设计目标之一是保持轻量级,以减小对系统性能的影响。它通过使用内核中的特定功能实现了较低的系统开销。
-
容易配置: 配置AppArmor的规则相对较简单,管理员可以使用特定的工具或编辑配置文件来定义应用程序的访问规则。
-
与LSM集成: AppArmor是Linux安全模块(LSM)的一部分,可以与其他安全模块集成,例如SELinux(Security-Enhanced Linux)。
-
审计和日志: AppArmor生成审计和日志记录,这有助于管理员了解应用程序的行为,以及检测可能的安全威胁。
AppArmor通常与特定Linux发行版一起提供,例如Ubuntu。在使用AppArmor之前,管理员需要了解目标应用程序的工作方式,并配置适当的安全策略。这有助于最小化潜在的威胁和攻击面。
3.4 SElinux
SELinux(Security-Enhanced Linux)是一个Linux内核模块,提供了强化的安全性控制机制。它被设计为Linux操作系统的一部分,旨在强化系统的安全性,防止未经授权的访问和恶意行为。SELinux的设计理念是通过强制访问控制(Mandatory Access Control,MAC)来增强Linux的安全性。
以下是SELinux的一些关键特点和功能:
-
强制访问控制(MAC): SELinux引入了强制访问控制,与传统的自主访问控制(DAC)不同。在DAC中,用户对自己的文件有控制权,而在MAC中,访问控制由系统管理员定义,对用户来说是强制的。
-
标签和上下文: SELinux使用安全上下文标签为系统中的对象(如文件、进程和网络套接字)分配安全属性。这些标签包含有关对象的信息,用于决定对象的访问权限。
-
策略规则: SELinux的策略由一组规则组成,这些规则定义了对象之间的关系以及它们的访问权限。管理员可以配置这些规则以适应系统的安全需求。
-
细粒度控制: SELinux提供了细粒度的控制,可以限制每个对象的访问权限。这有助于最小化系统上的潜在威胁。
-
可定制性: SELinux的策略是可定制的,系统管理员可以根据需要调整和修改。这使得SELinux适用于各种用途和环境。
-
与LSM集成: SELinux是Linux安全模块(LSM)的一部分,可以与其他LSM模块一起使用。这允许系统管理员选择不同的安全模块来满足其需求。
-
日志和审计: SELinux生成详细的日志和审计信息,有助于管理员监视系统上的安全事件和异常行为。
SELinux通常由一些主流的Linux发行版采用,例如Red Hat Enterprise Linux(RHEL)和CentOS。在使用SELinux之前,系统管理员需要理解和配置适当的安全策略,以确保系统的正常运行并保护其免受潜在的安全威胁。