深入探索Linux安全技术:PAM与SELinux的应用
1. Linux安全限制设置
在Linux系统中,限制设置是针对每次登录进行的,并且仅在登录会话期间有效。恶意用户可能会多次登录以创建fork炸弹,因此为用户账户设置最大登录次数是个不错的主意。
限制最大登录次数可能需要针对每个用户进行设置。例如,如果用户
johndoe
只需要登录Linux系统一次,为防止他人使用他的账户,可以将其账户的最大登录次数设置为1:
johndoe hard maxlogins 1
要覆盖
limits.conf
文件中的任何设置,可以将名为
*.conf
的文件添加到
/etc/security/limits.d
目录中。这是一种方便的方法,可以通过RPM文件或其他方式添加和删除限制,而无需直接编辑
limits.conf
文件。
限制此资源的最后一步是确保使用
limits.conf
的PAM模块包含在某个PAM系统事件配置文件中。使用
limits.conf
的PAM模块是
pam_limits
。可以使用以下命令验证该PAM模块是否在系统事件配置文件中使用:
# grep "pam_limits" /etc/pam.d/*
/etc/pam.d/fingerprint-auth:session required pam_limits.so
/etc/pam.d/password-auth:session required pam_limits.so
/etc/pam.d/runuser:session required pam_limits.so
/etc/pam.d/system-auth:session required pam_limits.so
2. PAM实现时间限制
PAM可以使整个Linux系统按照“PAM时间”运行。诸如在一天中的特定时间访问特定应用程序,或仅在一周的指定日期允许登录等时间限制,都由PAM处理。
处理这些限制的PAM配置文件位于
/etc/security
目录中。以下是记录详细的
/etc/security/time.conf
PAM配置文件示例:
$ cat /etc/security/time.conf
# this is an example configuration file for the pam_time module. Its
syntax
# was initially based heavily on that of the shadow package
(shadow-960129).
#
# the syntax of the lines is as follows:
#
# services;ttys;users;times
每个有效条目的格式遵循以下语法:
services;ttys;users;times
,字段之间用分号分隔。有效字段值在
time.conf
配置文件中有详细记录。
例如,如果你决定普通用户只能在工作日(周一至周五)的终端上登录,并且可以在这些工作日的早上7点到晚上7点登录,需要设置的元素如下:
-
services
:Login
-
ttys
:
*
,表示包含所有终端
-
users
:除root之外的所有人(
!root
)
-
times
:工作日(Wd)从早上7点(0700)到晚上7点(1900)
time.conf
中的条目如下所示:
login; * ; !root ; Wd0700-1900
实现此时间限制的最后一步是确保使用
time.conf
的PAM模块包含在某个PAM系统事件配置文件中。使用
time.conf
的PAM模块是
pam_time
。可以使用以下命令检查:
# grep "pam_time" /etc/pam.d/*
config-util:auth sufficient pam_timestamp.so
config-util:session optional pam_timestamp.so
由于未列出
pam_time
,因此必须修改
/etc/pam.d/system-auth
文件,以便PAM强制执行时间限制。在配置文件的“account”部分顶部附近添加以下内容:
account required pam_time.so
注意,在Ubuntu系统上,需要修改
/etc/pam.d/common-auth
文件,而不是
system-auth
配置文件。
3. PAM强制执行强密码
当修改密码时,PAM模块
pam_cracklib
会参与其中。该模块会提示用户输入密码,并根据系统字典和一组规则检查密码的强度,以识别不良选择。
在Fedora和RHEL系统上,
pam_cracklib
模块默认安装;而在Ubuntu Linux系统上,默认未安装。要在Ubuntu上使用该模块,可以使用以下命令进行安装:
sudo apt-get install libpam-cracklib
使用
pam_cracklib
可以检查新选择的密码是否符合以下条件:
- 是否为字典中的单词?
- 是否为回文?
- 是否是旧密码仅改变大小写?
- 是否与旧密码过于相似?
- 是否太短?
- 是否是旧密码的旋转版本?
- 是否使用了相同的连续字符?
- 是否以某种形式包含用户名?
可以通过修改
/etc/pam.d/system-auth
文件来更改
pam_cracklib
检查新密码的规则。虽然可能认为应该在支持PAM的
passwd
配置文件中进行更改,但
/etc/pam.d/passwd
文件在其堆栈中包含了
system-auth
文件。
当前
system-auth
文件的设置如下:
# cat /etc/pam.d/system-auth
#%PAM-1.0
# Generated by authselect on Mon Oct 21 19:24:36 2019
# Do not modify this file manually.
auth required pam_env.so
auth required pam_faildelay.so delay=2000000
auth sufficient pam_fprintd.so
...
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so
auth sufficient pam_sss.so forward_pass
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account [default=bad success=ok user_unknown=ignore] pam_sss.so
account required pam_permit.so
password requisite pam_cracklib.so try_first_pass retry=3
...
pam_cracklib
条目中使用了
retry
关键字,以下是
cracklib
可用的关键字:
| 关键字 | 说明 |
| — | — |
|
debug
| 使模块将信息写入系统日志 |
|
authtok_type=XXX
| 默认使用“New UNIX password:”和“Retype UNIX password:”来请求密码,将
XXX
替换为其他单词可替代“UNIX” |
|
retry=N
| 默认值为1,最多提示用户N次,然后返回错误 |
|
difok=N
| 默认值为5,新密码中必须与旧密码不同的字符数 |
|
difignore=N
| 默认值为23,密码达到该字符数后,
difok
设置将被忽略 |
|
minlen=N
| 默认值为9,新密码的最小可接受长度 |
|
dcredit=N
| 默认值为1,若
N >= 0
,表示新密码中数字的最大信用值;若
N < 0
,表示新密码必须包含的最小数字数 |
|
ucredit=N
| 默认值为1,若
N >= 0
,表示新密码中大写字母的最大信用值;若
N < 0
,表示新密码必须包含的最小大写字母数 |
|
lcredit=N
| 默认值为1,若
N >= 0
,表示新密码中小写字母的最大信用值;若
N < 0
,表示新密码必须包含的最小小写字母数 |
|
ocredit=N
| 默认值为1,若
N >= 0
,表示新密码中其他字符的最大信用值;若
N < 0
,表示新密码必须包含的最小其他字符数 |
|
minclass=N
| 默认值为0,新密码需要包含的四类字符(数字、大写字母、小写字母和其他字符)中的N类 |
|
maxrepeat=N
| 默认值为0,拒绝包含超过N个相同连续字符的密码 |
|
reject_username
| 检查新密码是否包含用户的正序或逆序名称,若包含则拒绝新密码 |
|
try_first_pass
| 尝试从前一个PAM模块获取密码,若失败则提示用户输入密码 |
|
use_authtok
| 强制模块不提示用户输入新密码,新密码由之前堆叠的密码模块提供 |
|
dictpath=/path
| cracklib字典的路径 |
|
maxsequence=N
| 默认值为0(表示此检查禁用),设置为非0值时,拒绝包含超过该长度单调字符的密码 |
|
maxclassrepeat=N
| 默认值为0(表示此检查禁用),设置为非0值时,拒绝包含超过该长度同一类连续字符的密码 |
|
gecoscheck=N
| 拒绝包含用户GECOS字段中超过三个连续字符的密码 |
|
enforce_for_root=N
| 默认值为0(表示此检查禁用),设置为非0值时,拒绝包含超过该长度同一类连续字符的密码 |
|
enforce_for_root
| 对root用户强制执行密码检查失败规则,默认关闭 |
例如,如果组织要求密码长度为10个字符,并且必须包含两个数字,可以在
/etc/pam.d/system-auth
文件中添加以下类似行:
password required pam_cracklib.so minlen=10 dcredit=-2
此示例中
pam_cracklib
使用的关键字如下:
-
minlen=10
:新密码必须至少为10个字符。
-
dcredit=-2
:新密码必须包含两个数字。
注意,
pam_cracklib
的限制默认不适用于root用户,除非应用
enforce_for_root
选项。
4. PAM鼓励使用sudo
为了允许系统跟踪个人对root账户的使用,并避免出现抵赖情况,可以限制
su
命令的使用,鼓励使用
sudo
。如果组织有这样的策略,可以通过PAM在几个步骤内实现。
su
命令支持PAM,这大大简化了操作。它使用PAM模块
pam_wheel
来检查用户是否属于
wheel
组。
/etc/pam.d/su
配置文件如下:
# cat /etc/pam.d/su
#%PAM-1.0
auth required pam_rootok.so
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users
# in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be
# in the "wheel" group.
#auth required pam_wheel.so use_uid
auth substack system-auth
auth include postlogin
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session include system-auth
session include postlogin
session optional pam_xauth.so
首先,为了限制
su
命令的使用,如果使用
wheel
组作为管理组,需要将管理组重新分配到一个新组;如果不使用
wheel
组,只需确保将来不向该组分配任何人。
接下来,需要编辑
/etc/pam.d/su
配置文件,移除以下行的注释符号
#
:
#auth required pam_wheel.so use_uid
通过这些修改,PAM将禁用
su
命令的使用。管理用户现在必须使用
sudo
,系统会跟踪该命令的使用,并提供所需的不可抵赖环境。
5. 获取PAM的更多信息
PAM是Linux系统上一个丰富且通用的安全工具。可以在Linux系统的手册页中了解如何管理PAM配置文件以及
/usr/lib64/security
(64位)目录中的模块。
- 要获取有关PAM配置文件的更多信息,可以使用命令
man pam.conf
。
- 可以在命令行中输入
ls /usr/lib64/security/pam*.so
查看系统上所有可用的PAM模块。要获取每个PAM模块的更多信息,输入
man pam_module_name
(注意去掉
pam_module_name
的文件扩展名
.so
)。例如,输入
man pam_lastlog
以了解
pam_lastlog.so
模块的更多信息。
此外,以下网站可以提供有关PAM的更多信息:
- 官方Linux - PAM网站:http://linux-pam.org
- Linux - PAM系统管理员指南:http://linux-pam.org/Linux-PAM-html/Linux-PAM_SAG.html
- PAM模块参考:http://linux-pam.org/Linux-PAM-html/sag-module-reference.html
6. SELinux简介
Security Enhanced Linux(SELinux)由美国国家安全局(NSA)与其他安全研究组织(如Secure Computing Corporation)共同开发。它于2000年发布到开源社区,当Red Hat将其包含在Linux发行版中后变得流行起来。现在,SELinux被许多组织使用,并且广泛可用。
SELinux是部署在Linux之上的安全增强模块,它提供了额外的安全措施,在Red Hat Enterprise Linux(RHEL)和Fedora中默认包含并设置为强制模式。
SELinux通过基于角色的访问控制(RBAC)对主体和对象(即进程和资源)提供了改进的Linux系统安全性。而“传统”的Linux安全使用的是自主访问控制(DAC)。
在DAC中,进程可以访问任何开放访问的文件、目录、设备或其他资源。而在RBAC中,进程只能访问其被明确允许访问的资源,这基于分配的角色。SELinux实现RBAC的方式是为进程分配一个SELinux策略,该策略限制访问如下:
- 仅允许进程访问带有明确标签的资源。
- 使潜在不安全的功能(如对目录的写访问)作为布尔值可用,可以打开或关闭。
例如,一个包含SELinux策略的服务(如Web服务器)在安装时,通常会在特定的目录和文件上设置SELinux标签。这使得运行的服务器进程只能从特定目录读写文件。如果需要更改这种访问权限,则需要在希望进程访问的文件和目录上添加正确的SELinux标签。
SELinux不是DAC的替代品,而是一个额外的安全层:
- 使用SELinux时,仍然会使用DAC规则。
- 首先检查DAC规则,如果允许访问,则再检查SELinux策略。
- 如果DAC规则拒绝访问,则不会审查SELinux策略。
例如,如果用户尝试执行一个没有执行权限(
rw-
)的文件,“传统”的Linux DAC控制会拒绝访问,因此SELinux策略甚至不会被检查。
注意,SELinux是Red Hat发行版的默认安全增强功能,而AppArmor是Ubuntu的默认安全增强功能。可以在Ubuntu上使用命令
sudo apt-get install selinux
安装SELinux,然后重启系统。但截至目前,Ubuntu的SELinux维基页面建议不要使用Ubuntu的SELinux软件包(https://wiki.ubuntu.com/SELinux)。如果想了解更多关于AppArmor的信息,可以访问https://help.ubuntu.com/community/AppArmor。
7. SELinux的好处
尽管“传统”的Linux安全控制仍然有效,但使用SELinux有几个好处:
-
实现RBAC访问控制模型
:这被认为是最强的访问控制模型。
-
使用最小权限访问
:每个主体(如用户和进程)只被授予完成其任务所需的有限权限。通过实施最小权限,用户或进程对对象造成意外(或故意)损害的可能性受到限制。
-
允许进程沙箱化
:每个进程在自己的区域(沙箱)中运行,除非获得特殊权限,否则无法访问其他进程或其文件。这些进程运行的区域称为“域”。
-
允许在实施前测试功能
:SELinux有一个宽容模式,允许查看在系统上强制执行SELinux的效果。在宽容模式下,SELinux仍然会记录它认为的安全漏洞(称为AVC拒绝),但不会阻止它们。
另一种看待SELinux好处的方式是检查如果SELinux不在Linux系统上运行会发生什么。例如,以Web服务器为例,如果没有SELinux,服务器进程可能会不受限制地访问系统资源,从而增加安全风险。
以下是SELinux与DAC的访问控制流程对比的mermaid流程图:
graph LR
A[用户请求访问资源] --> B{DAC规则检查}
B -- 允许 --> C{SELinux策略检查}
B -- 拒绝 --> D[访问被拒绝]
C -- 允许 --> E[访问资源]
C -- 拒绝 --> D
通过上述对PAM和SELinux的介绍,我们可以看到它们在Linux系统安全中发挥着重要作用。PAM可以帮助我们设置各种安全策略,如时间限制、强密码要求等;而SELinux则提供了更高级的安全增强功能,通过RBAC和最小权限原则保护系统资源。在实际应用中,我们应该根据系统的安全需求合理配置和使用这些工具。
深入探索Linux安全技术:PAM与SELinux的应用
8. SELinux的工作原理
SELinux通过为系统中的进程和资源分配安全上下文(标签)来实现基于角色的访问控制(RBAC)。这些安全上下文包含了主体(进程)和客体(资源)的角色、类型和级别信息。当一个进程尝试访问一个资源时,SELinux会根据这些安全上下文和预定义的策略来决定是否允许访问。
SELinux策略定义了主体和客体之间的访问规则。这些策略可以是全局的,也可以是针对特定服务或应用程序的。例如,一个Web服务器进程可能被分配了一个特定的SELinux类型,并且只能访问具有相应类型标签的文件和目录。
以下是SELinux工作的基本流程:
1.
进程启动
:当一个进程启动时,SELinux会为其分配一个安全上下文。
2.
访问请求
:进程尝试访问一个资源,如文件、网络端口等。
3.
上下文检查
:SELinux检查进程和资源的安全上下文。
4.
策略评估
:根据SELinux策略,评估是否允许进程访问该资源。
5.
决策执行
:如果策略允许访问,则进程可以访问资源;否则,访问被拒绝。
可以用以下mermaid流程图来表示:
graph LR
A[进程启动] --> B[分配安全上下文]
B --> C[进程尝试访问资源]
C --> D{检查进程和资源上下文}
D -- 匹配 --> E{评估SELinux策略}
D -- 不匹配 --> F[访问被拒绝]
E -- 允许 --> G[进程访问资源]
E -- 拒绝 --> F
9. SELinux的设置
在Red Hat Enterprise Linux(RHEL)和Fedora等系统中,SELinux默认是启用的,并且设置为强制模式。可以通过以下命令检查SELinux的状态:
sestatus
输出结果会显示SELinux的当前状态,如
enforcing
(强制模式)、
permissive
(宽容模式)或
disabled
(禁用)。
如果需要更改SELinux的模式,可以编辑
/etc/selinux/config
文件。例如,将SELinux设置为宽容模式:
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
修改完成后,需要重启系统使更改生效。
也可以在不重启系统的情况下临时更改SELinux的模式:
# 设置为宽容模式
setenforce 0
# 设置为强制模式
setenforce 1
10. 解决SELinux问题
在使用SELinux时,可能会遇到一些问题,如进程无法访问资源等。当SELinux拒绝访问时,会在系统日志(如
/var/log/audit/audit.log
)中记录相关信息。可以使用
ausearch
和
sealert
工具来分析这些日志。
例如,使用
ausearch
查找最近的SELinux拒绝访问记录:
ausearch -m avc -ts recent
使用
sealert
工具将这些记录转换为更易读的格式:
sealert -a /var/log/audit/audit.log
sealert
会提供详细的错误信息和可能的解决方案。常见的解决方案包括:
-
调整SELinux策略
:可以使用
seboolean
命令调整SELinux的布尔值,以允许或禁止某些功能。例如,允许HTTP服务器访问用户主目录:
setsebool -P httpd_enable_homedirs on
-P
选项表示永久保存更改。
-
重新标记文件和目录
:如果文件或目录的SELinux标签不正确,可以使用
chcon
或
restorecon
命令重新标记。例如,使用
restorecon
恢复文件的默认标签:
restorecon -Rv /path/to/directory
-R
表示递归处理,
-v
表示显示详细信息。
11. 获取SELinux的更多信息
可以通过以下方式获取SELinux的更多信息:
-
手册页
:使用
man
命令查看SELinux相关命令和配置文件的手册页,如
man sestatus
、
man setenforce
等。
-
官方文档
:Red Hat提供了详细的SELinux文档,可以在其官方网站上查找。
-
社区论坛
:参与Linux社区论坛,与其他用户交流SELinux的使用经验和解决问题的方法。
12. 总结
本文介绍了Linux系统中两个重要的安全技术:PAM和SELinux。
PAM(可插拔认证模块)是一个强大的工具,用于管理用户认证和授权。通过PAM,可以实现多种安全策略,如限制用户登录时间、强制执行强密码、鼓励使用
sudo
等。以下是PAM实现的主要安全策略总结:
| 安全策略 | 实现方法 |
| — | — |
| 登录时间限制 | 修改
/etc/security/time.conf
文件,并在PAM配置文件中添加
pam_time.so
模块 |
| 强密码要求 | 修改
/etc/pam.d/system-auth
文件,使用
pam_cracklib.so
模块设置密码规则 |
| 限制
su
使用 | 编辑
/etc/pam.d/su
配置文件,启用
pam_wheel.so
模块 |
SELinux(安全增强型Linux)是一个基于角色的访问控制(RBAC)系统,为Linux系统提供了额外的安全层。SELinux通过为进程和资源分配安全上下文,并根据预定义的策略来控制访问。它具有实现RBAC模型、最小权限访问、进程沙箱化和可测试性等优点。在使用SELinux时,需要注意其工作原理、设置方法和解决问题的技巧。
在实际应用中,应该根据系统的安全需求合理配置和使用PAM和SELinux。同时,在进行任何安全设置更改之前,建议在测试环境中进行充分测试,以确保不会对系统的正常运行造成影响。
13. 练习
以下是一些练习,用于测试对PAM和SELinux的掌握程度:
1.
PAM相关
- 使用
gpg2
实用程序和对称密钥加密一个文件。
- 生成一个公钥环,并列出该公钥环。
- 加密一个文件并添加数字签名。
- 验证下载的Fedora镜像的完整性。
- 确定
su
命令是否支持PAM,并查看其PAM配置文件。
- 列出系统上的各种PAM模块。
- 查找系统上的PAM“other”配置文件,并检查是否强制执行隐式拒绝。
- 查找PAM限制配置文件,并检查是否有防止fork炸弹的设置。
2.
SELinux相关
- 检查SELinux的当前状态。
- 将SELinux模式从强制模式切换到宽容模式。
- 模拟一个SELinux拒绝访问的情况,并使用
ausearch
和
sealert
工具分析日志。
- 调整SELinux布尔值,允许HTTP服务器访问用户主目录。
- 重新标记一个目录及其子目录的SELinux标签。
通过完成这些练习,可以加深对PAM和SELinux的理解和应用能力,提高Linux系统的安全性。
超级会员免费看

29

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



