安装程序使用docker保护Jenkins master

时间:2015-04-20 17:55:32

标签: ssl jenkins https amazon-ec2 docker

我想在带有docker的ec2上设置一个安全的Jenkins主服务器。 我在这里使用标准的jenkins docker文件:https://registry.hub.docker.com/_/jenkins/

默认情况下,它会打开一个不安全的8080 http端口。但是我希望它使用带https的标准443端口(起初我想使用自签名证书)。

我在这个主题上进行了一些研究,发现了几种可能的解决方案。我对docker并不是很熟悉,所以我仍然无法找到一个我可以使用或实现的简单版本。以下是我发现的一些选项:

有人可以体验请向我推荐最佳解决方案吗?

P.S。我不确定ec2会给我带来多少麻烦,但我认为它只是在安全组中打开443。

4 个答案:

答案 0 :(得分:17)

在Docker上传递了一些教程之后,我发现最简单的选项是2号.Jenkins docker image以一种你可以轻松地将参数传递给jenkins的方式声明入口点。

假设您在ubuntu ec2实例的主文件夹中将您的密钥库(例如,在此示例中为自签名)作为jenkins_keystore.jks。以下是如何生成一个的示例:

keytool -genkey -keyalg RSA -alias selfsigned -keystore jenkins_keystore.jks -storepass mypassword -keysize 2048

现在,您可以轻松地将jenkins配置为仅在https上运行,而无需创建自己的docker镜像:

docker run -v /home/ubuntu:/var/jenkins_home -p 443:8443 jenkins --httpPort=-1 --httpsPort=8443 --httpsKeyStore=/var/jenkins_home/jenkins_keystore.jks --httpsKeyStorePassword=mypassword
  • -v /home/ubuntu:/var/jenkins_home将主机主文件夹公开给jenkins docker容器
  • -p 443:8443将容器中的8443 jenkins端口映射到主机的443端口
  • --httpPort=-1 --httpsPort=8443阻止jenkins http并在容器内的端口8443上使用https公开它
  • --httpsKeyStore=/var/jenkins_home/jenkins_keystore.jks --httpsKeyStorePassword=mypassword提供已从主机主文件夹映射到容器/var/jenkins_home/文件夹的密钥库。

答案 1 :(得分:2)

otognan一样,我也建议做#2,但看来他的答案已经过时了。

首先,使用jenkins/jenkins:lts图片,因为jenkins图片已弃用(请参见https://hub.docker.com/_/jenkins/

现在,让我们进行设置。您需要停止当前的jenkins容器以释放端口。

首先,您需要一个证书密钥库。如果您没有密码,则可以使用

创建一个自签名密码。
keytool -genkey -keyalg RSA -alias selfsigned -keystore jenkins_keystore.jks -storepass mypassword -keysize 4096

接下来,我们将SSL参数传递到jenkins容器中。这是我用来执行此操作的脚本:

read -s -p "Keystore Password:" password
echo
sudo cp jenkins_keystore.jks /var/lib/docker/volumes/jenkins_home/_data
docker run -d -v jenkins_home:/var/jenkins_home -v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -p 443:8443 -p 50000:50000 jenkins/jenkins:lts --httpPort=-1 --httpsPort=8443 --httpsKeyStore=/var/jenkins_home/jenkins_keystore.jks --httpsKeyStorePassword=$password
  • 此脚本提示用户输入密钥库密码
  • -v jenkins_home:/var/jenkins_home创建一个名为jenkins_home的命名卷,根据约定该卷恰好存在于/var/lib/docker/volumes/jenkins_home/_data处。
    • 如果/var/lib/docker/volumes/jenkins_home/_data上的目录尚不存在,则需要在复制密钥库之前使用docker volume创建命名卷。
  • -p 443:8443将容器中的8443 jenkins端口映射到主机的443端口
  • --httpPort=-1 --httpsPort=8443阻止http并在容器内部的端口8443(容器外部的端口443)上显示https。
  • --httpsKeyStore=/var/jenkins_home/jenkins_keystore.jks --httpsKeyStorePassword=$password提供了密钥库,该密钥库位于容器内部的/var/jenkins_home/jenkins_keystore.jks(容器外部的/var/lib/docker/volumes/jenkins_home/_data/jenkins_keystore.jks)。
  • -v /var/run/docker.sock:/var/run/docker.sock是可选的,但是允许您的jenkins实例启动其他Docker容器的推荐方法。
  • -v $(which docker):/usr/bin/docker也是可选的,但允许您的jenkins容器能够运行docker二进制文件。
    • 请注意,由于docker现在是动态链接的,因此它不再附带依赖项,因此可能需要您在容器中安装依赖项。
    • 另一种方法是省略-v $(which docker):/usr/bin/docker并将docker安装在jenkins容器中。您需要确保内部容器docker和外部主机docker是同一版本,以便支持通过/var/run/docker.sock进行的通信。
    • 无论哪种情况,您都可能想使用Dockerfile创建新的Jenkins Docker映像。
    • 另一种替代方法是包括-v $(which docker):/usr/bin/docker,但在主机上安装静态链接的docker二进制文件。

您现在应该可以在没有端口说明符的情况下通过https访问jenkins Webportal(因为https默认为端口443)

感谢otognan让我参与其中。

答案 2 :(得分:0)

我会在同一容器中使用nginx和jenkins,并使用supervisord来管理这两个进程。使用内置工具保护不同的服务是一件痛苦的事。 nginx对所有服务的工作方式相同,并且易于配置。在某些方面,使用docker-compose(无花果)来创建两个不同的容器并将它们与docker提供的相当内部网络连接起来是可能的,并且更好。问题是,像马拉松这样的集群管理器仍然不能很好地支持一起运行工作对。告诉大多数服务运行单个容器,而不是运行两个容器,但要确保它们位于同一主机上要容易得多。

答案 3 :(得分:0)

我知道这是一个非常古老的话题,但我想分享一篇详细介绍反向代理选项的博客文章:https://itnext.io/setting-up-https-for-jenkins-with-nginx-everything-in-docker-4a118dc29127

Jenkins 建议在文档中设置反向代理。乍一看,这似乎是一项额外的工作,但它也是与 CI/CD 环境相关的其他服务(即 SonarQube)的通用解决方案。