本文通过Jenkins+Docker+Git搭建了CI/DI环境,着重讲解Jenkins构建配置。

起因

2020年6月11日,突然被腾讯云通知,系统中存在木马文件,还好只是刚搭建的用于开发测试的服务器。打开腾讯云先尝试用官方提示的安全工具隔离文件,但是隔离了又冒出新的木马文件。综合考虑一下,因为是刚搭建的测试环境,只是用maven插件上传镜像到远程docker运行,为了避免造成更多的问题,先把服务器停机,对问题进行排查。

发现可能是开放docker端口导致病毒文件被上传到服务器中,考虑时间成本与安全性问题,决定重装服务器并搭建 CI/DI环境。

操作步骤

项目配置

  1. Docker 远程连接,推送镜像到远程私库。

    注:需要采用证书验证端口,否则会容易被黑。添加证书校验详见Docker服务开放了这个端口,服务器分分钟变肉机!

Maven打包插件配置

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>${docker.maven.plugin.version}</version>
    <executions>
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <imageName>fatdown/${project.name}:${project.version}</imageName>
        <!--远程 docker 地址-->
        <dockerHost>${docker.host}</dockerHost>
        <baseImage>java:8</baseImage>
        <entryPoint>["java", "-jar","-Dspring.profiles.active=prod","/${project.build.finalName}.jar"]
        </entryPoint>
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

安装软件

  • Jenkins :CI/DI 软件。
  • docker :容器软件。
  • docker register :私有镜像库。

这里讲一下如何安装Jenkins,其他软件安装详见 mall在Linux环境下的部署(基于Docker容器)

Win10环境

通过如下链接下载并安装,默认启动地址为 localhost:8080

https://mirrors.ustc.edu.cn/jenkins/windows-stable/

Linux环境

先安装docker,在下载 Jenkins 镜像并运行,默认启动地址也是 localhost:8080

yum install docker-ce

systemctl start docker

docker pull jenkins/jenkins:lts

docker run -p 8080:8080 -p 50000:5000 --name jenkins \
-u root \
-v /mydata/jenkins_home:/var/jenkins_home \
-d jenkins/jenkins:lts

启动登录后如图

image-20200930224421962

新建Item,配置构建

以Win10环境为例,演示如何配置构建。

  1. 安装插件publish over ssh,用于连接其他服务器,执行构建脚本。
  2. 安装Role-based Authorization Strategy,用于管理Jenkins用户。
  3. 配置Git用户信息,用于获取远程代码。
  4. 执行脚本,在Docker运行项目。

其中运行脚本fatdown-admin.sh,如下

#!/usr/bin/env bash
app_name='fatdown-admin'
docker stop ${app_name}
echo'----stop container----'
docker rm ${app_name}
echo'----rm container----'
docker run -p 8088:8088 --name ${app_name} \
--link mysql:db \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/${app_name}/logs:/var/logs \
-d fatdown/${app_name}:0.0.1-SNAPSHOT
echo'----start container----'

脚本 rmUselessImages.sh用于清除无名镜像,如下:

docker rmi -f  `docker images | grep '<none>' | awk '{print $3}'`
echo '----rm useless images----'

image-20200930230037759

image-20200930230401363

image-20200930230517679

至此,我们点击构建即可自动部署应用到服务器并运行。后续配置触发器后可以做到PR合并自动触发自动部署,极大的减轻了应用部署的工作量。

Tips

  1. ssh连接远程服务器失败:检查是否已安装publish over ssh插件,安装后重启。

总结

对本次被黑进行简单总结,搜索总结了,网上常用提高安全性措施。

  1. 取消远程用户账号密码登录方式;ssh远程登录端口修改为不常用端口;密码设置复杂,降低暴力破解成功率。
  2. 谨慎开放端口,建议只对特定ip地址开放。
  3. 端口开放需要验证。