【甲方安全建设】DevOps初体验

admin 2024年2月5日13:53:46评论12 views字数 8623阅读28分44秒阅读模式

由于微信公众号推送机制改变了,快来点个关注不再迷路,谢谢大家!

【甲方安全建设】DevOps初体验

免责声明

由于传播、利用本公众号所发布的而造成的任何直接或者间接的后果及损失,均由使用者本人承担。LK安全公众号及原文章作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!

前言

临近春节,笔者经过半年北漂,实习期间辗转几家公司,同时也接触了几种不同岗位,也算对安全有了个初步的了解。目前在一家公司做安全开发相关实习,期间接触到一些比较有意思的技术,特此记录一下之前写一些小的工具,无论是Bash、Python还是Java,都是顶多几百行的工作量,感觉不到开发的魅力,也没有开发和安全相结合的感觉,后面在公司有机会写一下完整的系统,以及后续的部署发布,体验到了创造的魅力(增删改查 hah)。

传统的开发方式

一开始写的时候,技术选型是SpringBoot+SpringSecurity+MyBatis+thymeleaf,前后端不分离直接java -jar project.jar直接运行了,似乎其他的也不需要考虑,后面了解到"防御型编程"(开玩笑的),直接将项目进行前后端分离SpringBoot+Vue(为什么选Vue?因为公司前端用的React),后端提供接口文档给前端,这样开发出来的项目,后端与前端单独运行。将前端静态代码放在Nginx中,配置个反向代理啥的,这样项目也能跑起来。

【甲方安全建设】DevOps初体验

nginx目录放置静态代码

【甲方安全建设】DevOps初体验

Docker-解决环境问题

后面接触到了Docker 感觉容器化部署也不错,也不需要管Jdk版本,数据库版本啥的,部署起来简直不要太舒服,直接一个DockerFile就跑起来了。

FROM ubuntu:latest
FROM openjdk:8

# 设置工作目录
WORKDIR /app

COPY /target/springboot-backend.jar /app

EXPOSE 22
EXPOSE 8080

LABEL authors="xxxxxx"
LABEL version="1.0"
LABEL description="I think therefore I am."

ENV IMAGE_NAME=secPlatform-springboot

#RUN apt-get update vim net-tools openssh-server

ENTRYPOINT ["java", "-jar","springboot-backend.jar"]

这样看似乎也没什么问题

【甲方安全建设】DevOps初体验

这里搭配IDEA食用更佳

后面发现一个一个拉镜像也挺麻烦的,Java后端的、Nginx前端的、Mysql数据库的、Redis数据库,还有需要一个portainer做监测吧(这里还是要注意下数据卷挂载问题),后面了解到Docker-Compose(单主机多容器)跟Docker Swam(多个主机容器集群 奈何资源有限),写个Docker-Compose 直接一键编排也确实挺香的。

version: "3"
services:
nginx:
  image: nginx:latest
  container_name: springboot-nginx
   restart: always
  ports:
     - 80:80
  volumes:
     - /data/Docker/Volumes/nginx/html:/usr/share/nginx/html
     - /data/Docker/Volumes/nginx/nginx.conf:/etc/nginx/nginx.conf
  privileged: true
mysql:
  image: mysql:8.2.0
  container_name: springboot-mysql
   restart: always
  ports:
     - 3306:3306
  environment:
     - MYSQL_ROOT_PASSWORD=xxxxxx
  volumes:
     - /data/Docker/Volumes/mysql/data:/var/lib/mysql
     - /data/Docker/Volumes/mysql/conf/conf.d:/etc/mysql/conf.d
redis:
  image: redis:latest
  container_name: springboot-redis
   restart: always
  command: redis-server /etc/redis/redis.conf --appendonly yes --requirepass xxxxxx
  ports:
     - 6379:6379
  volumes:
     - /data/Docker/Volumes/redis/conf:/etc/redis
     - /data/Docker/Volumes/redis/data:/data
  logging:
    driver: "json-file"
    options:
      max-size: "100m"
      max-file: "2"

backend:
  image: springboot-backend:1.0
  container_name: springboot-back
   restart: always
  build: .
  ports:
     - 8080:8080
     - 122:22
  environment:
     - TZ=Asia/Shanghai  # 设置时区为上海(GMT+8)

portainer:
  image: portainer/portainer
  container_name: portainer
   restart: always
  ports:
     - 9000:9000
     - 8001:8080
  volumes:
     - /var/run/docker.sock:/var/run/docker.sock
     - /data/Docker/Volumes/portainer/data:/data

【甲方安全建设】DevOps初体验

局限于服务器资源限制 说实话我其实想直接上K8s的(怎么着也要32g起步啊)。做完这些感觉还是不够 自己写的代码还是需要构建打包 然后每次都需要重新部署前端&后端容器,这些操作还是需要手动的操作 感觉还是不够人性化(这里感觉稍微别扭一点的就是容器间通信问题 当然最近还在琢磨)

==后面接触到了DevOps,CI、CD操作彻底解放双手==

