Skip to content

Commit

Permalink
1
Browse files Browse the repository at this point in the history
  • Loading branch information
YiRanCN committed Feb 7, 2025
1 parent 4591a73 commit a055dab
Show file tree
Hide file tree
Showing 6 changed files with 295 additions and 4 deletions.
51 changes: 51 additions & 0 deletions docs/study/devops/Linux运维-PAM.md
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 模块来管理用户密码的更改,确保密码的强度和安全性。
78 changes: 78 additions & 0 deletions docs/study/devops/Linux运维-etc-security.md
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 系统的安全策略框架,通过合理配置这些文件,可以有效地管理用户的资源使用、认证和访问权限,提高系统的安全性和稳定性。
4 changes: 2 additions & 2 deletions docs/study/devops/Linux运维-常用.md
Original file line number Diff line number Diff line change
Expand Up @@ -292,8 +292,8 @@ vi /etc/security/limits.d/20-nproc.conf
echo "fs.file-max=6553500" >> /etc/sysctl.conf
# 改完之后 重新打开shell(重新登录)
ulimit -a
# 在麒麟V10存在修改后不生效的兼容问题
# 可以将*改成指定的用户
# 在麒麟V10存在修改后不生效的问题
# 原因是sshd没有开启PAM,修改参数UsePAM为yes即可
##############################################################################################

```
Expand Down
10 changes: 9 additions & 1 deletion docs/study/devops/ssh.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,12 @@ send \"$remote_command\r\";
expect \"$\";
send \"exit\r\";
"
```
```

### UsePAM

如果不开启此参数,会导致不会执行/etc/pam.d/sshd的逻辑,而sshd里面有对`session include password-auth`的处理;

password-auth又有对`session required pam_limits.so`的处理;

pam_limits.so用于处理`/etc/security/limits.conf`文件的生效;
29 changes: 28 additions & 1 deletion docs/study/program/JAVA/JDK17-bin.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,30 @@ javap -private -classpath etcdwrapper-2.6.4.2-SNAPSHOT.jar com.sansec.ccsp.Servi
```
### jcmd

```shell
# 列出所有 Java 进程
# 如果查询不到,可能是ll /tmp/hsperfdata_ccsp下的临时文件被删除了
jcmd -l
# 查看命令帮助信息 有很多
jcmd <pid> help
# 生成堆转储文件 可以使用Java Visual VM分析
jcmd <pid> GC.heap_dump <filename>
jcmd 1234 GC.heap_dump /path/to/heapdump.hprof
# 执行垃圾回收
jcmd <pid> GC.run
# 查看堆内存信息
jcmd <pid> GC.heap_info
# 查看类加载信息
jcmd <pid> VM.classloader_stats
# 查看 JVM 配置信息
jcmd <pid> VM.flags
# 返回信息:-XX:CICompilerCount=3 -XX:InitialHeapSize=249561088 -XX:MaxHeapSize=3990880256 -XX:MaxNewSize=1330118656 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=82837504 -XX:OldSize=166723584 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
# 查看线程堆栈信息
jcmd <pid> Thread.print
#
jcmd <pid> VM.command_line
```

### jconsole

jconsole 提供了可视化的方式来获取有关 Java 应用程序的各种信息,包括内存使用情况、线程活动、GC 行为等重要指标。它还允许远程连接到运行中的 Java 进程,提供对远程应用程序的监控和管理能力。
Expand All @@ -45,6 +69,8 @@ jconsole 提供了可视化的方式来获取有关 Java 应用程序的各种

### jfr

Java Flight Recorder(JFR)是Java虚拟机(JVM)内置的性能分析工具,用于收集和分析Java应用程序的运行时数据。JFR能够以极低的性能开销记录应用程序的运行状态,帮助开发者和运维人员诊断性能问题、内存泄漏、线程争用等。

### jhsdb

### jimage
Expand All @@ -60,7 +86,8 @@ Java Configuration Info :查看配置参数信息,支持部分参数运行
Java Memory Map :分析堆内存工具,导出 dump 堆内存快照

```shell
jmap -dump:live,format=b,file=heap.bin <pid>
# 导出文件后 可以使用JDK自带的Java Visual VM加载打开
jmap -dump:format=b,file=./heapdump.hprof <pid>
```

### jmod
Expand Down
127 changes: 127 additions & 0 deletions docs/study/program/JAVA/JFR.md
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` 命令行工具进行分析,帮助用户深入了解应用程序的运行状态。

0 comments on commit a055dab

Please sign in to comment.