71、深入探索Linux安全技术:PAM与SELinux的应用

深入探索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系统的安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值