Jenkins 中,“Use secret text(s) or file(s)” 是一个用于安全处理敏感信息

在 Jenkins 中,“Use secret text(s) or file(s)” 是一个用于安全处理敏感信息的功能,目的是避免在代码或配置中直接暴露密码、密钥、令牌等敏感数据。以下是其核心用途和典型场景:

1. 主要用途

  • 安全存储敏感信息:将密码、API 密钥、SSH 私钥、证书等敏感内容存储在 Jenkins 的凭证管理系统(Credentials)中,而非硬编码在脚本或配置文件中。

  • 动态注入到构建环境:在流水线(Pipeline)或作业(Job)运行时,将敏感信息以环境变量临时文件的形式注入到构建过程中。

  • 自动化清理:临时文件在构建结束后自动删除,减少泄露风险。

 

2. 典型使用场景

a. 认证与授权

  • Git 仓库克隆:使用 SSH 私钥或用户名/密码访问私有仓库。

    // 示例:在 Pipeline 中使用 Git 凭证
    checkout([
        $class: 'GitSCM',
        branches: [[name: '*/main']],
        userRemoteConfigs: [[
            url: 'git@github.com:user/repo.git',
            credentialsId: 'your-ssh-key-id' // 引用存储的 SSH 私钥凭证
        ]]
    ])

     

  • 访问云服务:如 AWS/Azure/GCP 的 API 密钥、Kubernetes 的 kubeconfig 文件。

    // 示例:将 AWS 密钥注入环境变量
    withCredentials([
        string(credentialsId: 'aws-access-key', variable: 'AWS_ACCESS_KEY_ID'),
        string(credentialsId: 'aws-secret-key', variable: 'AWS_SECRET_ACCESS_KEY')
    ]) {
        sh 'aws s3 ls' // 脚本中通过环境变量使用密钥
    }

     

    
    

b. 配置文件或证书

  • 数据库密码:在部署时注入 application.properties

  • TLS 证书:将 HTTPS 证书以文件形式挂载到容器或服务中。

    // 示例:挂载 SSL 证书文件
    withCredentials([file(credentialsId: 'ssl-cert', variable: 'SSL_CERT')]) {
        sh """
            cp ${SSL_CERT} ./ssl/nginx.crt
            docker-compose up -d
        """
    }

c. 第三方服务集成

  • Slack 通知:发送构建状态到 Slack 频道,使用 Bot Token。

    // 示例:发送消息到 Slack
    withCredentials([string(credentialsId: 'slack-token', variable: 'SLACK_TOKEN')]) {
        sh "curl -X POST -H 'Authorization: Bearer ${SLACK_TOKEN}' https://slack.com/api/chat.postMessage..."
    }
    
    

3. 如何使用

步骤 1:添加凭证

  1. 进入 Jenkins → Manage Jenkins → Credentials → System → Global credentials

  2. 点击 Add Credentials,选择类型:

    • Secret text:适用于短文本(如 API 令牌)。

    • File:适用于证书、密钥文件(如 .pem.key.json)。

步骤 2:在 Pipeline 或 Job 中引用

  • 在声明式 Pipeline 中

pipeline {
    agent any
    environment {
        // 将 Secret Text 注入为环境变量
        API_TOKEN = credentials('api-token-credentials-id')
    }
    stages {
        stage('Deploy') {
            steps {
                // 使用环境变量
                sh 'curl -H "Authorization: Bearer ${API_TOKEN}" https://api.example.com'
                
                // 挂载 Secret File
                withCredentials([file(credentialsId: 'config-file', variable: 'CONFIG')]) {
                    sh 'deploy-tool --config ${CONFIG}'
                }
            }
        }
    }
}

 

  • 在自由风格 Job 中

    • 在 Build Environment 配置中勾选 Use secret text(s) or file(s)

    • 选择凭证类型并绑定到环境变量或文件路径。

4. 安全注意事项

  • 屏蔽日志输出:Jenkins 自动隐藏环境变量值(如 ****),但需避免在脚本中直接打印敏感变量。

  • 最小权限原则:仅授予 Job 所需的最小权限。

  • 定期轮换凭证:定期更新密钥或密码,降低泄露风险。


总结

通过 “Use secret text(s) or file(s)”,Jenkins 实现了敏感信息与代码的分离,提升了安全性和可维护性。无论是文本密钥还是文件证书,都能通过统一的“凭证管理系统”安全地集成到自动化流程中。

具体操作配置案例:

  • 1. jenkin的认证管理中添加你的认证数据:

比如为了访问gitlab仓库,创建了一个api key,但是不想在项目代码中直接硬编码写入这个api key(因为这样不安全),那么就可以先在jenkins中添加一个认证数据。Secret就是apikey的值,ID是自定义命名的。

  • 2. 在jenkins job中添加“Use secret text(s) or file(s)”,选择刚才创建的认证数据:

 然后选择认证:

比如Variable变量名称,我命名为:Testsecret

  •  3.在代码(我这里的案例是java代码)中获取这个环境变量的apikey值
    @PostMapping(value = "/testEnvParameter")
    @ApiOperation("testEnvParameter")
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public String testEnvParameter(){
        //String value = System.getenv("Path");//获取系统环境变量Path
        //System.out.println("Path = " + value);

        String Testsecret = System.getenv("Testsecret");
        System.out.println("Testsecret = " + Testsecret);
        return Testsecret;
    }
  • 4.调用api接口,可以直接获取到jenkins job的configure中配置的“User secret text or file”这个配置选择的Credentials认证数据对应的Secret值(也就是github账号创建的api token值):

  •  我这里为了测试效果,所以写了一个api直接返回这个api token值。具体用法你们就根据自己项目需求来设计就行了。比如也可以把它放到一个全局变量,这样整个项目在访问时,也是比较方便的。
  •  这样就实现了把gitlab账号下的api token值抽离出来了,这样的作法就避免的直接把api token值直接硬编码写入到代码中被暴露出来的风险了。但是需要注意的是,这个api token在代码中不要出来,避免敏感信息的泄露。
posted @ 2025-03-27 14:00  苹果芒  阅读(204)  评论(0)    收藏  举报