当涉及处理机密信息(如密码、令牌、密钥文件等)等,以下问题值得考虑:安全性十分重要,但高安全性往往伴随着高度的不便。在团队中,共享某些密钥有时无法避免(因此现在我们需要考虑在多人之间分发和更新密钥的安全方法)。具体的密钥通常取决于环境。 目前市面上已经存在许多较为成熟的密钥管理产品,比如HashiCorpVault,AWSSecretsManager以及GCPSecretManager。由于这些产品需要集成和维护等服务,因此在项目中引入会增加一定的成本和开销。阅读本文,将带你了解如何在Docker容器中设置gitsecret和gpg。 本文将对以下几点展开讲解:识别包含密钥的文件确保将密钥添加到。gitignore通过gitsecret进行加密将加密文件提交到存储库 在最后我们将能够调用:makesecretdecrypt 这将会披露代码库中的密钥,在必要时对其进行修改,然后运行:makesecretencrypt 需要再次加密密钥,以便提交(并推送到远程存储库),要查看实际效果请运行以下命令:checkoutthebranchgitcheckoutpart6gitsecretencryptrepositorydockerbuildandstartthedockersetupmakemakeinitmakedockerbuildmakedockerupcreatethesecretkeythefilesecret。gpg。examplewouldusuallyNOTliveintherepo!cpsecret。gpg。examplesecret。gpginitializegpgmakegpginitensurethatthedecryptedsecretfiledoesnotexistlspasswords。txtdecryptthesecretfilemakesecretdecryptshowthecontentofthesecretfilecatpasswords。txtTooling 我们在PHPbase镜像中设置gpg和gitsecret以便这些工具在所有其他容器中都可用。以下所有命令都在application容器中执行。 请注意,gitsecret在主机系统和docker容器之间共享的文件夹中使用时需要注意。将在下面称为gitsecret目录和gpgagentsocket的部分中更详细地解释这一点。gpg gpg是TheGNUPrivacyGuard的缩写,是OpenPGP标准的开源实践。简而言之,GNU允许我们创建一个个人密钥文件对(类似于SSH密钥),其中包含一个私有密钥和一个可以与您想要解密其消息的其他方共享的公共密钥。 gpg安装 关于安装,我们可以简单地运行apkaddgnupg并相应更新。dockerimagesphpbaseDockerfile:File:。dockerimagesphpbaseDockerfileRUNapkaddupdatenocachebashgnupgmake。。。创建gpg密钥对 我们需要通过以下方式创建gpg密钥对(KeyPair):namePascalLandauemailpascal。landauexample。comgpgbatchgenkeyEOFKeyType:1KeyLength:2048SubkeyType:1SubkeyLength:2048NameReal:nameNameEmail:emailExpireDate:0noprotectionEOF noprotection创建一个没有密码的key。 输出:namePascalLandauemailpascal。landauexample。comgpgbatchgenkeyEOFKeyType:1KeyLength:2048SubkeyType:1SubkeyLength:2048NameReal:nameNameEmail:emailExpireDate:0noprotectionEOFgpg:keyE1E734E00B611C26markedasultimatelytrustedgpg:revocationcertificatestoredasroot。gnupgopengpgrevocs。d74082D81525723F5BF5B2099E1E734E00B611C26。rev 也可以在没有batch标志的情况下以交互方式引导整个过程运行gpggenkey,然后导出、列出和导入私有gpgKey,可以通过以下方式导出:emailpascal。landauexample。compathsecret。gpggpgoutputpatharmorexportsecretkeyemail 记住不能共享此密钥。BEGINPGPPRIVATEKEYBLOCKlQOYBF7VVBwBCADo9unSySuInHSkPDpFVKuZXgs4BbZmqFtYjvUUSoRAeSejvG21nwttQGutFGdpDJL6W4pmLS31Kxpt6LCAxhIDPRYiJQ4k3inJfeUx7Ws339XDPO3RysCmnZchcEgnbOfQlEqo51DMj6mRF2Ra6svh7lqhrixGx1BaKn6VlHkC。。。ncIcHxNZt7eK644nWDn7j52HsRiwcWsZ9mjkUgZLtyMPJNB5qlKQ18QgVdEAhuZxT3SieoBPdtZikhu3BqyIifmLnxOJOjOIhbQrgFiblvzU1iOUOTOcSIB7AYmRmENDPGPPRIVATEKEYBLOCK 所有密钥都可以通过以下方式列出:gpglistsecretkeys 输出:gpglistsecretkeysroot。gnupgpubring。kbxsecrsa204820220327〔SCEA〕74082D81525723F5BF5B2099E1E734E00B611C26uid〔ultimate〕PascalLandaupascal。landauexample。comssbrsa204820220327〔SEA〕 可以通过以下方式导入私钥:pathsecret。gpggpgimportpath 得到以下输出:pathsecret。gpggpgimportpathgpg:keyE1E734E00B611C26:PascalLandaupascal。landauexample。comnotchangedgpg:keyE1E734E00B611C26:secretkeyimportedgpg:Totalnumberprocessed:1gpg:unchanged:1gpg:secretkeysread:1gpg:secretkeysunchanged:1 注意:如果secretkey需要密码,这里会提示输入密码。我们可以使用以下方法绕过提示batchyespinentrymodeloopback:pathsecret。gpggpgimportbatchyespinentrymodeloopbackpath 目前还不需要提供密码,但需要在稍后尝试解密文件时提供。 导出、列出和导入gpg公钥,可以通过以下方式导出public。gpg:emailpascal。landauexample。compathpublic。gpggpgarmorexportemailpath 导出如下:BEGINPGPPUBLICKEYBLOCKmQENBF7VVBwBCADo9unSySuInHSkPDpFVKuZXgs4BbZmqFtYjvUUSoRAeSejvG21nwttQGutFGdpDJL6W4pmLS31Kxpt6LCAxhIDPRYiJQ4k3inJfeUx7Ws339。。。3LLbK7Qxz0cV12K7Bn2ei466QAYXo03a7WlsPWn0JTFCsHoCOphjaVsncIcHxNZt7eK644nWDn7j52HsRiwcWsZ9mjkUgZLtyMPJNB5qlKQ18QgVdEAhuZxT3SieoBPdtZikhu3BqyIifmLnxOJOjOIhbQrgFiblvzU1iOUOTOcSIB7Ag0hFENDPGPPUBLICKEYBLOCK 通过以下方式列出所有公钥:gpglistkeys 输出:gpglistkeysroot。gnupgpubring。kbxpubrsa204820220327〔SCEA〕74082D81525723F5BF5B2099E1E734E00B611C26uid〔ultimate〕PascalLandaupascal。landauexample。comsubrsa204820220327〔SEA〕 通过以下方式以与私钥相同的方式导入公钥:pathpublic。gpggpgimportpath 例如:gpgimportvarwwwapppublic。gpggpg:keyE1E734E00B611C26:PascalLandaupascal。landauexample。comnotchangedgpg:Totalnumberprocessed:1gpg:unchanged:1gitsecret gitsecret的官方网站可以找到详细介绍该工具的内容。gitsecret允许将某些文件声明为secret并通过gpg加密。然后可以将加密的文件直接安全地存储在Git存储库中,并在需要时进行解密。本文使用gitsecretv0。4。0:gitsecretversion0。4。0gitsecret安装 Alpine的安装说明如下:shcechohttps:gitsecret。jfrog。ioartifactorygitsecretapkallmainetcapkrepositorieswgetOetcapkkeysgitsecretapk。rsa。pubhttps:gitsecret。jfrog。ioartifactoryapisecuritykeypairpublicrepositoriesgitsecretapkapkaddupdatenocachegitsecret 。dockerimagesphpbaseDockerfile进行更新:File:。dockerimagesphpbaseDockerfileinstallgitsecretseehttps:gitsecret。ioinstallationalpineADDhttps:gitsecret。jfrog。ioartifactoryapisecuritykeypairpublicrepositoriesgitsecretapketcapkkeysgitsecretapk。rsa。pubRUNechohttps:gitsecret。jfrog。ioartifactorygitsecretapkallmainetcapkrepositoriesapkaddupdatenocachebashgitsecretgnupgmake。。。gitsecret用法 初始化gitsecret gitsecret通过在Git存储库的根目录中运行的以下命令进行初始化。gitsecretinitgitsecretinitgitsecret:initcreated:varwwwapp。gitsecret 只需这样操作一次,稍后会把文件夹提交到Git,将包含以下文件:gitstatusgrep。gitsecretnewfile:。gitsecretkeyspubring。kbxnewfile:。gitsecretkeyspubring。kbxnewfile:。gitsecretkeystrustdb。gpgnewfile:。gitsecretpathsmapping。cfg 该pubring。kbx文件(带有波浪号)只是一个临时文件,可以安全地被git忽略。 gitsecretDirectory和gpgagentSocket 要gitsecret在主机系统和Docker之间共享的目录中使用,还需要运行以下命令:tee。gitsecretkeysS。gpgagentEOFAssuansockettmpS。gpgagentEOFtee。gitsecretkeysS。gpgagent。sshEOFAssuansockettmpS。gpgagent。sshEOFtee。gitsecretkeysgpgagent。confEOFextrasockettmpS。gpgagent。extrabrowsersockettmpS。gpgagent。browserEOF 这一步很必要,因为gitsecret在主机系统和Docker容器之间共享代码库的设置中使用时存在问题,具体如下:gpg使用gpgagent来执行其任务,这两个工具通过在pgpagent的homedirectory中创建的套接字进行通信。代理通过gitsecret使用的gpg命令隐式启动,使用。gitsecretkeys目录作为homedirectory。由于homedirectory的位置与主机系统共享,因此套接字创建将失败。 对应的错误信息是:gpg:cantconnecttotheagent:IPCconnectcallfailedgpgagent:errorbindingsockettovarwwwapp。gitsecretkeysS。gpgagent:IOerror 解决此问题,可以通过将其他gpg配置文件放在。gitsecretkeys目录中,将gpg配置为对套接字使用不同的位置: S。gpgagentAssuansockettmpS。gpgagent s。gpgagent。sshAssuansockettmpS。gpgagent gpgagent。confextrasockettmpS。gpgagent。extrabrowsersockettmpS。gpgagent。browser添加、列出和删除用户 要添加新用户,必须首先导入其公共gpg密钥。然后运行:emailpascal。landauexample。comgitsecrettellemail 在这种情况下,用户pascal。landauexample。com现在将能够解密这些密钥。要显示用户请运行:gitsecretwhoknowsgitsecretwhoknowspascal。landauexample。com 要删除用户,请运行:emailpascalexample。comgitsecretkillpersonemail 这时此命令在gitsecret0。5。0中已重命名为removepersongitsecretkillpersonpascal。landauexample。comgitsecret:removedkeys。gitsecret:now〔pascal。landauexample。com〕donothaveanaccesstotherepository。gitsecret:makesuretohidetheexistingsecretsagain。 用户pascalexample。com将无法再解密这些密钥。 注意删除用户后需要重新加密机密,并轮换加密的密钥。 添加、列出和删除文件以进行加密 运行gitsecretadd〔filenames。。。〕来为文件加密:gitsecretadd。env 如果。env没有被添加到。gitignore,gitsecret将显示警告并自动添加。gitsecret:thesefilesarenotin。gitignore:。envgitsecret:autoaddingthemto。envgitsecret:1item(s)added。 如已添加,则添加文件时不会发出警告。gitsecretadd。envgitsecret:1item(s)added。 只需要添加一次文件。然后将它们存在。gitsecretpathsmapping。cfg:cat。gitsecretpathsmapping。cfg。env:505070fc20233cb426eac6a3414399d0f466710c993198b1088e897fdfbbb2d5 还可以通过以下方式显示添加的文件:gitsecretlistgitsecretlist。env 需要主要的是,这个时候文件尚未加密,如果要从加密中删除文件,请运行:gitsecretlistgitsecretlist。env 输出:gitsecretremove。envgitsecret:removedfromindex。gitsecret:ensurethatfiles:〔。env〕arenownotignored。加密文件 要加密文件,请运行:gitsecrethide 输出:gitsecrethidegitsecret:done。1of1filesarehidden。 所有通过gitsecrettell被添加的用户能够解密这些已经加密的文件,这也意味着每当添加新用户时,您都需要再次运行此命令。解密文件 可以通过以下方式解密文件:gitsecretreveal 输出:gitsecretrevealFilevarwwwapp。envexists。Overwrite?(yN)ygitsecret:done。1of1filesarerevealed。文件被解密并将覆盖当前未加密的文件。使用f选项强制覆盖并以非交互方式运行。如果只想检查加密文件的内容,可以使用gitsecretcatfilename例如,gitsecretcat。env。 当gpg密钥受密码保护时,需要通过p选项传递密码。以下是密码示例123456:gitsecretrevealp123456显示加密和解密文件间的变化 加密文件的一个问题是,无法在远程工具的代码审查期间审查加密文件。为了了解进行了哪些更改,显示加密文件和解密文件之间的更改能够帮助解决这个问题。可以通过以下方式完成:gitsecretchanges 输出:echofoo。envgitsecretchangesgitsecret:changesinvarwwwapp。env:devfd63varwwwapp。env34,334,4MAILENCRYPTIONnullMAILFROMADDRESSnullMAILFROMNAME{APPNAME}foo 注意底部的foo。它是通过在第一行echofoo。env添加的。 本文是gitsecret用法的上篇,在下篇中我们将会介绍gitsecret的初始设置、Makefile调整等内容,保持关注哦