Spring boot 从SCDF执行任务时作为部分作业参数公开的DB凭据

Spring boot 从SCDF执行任务时作为部分作业参数公开的DB凭据,spring-boot,kubernetes,spring-batch,openshift,spring-cloud-dataflow,Spring Boot,Kubernetes,Spring Batch,Openshift,Spring Cloud Dataflow,我有定制的SCDF,它在Openshift中构建为docker映像,在server-deployment.yaml中称为docker映像。我使用Oracle db存储任务元数据,并且是这里的外部源。我在configmap中传递所有db属性。DB密码是base64编码的,并作为机密添加到配置映射中。SCDF正在使用这些数据库详细信息来存储任务元数据 这些作业参数由SCDF传递给正在执行的作业。但这些作业参数(这些作业参数是数据源属性,包括configmap中存在的db密码)将作为作业参数和批处理作

我有定制的SCDF,它在Openshift中构建为docker映像,在server-deployment.yaml中称为docker映像。我使用Oracle db存储任务元数据,并且是这里的外部源。我在configmap中传递所有db属性。DB密码是base64编码的,并作为机密添加到配置映射中。SCDF正在使用这些数据库详细信息来存储任务元数据

这些作业参数由SCDF传递给正在执行的作业。但这些作业参数(这些作业参数是数据源属性,包括configmap中存在的db密码)将作为作业参数和批处理作业执行参数表打印在日志中

我认为在configmap中使用密码作为机密应该可以解决这个问题。但事实并非如此。下面是正在打印的作业参数的日志和表片段

我想知道如何避免将这些db属性作为作业参数传递给正在执行的作业,以防止暴露凭据?

12-06-2020 18:12:38.540 [main] INFO org.springframework.batch.core.launch.support.SimpleJobLauncher.run - Job: 
[FlowJob: [name=Job]] launched with the following parameters: [{
-spring.cloud.task.executionid=8010, 
-spring.cloud.data.flow.platformname=default, 
-spring.datasource.username=ACTUAL_USERNAME, 
-spring.cloud.task.name=Alljobs, 
Job.ID=1591985558466, 
-spring.datasource.password=ACTUAL_PASSWORD, 
-spring.datasource.driverClassName=oracle.jdbc.OracleDriver, 
-spring.datasource.url=DATASOURCE_URL, 
-spring.batch.job.names=Job_1}]
为作业执行创建的Pod-openshift屏幕截图

数据库表


任何帮助都将不胜感激。谢谢。

这不是一个完美的例子,但是您可以使用logback(Spring Boot使用的默认日志库)的功能在日志中屏蔽密码

将下面的配置放入您的logback,它将用替换密码****

<springProfile name="local">
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                %d{dd-MM-yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M - %replace(%msg){'password=\S*', 'password=****'}%n
            </pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="console"/>
    </root>
</springProfile>

%d{dd MM yyyy HH:MM:ss.SSS}[%thread]-5级%logger{36}。%M-%replace(%msg){'password=\S*','password=***'}%n

对于登录数据库的密码,看起来我们运气不好。我们能做的最好的事情是将它放在一个单独的模式中,并拥有访问这些SCDF表的特定权限。

在SCDF V2.6.2中,团队解决了这个问题。数据库凭证不再在日志、POD描述页面或数据库中公开。默认情况下,凭据将可见。因此,任何有此问题的人都必须添加以下环境变量作为部署配置的一部分,并将该值设置为true


SPRING\u CLOUD\u DATAFLOW\u TASK\u USE\u KUBERNETES\u SECRETS\u FOR\u DB\u CREDENTIALS=true

我不确定我是否理解您的问题。你能澄清一下你的问题是什么吗?更新了问题,没有更多的信息。基本上,当作业通过SCDF在kubernetes平台中执行时,SCDF传递的作业参数包含db凭据。如何避免这种情况?这里正在跟踪:谢谢Hoang的回答。谢天谢地,作为发布的一部分,scdf it已经解决了这个问题。我将在单独的回答中提供这些细节。感谢@Rajesh2389的更新:)。我的团队也有类似的问题,我们还不能升级SCDF。我会暂时保留答案,以防有人有同样的问题。很高兴他们解决了。我的团队仍然坚持使用SCDF 1.7.x。。。
<springProfile name="local">
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                %d{dd-MM-yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M - %replace(%msg){'password=\S*', 'password=****'}%n
            </pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="console"/>
    </root>
</springProfile>