我正在使用Ant + Ivy,我的公司最近为我们自己的私人图书馆建立了一个Nexus服务器。Ivy可以通过使用ibilio解析器和m2compatible=true从Nexus服务器获取依赖项,但我必须将我的凭据放在ivysettings.xml文件中。
不同的开发人员应该如何存储他们的凭据?
ivysettings.xml文件不应该在vcs中提交吗?
我真的不想以明文形式存储我的密码
使用带有控制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
这意味着该解决方案只适用于隐藏静态数据。
出于我的目的,命令行凭证不是一个选项,因为我正在运行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文件被正确地隐藏,除了您(或您的自动构建实现)。
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>
表示,属性名不应该被${…}(我花了很长时间才找到失败的原因-但现在我知道如何调试常春藤访问-使用commons-httpclient-3.0,将所有内容设置为verbose等)
除了Mark O'Connor的答案之外,您还可以通过将这些属性放入antrc启动文件或ant使用的环境变量中来隐藏密码,以避免日常工作和同事的窥探。请注意,它们在任何地方都不是很安全。