Java在Linux上的安全加固措施
firewalld
(CentOS)或iptables
(Ubuntu)配置防火墙,仅开放Java应用必需的端口(如HTTP 8080、HTTPS 443),禁止未授权IP访问。例如,通过firewall-cmd --permanent --add-port=8080/tcp
添加端口,firewall-cmd --reload
生效。root
用户运行Java应用,创建专用低权限用户(如javaapp
),通过chown -R javaapp:javaapp /app/path
设置应用目录所有权,用sudo -u javaapp java -jar app.jar
启动应用。setenforce 1
)或AppArmor,通过安全策略限制Java进程对系统资源的访问(如禁止写入/etc
目录)。例如,SELinux的targeted
策略可约束应用仅能访问自身目录。mvn dependency:tree
(Maven)或gradle dependencies
(Gradle)检查依赖库,移除未使用的旧版本库。server.xml
配置:禁用AJP协议(<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
注释掉)、启用SSL/TLS(<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" ... />
)、限制连接数(maxThreads="200"
)。java -Djava.security.manager -Djava.security.policy==/path/to/policy.file
启用安全管理器,结合policy
文件定义权限(如禁止文件写入、限制网络访问),防止恶意代码越权操作。PreparedStatement
防止SQL注入;对输出到页面的内容(如response.getWriter().write()
)进行HTML转义(如OWASP ESAPI的encodeForHTML
),防御XSS攻击。BCryptPasswordEncoder
可实现密码哈希:BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); String hashedPassword = encoder.encode(rawPassword)
。System.getenv("DB_PASSWORD")
读取环境变量中的敏感信息(如数据库密码),而非硬编码在代码中;使用密钥管理系统(如HashiCorp Vault)集中管理API密钥、加密密钥。request.getRequestURI()
)、异常日志(如logger.error("SQL Error", e)
);使用auditd
监控系统调用(如-w /path/to/java/app -p rwxa -k java_app_access
),追踪可疑操作。docker run -u 1000:1000 --read-only --cap-drop=ALL
限制容器权限(非root用户、只读文件系统、移除不必要的Linux能力);使用Docker Compose编排多容器应用,隔离数据库、缓存等服务。rsync
同步到远程服务器),确保在遭受攻击时能快速恢复。