当使用Ivy和私有公司仓库时,我应该把我的凭证放在哪里?

16

我正在使用Ant+Ivy,我们公司最近为自己的私有库建立了一个Nexus服务器。通过使用ibilio解析器和m2compatible=true,Ivy可以从Nexus服务器获取依赖项,但我必须在ivysettings.xml文件中放置我的凭据。

不同的开发人员应该如何存储他们的凭据?

ivsettings.xml文件是否不应该提交到版本控制系统中?

我真的不想以明文形式存储我的密码。

4个回答

14

使用一个包含控制Nexus凭证的属性的设置文件:

<ivysettings>
    <property name="repo.host" value="default.mycompany.com" override="false"/>
    <property name="repo.realm" value="Sonatype Nexus Repository Manager" override="false"/>
    <property name="repo.user" value="deployment"  override="false"/>
    <property name="repo.pass" value="deployment123"  override="false"/>          

    <credentials host="${repo.host}" realm="${repo.realm}" username="${repo.user}" passwd="${repo.pass}"/>

    ..
    ..
</ivysettings>

在运行构建时,您可以指定真实的用户名和密码:

ant -Drepo.user=mark -Drepo.pass=s3Cret

更新/增强

将密码存储为文件系统属性需要加密。

Jasypt有一个命令行程序可以生成加密字符串:

$ encrypt.sh verbose=0 password=123 input=s3Cret
hXiMYkpsPY7j3aIh/2/vfQ==

这可以保存在构建的属性文件中:

username=bill
password=ENC(hXiMYkpsPY7j3aIh/2/vfQ==)
以下ANT目标将解密任何加密的ANT属性:
<target name="decrypt">
    <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="build.path"/>

    <groovy>
    import org.jasypt.properties.EncryptableProperties
    import org.jasypt.encryption.pbe.StandardPBEStringEncryptor

    StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor()
    encryptor.setPassword(properties["master.pass"])

    Properties props = new EncryptableProperties((Properties)properties, encryptor);

    props.propertyNames().each {
        properties[it] = props.getProperty(it)
    }
    </groovy>
</target>
当然,要使这个工作正常运行,加密属性所使用的密码需要作为构建的一部分进行指定。
ant -Dmaster.pass=123

这意味着该解决方案仅适用于隐藏静态数据。


1
只是提醒一下,仍然可以在~/.bash_history文件中挖掘敏感信息。 - om-nom-nom
@om-nom-nom 是的,解决方案还远非完美。 - Mark O'Connor

12

出于我的目的,命令行凭据不是一个选项,因为我正在通过Jenkins运行,并且它们会清晰地粘贴在构建输出上,所以这是我的解决方案,通过合理安全来达到平衡。

  • 在您的主目录中创建一个包含敏感信息的属性文件(我们将其称为“maven.repo.properties”)

repo.username=admin
repo.password=password
  • 在您的构建文件顶部附近,导入属性文件

  • <property file="${user.home}/maven.repo.properties"/>
    
  • 在build.xml中的发布目标下,设置ivy设置文件的位置(该文件会被检入代码控制),但嵌入您的凭证属性。

  • <target name="publish">
        <ivy:settings file="ivysettings.xml">
            <credentials host="repohostname" realm="Artifactory Realm" username="${repo.username}" passwd="${repo.password}"/>
        </ivy:settings>
        <!-- ivy:makepom and ivy:publish targets go here -->
    </target>
    
  • 按照之前的方式创建ivysettings.xml文件,但是删除username和passwd属性。

  • 然后利用操作系统的权限确保maven.repo.properties文件只有你(或你的自动化构建实现)可以看到。


    这让我意识到,在为“Jfrog Artifactory”指定凭据时,领域必须完全是“Artifactory Realm”。 - devatherock

    2

    马克·奥康纳(Mark O'Connor)在他的回答中提供的ivysettings.xml示例实际上应该如下所示:

    <ivysettings>
      <property name="repo.host" value="default.mycompany.com" override="false"/>
      <property name="repo.realm" value="Sonatype Nexus Repository Manager" override="false"/>
      <property name="repo.user" value="deployment"  override="false"/>
      <property name="repo.pass" value="deployment123"  override="false"/>          
    
      <credentials host="${repo.host}" realm="${repo.realm}" username="${repo.user}" passwd="${repo.pass}"/>
    
      ..
    </ivysettings>
    

    意思是,属性名称不应该被${...}包围(我花了很长时间才发现这个失败的原因 - 但现在我知道如何调试ivy访问 - 使用commons-httpclient-3.0,将所有内容设置为详细等级)。

    这与Mark的答案有何不同?另外,您所说的“使用commons-httpclient-3.0”是什么意思?将什么设置为详细模式(Ant?Ivy?)? - Shane Gillis
    编辑人:Manfred Moser,2015年5月22日,我只是复制了我的答案。然而,这是相当久远的事情了,我最近没有使用过ant/ivy。commons-httpclient已经几年没有更新了,原始的commons-httpclient在mvn中心的最新版本是2007年8月21日的3.1版本。很可能当时ivy有一个httpclient依赖项。但是请随意进行一些研究... - Remigius Stalder

    0
    除了Mark O'Connor的答案之外,您还可以通过将这些属性放入antrc启动文件或由ant使用的环境变量中,来隐藏密码,使其在日常工作和同事的窥视下不可见。请注意,无论放在哪个地方,它们都不是非常安全。

    如果我真的对密码以明文保存感到非常担心,我会编写一个ANT任务,从属性文件中读取加密副本。请参阅http://www.jasypt.org/encrypting-configuration.html。 - Mark O'Connor

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接