服务端防泄密可以做的事情

这篇文章是突发奇想的,本来是想写代码混淆的 ProGuard 的使用和配置,然后发现这挺简单的,就是一些配置和 gradle 打包和混淆。

想着想着,想起在工作中碰到了很多关于加密、鉴权、混淆之类的偏运维的配置和工作,觉得可以整理一下。

我们看下,一个 SpringBoot 项目,在服务端可以做哪些事情来防泄密和抄袭。

Linux

  • 禁用 root 登录,而是用子账户登录。
  • 记录用户登录和操作日志的功能,比如定时任务定时扫描 history 命令,保存到文本中。
  • 网络管控。只有白名单ip或者网段内的ip才能登录服务器,这个在共有云操作很简单。如果是公司搭建的网络,那还得查一查怎么配置。

Java 代码混淆

  • ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具。
  • 它在 Android用得比较多,防止被逆向工程破解,服务端用得不多,因为服务器不容易被破解。
  • 如果要在 Spring 项目中使用,一般是有 maven 或者 gradle 的 jar 包来用,比如用 gradle 的话,依赖的包如下:
import proguard.gradle.ProGuardTask

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("com.guardsquare:proguard-gradle:7.3.2")
    }
}

task proguard(type: ProGuardTask) {}

项目嵌入授权模块(License)

在一些给客户部署的项目中,项目有使用有效期,比如有效期是 5 年,那就需要维护一套授权模块,只有配置正确的授权文件,服务才能正常使用。

  1. 拿到服务器的CPU 、网卡、mac地址等和服务器强相关的配置,依赖这些输入生成一套授权文本文件。
  2. SpringBoot 服务启动的时候,根据 CPU、网卡、mac等输入数据,再次计算得到授权文本,和 resources 内嵌已有的授权文件比较,一致了才能继续启动。
  3. http 接口访问的时候,增加拦截器或者过滤器,在启动完成后增加判断有boolean值,全局可用,拦截器中增加授权拦截。
  4. 为了防止修改系统时间,无限续期授权文件,需要记录系统访问或者上次启动的时间戳,每次启动后都比较下。时间差必须是越来越小的。

application.yml 密码加密

需要在application.yml文件里配置数据库的连接信息,或者在启动时传入数据库密码,如果不加密,传明文,数据库就直接暴露了,相当于"裸奔"了,因此需要进行加密处理才行。

使用一套依赖即可,我用的是:com.github.ulisesbocchio:jasypt-spring-boot-starter:2.1.2

在启动的时候用配置的密码就是 password: ENC(密码加密串),和它约定好秘钥,它启动的时候再解密,set回去就可以连接数据库了。

MySQL 加解密

数据库中,有敏感字段,比如:用户表的身份证、密码、手机号登敏感字段,用来内审,防止运维、开发窃取用户信息。

对于 MySQL 函数,可以使用 AES_ENCRYPT 来加解密。

总结

其实,可以做的防泄密的事情不少的,就看项目是否需要。

如果不需要的时候就不要这么麻烦了,因为做这么多也限制了开发和运维。如果项目需要,比如用户信息很重要,或者要完成分级保护、等级保护等等验收,那这些都是必须的了。