-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
295 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
PAM(Pluggable Authentication Modules)即可插拔认证模块,是一种在 Linux 及其他类 Unix 系统中广泛使用的认证机制,它提供了一种灵活且可扩展的方式来处理用户认证、账户管理、会话管理和密码更改等任务。以下将从多个方面详细介绍 Linux 的 PAM 机制。 | ||
|
||
### 1. 核心概念 | ||
PAM 的核心思想是将认证过程模块化,允许系统管理员根据不同的服务(如 SSH、登录、FTP 等)需求,灵活组合和配置不同的认证模块。这种模块化设计使得系统在认证方面具有很高的灵活性和可扩展性,能够轻松适应各种复杂的认证需求。 | ||
|
||
### 2. 主要组件 | ||
- **应用程序(服务)**:是发起认证请求的主体,例如 SSH 服务、登录程序等。这些应用程序通过调用 PAM 提供的 API 来触发认证过程。 | ||
- **PAM 库**:作为应用程序和 PAM 模块之间的桥梁,负责加载和管理 PAM 模块,解析 PAM 配置文件,并根据配置文件的要求依次调用相应的 PAM 模块。 | ||
- **PAM 模块**:是实现具体认证功能的组件,以共享库(`.so` 文件)的形式存在。每个 PAM 模块负责完成特定的认证任务,如验证用户密码、检查账户有效性等。 | ||
- **PAM 配置文件**:存放在 `/etc/pam.d` 目录下,文件名通常与对应的服务名称一致。配置文件定义了针对某个服务应该使用哪些 PAM 模块以及这些模块的调用顺序和行为。 | ||
|
||
### 3. PAM 模块类型 | ||
PAM 模块根据其功能可以分为以下几种类型: | ||
- **认证(auth)模块**:用于验证用户的身份,常见的操作是验证用户输入的用户名和密码。例如,`pam_unix.so` 模块可以验证基于 Unix 系统的用户密码。 | ||
- **账户(account)模块**:用于检查用户账户的有效性,如账户是否过期、是否被锁定等。例如,`pam_nologin.so` 模块可以阻止用户在系统不允许登录时进行登录操作。 | ||
- **会话(session)模块**:负责管理用户会话的创建和销毁,例如在用户登录时挂载文件系统、在用户退出时清理临时文件等。`pam_limits.so` 模块可以在用户会话开始时应用系统的资源限制。 | ||
- **密码(password)模块**:用于处理用户密码的更改,例如验证新密码的强度、更新密码存储等。`pam_cracklib.so` 模块可以检查新密码的复杂性。 | ||
|
||
### 4. PAM 配置文件格式 | ||
PAM 配置文件由多行配置项组成,每行配置项包含四个字段,格式如下: | ||
```plaintext | ||
<type> <control_flag> <module_path> <module_arguments> | ||
``` | ||
- **`<type>`**:指定 PAM 模块的功能类型,即上述的 `auth`、`account`、`session` 或 `password`。 | ||
- **`<control_flag>`**:决定了 PAM 模块的执行结果如何影响整个认证流程,常见的控制标志有: | ||
- **`required`**:该模块必须成功执行,认证流程才能继续进行。如果该模块执行失败,会记录错误信息,但不会立即终止认证流程,直到所有相关模块都执行完毕后才会返回失败结果。 | ||
- **`requisite`**:与 `required` 类似,但如果该模块执行失败,会立即终止认证流程并返回失败结果。 | ||
- **`sufficient`**:如果该模块执行成功,且之前没有 `required` 类型的模块失败,那么认证流程将立即返回成功结果,不再执行后续的相关模块。 | ||
- **`optional`**:该模块的执行结果对认证流程没有直接影响,无论执行成功还是失败,认证流程都会继续进行。 | ||
- **`include`**:用于引用另一个 PAM 配置文件,将该文件中的配置项插入到当前位置。 | ||
- **`<module_path>`**:指定要使用的 PAM 模块的路径,通常是 `/lib/security` 或 `/lib/x86_64-linux-gnu/security` 目录下的共享库文件。 | ||
- **`<module_arguments>`**:为 PAM 模块提供额外的参数,用于定制模块的行为。不同的 PAM 模块支持不同的参数,具体参数可以参考相应模块的文档。 | ||
|
||
### 5. PAM 工作流程 | ||
当一个服务(如 SSH)需要进行用户认证时,其工作流程如下: | ||
1. **服务调用 PAM API**:服务程序调用 PAM 提供的 API 函数(如 `pam_start`)来初始化 PAM 会话。 | ||
2. **查找并解析配置文件**:PAM 库根据服务名称查找对应的 PAM 配置文件,并解析其中的配置项。 | ||
3. **加载和执行 PAM 模块**:按照配置文件中指定的顺序,依次加载并执行相应的 PAM 模块。每个模块执行完成后,会返回一个结果代码给 PAM 库。 | ||
4. **处理模块结果**:PAM 库根据模块的返回结果和控制标志决定后续的处理流程,可能会继续执行下一个模块,或者立即终止认证流程并返回结果。 | ||
5. **反馈结果给服务**:当所有 PAM 模块都执行完毕后,PAM 库将最终的认证结果反馈给调用它的服务程序。 | ||
6. **结束 PAM 会话**:服务程序调用 `pam_end` 函数结束 PAM 会话,PAM 库进行相应的清理工作。 | ||
|
||
### 6. 优点 | ||
- **灵活性**:系统管理员可以根据不同的服务需求,灵活选择和配置不同的 PAM 模块,实现多样化的认证策略。 | ||
- **可扩展性**:可以轻松添加新的 PAM 模块来实现自定义的认证功能,满足特殊的安全需求。 | ||
- **集中管理**:通过 PAM 配置文件,可以集中管理系统中各个服务的认证和账户管理策略,提高管理效率。 | ||
|
||
### 7. 常见应用场景 | ||
- **用户登录认证**:在用户通过控制台、SSH 等方式登录系统时,使用 PAM 模块验证用户的身份和账户有效性。 | ||
- **服务访问控制**:对于一些需要认证的服务(如 FTP、SMTP 等),使用 PAM 模块控制用户的访问权限。 | ||
- **密码管理**:使用 PAM 模块来管理用户密码的更改,确保密码的强度和安全性。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
在 Linux 系统中,`/etc/security` 目录主要用于存放与系统安全策略、用户认证和资源限制相关的配置文件。下面详细介绍该目录下一些常见文件及其作用: | ||
|
||
### 1. `limits.conf` | ||
- **功能**:该文件用于设置用户或用户组的资源使用限制,比如进程可以打开的最大文件描述符数量、CPU 时间限制、内存使用限制等。这些限制可以是软限制(`soft`)和硬限制(`hard`),软限制可以被用户进程在运行时修改,但不能超过硬限制。 | ||
- **配置示例**: | ||
```plaintext | ||
# 为所有用户设置最大打开文件数的软限制和硬限制 | ||
* soft nofile 65536 | ||
* hard nofile 65536 | ||
# 为用户组 staff 设置最大进程数的软限制和硬限制 | ||
@staff soft nproc 2048 | ||
@staff hard nproc 4096 | ||
``` | ||
在上述示例中,`*` 表示所有用户,`@staff` 表示 `staff` 用户组,`nofile` 表示最大打开文件数,`nproc` 表示最大进程数。 | ||
|
||
### 2. `pam_env.conf` | ||
- **功能**:此文件用于配置 PAM(Pluggable Authentication Modules)环境模块,它允许系统管理员为用户登录会话设置环境变量。当用户登录系统时,PAM 会根据该文件的配置为用户的会话添加或修改环境变量。 | ||
- **配置示例**: | ||
```plaintext | ||
# 设置默认的编辑器为 vim | ||
DEFAULTENV DEFAULT=EDITOR=/usr/bin/vim | ||
# 为所有用户设置语言环境 | ||
ENV LANG=en_US.UTF-8 | ||
``` | ||
|
||
### 3. `namespace.conf` | ||
- **功能**:该文件用于配置 Linux 命名空间(namespace)相关的安全策略。命名空间是 Linux 内核提供的一种隔离机制,用于隔离进程的资源,如进程 ID、网络、挂载点等。`namespace.conf` 文件可以控制哪些用户或用户组可以使用特定的命名空间。 | ||
- **配置示例**: | ||
```plaintext | ||
# 允许 root 用户使用所有命名空间 | ||
root /proc/self/ns/* rw | ||
# 允许 users 用户组使用网络命名空间 | ||
@users /proc/self/ns/net r | ||
``` | ||
|
||
### 4. `access.conf` | ||
- **功能**:用于控制哪些用户或用户组可以通过哪些终端设备登录系统。通过配置该文件,可以限制特定用户或用户组只能从指定的终端设备登录,增强系统的安全性。 | ||
- **配置示例**: | ||
```plaintext | ||
# 允许所有用户从本地终端登录 | ||
+ : ALL : LOCAL | ||
# 只允许 users 用户组从特定 IP 地址的远程终端登录 | ||
+ : @users : 192.168.1.0/24 | ||
# 禁止所有其他用户从远程终端登录 | ||
- : ALL : ALL EXCEPT LOCAL | ||
``` | ||
|
||
### 5. `pwquality.conf` | ||
- **功能**:该文件用于配置密码质量检查模块(如 `pam_pwquality.so`)的参数,用于强制用户设置符合一定复杂度要求的密码,提高系统的安全性。 | ||
- **配置示例**: | ||
```plaintext | ||
# 密码最小长度为 8 | ||
minlen = 8 | ||
# 密码中至少包含 1 个数字 | ||
dcredit = -1 | ||
# 密码中至少包含 1 个大写字母 | ||
ucredit = -1 | ||
``` | ||
|
||
### 6. `time.conf` | ||
- **功能**:用于限制用户在特定时间段内登录系统。通过配置该文件,可以设置用户或用户组只能在指定的时间范围内登录,增强系统的安全性和资源管理。 | ||
- **配置示例**: | ||
```plaintext | ||
# 允许 users 用户组在工作日的 09:00 - 17:00 登录 | ||
@users; tty*; Al0900-1700 | ||
# 禁止所有用户在周末登录 | ||
ALL; tty*; Sa-Su0000-2400 | ||
``` | ||
|
||
这些文件共同构成了 Linux 系统的安全策略框架,通过合理配置这些文件,可以有效地管理用户的资源使用、认证和访问权限,提高系统的安全性和稳定性。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
Java Flight Recorder(JFR)是Java虚拟机(JVM)内置的性能分析工具,用于收集和分析Java应用程序的运行时数据。JFR能够以极低的性能开销记录应用程序的运行状态,帮助开发者和运维人员诊断性能问题、内存泄漏、线程争用等。 | ||
|
||
### 1. JFR 的核心概念 | ||
|
||
- **事件(Event)**:JFR 通过记录各种事件来捕获应用程序的运行状态。事件可以是方法调用、垃圾回收、线程状态、锁争用等。 | ||
- **记录(Recording)**:JFR 将事件存储在记录中,记录可以保存到文件中供后续分析。 | ||
- **配置(Configuration)**:JFR 提供了多种预定义的配置,用于控制记录哪些事件以及记录的详细程度。用户也可以自定义配置。 | ||
|
||
### 2. JFR 的使用场景 | ||
|
||
- **性能分析**:通过记录方法调用、CPU 使用率、内存分配等事件,分析应用程序的性能瓶颈。 | ||
- **内存分析**:记录垃圾回收事件、对象分配事件,帮助诊断内存泄漏和内存使用问题。 | ||
- **线程分析**:记录线程状态、锁争用事件,分析线程阻塞和死锁问题。 | ||
- **I/O 分析**:记录文件 I/O、网络 I/O 事件,分析 I/O 性能问题。 | ||
|
||
### 3. JFR 的启用方式 | ||
|
||
JFR 可以通过命令行参数、JMX API 或 JDK 工具(如 `jcmd`)启用。 | ||
|
||
#### 3.1 命令行参数 | ||
|
||
在启动 Java 应用程序时,可以通过以下命令行参数启用 JFR: | ||
|
||
```bash | ||
java -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr -jar myapp.jar | ||
``` | ||
|
||
- `-XX:+FlightRecorder`:启用 JFR。 | ||
- `-XX:StartFlightRecording`:启动一个记录,指定记录的持续时间(`duration`)和输出文件(`filename`)。 | ||
|
||
#### 3.2 使用 `jcmd` 工具 | ||
|
||
`jcmd` 是 JDK 提供的一个命令行工具,可以用于动态控制 JFR。 | ||
|
||
```bash | ||
jcmd <pid> JFR.start duration=60s filename=myrecording.jfr | ||
jcmd <pid> JFR.dump filename=myrecording.jfr | ||
jcmd <pid> JFR.stop | ||
``` | ||
|
||
- `JFR.start`:启动一个记录。 | ||
- `JFR.dump`:将当前记录保存到文件。 | ||
- `JFR.stop`:停止记录。 | ||
|
||
#### 3.3 使用 JMX API | ||
|
||
通过 JMX API,可以在运行时动态控制 JFR。以下是一个简单的示例: | ||
|
||
```java | ||
import javax.management.MBeanServerConnection; | ||
import javax.management.ObjectName; | ||
import javax.management.remote.JMXConnector; | ||
import javax.management.remote.JMXConnectorFactory; | ||
import javax.management.remote.JMXServiceURL; | ||
|
||
public class JFRControl { | ||
public static void main(String[] args) throws Exception { | ||
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:12345/jmxrmi"); | ||
JMXConnector connector = JMXConnectorFactory.connect(url); | ||
MBeanServerConnection connection = connector.getMBeanServerConnection(); | ||
|
||
ObjectName jfr = new ObjectName("com.sun.management:type=FlightRecorder"); | ||
connection.invoke(jfr, "startRecording", new Object[]{null}, new String[]{String.class.getName()}); | ||
Thread.sleep(60000); // 记录 60 秒 | ||
connection.invoke(jfr, "stopRecording", new Object[]{}, new String[]{}); | ||
} | ||
} | ||
``` | ||
|
||
### 4. JFR 的分析工具 | ||
|
||
JFR 记录的文件可以使用 JDK 自带的 `jfr` 工具或第三方工具进行分析。 | ||
|
||
#### 4.1 使用 JDK Mission Control (JMC) | ||
|
||
JDK Mission Control 是 Oracle 提供的一个图形化工具,用于分析 JFR 记录文件。JMC 提供了丰富的视图和图表,帮助用户分析性能问题。 | ||
|
||
#### 4.2 使用 `jfr` 命令行工具 | ||
|
||
JDK 提供了 `jfr` 命令行工具,可以用于解析和分析 JFR 记录文件。 | ||
|
||
```bash | ||
jfr print myrecording.jfr | ||
``` | ||
|
||
`jfr` 工具可以将记录文件中的事件打印到控制台,方便用户查看。 | ||
|
||
### 5. JFR 的配置 | ||
|
||
JFR 提供了多种预定义的配置,用户也可以自定义配置。配置文件是一个 XML 文件,定义了要记录的事件及其详细程度。 | ||
|
||
#### 5.1 预定义配置 | ||
|
||
JFR 提供了以下几种预定义配置: | ||
|
||
- `default`:默认配置,记录大多数事件。 | ||
- `profile`:性能分析配置,记录更多的方法调用和 CPU 使用事件。 | ||
- `debug`:调试配置,记录所有事件,详细程度最高。 | ||
|
||
#### 5.2 自定义配置 | ||
|
||
用户可以通过编辑 XML 文件自定义 JFR 配置。以下是一个简单的自定义配置示例: | ||
|
||
```xml | ||
<configuration version="2.0"> | ||
<event name="jdk.CPULoad"> | ||
<setting name="enabled">true</setting> | ||
<setting name="threshold">10 ms</setting> | ||
</event> | ||
<event name="jdk.GarbageCollection"> | ||
<setting name="enabled">true</setting> | ||
</event> | ||
</configuration> | ||
``` | ||
|
||
### 6. JFR 的性能开销 | ||
|
||
JFR 的设计目标是以极低的性能开销记录事件。通常情况下,JFR 的性能开销在 1% 以下,适合在生产环境中使用。 | ||
|
||
### 7. JFR 的限制 | ||
|
||
- **事件丢失**:在高负载情况下,JFR 可能会丢失部分事件。 | ||
- **存储空间**:长时间记录可能会生成较大的文件,需要足够的存储空间。 | ||
|
||
### 8. 总结 | ||
|
||
Java Flight Recorder 是一个强大的性能分析工具,能够以极低的性能开销记录 Java 应用程序的运行时数据。通过 JFR,开发者和运维人员可以快速诊断性能问题、内存泄漏、线程争用等问题。JFR 的记录文件可以使用 JDK Mission Control 或 `jfr` 命令行工具进行分析,帮助用户深入了解应用程序的运行状态。 |