【doris】doris集成ranger控制权限,ranger配置无法存储doris密码password信息
doris版本:3.0.0
ranger:2.6.0
ranger的日志配置在此文件中:ranger-2.6.0-admin/conf/logback.xml
添加插件的日志级别配置:
<logger name="org.apache.ranger.services.doris" additivity="false" level="debug"><appender-ref ref="xa_log_appender"/></logger
doris-ranger集成官方文档
在此文章中找到
并下载通过,jd-gui
反编译工具打开,在idea中新建目录结构,并添加依赖,文本是使用gradle构建build.gradle
文件如下:
plugins {id 'org.jetbrains.kotlin.jvm' version '1.9.23'
}group = 'org.apache.ranger'
version = '3.0.0'repositories {mavenCentral()
}dependencies {api("org.apache.ranger:ranger-plugins-common:2.6.0")testImplementation 'org.jetbrains.kotlin:kotlin-test'
}test {useJUnitPlatform()
}
kotlin {jvmToolchain(8)
}
很遗憾,此包在github中么有找到源码,必须反编译了。
将几个文件源码分别复制idea中。修改:DorisClient
类,在initConnection
添加密码解码代码。
添加if代码块信息即可。本文用kotlin语言编译。可自行按逻辑编写java代码。
private fun initConnection() {val prop = configHolder.rangerSectionval driverClassName = prop.getProperty("jdbc.driver_class")val url = prop.getProperty("jdbc.url")val properties = Properties()properties["user"] = prop.getProperty("username")if (prop.getProperty("password") != null) {val pwdTmp= prop.getProperty("password")val pwd=PasswordUtils.getDecryptPassword(pwdTmp)properties["password"]=pwd}
总结,doris源码中没有对ranger提供的密码解码导致,密码错误和无法被存储的假象。
附录:
PasswordUtils.getDecryptPassword
的测试
其逻辑是能解码就解码,不能解就返回原密码。
package org.apache.ranger.plugin.util
import org.junit.jupiter.api.Test
class PasswordUtilsTest {@Testfun testPasswordDecrypt(){println("hello!")val encryptedPassword="PBEWithHmacSHA512AndAES_128,tzL1AKl5uc4NKYaoQ4P3WLGIBFPXWPWdu1fRm9004jtQiV,f77aLYLo,1000,Nwv5d4wax5rgJLyu4bnSNw==,0eEjW1/qisHcE++8Af1QPA=="val password1=PasswordUtils.getDecryptPassword(encryptedPassword)println("from encrypted: ${password1}") // 能被正确解码:qaz123val unencryptedPassword="qaz123"val password2=PasswordUtils.getDecryptPassword(unencryptedPassword)println("from unencrypted: ${password2}") // 就是原密码:qaz123}
}
编译项目,并替换`ranger-2.6.0-admin/ews/webapp/WEB-INF/classes/ranger-plugins/doris/ranger-doris-plugin-3.0.0.jar`,重启ranger即可。
观察`ranger-admin-ranger-root.log`日志即可debug了。当然也可以在源码中添加LOG.info信息。
源码如下:
public static String getDecryptPassword(String password) {String decryptedPwd = null;try {decryptedPwd = decryptPassword(password);} catch (Exception var6) {LOG.warn("Password decryption failed, trying original password string.");decryptedPwd = null;} finally {if (decryptedPwd == null) {decryptedPwd = password;}}return decryptedPwd;}