DevOps-CI/CD走向流水线

DevOps经历了瀑布模型到敏捷模型的'进化',从传统的开发运维模型演变而来DevOps中的Dev指的是Development(开发),Ops指的是Operations(运维),用一句话来说,DevOps就是打通开发运维的壁垒,实现开发运维一体化。

【甲方安全建设】DevOps初体验

这里概念啥的不再重复,先上手再说,搭建环境的时候挺麻烦 不过好在已经习惯了找了一些课程看了看 感觉里面的一些工具什么的都是自己曾经做渗透测试的时候经常遇到的系统,比如说Gitlab、Jenkins、Grafana、Prometheus,当时就顾的找有没有历史漏洞,版本能不能对上,能不能复现,打没打补丁,也不太在意这个系统是干嘛的,现在看起来这些系统原来都在DevOps中扮演着不同的角色。相关工具使用:代码管理:Gitlab。

【甲方安全建设】DevOps初体验

构建工具:Maven 与JDK 通过数据卷映射到Jenkins_home下CI/CD(持续集成、持续部署):Jenkins

【甲方安全建设】DevOps初体验

在DevOps流程中JenKins扮演着重要角色

【甲方安全建设】DevOps初体验

换一张图,再次震撼一下

【甲方安全建设】DevOps初体验

基本上有点规模的公司都会使用这种开发流程

==这里通过Jnekins构建过程中 控制台输出来简单讲述一下 Jenkins工作流程==

Jenkins工作流程

Git拉取代码

Started by user whgojp
Running as SYSTEM
Building in workspace /var/jenkins_home/workspace/安全平台-后端
The recommended git tool is: NONE
No credentials specified
> git rev-parse --resolve-git-dir /var/jenkins_home/workspace/安全平台-后端/.git # timeout=10
Fetching changes from the remote Git repository
> git config remote.origin.url http://172.21.251.39:8929/whgojp/secplatform-springboot.git # timeout=10
Fetching upstream changes from http://172.21.251.39:8929/whgojp/secplatform-springboot.git
> git --version # timeout=10
> git --version # 'git version 2.39.2'
> git fetch --tags --force --progress -- http://172.21.251.39:8929/whgojp/secplatform-springboot.git +refs/heads/*:refs/remotes/origin/* # timeout=10
> git rev-parse refs/remotes/origin/main^{commit} # timeout=10
Checking out Revision a422d64e0ad3760e288170c97c6aa44669fde20e (refs/remotes/origin/main)
> git config core.sparsecheckout # timeout=10
> git checkout -f a422d64e0ad3760e288170c97c6aa44669fde20e # timeout=10
Commit message: "Update docker-compose.yml"
> git rev-list --no-walk 13688eb2a3f81e7e1b4239a9b4dc10ac9857115c # timeout=10

Maven构建打包

[安全平台-后端] $ /var/jenkins_home/maven3.9.6/bin/mvn clean package -DskipTests
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for springboot-backend:springboot-backend:jar:5.1
[INFO] ---------------< springboot-backend:springboot-backend >----------------
[INFO] Building springboot-backend 5.1
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[WARNING] The artifact mysql:mysql-connector-java:jar:8.0.33 has been relocated to com.mysql:mysql-connector-j:jar:8.0.33: MySQL Connector/J artifacts moved to reverse-DNS compliant Maven 2+ coordinates.
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ springboot-backend ---
[INFO] Deleting /var/jenkins_home/workspace/安全平台-后端/target
[INFO]
[INFO] --- surefire:2.22.2:test (default-test) @ springboot-backend ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- jar:3.2.2:jar (default-jar) @ springboot-backend ---
[INFO] Building jar: /var/jenkins_home/workspace/安全平台-后端/target/springboot-backend.jar
[INFO]
[INFO] --- spring-boot:2.7.14:repackage (repackage) @ springboot-backend ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  5.756 s
[INFO] Finished at: 2024-02-01T03:38:05Z
[INFO] ------------------------------------------------------------------------

通过SSH连接后端服务器

SSH: Connecting from host [7988de83981e]
SSH: Connecting with configuration [172.21.251.39] ...
SSH: EXEC: completed after 3,402 ms
SSH: Disconnecting configuration [172.21.251.39] ...
SSH: Transferred 3 file(s)
Finished: SUCCESS

【甲方安全建设】DevOps初体验

当然,这个过程中还需要一些必要的配置,这里就不再复述

实现自己在Idea中写完代码push后自动部署 后续可以搭配webhook触发

【甲方安全建设】DevOps初体验

最终的docker-compose文件

version: "3"
services:
nginx:
  image: nginx:latest
  container_name: springboot-nginx
   restart: always
  ports:
     - 80:80
  volumes:
     - /data/Docker/Volumes/nginx/html:/usr/share/nginx/html
     - /data/Docker/Volumes/nginx/nginx.conf:/etc/nginx/nginx.conf
  privileged: true
