如今云时代流行,云和容器已经成为日常工作的一部分。这涉及到一个安全问题。在使用容器的过程中,经常需要构建镜像,然后推送到公共存储(不要为私有项目存储大型公共注册中心),这可能涉及一些敏感信息和机密数据泄露。如IP地址、密码、私钥等信息。在本文中,我们将讨论如何在实践中避免敏感信息泄露。概述容器和Docker让我们的日常生活更加方便,但同时也很容易不小心将一些信息泄露给公众,造成安全问题。如果配置不当,密码、云凭据和SSH私钥可能会意外泄露。除非建立一套安全事件策略和全面的保护措施,否则某些情况:Codecov供应链攻击:2021年4月1日,由于CodecovDocker文件配置错误,攻击者可以窃取凭证并修改客户使用的BashUploader脚本。使用恶意代码修改Bash上传器,并将从某些客户的CI/CD环境中收集的环境变量和密钥泄露到攻击者控制的服务器。受此事件影响,HashiCorp用于签发签名和验证的GPG密钥被泄露,并采用轮换机制定期更换私钥。由于DockerHub公共映像导致的其他泄漏包括(但不限于):AWS帐户和凭据、SSH私钥、Azure密钥、.npmrc令牌、DockerHub帐户、PyPI存储库密钥、SMTP服务器身份验证信息、eCAPTCHA密码、TwitterAPIkeys,Jirakeys,Slackkeys,andafewothers,etc.COPY方法DockerFile语法中常见的COPY方法:FROMdebian:busterCOPY./app默认情况下,该语句会将当前目录的所有内容复制到镜像中。这些可能包含带有敏感信息的文件:例如site.env。一旦敏感信息被放入Docker镜像中,任何有权访问该镜像的人都可以看到。为防止因COPY而泄露敏感信息:限制复制的内容:只复制必要的特定文件或目录。例如,COPYsetup.pymyapp/app。.dockerignore:使用.dockerignore保证敏感文件不复制到镜像中,典型配置:NOTICEREADME.mdLICENSEAUTHORS.mdCONTRIBUTING.md.vscode/vendor/env/ENV/build/dist/target/downloads/eggs/.eggs/lib/lib64/parts/sdist/var/Dockerfile.git.editorconfig*.egg-info/.installed.cfg*.egg*.manifest*.spec.gcloudignore.gitignore.tox/.dockerignore.coverage.coverage.*.cachehtmlcov/nosetests.xmlcoverage.xml*,cover.hypothesis/ssh/id_rsa.git-credentialsconfig.*避免手动生成图片:相对于CICD自动生成系统,开发环境更容易涉及敏感文件,因此开发环境中手动生成的公共镜像更容易泄露。使用CI环境变量:如果CI或构建环境需要保密信息,需要在环境变量中配置,而不是通过文件访问。镜像编译有时需要在构建Docker镜像时使用机密,例如访问私有包存储库的密码。FROMpython:3.9RUNpipinstall\--extra-index-urlUser:pass@priveapk.example\packageprivatepackage直接在url中包含了用户名和密码,会直接导致其泄露。可以通过环境变量的形式申请:exportMYSECRET=secretpasswordexportDOCKER_BUILDKIT=1dockerbuild--secret--secretid=mysecret,env=MYSECRET。容器运行时需要访问一些密码,例如访问数据库的凭据。相同的运行时秘密不能直接存储在图像中。除了镜像内容的意外泄露,镜像中存储的配置也与环境绑定,导致镜像难以灵活运行。有几种方法可以在容器运行时将秘密传递给容器:使用环境变量。与机密文件绑定的卷。编排系统(如K8S)的密码管理机制。在公共云环境中,云环境变量和授权是可用的。比如AWS的IAM角色管理。外部密钥库。通过上述机制,可以防止运行时敏感信息被存储在图像本身中。安全扫描除了上面的一些管理策略外,还有一种主动的方式就是自动进行安全扫描。市面上有很多密码扫描工具,可以扫描目录或者Git仓库,如果有敏感信息会直接报警。比如detect-secrets,trufflehog还有扫描镜像的工具,比如pentester可以扫描DockerHub镜像,发现问题。总结在本文中,我们讨论了容器敏感信息防泄露的一些安全方法,包括基本语法、镜像编译、运行时和安全扫描方法。综合运用这些方法和策略,可以有效防止容器在使用过程中敏感信息的泄露,从而提高安全性。
