深入理解Linux基础安全
1. 账户密码设置
在Linux系统中,账户密码的设置对于系统安全至关重要。以
tim
账户为例,我们可以使用
chage
命令来查看和设置账户的密码相关信息。
-
查看密码设置信息
:
# chage -l tim | grep Password
Password expires : never
Password inactive : never
从输出可以看出,
tim
账户的密码没有设置过期时间和非活动时间。
-
设置账户锁定时间
:
如果我们仅使用
-I
选项来设置账户在密码过期后5天锁定,如下所示:
# chage -I 5 tim
# chage -l tim | grep Password
Password expires : never
Password inactive : never
可以发现设置没有生效。这是因为没有设置密码过期时间,
-I
选项就不会起作用。因此,我们需要使用
-M
选项来设置密码过期的最大天数,再设置密码非活动时间。
# chage -M 30 -I 5 tim
# chage -l tim | grep Password
Password expires : Mar 03, 2017
Password inactive : Mar 08, 2017
现在,
tim
账户的密码将在2017年3月3日过期,过期后5天(即3月8日)账户将被锁定。这种设置在员工离职但用户账户尚未删除的情况下非常有用。
2. 理解密码文件和密码哈希
早期的Linux系统将密码存储在
/etc/passwd
文件中,这些密码是经过哈希处理的。哈希是一种单向的数学过程,一旦生成哈希值,就无法从哈希值还原出原始密码。
-
密码验证过程
:当用户输入账户密码时,Linux系统会对输入的密码进行重新哈希处理,然后将结果与
/etc/passwd
文件中的原始哈希值进行比较。如果匹配,用户将被认证并允许进入系统。
-
/etc/passwd
文件的安全问题
:查看
/etc/passwd
文件的权限:
# ls -l /etc/passwd
-rw-r--r--. 1 root root 1644 Feb 2 02:30 /etc/passwd
可以看到,该文件的权限是所有人都可以读取。虽然密码是经过哈希处理的,但恶意人员可以使用彩虹表(一种包含大量可能密码及其哈希值的字典)来破解密码。例如,流行密码“Password”的哈希值如下:
$6$dhN5ZMUj$CNghjYIteau5xl8yX.f6PTOpendJwTOcXjlTDQUQZhhy
V8hKzQ6Hxx6Egj8P3VsHJ8Qrkv.VSR5dxcK3QhyMc.
-
/etc/shadow文件的出现 :为了解决/etc/passwd文件的安全问题,多年前,哈希密码被转移到了新的配置文件/etc/shadow中。查看该文件的权限:
# ls -l /etc/shadow
-rw-r----- 1 root shadow 1320 Apr 3 19:50 /etc/shadow
只有root用户和
shadow
组的成员可以查看该文件,从而保护了哈希密码的安全。例如,查看
/etc/shadow
文件的末尾部分:
# tail -2 /etc/shadow
johndoe:$6$jJjdRN9/qELmb8xWM1LgOYGhEIxc/:15364:0:99999:7:::
Tim:$6$z760AJ42$QXdhFyndpbVPVM5oVtNHs4B/:15372:5:30:7:16436::
可以看到,每个用户记录中都有一长串无意义的字符串,这些就是哈希密码。
-
/etc/shadow
文件的其他信息
:除了账户名和哈希密码外,
/etc/shadow
文件还存储了以下信息:
- 自1970年1月1日以来密码更改的天数
- 密码可以更改之前的天数
- 密码必须更改之前的天数
- 密码必须更改之前警告用户的天数
- 密码过期后账户被禁用的天数
- 自1970年1月1日以来账户被禁用的天数
3. 确保文件系统安全
3.1 管理危险的文件系统权限
如果为Linux系统上的每个文件都赋予
rwxrwxrwx
(777)的完全访问权限,将会导致系统混乱。同样,如果不严格管理设置用户ID(SUID)和设置组ID(SGID)权限,也会引发类似的问题。
-
SUID权限
:具有SUID权限的文件,在所有者类别中具有该权限,并且在其他类别中具有执行权限,允许任何人在文件在内存中执行时临时成为文件的所有者。如果文件的所有者是root,这种情况风险最大。
-
SGID权限
:具有SGID权限的文件,在组类别中具有该权限,并且在其他类别中具有执行权限,允许任何人在文件在内存中执行时临时成为文件所属组的成员。SGID也可以设置在目录上,这将使在该目录中创建的任何文件的组ID设置为目录的组ID。
-
示例命令
:查看
passwd
和
sudo
命令的权限:
$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 28804 Aug 17 20:50 /usr/bin/passwd
$ ls -l /usr/bin/sudo
---s--x--x. 2 root root 77364 Nov 3 08:10 /usr/bin/sudo
passwd
和
sudo
命令是设计为SUID程序的。虽然这些命令以root用户身份运行,但普通用户只能使用
passwd
更改自己的密码,并且只有在
/etc/sudoers
文件中被授予权限时才能使用
sudo
提升到root权限。而如果黑客创建了一个SUID的
bash
命令,任何运行该命令的人都可以有效地更改系统上具有root访问权限的所有内容。
-
查找SUID和SGID命令
:可以使用
find
命令搜索系统中是否存在隐藏或不适当的SUID和SGID命令:
# find / -perm /6000 -ls
4597316 52 -rwxr-sr-x 1 root games 51952 Dec 21 2013 /usr/bin/atc
4589119 20 -rwxr-sr-x 1 root tty 19552 Nov 18 2013 /usr/bin/write
4587931 60 -rwsr-xr-x 1 root root 57888 Aug 2 2013 /usr/bin/at
4588045 60 -rwsr-xr-x 1 root root 57536 Sep 25 2013 /usr/bin/crontab
4588961 32 -rwsr-xr-x 1 root root 32024 Nov 18 2013 /usr/bin/su
...
5767487 85 -rwsrwsr-x 1 root root 68928 Sep 13 11:52 /var/.bin/myvi
...
从输出可以看出,
find
命令可以发现普通用户为了特定原因提升权限而运行的SUID和SGID命令。在这个例子中,还有一个用户试图隐藏的文件
myvi
,这是
vi
命令的一个副本,由于权限和所有权的原因,可以更改root拥有的文件。
3.2 保护密码文件
-
/etc/passwd文件 :该文件用于检查用户账户信息,其权限设置应该如下: - 所有者:root
- 组:root
-
权限:(644) 所有者:rw- 组:r– 其他:r–
查看/etc/passwd文件的权限:
# ls -l /etc/passwd
-rw-r--r--. 1 root root 1644 Feb 2 02:30 /etc/passwd
这些设置允许用户登录系统并查看与用户ID和组ID号关联的用户名,但用户不应该能够直接修改
/etc/passwd
文件。例如,如果授予其他用户写访问权限,恶意用户可能会向文件中添加新账户。
-
/etc/shadow
文件
:该文件与
/etc/passwd
文件密切相关,用于登录认证过程。其权限设置应该如下:
- 所有者:root
- 组:root
- 权限:(640) 所有者:-rw- 组:r– 其他:—
查看
/etc/shadow
文件的权限:
# ls -l /etc/shadow
-rw-r----- 1 root shadow 1320 Apr 3 19:50 /etc/shadow
可以看到,
/etc/shadow
文件的访问权限比
/etc/passwd
文件严格得多。虽然只有root用户可以查看该文件,但用户可以使用
passwd
命令更改自己的密码。
passwd
命令使用了特殊的SUID权限:
# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 28804 Aug 17 20:50 /usr/bin/passwd
当用户运行
passwd
命令时,在命令执行期间,用户将临时成为root用户,从而可以写入
/etc/shadow
文件,但只能更改自己的密码相关信息。
-
/etc/group
文件
:该文件包含Linux系统上的所有组,其文件权限应设置为与
/etc/passwd
文件相同:
- 所有者:root
- 组:root
- 权限:(644) 所有者:rw- 组:r– 其他:r–
3.3 锁定文件系统
/etc/fstab
文件是文件系统表,用于在启动时挂载存储设备到文件系统,也被
mount
、
dump
和
fsck
命令使用。其权限设置应该如下:
- 所有者:root
- 组:root
- 权限:(644) 所有者:rw- 组:r– 其他:r–
在文件系统表中,有一些重要的安全设置需要审查。除了根分区、引导分区和交换分区外,文件系统选项默认情况下是比较安全的。还可以考虑以下设置:
-
/home
目录
:通常将
/home
子目录(用户目录所在的位置)放在单独的分区上。在
/etc/fstab
中添加挂载选项时,可以设置
nosuid
选项,以防止具有SUID和SGID权限的可执行程序在该目录中运行;设置
nodev
选项,使该目录中的设备文件不会被识别;设置
noexec
选项,禁止在该目录中运行可执行程序。
-
/tmp
目录
:将
/tmp
子目录(临时文件所在的位置)放在单独的分区上,并使用与
/home
目录相同的选项设置:
nosuid
、
nodev
、
noexec
。
-
/usr
目录
:将
/usr
子目录(用户程序和数据所在的位置)放在单独的分区上,并设置
nodev
选项,使该目录中的设备文件不会被识别。安装软件后,
/usr
目录通常很少或没有变化,有时为了安全起见,甚至将其挂载为只读。
-
/var
目录
:如果系统配置为服务器,可能需要将
/var
目录放在单独的分区上。该目录会随着日志消息和Web、FTP等服务器内容的添加而增长,可以使用与
/home
目录相同的挂载选项:
nosuid
、
nodev
、
noexec
。
将上述挂载选项添加到
/etc/fstab
文件中,示例如下:
/dev/sdb1 /home ext4 defaults,nodev,noexec,nosuid 1 2
/dev/sdc1 /tmp ext4 defaults,nodev,noexec,nosuid 1 1
/dev/sdb2 /usr ext4 defaults,nodev 1 2
/dev/sdb3 /var ext4 defaults,nodev,noexec,nosuid 1 2
这些挂载选项将有助于进一步锁定文件系统,增加对恶意意图的防护。管理各种文件权限和
fstab
选项应该是安全策略的一部分,具体实施的项目应根据组织的安全需求来确定。
4. 管理软件和服务
- 更新软件包 :除了删除不必要的服务和软件外,保持当前软件的更新对于安全至关重要。通过软件更新可以获得最新的错误修复和安全补丁。软件包更新应该定期进行,具体的更新频率和时间取决于组织的安全需求。可以轻松地自动化软件更新,但在更新生产Linux系统之前,最好先在测试环境中测试更新。
- 关注安全公告 :当Linux软件中发现安全漏洞时,通用漏洞披露(CVE)项目会跟踪这些漏洞,并帮助Linux社区快速修复这些漏洞。像Canonical这样的公司会提供更新的软件包来修复安全漏洞并进行分发。可以在Ubuntu网站的安全通知页面(usn.ubuntu.com/)上了解Ubuntu中安全更新的处理方式,也可以在people.canonical.com/~ubuntu-security/cve页面上搜索CVE和相关软件包。
5. 监控系统
如果系统的安全规划和实施做得好,大多数恶意攻击将被阻止。但如果发生攻击,需要能够识别它。监控是一项需要持续进行的活动,包括监视日志文件、用户账户和文件系统本身。
-
监控日志文件
:理解消息日志的记录方式对于维护和故障排除Linux系统至关重要。在使用
systemd
收集消息到
systemd
日志之前,内核和系统服务生成的消息被定向到
/var/log
目录中的文件。现在,仍然可以通过
rsyslogd
服务将大部分
/var/log
目录中的文件从
systemd
日志定向到该目录。大多数日志文件可以使用
cat
、
head
、
tail
、
more
或
less
命令显示,但有一些文件需要特殊命令来查看,如下表所示:
| Filename | View Command |
|---|---|
| btmp | dump-utmp btmp |
| dmesg | dmesg |
| lastlog | lastlog |
| wtmp | dump-utmp wtmp |
使用
journalctl
命令可以直接从
systemd
日志中查看日志消息。例如,分页查看内核消息:
$ journalctl -k
-- Logs begin at Tue 2019-05-07 09:16:36 EDT, end at Tue 2020-04-07
12:25:01 EDT
Apr 07 07:49:08 workstation kernel: Linux version 5.3.0-46-generic
(buildd@lcy01
Apr 07 07:49:08 workstation kernel: Command line: BOOT_IMAGE=/boot/
vmlinuz-5.3.0
Apr 07 07:49:08 workstation kernel: KERNEL supported cpus:
Apr 07 07:49:08 workstation kernel: Intel GenuineIntel
Apr 07 07:49:08 workstation kernel: AMD AuthenticAMD
Apr 07 07:49:08 workstation kernel: Hygon HygonGenuine
Apr 07 07:49:08 workstation kernel: Centaur CentaurHauls
Apr 07 07:49:08 workstation kernel: zhaoxin Shanghai
Apr 07 07:49:08 workstation kernel: x86/fpu: Supporting XSAVE feature
0x001: 'x8
Apr 07 07:49:08 workstation kernel: x86/fpu: Supporting XSAVE feature
0x002: 'SS
Apr 07 07:49:08 workstation kernel: x86/fpu: Supporting XSAVE feature
0x004: 'AV
Apr 07 07:49:08 workstation kernel: x86/fpu: xstate_offset[2]: 576,
xstate_size
Apr 07 07:49:08 workstation kernel: x86/fpu: Enabled xstate features
0x7, contex
Apr 07 07:49:08 workstation kernel: BIOS-provided physical RAM map:
Apr 07 07:49:08 workstation kernel: BIOS-e820: [mem
0x0000000000000000-0x0000000
...
要查看与特定服务相关的消息,可以使用
-u
选项后跟服务名称:
$ journalctl -u NetworkManager.service
$ journalctl -u apache2.service
$ journalctl -u avahi-daemon.service
如果认为正在发生安全漏洞,可以使用
-f
选项实时跟踪所有或选定的消息(按Ctrl+C停止):
$ journalctl -k -f
$ journalctl -f -u apache2.service
在规划系统部署时,还需要了解一些其他重要的安全主题,如加密、可插拔认证模块(PAM)和AppArmor等,这些高级主题将在后续文章中详细介绍。通过合理的安全设置、软件管理、服务监控和日志查看,可以大大提高Linux系统的安全性,有效抵御各种潜在的安全威胁。
深入理解Linux基础安全
6. 高级安全主题概述
在规划Linux系统部署时,除了前面提到的基础安全措施,还有一些高级安全主题需要我们关注,这些主题包括加密技术、可插拔认证模块(PAM)以及AppArmor。虽然这些内容较为复杂和深入,但对于构建更安全的Linux系统至关重要。
-
加密技术
:加密是保护数据安全的重要手段。在Linux系统中,加密可以应用于多个层面,如文件系统加密、网络通信加密等。通过加密,可以确保数据在存储和传输过程中的保密性和完整性,防止数据被未授权的访问和篡改。
-
可插拔认证模块(PAM)
:PAM是一种灵活的认证机制,它允许系统管理员根据不同的需求配置认证方式。PAM可以用于多种服务,如登录、sudo等,通过插入不同的认证模块,可以实现不同的认证策略,如密码认证、指纹认证等。
-
AppArmor
:AppArmor是一种强制访问控制(MAC)系统,它通过为每个应用程序定义访问控制策略,限制应用程序的行为。AppArmor可以防止应用程序执行未授权的操作,如访问敏感文件、网络连接等,从而提高系统的安全性。
7. 系统监控的重要性及方法
系统监控是保障Linux系统安全的重要环节。即使我们在系统安全方面进行了全面的规划和实施,仍然可能会面临各种潜在的安全威胁。因此,持续的系统监控可以帮助我们及时发现并应对这些威胁。
-
日志文件监控
:日志文件是系统活动的记录,通过监控日志文件,可以发现系统中的异常活动。如登录失败记录、系统错误信息等。前面已经介绍了如何查看不同类型的日志文件,这里再次强调日志监控的重要性。例如,通过定期查看
/var/log/btmp
文件,可以发现是否有异常的登录尝试;通过查看
/var/log/syslog
文件,可以了解系统的整体运行情况。
-
用户账户监控
:监控用户账户的活动也是系统监控的重要内容。要关注用户账户的创建、删除、权限变更等操作,防止恶意用户创建非法账户或提升自身权限。可以通过定期检查
/etc/passwd
和
/etc/shadow
文件,查看是否有异常的用户账户信息。
-
文件系统监控
:文件系统的完整性和安全性直接关系到系统的稳定运行。可以使用工具如
tripwire
来监控文件系统的变化,当文件被修改、删除或创建时,
tripwire
会生成相应的报告,帮助我们及时发现异常情况。
8. 安全策略制定与实施
制定合理的安全策略是保障Linux系统安全的关键。安全策略应该根据组织的安全需求和系统的实际情况进行制定,并在系统中进行有效实施。
-
确定安全目标
:首先要明确系统的安全目标,如保护敏感数据、防止非法访问、保障系统的可用性等。根据这些目标,制定相应的安全策略。
-
制定访问控制策略
:访问控制是安全策略的核心内容之一。通过设置文件和目录的权限,限制用户和进程的访问权限。例如,对于重要的配置文件,只允许root用户进行读写操作;对于敏感数据文件,限制只有特定用户或用户组可以访问。
-
实施安全审计
:安全审计是对系统安全策略执行情况的检查和评估。通过定期的安全审计,可以发现安全策略中存在的问题,并及时进行调整和改进。可以使用工具如
auditd
来记录系统的安全事件,并进行审计分析。
9. 应对安全事件的流程
当系统发生安全事件时,需要有一套完善的应对流程,以减少事件对系统造成的影响。
graph LR
A[发现安全事件] --> B[评估事件影响]
B --> C[隔离受影响的系统或服务]
C --> D[收集证据]
D --> E[分析事件原因]
E --> F[制定解决方案]
F --> G[实施解决方案]
G --> H[恢复系统正常运行]
H --> I[总结经验教训,改进安全策略]
- 发现安全事件 :通过系统监控可以发现安全事件的迹象,如异常的登录尝试、文件系统的异常变化等。当发现安全事件时,要及时进行记录和报告。
- 评估事件影响 :评估安全事件对系统的影响程度,包括数据是否泄露、系统是否瘫痪等。根据评估结果,确定应对措施的优先级。
- 隔离受影响的系统或服务 :为了防止安全事件的扩散,需要及时隔离受影响的系统或服务。如关闭受攻击的网络端口、停止受感染的服务等。
- 收集证据 :收集与安全事件相关的证据,如日志文件、系统快照等。这些证据将有助于分析事件的原因和责任认定。
- 分析事件原因 :通过对收集到的证据进行分析,找出安全事件发生的原因。如是否是由于软件漏洞、配置错误或人为疏忽等原因导致的。
- 制定解决方案 :根据事件原因,制定相应的解决方案。如修复软件漏洞、调整系统配置、加强用户培训等。
- 实施解决方案 :按照制定的解决方案,对系统进行修复和改进。在实施过程中,要注意备份重要数据,防止数据丢失。
- 恢复系统正常运行 :在解决安全事件后,要及时恢复系统的正常运行。如重新启动服务、恢复数据等。
- 总结经验教训,改进安全策略 :对安全事件进行总结,分析事件发生的原因和处理过程中存在的问题。根据总结结果,改进安全策略,防止类似事件的再次发生。
10. 安全意识培训
除了技术层面的安全措施,提高用户的安全意识也是保障Linux系统安全的重要因素。用户是系统的直接使用者,如果用户缺乏安全意识,可能会因为误操作或泄露密码等原因导致系统安全事件的发生。
-
定期培训
:定期组织用户进行安全意识培训,向用户传授安全知识和技能。如如何设置强密码、如何避免点击可疑链接、如何正确使用系统资源等。
-
安全宣传
:通过安全宣传海报、邮件通知等方式,向用户宣传系统安全的重要性和常见的安全威胁。提高用户对安全问题的关注度和警惕性。
-
案例分析
:通过实际的安全案例分析,让用户了解安全事件的后果和影响。如介绍一些知名的黑客攻击事件,分析事件发生的原因和防范措施,让用户从中吸取教训。
通过以上对Linux系统安全各个方面的介绍,我们可以看到,保障Linux系统安全是一个综合性的工作,需要从多个层面进行考虑和实施。从账户密码设置、文件系统安全管理、软件和服务更新,到系统监控、安全策略制定和用户安全意识培训,每个环节都至关重要。只有全面地做好这些工作,才能构建一个安全可靠的Linux系统,有效抵御各种潜在的安全威胁。
超级会员免费看
3267

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



