Java安全基线案例

wen java案例 2

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

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("&", "&amp;")
            .replace("<", "&lt;")
            .replace(">", "&gt;")
            .replace("\"", "&quot;")
            .replace("'", "&#x27;")
            .replace("/", "&#x2F;");
    }
}

日志安全配置

<!-- 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应用从开发到部署的各个安全环节,可以根据实际需求进行调整和补充,建议定期审查和更新安全策略以应对新的安全威胁。

抱歉,评论功能暂时关闭!