配置yml中的敏感信息至linux环境变量

162 阅读2分钟

一、写在前面

        在yml文件中,经常会配置一些数据库账号密码、加密盐值和端口等等重要信息,从代码安全上考虑,一旦源码泄漏,这些信息都会暴露在外网中。
image.png
        因此,我希望对于项目中敏感信息可以配置到Linux的环境变量中,这样即使源码泄漏,对方拿到的敏感信息也只是一个占位符(除非对方能攻破服务器拿到环境变量)。
image.png

二、yaml配置

        在企业项目的使用环境中,一般分为开发环境、测试环境和生产环境,这里为了简单演示效果,我只分为了开发环境和生产环境,yaml的结构目录如下:
image.png
        开发环境中的yaml配置如下:

# 正式环境
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/env_demo?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&nullCatalogMeansCurrent=true
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

        生产环境中的配置如下:

# 正式环境
spring:
  datasource:
    url: jdbc:mysql://${SERVER_IP}:${DB_PORT}/${PROJECT_NAME}?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&nullCatalogMeansCurrent=true
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
    driver-class-name: com.mysql.jdbc.Driver

        在yml主文件中,我们通过spring.profiles.active来控制实际使用哪个配置:
image.png

三、linux环境变量的配置

        配置Linux环境变量,我们需要修改etc下的profile文件,以下是具体操作:

  1. 打开文件
    vim /etc/profile
    图中的export ****表示linux下的全局环境变量

  2. 添加环境变量

image.png

  1. 重新生效文件

        这里使用source命令来使我们添加的环境变量生效:
source /etc/profile

  1. 检查环境变量是否生效

        使用命令export来查看环境变量
export image.png
        至此,环境变量配置完毕,我们来运行项目,查看是否拿到了环境变量

四、测试

        我们这里写个工具类用于环境变量的获取:

@Configuration
@Getter
public class GlobalVariableUtil {
    /**
     * description 数据库连接地址
     */
    @Value("${spring.datasource.url}")
    private String dbUrl;
    /**
     * description 数据库连接用户名
     */
    @Value("${spring.datasource.username}")
    private String username;

    /**
     * description 数据库连接密码
     */
    @Value("${spring.datasource.password}")
    private String password;


}

        再写个controller来拿取变量:

@RestController
@AllArgsConstructor
@RequestMapping("/api")
@Slf4j
public class UserController {

    private GlobalVariableUtil globalVariableUtil;

    /**
     * description 获取所有用户
     * @return  所有用户
     */
    @GetMapping("/test")
    public JSONObject getAllUser(){
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("dbUrl",globalVariableUtil.getDbUrl());
        jsonObject.put("username",globalVariableUtil.getUsername());
        jsonObject.put("password",globalVariableUtil.getPassword());
        return jsonObject;
    }
}
  1. 开发环境

image.png

  1. 生产环境

image.png
        对比两者,可以看到变量已经被替换

五、注意事项

1.操作顺序:先新增环境变量,再运行项目


        环境变量的新增应该优先于项目的部署,因为项目运行后,会首先从Linux环境中获取变量并加载到容器中,如果项目运行后再去添加环境变量,此时环境变量是拿不到;同理,如果要修改环境变量,在source命令后,仍然需要重启项目,以重新加载