代码之家  ›  专栏  ›  技术社区  ›  BillLoot

在sqoop中传递密码的安全方法

  •  1
  • BillLoot  · 技术社区  · 10 年前

    我担心sqoop批处理中数据库密码的安全性(无交互输入)。

    在过去,对于sqoop批处理,唯一能做的就是在命令行上使用 --password ,但是密码很容易用一个简单的 ps 命令

    现在我们有了 --password-file 选项,但它需要在磁盘上存储未加密的密码,这不是一种真正的“安全”做法,也不是很方便为单个参数设置单独的文件。

    我正在考虑将加密的密码存储在一个配置文件中,并对其进行动态解密,将其存储在临时文件中,设置权限(使用chmod命令),调用sqoop,然后删除该文件。。。但我可能会错过一个不那么麻烦的方式?你是怎么处理的?

    2 回复  |  直到 10 年前
        1
  •  2
  •   Community Stefan Steinegger    7 年前

    @在2015年3月的stackoverflow 23916985回复中,阿贝亚马斯目前给出了最好的答案 here 。本质上,我们应该升级到sqoop>1.4.5并使用java密钥库(JKES)、org.apache.sqoop.util.password.CryptoFileLoader或我们自己类中定义的加载器。

    提供的CryptoFileLoader有一个缺点,即假定加密密码短语和salt将作为-D参数提供,以驱动系统财产(可以通过ps进行监听)或配置XML中的纯文本。

    我最初在 this 2015年3月的博客,之前错过了它(它没有标题,但如果你看第3步第2部分,你会发现它)。

    令人惊讶的是,这不是推荐的做法,也没有出现在sqoop 1.4.5文档中。

        2
  •  1
  •   Arnaud    10 年前

    --password-file 选项,我为sqoop制作了一个补丁,以便在使用 -P 命令

    这样,我就可以从配置文件中解密密码,并使用stdin管道使用该密码调用sqoop,而无需使用可以看到纯密码的文件或命令行。

    编辑文件 src/java/org/apache/sqoop/SqoopOptions.java

    更换 securePasswordEntry 函数代码依据

    private String securePasswordEntry() {
    try {
      return new String(System.console().readPassword("Enter password: "));
    }
    // PATCH Bouygues Telecom - read password from pipe if launched in non-interactive mode
    catch (NullPointerException e) {    
        try {
            final java.io.BufferedReader reader = new java.io.BufferedReader(
                                new java.io.InputStreamReader(System.in));
            return reader.readLine();
        }
        catch (java.io.IOException excep) {      
            LOG.error("It seems that you have launched a Sqoop metastore job via");
            LOG.error("Oozie with sqoop.metastore.client.record.password disabled.");
            LOG.error("But this configuration is not supported because Sqoop can't");
            LOG.error("prompt the user to enter the password while being executed");
            LOG.error("as Oozie tasks. Please enable sqoop.metastore.client.record");
            LOG.error(".password in sqoop-site.xml, or provide the password");
            LOG.error("explicitly using --password in the command tag of the Oozie");
            LOG.error("workflow file.");
        }
        return null;
      }
    }
    

    麻烦的是必须重新修补Sqoop的每一个新版本。。。我可能应该提交一个jira(对我的补丁会被考虑在内的信心很低),或者按照您想要的方式转到--password文件选项。