阅读量:24
1. 系统级基础安全加固
- 更新系统与软件包:定期执行
sudo apt update && sudo apt upgrade,安装Ubuntu和Java的最新安全补丁,修复已知漏洞。 - 配置防火墙:使用UFW(Uncomplicated Firewall)限制入站/出站连接,仅开放必要端口(如HTTP的80/tcp、HTTPS的443/tcp),命令示例:
sudo ufw enable && sudo ufw allow 80/tcp && sudo ufw allow 443/tcp。 - 强化用户认证:禁用root用户直接登录(
sudo passwd -dl root),配置SSH密钥认证(修改/etc/ssh/sshd_config,设置PermitRootLogin no和PasswordAuthentication no),并使用强密码策略(通过/etc/pam.d/system-auth添加pam_cracklib.so模块,要求密码包含大小写字母、数字和特殊字符,最小长度10位)。
2. Java环境安全配置
- 安装可信Java版本:优先通过Ubuntu官方仓库安装OpenJDK(如
sudo apt install openjdk-11-jdk),避免从非官方渠道下载;验证安装版本(java -version、javac -version)。 - 配置Java安全策略文件:
- 系统级策略文件位于
/usr/lib/jvm/java-(如Java 11为/lib/security/java.security /usr/lib/jvm/java-11-openjdk-amd64/lib/security/java.security),可调整全局安全参数(如加密算法强度、随机数生成器); - 应用级策略文件(如
myapp.policy)需自定义权限,示例内容:grant codeBase "file:/path/to/your/app/-" { permission java.security.AllPermission; };(仅允许可信路径下的应用运行); - 通过命令行指定策略文件路径(
java -Djava.security.policy=/path/to/myapp.policy -jar your-app.jar),或在代码中设置(System.setProperty("java.security.policy", "/path/to/myapp.policy"))。
- 系统级策略文件位于
3. Java应用层安全防护
- 输入验证与清理:对所有用户输入(如表单、URL参数)进行格式校验(如使用Hibernate Validator的
@NotNull、@Size注解),防止SQL注入、XSS等攻击;清理特殊字符(如<、>、'),避免恶意代码执行。 - 依赖库安全管理:使用OWASP Dependency-Check工具定期扫描项目依赖(如Maven项目中执行
mvn org.owasp:dependency-check-maven:check),识别并替换存在漏洞的库(如旧版本Spring、Log4j);将依赖库存储在私有仓库(如Nexus),避免从公共仓库下载未验证的组件。 - 加密传输与存储:使用SSL/TLS加密数据传输(如配置Tomcat的
server.xml启用HTTPS,或通过Spring Boot的application.properties设置server.ssl.enabled=true);对敏感数据(如用户密码、数据库凭证)进行加密存储(使用Jasypt等库,配置加密密钥并通过环境变量传递)。 - 防止反序列化漏洞:使用
SafeObjectInputStream封装反序列化操作,重写resolveClass方法,仅允许加载可信类(如白名单机制,示例代码:private static final String[] SAFE_CLASSES = {"java.util.ArrayList"};,若类名不在白名单中则抛出SecurityException)。
4. 运行时权限控制
- 使用SecurityManager:通过
System.setSecurityManager(new SecurityManager())启用安全管理器,限制Java应用的权限(如禁止访问文件系统、网络);配合策略文件定义具体权限(如grant { permission java.io.FilePermission "/tmp/-", "read"; };仅允许读取/tmp目录)。 - 自定义ClassLoader沙箱:继承
SecureClassLoader,重写loadClass方法,禁止加载敏感类(如com.xxx.sensitive包下的类),示例代码:if (name.startsWith("com.xxx.sensitive")) { throw new SecurityException("禁止加载敏感类"); },防止恶意类被加载执行。
5. 日志与监控
- 日志记录:配置Java应用的日志框架(如Logback、Log4j2),记录安全相关事件(如登录失败、权限拒绝、异常抛出);避免在日志中泄露敏感信息(如用户密码、银行卡号),使用占位符(如
{password})替代。 - 日志监控与分析:使用
logwatch或fail2ban监控日志文件(如/var/log/auth.log、应用日志),设置告警规则(如连续5次登录失败触发邮件通知);定期审查日志,及时发现异常行为(如大量来自陌生IP的请求、未授权的访问尝试)。