密码加密

概要

openLooKeng 管理一些catalog相关的配置文件,这些配置文件可能包含一些用户名、密码等信息,其中,密码信息一般情况下要求保密,不能以明文的方式存储。 这是一个典型的MySQL connector的配置文件:

  1. connector.name=mysql
  2. connection-url=jdbc:mysql://localhost:3306
  3. connection-user=root
  4. connection-password=123456

openLooKeng 可以开启密码加密功能,这些密码就可以被加密存储。

建议RSA Key的长度为3072 bit,最低2048 bit。

原理

我们采用非对称加密算法 (RSA),原理如下:

password-encryption-principle

  • 公钥: 用于加密,客户端使用公钥对明文进行加密。
  • 私钥: 用户解密,服务端将私钥存储在文件系统的keystore中,并使用私钥对密文进行解密。

用户自己保存公钥,将私钥给openLooKeng用于加密后的密文解密。

配置

为了开启密码加密特性,你需要在 etc/config.properties增加以下属性:

  1. security.password.decryption-type=RSA
  2. security.key.manager-type=keystore
  3. security.key.keystore-password=my-keystore-pwd
  4. security.key.store-file-path=/openlookeng/keystore/keystore.jks
属性描述
security.password.decryption-type密码加解密使用的加密算法. 必须是 NONERSA.
security.key.manager-type=keystore加密秘钥的存储方式. 必须是 keystore.
security.key.keystore-passwordkeystore的密码.
security.key.cipher-transformationsCipher.getInstance(transformations), the default value is ‘RSA/ECB/OAEPWITHSHA256AndMGF1Padding’
security.key.store-file-path文件系统 中keystore文件的路径.

用例

用例 1. 公私钥

采用keytool工具生产一个keystore文件,从keystore文件中提取公钥,通过openssl工具使用提取的公钥加密需要加密的明文。 同时,从keystore中提取私钥,并通过restful api发送给openLooKeng服务。

以下是使用样例:

  1. 1. 采用pkcs12格式创建keystore:
  2. keytool -genkeypair -alias alias -dname cn=openlookeng -validity 365 -keyalg RSA -keysize 2048 -keypass openlookeng -storetype jks -keystore keystore.jks -storepass openlookeng -deststoretype pkcs12
  3. 2. keystore中提取公钥,并将公钥复制到pub.key文件中:
  4. keytool -list -rfc -keystore keystore.jks -storepass openlookeng | openssl x509 -inform pem -pubkey
  5. 3. openssl工具加密,data.txt为需要加密的内容,result.en为加密结果,pub.key为公钥:
  6. openssl pkeyutl -encrypt -in data.txt -out result.en -pubin -inkey pub.key -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:SHA256 -pkeyopt rsa_mgf1_md:SHA256
  7. 4. result.en需要采用base64转换为可读字符串:
  8. cat result.en | base64
  9. 注意: 获取到可读密文字符串后,需要手动删除每行的换行符'\n'
  10. 5. 提取私钥
  11. keytool -v -importkeystore -srckeystore keystore.jks -srcstoretype jks -srcstorepass openlookeng -destkeystore server.pfx -deststoretype pkcs12 -deststorepass openlookeng -destkeypass openlookeng
  12. openssl pkcs12 -in server.pfx -nocerts -nodes -out private.key
  13. private.key的文件内容就是提取的私钥.
  14. 6. 添加静态数据源的私钥到keystore.jks (keystore.jkssecurity.key.store-file-path指定路径的文件)
  15. 假设静态数据源的名字是mysql001,静态数据源加密用的公钥是从keystore001.jks文件中提取的,需要主要的keystore.jks文件的alias必须跟静态数据源的名称一致,即为mysql001。因此,需要将keystore001.jks文件中aliasmysql001的私钥存储到keystore.jks文件中。
  16. 可以参照以下命令实现:
  17. keytool -v -importkeystore -srckeystore keystore001.jks -srcstoretype jks -srcstorepass openlookeng -destkeystore server.p12 -deststoretype pkcs12 -deststorepass openlookeng -destkeypass openlookeng
  18. keytool -importkeystore -deststorepass openlookeng -destkeystore keystore.jks -srckeystore server.p12 -srcstoretype pkcs12 -srcstorepass openlookeng -alias mysql001

用例 2. 动态目录

一个http请求的模板如下 (以MySQL connector为例):

  1. request: POST/PUT
  2. header: 'X-Presto-User: admin'
  3. form: '
  4. catalogInformation={
  5. "catalogName":"mysql",
  6. "connectorName":"mysql",
  7. "securityKey":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1Z4yap2cI1u6zg/R8vTcltOy8xxeOt/VG0xEArud+c5rI9h2kWy8Uo7hTFN/JapVDENT17fEzd+SqrlvcmD8ceDH07+OW2RRGcQjR0GKpKGSmubEHdH01xzpuQ1+m83B84Ir5eqcWx6QIwBPQsqqjeNpHhYdJLMpSrX1V+c7UUQIDAQAB",
  8. "properties":{
  9. "connection-url":"jdbc:mysql://localhost:3306",
  10. "connection-user":"root",
  11. "connection-password":"iRSxl1KNY06d34JGLooey0re4akzr+iJlTz1eCK1hEq8aYaX1SlzANCF7KTq6o2cF71OjINGvNjR0DXRed6gu3QYODw1Src0wiY0OvO9xfcffVt2rFvM/o238MJz1yhIcPn1BrrEgW5qVjzbbvzkS/fX+pTDqKNGAd3qefDLCuc=",
  12. "encrypted-properties":"connection-password",
  13. }
  14. }
  15. '
  • securityKey: 私钥.
  • connection-password: 使用私钥加密后的密码密文.
  • encrypted-properties: 加密的属性名称.

可以从 动态目录 查看更多信息.