mysql:
  image: mysql:8.2.0
  container_name: springboot-mysql
   restart: always
  ports:
     - 3306:3306
  environment:
     - MYSQL_ROOT_PASSWORD=xxxxxx
  volumes:
     - /data/Docker/Volumes/mysql/data:/var/lib/mysql
     - /data/Docker/Volumes/mysql/conf/conf.d:/etc/mysql/conf.d
redis:
  image: redis:latest
  container_name: springboot-redis
   restart: always
  command: redis-server /etc/redis/redis.conf --appendonly yes --requirepass xxxxxx
  ports:
     - 6379:6379
  volumes:
     - /data/Docker/Volumes/redis/conf:/etc/redis
     - /data/Docker/Volumes/redis/data:/data
  logging:
    driver: "json-file"
    options:
      max-size: "100m"
      max-file: "2"

backend:
  image: springboot-backend:1.0
  container_name: springboot-back
#   command: cd /data/Docker/Volumes/
   restart: always
  build: .
  ports:
     - 8080:8080
     - 122:22
  environment:
     - TZ=Asia/Shanghai  # 设置时区为上海(GMT+8)
     -
portainer:
  image: portainer/portainer
  container_name: portainer
   restart: always
  ports:
     - 9000:9000
     - 8001:8080
  volumes:
     - /var/run/docker.sock:/var/run/docker.sock
     - /data/Docker/Volumes/portainer/data:/data

# gitlab 需要服务器4G往上 暂时放置本地
gitlab:
  image: gitlab/gitlab-ce:14.0.7-ce.0
  container_name: springboot-gitlab
   restart: always
  hostname: 172.21.251.39
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'http://172.21.251.39:8929'
      gitlab_rails['gitlab_shell_ssh_port'] = 2224
      gitlab_rails['time_zone'] = 'Asia/Shanghai'
  ports:
     - 8929:8929
     - 2224:22 # 注意这里映射的是gitlab的22端口
  volumes:
     - /data/Docker/Volumes/gitlab/config:/etc/gitlab
     - /data/Docker/Volumes/gitlab/logs:/var/log/gitlab
     - /data/Docker/Volumes/gitlab/data:/var/opt/gitlab

jenkins:
  image: jenkins/jenkins
  container_name: springboot-jenkins
   restart: always
  ports:
     - 18002:8080
     - 50000:50000
  volumes:
     - /data/Docker/Volumes/jenkins/jenkins_home:/var/jenkins_home
  privileged: true

【甲方安全建设】DevOps初体验

实现效果

当然后台也进行docker-compose 编排

【甲方安全建设】DevOps初体验

后面会考虑加入日志管理、系统监控、SonarQube(代码质量、安全检测)啥的 当然这也要看运维大哥给不给加内存了 hah

==最近又又又接触到了DevSecOps==

DevSecOps-安全赋能

顾名思义 就是在DevOps过程中贯穿了安全,近几年从DevOps演变而来的

【甲方安全建设】DevOps初体验

据我目前的认识,应该是在DevOps流程中加入一些安全工具等因素,比如说:使用SAST(静态分析安全测试):Fortify、AppScanDAST(动态分析安全测试):OWASP ZAP、Contrast当然还有一些其他的工具:AWVS、Nessus对源代码进行分析,以及源代码相关的SBOM(软件物料清单):pom依赖、第三方组件(供应链攻击)除了一些工具技术的干预外 还有一些安全培训等等相关介入由于接触的时间并不长,部分的内容了解的不多,留个白吧,后面有机会再补充。

关于安全平台

这里还是介绍一下自己正在开发的安全平台🤔️,目前只写了完整的两个功能

漏洞扫描

【甲方安全建设】DevOps初体验

可能有老哥一眼出发现了什么猫腻~~可以实现批量添加、批量删除、以及定时扫描,导出报告用的POI自定义模版,以及高危漏洞不同颜色显示等等等

【甲方安全建设】DevOps初体验每个目标对应多个漏洞,每个漏洞都有漏洞详情、修复建议什么的不过还是存在一些问题(大量漏洞详情存储过程中性能优化、怎么快速筛选出有价值的漏洞并导出报告)

漏洞预警

【甲方安全建设】DevOps初体验

代码实现:通过定时监控微软、阿里云、奇安信等漏洞预警平台接口(api调用、爬虫),使用钉钉webhook进行推送

【甲方安全建设】DevOps初体验

【甲方安全建设】DevOps初体验

当然还面临一些其他问题(平台的反爬虫、各平台推送重复怎么去重优化、漏洞及时更新详情)

TODO

  • 公司敏感信息泄漏监测(初步思路是通过GitHub接口监测……)

  • 本地资产管理(通过运维提供的资产列表,定期进行扫描端口、服务……)

  • 外网暴露面管理(通过Fofa进行资产汇总,定期监控……)

原文始发于微信公众号(LK安全):【甲方安全建设】DevOps初体验

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月5日13:53:46
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【甲方安全建设】DevOps初体验https://cn-sec.com/archives/2467599.html

发表评论

匿名网友 填写信息