我来为您提供一个全面的Java安全基线案例,涵盖常见的配置和安全要求。

Java安全基线案例
基础环境配置
# Java基础安全配置 java: version: "17.0.9 LTS" # 使用最新LTS版本 vendor: "Oracle" # 或 Eclipse Temurin, Amazon Corretto update_frequency: "90天" # 定期更新补丁 security_policy: policy_file: "/etc/java/security/java.policy" security_file: "/etc/java/security/java.security"
JVM安全参数配置
#!/bin/bash # JVM安全启动参数 JAVA_OPTS=" # 安全管理器 -Djava.security.manager -Djava.security.policy=/etc/java/security/java.policy # 安全属性 -Djava.security.properties=/etc/java/security/java.security # 限制堆转储 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/java/heapdump # 禁用远程调试 -Dcom.sun.management.jmxremote=false # 安全随机数生成器 -Djava.security.egd=file:/dev/./urandom # 限制外部访问 -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.local.only=true # 禁用不必要的协议 -Dcom.sun.net.ssl.enableECC=false -Djdk.tls.client.protocols=TLSv1.2,TLSv1.3 # 日志安全 -Dlog4j2.formatMsgNoLookups=true "
安全策略文件配置
// java.policy 安全策略示例
grant codeBase "file:${java.home}/lib/ext/-" {
permission java.security.AllPermission;
};
grant codeBase "file:/opt/myapp/lib/-" {
// 文件系统权限
permission java.io.FilePermission "/opt/myapp/conf/*", "read";
permission java.io.FilePermission "/var/log/myapp/*", "read,write";
permission java.io.FilePermission "-", "read";
// 网络权限
permission java.net.SocketPermission "localhost:1024-", "listen,accept";
permission java.net.SocketPermission "*.example.com:443", "connect";
// 运行时权限
permission java.lang.RuntimePermission "accessClassInPackage.*";
permission java.lang.RuntimePermission "getClassLoader";
// 属性权限
permission java.util.PropertyPermission "java.*", "read";
permission java.util.PropertyPermission "user.*", "read";
// 安全管理权限
permission java.security.SecurityPermission "getPolicy";
};
安全配置文件
# java.security - 安全配置
# 加密策略(使用无限制强度)
crypto.policy=unlimited
# 禁用不安全的TLS版本
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL
# 安全提供者顺序
security.provider.1=SunRsaSign
security.provider.2=SunJSSE
security.provider.3=SunEC
# 网络配置
networkaddress.cache.ttl=10
networkaddress.cache.negative.ttl=10
# 安全管理器
security.manager=allow
# 包访问控制
package.access=sun.misc.,sun.reflect.,com.sun.xml.internal.,com.sun.crypto.provider.
# 禁用不安全的JNDI功能
jdk.jndi.object.factoriesFilter=!*
jdk.jndi.ldap.object.trustSerialData=false
# RMI安全配置
java.rmi.server.enableClassLoader=false
java.rmi.server.disableHttp=true
代码安全实践
// 安全的文件操作示例
public class SecureFileHandler {
private static final String SAFE_DIR = "/opt/myapp/data/";
public void readFile(String filename) throws IOException {
// 路径遍历防护
Path filePath = Paths.get(SAFE_DIR, filename).normalize();
if (!filePath.startsWith(Paths.get(SAFE_DIR).normalize())) {
throw new SecurityException("Path traversal detected");
}
// 权限检查
if (!Files.isReadable(filePath)) {
throw new SecurityException("File not readable");
}
try (InputStream is = Files.newInputStream(filePath)) {
// 处理文件
}
}
}
// 安全的SQL操作
public class SecureDatabase {
public User getUserById(int id) {
String sql = "SELECT * FROM users WHERE id = ?";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setInt(1, id);
// 执行查询
}
}
}
// XSS防护
public class SecureOutput {
public String sanitizeUserInput(String input) {
return input
.replace("&", "&")
.replace("<", "<")
.replace(">", ">")
.replace("\"", """)
.replace("'", "'")
.replace("/", "/");
}
}
日志安全配置
<!-- log4j2.xml 安全配置 -->
<Configuration>
<Appenders>
<RollingFile name="SecureFile"
fileName="/var/log/app/secure.log"
filePattern="/var/log/app/secure-%d{yyyy-MM-dd}.log">
<PatternLayout pattern="%d{ISO8601} [%t] %-5level %c{1} - %msg%n"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="WARN">
<AppenderRef ref="SecureFile"/>
</Root>
<!-- 禁止日志注入 -->
<Logger name="org.apache.logging.log4j" level="ERROR"/>
</Loggers>
</Configuration>
容器化安全配置
# Dockerfile 安全基础
FROM eclipse-temurin:17-jre-alpine
# 创建非root用户
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
# 设置安全权限
COPY --chown=appuser:appgroup app.jar /app/
RUN chmod 644 /app/app.jar && \
chmod 755 /app && \
rm -rf /var/cache/apk/*
# 安全目录
RUN mkdir -p /var/log/app && \
chown -R appuser:appgroup /var/log/app && \
chmod 750 /var/log/app
# 安全启动
USER appuser
EXPOSE 8080
ENTRYPOINT ["java", \
"-Djava.security.manager", \
"-Djava.security.policy=/app/security.policy", \
"-jar", "/app/app.jar"]
安全检查清单
## Java应用安全检查清单 ### [ ] JDK版本 - [ ] 使用最新LTS版本 - [ ] 及时应用安全补丁 - [ ] 移除旧版本JDK ### [ ] JVM配置 - [ ] 启用安全管理器 - [ ] 限制堆内存大小 - [ ] 配置安全随机数生成器 - [ ] 禁用不安全的协议 ### [ ] 代码安全 - [ ] SQL注入防护 - [ ] XSS防护 - [ ] CSRF防护 - [ ] 输入验证 - [ ] 输出编码 ### [ ] 依赖管理 - [ ] 扫描依赖漏洞 - [ ] 使用最小化依赖 - [ ] 定期更新依赖版本 ### [ ] 文件系统 - [ ] 最小权限原则 - [ ] 路径遍历防护 - [ ] 敏感文件保护 ### [ ] 网络配置 - [ ] TLS配置 - [ ] 端口限制 - [ ] RMI安全配置 ### [ ] 日志安全 - [ ] 敏感信息脱敏 - [ ] 日志注入防护 - [ ] 日志轮转配置 ### [ ] 部署安全 - [ ] 非root用户运行 - [ ] 容器安全配置 - [ ] 安全策略文件
安全工具集成
<!-- Maven安全插件配置 -->
<build>
<plugins>
<!-- 依赖安全扫描 -->
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>8.4.0</version>
<configuration>
<failBuildOnCVSS>7</failBuildOnCVSS>
<formats>
<format>HTML</format>
</formats>
</configuration>
</plugin>
<!-- 代码安全分析 -->
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>4.7.3</version>
<configuration>
<effort>Max</effort>
<threshold>Low</threshold>
<failOnError>true</failOnError>
</configuration>
</plugin>
</plugins>
</build>
这个安全基线案例涵盖了Java应用从开发到部署的各个安全环节,可以根据实际需求进行调整和补充,建议定期审查和更新安全策略以应对新的安全威胁。