JMX 和 JAAS 认证
JMX(Java Management Extensions)认证主要用于保护 JMX 远程管理接口,防止未经授权的访问。在 Java 应用程序中启用 JMX 远程访问时,可以使用用户名/密码认证和SSL/TLS 加密来增强安全性。
JMX
1. 启用 JMX 远程管理
在 JAVA_OPTS
或 JAVA_TOOL_OPTIONS
中添加以下 JVM 选项,启用 JMX 远程管理:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9000
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true
-Djava.rmi.server.hostname=127.0.0.1
jmxremote.port=9000
:JMX 监听的端口jmxremote.ssl=false
:禁用 SSL(生产环境建议开启)jmxremote.authenticate=true
:启用认证java.rmi.server.hostname=127.0.0.1
:指定访问 JMX 的主机
2. 配置 JMX 认证
JMX 认证通过 jmxremote.access
和 jmxremote.password
文件管理权限和用户密码。
(1) 配置 jmxremote.access(访问权限)
创建或修改 $JAVA_HOME/lib/management/jmxremote.access
文件,配置用户权限:
monitorRole readonly
controlRole readwrite
adminRole readwrite
readonly
:仅可读取 JMX 信息readwrite
:可读取和修改 JMX 属性
(2) 配置 jmxremote.password(用户名和密码)
创建或修改 $JAVA_HOME/lib/management/jmxremote.password
文件:
monitorRole monitor123
controlRole control123
adminRole admin123
⚠️ 注意:
- 该文件必须设置严格的权限,否则 JMX 不会启用认证:
chmod 600 $JAVA_HOME/lib/management/jmxremote.password
- 不建议在生产环境使用明文密码,推荐基于 JAAS 进行更安全的认证机制。
3. 启用 SSL(可选,增强安全性)
如果希望启用 SSL 保护 JMX 连接,可以增加以下 JVM 选项:
-Dcom.sun.management.jmxremote.ssl=true
-Dcom.sun.management.jmxremote.registry.ssl=true
-Djavax.net.ssl.keyStore=/path/to/keystore.jks
-Djavax.net.ssl.keyStorePassword=yourpassword
这样 JMX 只能通过 SSL 加密的方式访问,防止中间人攻击。
4. 连接 JMX
在 JConsole 或 VisualVM 连接 JMX 时,需要提供认证信息:
service:jmx:rmi:///jndi/rmi://127.0.0.1:9000/jmxrmi
输入 controlRole
/ control123
进行访问。
5. 生产环境建议
- 强制认证:必须开启
jmxremote.authenticate=true
- 使用 SSL:避免明文传输敏感信息
- 限制 IP 访问:使用
iptables
或firewalld
允许特定 IP 访问 JMX 端口 - 不暴露到公网:尽量限制 JMX 端口仅允许内网访问
总结
JMX 认证主要涉及 用户名/密码 和 SSL 加密 两个方面。推荐在生产环境中启用 SSL,并仅允许受信任的 IP 访问,以防止 JMX 端口被攻击。
JAAS
JAAS(Java 认证与授权服务,全称 Java Authentication and Authorization Service)是 Java 提供的一套 认证(Authentication)和授权(Authorization) 机制,基于 Pluggable Authentication Module(PAM) 设计,可扩展支持多种身份认证方式,如 用户名/密码、Kerberos、LDAP、OAuth 等。
JAAS 主要用于:
- 认证(Authentication):验证用户身份,例如用户名和密码匹配。
- 授权(Authorization):控制用户对系统资源的访问权限。
JAAS 的核心组件
JAAS 由以下核心组件组成:
1. LoginModule
(认证模块)
LoginModule
负责实现具体的身份认证方式,如数据库、LDAP、Kerberos 等。- Java 允许在
jaas.config
配置文件中定义多个LoginModule
,并支持级联认证。
2. Subject
(主体)
Subject
代表被认证的用户,包括身份信息(Principal
)和安全凭证(Credentials
)。Subject
可以携带多个Principal
(例如用户 ID、角色等)。
3. Principal
(主体标识)
Principal
表示用户的身份,如用户名或角色信息。
4. Policy
(权限策略)
Policy
定义用户或角色的权限,类似于 Java 的SecurityManager
机制。
JAAS 认证流程
- 创建
LoginContext
对象LoginContext
负责管理认证流程,它会根据jaas.config
配置文件加载LoginModule
进行身份验证。
- 调用
login()
方法进行认证LoginContext
调用login()
,触发LoginModule
进行用户身份验证。
- 认证成功后获取
Subject
- 认证通过后,
LoginContext
会返回Subject
,包含用户身份信息和凭证。
- 认证通过后,
- 执行授权操作
- 使用
Subject.doAs()
以认证用户的身份执行某些操作,或进行权限验证。
- 使用
示例:使用 JAAS 进行 JMX 认证
如果你希望使用 JAAS 代替默认的 jmxremote.password
文件 进行 JMX 认证,可以按照以下步骤操作。
1. 配置 jaas.config
文件
首先,在 $JAVA_HOME/lib/security/
目录下创建 jmxjaas.config
文件:
JMXLogin {
com.sun.security.auth.module.FileLoginModule required
debug=true
userFile="/etc/jmx/jmx_users.txt";
};
FileLoginModule
:JAAS 内置的认证模块,从文件中读取用户名和密码。userFile
:存储用户名和密码的文件路径。
2. 创建用户认证文件 /etc/jmx/jmx_users.txt
文件内容格式:
admin admin123
monitor monitor123
⚠️ 确保文件权限:
chmod 600 /etc/jmx/jmx_users.txt
3. 配置 JVM 选项
在 Java 进程启动时,添加以下 JVM 选项:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9000
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.login.config=JMXLogin
-Djava.security.auth.login.config=/path/to/jmxjaas.config
com.sun.management.jmxremote.login.config=JMXLogin
:指定 JAAS 认证配置。java.security.auth.login.config=/path/to/jmxjaas.config
:指定 JAAS 配置文件路径。
4. 连接 JMX
在 JConsole 或 VisualVM 连接 JMX 时,需要输入 admin/admin123
进行身份认证。
JAAS 适用场景
- JMX 认证(如上所述,使用 JAAS 代替
jmxremote.password
)。 - Web 应用认证(如 Tomcat、Spring Security 可集成 JAAS)。
- LDAP/Kerberos 认证(企业级安全认证)。
- Java 应用访问安全资源(如文件、数据库等)。
总结
JAAS 提供了一种可插拔的身份认证和授权机制,可以用于 JMX、Web 认证、LDAP/Kerberos 认证 等场景。在 JMX 认证中,JAAS 可以替代默认的 jmxremote.password
机制,使认证更加灵活和安全。