本地安全管理与审计指南
在系统管理中,本地安全管理至关重要,它涉及用户访问审计、资源限制设置以及特殊权限文件的管理等多个方面。以下将详细介绍相关的管理和审计方法。
1. 用户访问审计
在很多情况下,我们需要查看系统用户的访问情况,比如排查潜在的安全漏洞、为公司人力资源部门进行调查或者在系统关机前确定是否还有用户登录等。下面介绍几种常用的命令行工具。
1.1 确定当前登录用户
可以使用
who
和
w
这两个主要命令来确定当前登录到系统的用户。
-
who
命令
:该命令简单地显示当前登录到系统的用户信息,包括用户名、当前终端和登录时间。示例如下:
$ who
Christine tty2 2015-11-10 11:53
Timothy tty3 2015-11-10 12:33
Rich tty4 2015-11-10 12:36
[...]
$
使用
-a
选项可以获取更多信息:
$ who -a
system boot 2015-11-11 08:17
run-level 5 2015-11-11 08:17
Christine + tty2 2015-11-11 11:53 00:38 1569
Timothy + tty3 2015-11-11 12:33 00:41 1571
Rich + tty4 2015-11-11 12:36 00:39 3086
LOGIN tty5 2015-11-11 08:17 1576 id=5
LOGIN tty6 2015-11-11 08:17 1578 id=6
[...]
$
第一行显示系统启动时间,第二行显示当前系统运行级别(这里是5)。接下来的几行显示当前登录的用户、登录时间和进程ID(PID)。可以使用
ps
命令结合列出的PID来了解特定程序或登录用户的更多信息,例如:
$ ps 1576
PID TTY STAT TIME COMMAND
1576 tty5 Ss+ 0:00 /sbin/mingetty /dev/tty5
$
who
命令从
/var/run/utmp
或
/run/utmp
文件中获取数据,具体取决于你的发行版。要确定你的发行版使用哪个文件,可以使用超级用户权限在命令行中输入
locate utmp
。
-
w
命令
:默认情况下,
w
命令虽然简短,但会显示有关登录用户的大量信息:
$ w
13:24:25 up 5:07, 4 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
Christin tty2 - 11:53 48:00 1.83s 1.83s -bash
Timothy tty3 - 12:33 50:32 0.31s 0.31s -bash
Rich tty4 - 12:36 48:20 0.11s 0.11s -bash
[...]
$
w
命令不仅显示登录到系统的用户,还显示他们正在做的事情以及有关CPU使用的统计信息。
JCPU
列显示当前连接到特定虚拟控制台终端的任何进程使用的所有CPU时间,
PCPU
列显示
WHAT
列中列出的程序当前消耗的所有CPU时间。
w
命令使用
utmp
文件数据进行显示,同时也使用
/proc/
目录中的信息。
可以通过查看
w
和
who
命令的手册页来了解更多信息。需要注意的是,这两个命令仅显示当前信息。如果需要特定用户的历史数据,则需要使用其他命令。
1.2 确定用户最后一次访问系统的时间
last
命令可以提供有关用户登录和退出系统的当前和历史数据。要显示信息,只需在命令行中输入
last
。由于可能有大量信息需要显示,建议将输出通过管道传递给分页器,如
less
。
$ last
# 输出大量信息,可通过管道传递给less查看
$ last | less
显示的数据来自
/var/log/wtmp
文件,
last
命令首先显示最新数据。因此,应该可以看到当前登录到系统的用户,标记为
still logged in
。每个用户记录中显示的日期和时间表示用户登录和退出系统的时间。在某些情况下,用户在系统关闭时仍处于登录状态,用
down
关键字表示。
如果
/var/log/wtmp
文件被
logrotate
实用程序轮转,可以使用
last
命令的
-f
选项查看旧版本的文件。例如,如果要查看名为
/var/log/wtmp.1
的旧版本文件,可以输入:
$ last -f /var/log/wtmp.1
如果只想查看特定用户的登录和退出活动,可以将用户名作为参数传递。例如,要查看是否有人直接访问
root
账户,可以输入:
$ last root
root tty3 Wed Nov 12 09:32 - 09:35 (00:02)
root pts/0 192.168.56.1 Fri Nov 7 10:38 - 13:04 (02:25)
root tty2 Wed Oct 29 11:37 - down (02:36)
root tty3 Fri Oct 10 08:03 - down (02:20)
root tty2 Tue Sep 30 09:44 - down (02:29)
wtmp begins Tue Mar 18 15:25:03 2015
$
注意,远程访问也会被记录,同时显示其源地址。还可以看到
/var/log/wtmp
文件的开始时间。需要注意的是,使用
su -
以
root
身份登录的尝试不会记录在这些文件中,这也是建议使用
sudo
来维护系统不可抵赖环境的另一个原因。
失败的登录尝试存储在
/var/log/btmp
文件中。可以使用
last
命令并添加
-f
选项来查看失败的登录尝试:
$ sudo last -f /var/log/btmp
[sudo] password for Christine:
root tty3 Wed Nov 12 09:35 gone - no logout
root tty3 Wed Nov 12 09:35 - 09:35 (00:00)
[...]
btmp begins Sat Nov 8 15:11:24 2015
$
更简单的方法是使用
lastb
命令,它显示所有失败的登录尝试,并且使用与
last
命令相同的所有选项:
$ sudo lastb
[sudo] password for Christine:
root tty3 Wed Nov 12 09:35 - 09:35 (00:00)
root tty3 Wed Nov 12 09:35 - 09:35 (00:00)
[...]
btmp begins Sat Nov 8 15:11:24 2015
$
使用
last
和
lastb
命令显示失败的登录尝试时,必须具有超级用户权限,因为
/var/log/btmp
文件通过权限进行保护,以防止攻击者更改失败的登录信息。
一些发行版有
dump-utmp
实用程序,可以将本节涉及的任何文件以人类可读的格式导出,包括
utmp
文件、
/var/log/wtmp
文件和
/var/log/btmp
文件。该工具有助于使用shell脚本生成审计报告。要了解有关此实用程序的更多信息,可以在命令行中输入
man dump-utmp
。
另一个有用的命令是
lastlog
,它从
/var/log/lastlog
文件中提取数据。可以通过添加
-u username
选项来确定特定用户最后一次登录系统的时间:
$ lastlog -u Christine
Username Port From Latest
Christine tty3 Wed Nov 12 10:20:36 -0500 2015
$
需要注意的是,如果特定用户多次登录系统,
lastlog
不会显示多个登录条目,它只显示用户最后一次登录系统的时间。查看每个账户的
/var/log/lastlog
条目有助于确定是否有不应登录的账户被访问。例如:
$ lastlog
Username Port From Latest
root tty3 Wed Nov 12 09:32:51 -0500 2015
[...]
sshd **Never logged in**
tcpdump **Never logged in**
Christine tty3 Wed Nov 12 10:20:36 -0500 2015
sally **Never logged in**
Rich tty4 Tue Nov 11 12:36:01 -0500 2015
Timothy tty3 Tue Nov 11 12:33:08 -0500 2015
[...]
$
2. 设置登录、进程和内存限制
有时需要对用户的登录次数、CPU时间消耗和内存使用等进行限制。可以通过
pam_limits
模块和
ulimit
命令来实现。
2.1 使用
pam_limits
模块
大多数主要的Linux发行版将
pam_limits
模块作为其标准PAM配置的一部分,通常不需要添加它,但需要对其进行配置。通过编辑其配置文件
/etc/security/limits.conf
来进行配置,该文件包含注释(以
#
开头)和由四个字段组成的限制行:
| 字段 | 说明 |
| ---- | ---- |
| domain | 描述限制适用的实体,可以是用户名、组名(格式为
@groupname
)或通配符
*
(匹配所有用户)。 |
| type | 指定限制是硬限制还是软限制。硬限制由系统管理员施加,在任何情况下都不能超过;而用户可以暂时超过软限制。也可以使用
-
表示限制既是硬限制又是软限制。 |
| item | 指定要限制的项目类型,例如
core
(核心文件大小)、
data
(程序数据区域大小)、
fsize
(用户创建的文件大小)、
nofile
(打开的数据文件数量)、
rss
(常驻集大小)、
stack
(堆栈大小)、
cpu
(单个进程的CPU时间,以分钟为单位)、
nproc
(并发进程数量)、
maxlogins
(同时登录的数量)和
priority
(进程优先级)等。数据、
rss
和
stack
项目都与程序消耗的内存有关,这些和其他数据容量的度量单位是千字节。 |
| value | 指定要应用于限制的值。 |
例如,对于某些用户应该能够登录并执行有限数量的操作,但不能无限期登录并消耗大量CPU时间的系统,可以使用以下配置:
@limited hard cpu 2
此配置将
limited
组的CPU硬限制设置为2分钟。该组的成员可以登录并运行程序,但如果其中一个程序消耗的CPU时间超过两分钟,它将被终止。需要注意的是,CPU时间和总系统访问时间是完全不同的概念。CPU时间是根据CPU积极处理用户数据的时间计算的,空闲时间(例如,当用户的shell处于活动状态但没有运行CPU密集型任务时)不计入。因此,即使硬CPU时间限制非常低,用户也可以登录并保持登录数小时。此限制旨在防止在不适合运行CPU密集型程序的系统上因用户运行此类程序而导致的问题。
2.2 使用
ulimit
命令
ulimit
是一个bash内置命令,因此它仅影响bash及其启动的程序。其语法如下:
ulimit [options [limit]]
选项定义了要限制的内容:
-
核心文件限制
:
-c
选项限制核心转储文件的大小,这些文件是在某些类型的程序崩溃时为调试目的创建的。
-
文件限制
:
-f
选项限制shell可以创建的文件大小,
-n
限制打开的文件描述符数量(不过大多数系统不遵守
-n
限制)。
-
进程限制
:
-u
选项限制用户可以运行的进程数量,
-t
限制总CPU时间(以秒为单位)。
-
内存限制
:
-v
选项设置shell可用的虚拟内存总量,
-s
设置最大堆栈大小,
-m
设置最大常驻集大小,
-d
限制程序的数据集大小,
-l
设置可以锁定到内存中的最大大小。
-
硬限制和软限制
:
-H
和
-S
选项修改其他选项,分别将它们设置为硬限制或软限制。硬限制随后不能增加,但软限制可以。如果未提供任何选项,
ulimit
将为指定的功能设置硬限制和软限制。
-
当前设置
:传递
-a
会使
ulimit
报告其当前设置。
limit
变量通常是与限制关联的数值。
ulimit
命令经常出现在系统或用户的bash启动脚本中,通常为
ulimit -c 0
,以防止创建可能会使文件系统混乱的核心文件。如果用户进行软件开发,可能需要确保不设置此限制,或者至少将其设置为软限制(如
ulimit -Sc 0
),以便用户在必要时可以覆盖它。
由于
ulimit
是bash内置命令,其作为系统安全工具的实用性有限。如果用户可以访问GUI登录工具或以任何绕过bash的方式登录系统(例如通过SSH,具体取决于其配置),
ulimit
施加的限制将变得毫无意义。因此,应将
ulimit
视为防止因意外而非故意滥用系统而导致问题的一种方式。
2.3 使用
/etc/nologin
文件
如果存在
/etc/nologin
文件,只有
root
可以登录计算机。其他用户在尝试登录时将看到该文件的内容。在很多方面,使用
/etc/nologin
就像为所有其他用户将关键系统限制设置为0。该文件在没有常规控制台或远程shell用户的专用服务器系统上很有用。
3. 定位SUID/SGID文件
SUID和SGID位是可以应用于可执行程序文件的特殊标志。这些标志使Linux将程序视为由程序文件的所有者(对于SUID)或文件的组(对于SGID)运行,而不是由实际运行程序的个人运行。例如,如果程序的SUID位被设置,并且程序文件由
bruce
拥有,那么任何人运行该程序时,都将能够访问
bruce
拥有的所有文件,并表现得就像
bruce
在运行它一样。
SUID和SGID位通常与
root
账户相关联,以使其能够执行需要特殊权限的任务。例如,
passwd
程序是SUID root,因为只有
root
可以修改Linux密码数据库。因此,对于普通用户来说,要更改密码,必须有一种机制以
root
身份运行进程,在
passwd
的情况下,这种机制就是SUID位。
然而,SUID和SGID位可能存在安全风险。例如,如果
rm
程序的SUID位被设置,由于该程序通常由
root
拥有,那么任何用户都可以删除计算机上的任何文件!虽然没有Linux发行版默认设置
rm
的SUID位,但SUID位可能会被不恰当地设置或被攻击者设置。因此,应该定期审计系统以查找所有SUID和SGID程序,并在必要时更改它们的权限设置。
可以使用
find
命令来查找SUID和SGID文件,特别是使用
-perm mode
选项,该选项搜索具有指定权限模式的文件。要搜索SUID和SGID文件,应传递模式值
+6000
,SUID和SGID位的符号表示为
6000
,加号
+
告诉
find
查找任何设置了指定位的文件。还可以传递
-type f
选项,将搜索限制为常规文件(目录使用SUID和SGID位的方式不同)。因此,要在整个计算机上搜索SUID和SGID程序,可以输入以下命令:
$ sudo find / -perm +6000 -type f
[sudo] password for Christine:
/lib64/dbus-1/dbus-daemon-launch-helper
/home/Christine/bigprogram.sh
/sbin/pam_timestamp_check
/sbin/netreport
/sbin/unix_chkpwd
[...]
$
可以通过传递
+4000
或
-u=s
单独搜索SUID文件,通过传递
+2000
或
-g=s
单独搜索SGID文件。
结果是一个文件列表,每行一个,显示设置了SUID或SGID位的文件。此列表中可能存在的程序包括
su
、
ping
、
mount
、
passwd
、
umount
和
sudo
等,这些程序都有合理的配置需求。大多数系统还有其他SUID和SGID程序,其中一些可能看起来微不足道。如果对某个程序是否真的需要SUID或SGID状态有疑问,应该进一步调查。可以尝试使用包管理工具验证包的完整性,并在网上搜索该程序名称和SUID或SGID相关信息。还可以尝试使用
chmod
命令更改程序的SUID状态,并查看普通用户运行时它是否仍然按预期工作。
如果发现不应该是SUID或SGID root的程序,可能表示系统已被入侵。攻击者可能会以这种方式重新配置程序,以便更轻松地制造麻烦。因此,如果发现此类程序,应调查系统的整体完整性。
通过以上方法,可以有效地管理本地系统的安全,包括用户访问审计、资源限制设置和特殊权限文件的管理,从而提高系统的安全性和稳定性。
本地安全管理与审计指南(续)
4. 安全管理流程总结与建议
为了更好地管理本地系统安全,我们可以将上述的各项操作整合为一个安全管理流程。以下是一个简单的 mermaid 流程图,展示了这个流程:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(用户访问审计):::process
B --> C{是否发现异常?}:::decision
C -->|是| D(深入调查异常情况):::process
C -->|否| E(设置资源限制):::process
D --> E
E --> F(定位SUID/SGID文件):::process
F --> G{是否有异常权限文件?}:::decision
G -->|是| H(调查并修复权限):::process
G -->|否| I(定期重复流程):::process
H --> I
I --> B
这个流程图展示了一个循环的安全管理流程,从用户访问审计开始,若发现异常则进行深入调查,然后设置资源限制,接着定位 SUID/SGID 文件,对异常权限文件进行处理,最后定期重复整个流程,以确保系统安全。
以下是根据这个流程给出的具体操作建议:
1.
定期进行用户访问审计
:
- 每周至少使用
last
和
lastb
命令查看用户登录和失败登录记录,及时发现异常登录行为。
- 每月使用
lastlog
命令检查所有用户的最后登录时间,确保不应该登录的账户没有被访问。
2.
合理设置资源限制
:
- 根据系统的实际使用情况和用户需求,在
/etc/security/limits.conf
文件中设置合理的用户资源限制,如 CPU 时间、内存使用等。
- 在用户的 bash 启动脚本中使用
ulimit
命令设置基本的资源限制,防止意外的资源滥用。
3.
定期检查 SUID/SGID 文件
:
- 每月使用
find
命令查找系统中的 SUID 和 SGID 文件,检查是否有异常权限的文件。
- 对于不确定是否需要特殊权限的文件,进行详细调查,必要时使用包管理工具验证其完整性。
5. 常见问题解答
在进行本地安全管理过程中,可能会遇到一些常见问题,以下是一些解答:
| 问题 | 解答 |
|---|---|
who
命令和
w
命令显示的信息有什么不同?
|
who
命令简单显示当前登录的用户、终端和登录时间;
w
命令除了这些信息外,还显示用户正在做的事情以及 CPU 使用统计信息。
|
last
命令和
lastb
命令有什么区别?
|
last
命令显示用户登录和退出系统的当前和历史数据;
lastb
命令专门显示失败的登录尝试。
|
pam_limits
和
ulimit
的作用有什么不同?
|
pam_limits
通过配置文件
/etc/security/limits.conf
对系统中的用户或组设置资源限制,适用于整个系统;
ulimit
是 bash 内置命令,仅影响 bash 及其启动的程序。
|
如何确定
who
命令使用的是哪个
utmp
文件?
|
使用超级用户权限,在命令行中输入
locate utmp
来确定。
|
| 如果发现 SUID 或 SGID 权限被不恰当地设置,应该怎么做? |
首先使用包管理工具验证程序所在包的完整性,然后在网上搜索该程序名称和 SUID 或 SGID 相关信息,了解其是否真的需要特殊权限。如果不需要,可以使用
chmod
命令更改其权限。
|
6. 总结
本地系统的安全管理是一个复杂而重要的任务,涉及多个方面的操作和配置。通过用户访问审计,我们可以及时发现潜在的安全威胁,如异常登录行为;合理设置登录、进程和内存限制,可以防止用户过度消耗系统资源,避免因资源滥用导致的系统性能下降或安全问题;定期定位和检查 SUID/SGID 文件,可以确保系统中没有不恰当的特殊权限设置,防止攻击者利用这些权限进行破坏。
在实际操作中,我们需要根据系统的具体情况和需求,灵活运用各种工具和方法,建立一个完善的安全管理流程,并定期进行检查和维护。同时,要不断学习和了解新的安全知识和技术,以应对不断变化的安全威胁,保障系统的安全稳定运行。
希望以上内容能够帮助你更好地管理本地系统的安全,如果你在操作过程中遇到任何问题,可以参考上述的常见问题解答或进一步查阅相关资料。通过持续的努力和关注,你可以有效地提高系统的安全性,为系统的正常运行提供坚实的保障。
超级会员免费看
1453

被折叠的 条评论
为什么被折叠?



