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

news2024/11/20 1:44:37

文章目录

  • 前言
  • 传统的开发方式:
    • Docker-解决环境问题
  • DevOps-CI/CD走向流水线
    • Jenkins工作流程
      • Git拉取代码
      • Maven构建打包
      • 通过SSH连接后端服务器
    • 实现效果
  • DevSecOps-安全赋能
  • 关于安全平台
    • 漏洞扫描
    • 漏洞预警
    • TODO

前言

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

传统的开发方式:

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

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"]

这样看似乎也没什么问题
在这里插入图片描述这里搭配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

在这里插入图片描述

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

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

DevOps-CI/CD走向流水线

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

这里概念啥的不再重复,先上手再说,搭建环境的时候挺麻烦 不过好在已经习惯了
找了一些课程看了看 感觉里面的一些工具什么的都是自己曾经做渗透测试的时候经常遇到的系统,比如说Gitlab、Jenkins、Grafana、Prometheus,当时就顾的找有没有历史漏洞,版本能不能对上,能不能复现,打没打补丁,也不太在意这个系统是干嘛的,现在看起来这些系统原来都在DevOps中扮演着不同的角色。
相关工具使用:
代码管理:Gitlab
在这里插入图片描述
构建工具:Maven 与JDK 通过数据卷映射到Jenkins_home下
CI/CD(持续集成、持续部署):Jenkins
在这里插入图片描述在DevOps流程中JenKins扮演着重要角色

在这里插入图片描述换一张图,再次震撼一下
在这里插入图片描述
基本上有点规模的公司都会使用这种开发流程

这里通过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

在这里插入图片描述

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

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

在这里插入图片描述最终的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

在这里插入图片描述

实现效果

当然后台也进行docker-compose 编排
在这里插入图片描述
后面会考虑加入日志管理、系统监控、SonarQube(代码质量、安全检测)啥的 当然这也要看运维大哥给不给加内存了 hah

最近又又又接触到了DevSecOps

DevSecOps-安全赋能

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

关于安全平台

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

漏洞扫描

在这里插入图片描述可能有老哥一眼出发现了什么猫腻~~
可以实现批量添加、批量删除、以及定时扫描,导出报告用的POI自定义模版,以及高危漏洞不同颜色显示等等等
在这里插入图片描述每个目标对应多个漏洞,每个漏洞都有漏洞详情、修复建议什么的
不过还是存在一些问题(大量漏洞详情存储过程中性能优化、怎么快速筛选出有价值的漏洞并导出报告)

漏洞预警

在这里插入图片描述代码实现:通过定时监控微软、阿里云、奇安信等漏洞预警平台接口(api调用、爬虫),使用钉钉webhook进行推送
在这里插入图片描述在这里插入图片描述当然还面临一些其他问题(平台的反爬虫、各平台推送重复怎么去重优化、漏洞及时更新详情)

TODO

  • 公司敏感信息泄漏监测(初步思路是通过GitHub接口监测……)
  • 本地资产管理(通过运维提供的资产列表,定期进行扫描端口、服务……)
  • 外网暴露面管理(通过Fofa进行资产汇总,定期监控……)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1428059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GitHub项目推荐--一个由OpenAI提供支持的聊天机器人和虚拟助手的构建平台】【转载】

Botpress Botpress是一个开源项目&#xff0c;它提供了一个平台&#xff0c;用于构建、部署和管理基于人工智能的聊天机器人和虚拟助手 github地址&#xff1a; https://github.com/botpress/botpress Botpress的介绍 Botpress是一个开源项目&#xff0c;它提供了一个平台&…

【PaddleSpeech】语音合成-男声

环境安装 系统&#xff1a;Ubuntu > 16.04 源码下载 使用apt安装 build-essential sudo apt install build-essential 克隆 PaddleSpeech 仓库 # github下载 git clone https://github.com/PaddlePaddle/PaddleSpeech.git # 也可以从gitee下载 git clone https://gite…

音视频数字化(音乐CD)

上篇文章【音视频数字化(音频数字化)】我们聊了音频数字化原理,其中谈到了音乐CD,结尾也提到了一个小问题:“CD音质是最高吗?为什么?”不知道大家是怎么理解的。 其实CD质量只是“无损”存储,但是数字化标准只是“44.1kHz,16bit”,因此相对于现在,音质不能说最高。 …

day03.函数与指针(含new与delete关键字)

一.指针 #include<iostream> using namespace std; #define pi 3.14159//定义常量int main(){cout<<pi<<endl;int a10;int *pNULL;//定义指针p&a;cout<<"a的地址为&#xff1a;"<<p<<endl;cout<<"a"<&l…

【面试深度解析】快手后端一面:G1、IOC、AOP、并发、JVM生产问题定位、可重复读、ThreadLocal

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

C# 引用同一个dll不同版本的程序集

因为项目需要所以必须在项目中引用不同版本的同一程序集 我要引用的文件是newtonsoft.json.dll 两个版本为12.0.0.0 和4.0.0.0 1.如果已经先引入了newtonsoft.json 12.0.0.0版本的程序集&#xff0c;如果直接引入另一个版本的程序集的话会提示不成功&#xff0c;所以先将另一个…

C++学习Day01之双冒号作用域运算符

目录 一、程序二、输出三、分析与总结 一、程序 #include<iostream>int atk 1000; void test01() {int atk 2000;std::cout << "atk " << atk << std::endl;// ::代表作用域 如果前面什么都不添加 代表全局作用域std::cout << &q…

c++阶梯之auto关键字与范围for

auto关键字&#xff08;c11&#xff09; 1. auto关键字的诞生背景 随着程序的逐渐复杂&#xff0c;程序代码中用到的类型也越来越复杂。譬如&#xff1a; 类型难以拼写&#xff1b;含义不明确容易出错。 比如下面一段代码&#xff1a; #include <string> #include &…

Sketch使用手册:从入门到精通的完整教程

Sketch软件是Mac平台上流行的矢量图形编辑软件&#xff0c;旨在帮助用户创建网站、移动应用、图标等各种设计原型。Sketch软件的设计风格简洁明了&#xff0c;界面操作简单易用&#xff0c;非常适合UI/UX设计师、平面设计师等数字创意人员。本文将根据如何使用Sketch&#xff0…

嵌入式中C 语言中的三块技术难点

C 语言在嵌入式学习中是必备的知识&#xff0c;甚至大部分操作系统都要围绕 C 语言进行&#xff0c;而其中有三块技术难点&#xff0c;几乎是公认级别的“难啃的硬骨头”。 今天就来带你将这三块硬骨头细细拆解开来&#xff0c;一定让你看明白了。 0x01 指针 指针是公认最难理…

10. BI - 决策树的使用及可视化

本文为 「茶桁的 AI 秘籍 - BI 篇 第 10 篇」 文章目录 可视化探索决策树原理决策树算法决策树可视化泰坦尼克海难数据 Hi&#xff0c;你好。我是茶桁。 上一节课&#xff0c;咱们了解了图形的具体绘制方法&#xff0c;接下来咱们还要看看除了图形绘制之外&#xff0c;还有哪些…

Redis进阶(一):持久化

持久化 何为持久化&#xff1f; MySQL的事务有四个比较核心的特征&#xff1a;原子性、一致性、持久性和隔离性&#xff0c;这里的持久性和持久化说的是一个事&#xff0c;简单来说&#xff0c;数据存储在硬盘上就是持久&#xff0c;存在内存上那就是不持久&#xff08;重启之后…

PyTorch基础-Tensors属性、Tensor的运算

PyTorch的基本概念 Tensor的基本概念 张量高于标量、向量、矩阵 标量说零维的张量&#xff0c;向量是一维的张量&#xff0c;矩阵是二维的张量 Tensor与机器学习的关系 Tensor的创建 函数功能Tensor(*size)基础构造函数Tensor(data)类似np.arrayones(*size)全1Tensorzeros(…

举个栗子!Tableau 技巧(263):按需突出显示文本表的 N 个行

我们分享过 &#x1f330; &#xff1a;突出显示文本表的行或列&#xff0c;可以突出显示文本表中的某一行或某一列。有数据粉提出新的问题&#xff1a;如果想突出显示多行数据&#xff0c;该如何实现呢&#xff1f; 在 Tableau 中是可以实现的&#xff08;如上图&#xff09;&…

代码随想录刷题第23天

今天是二叉树的终章&#xff0c;不知不觉已经刷题23天了&#xff0c;先给自己点个赞&#x1f604;&#x1f44d; 第一题是修剪二叉搜索树&#xff0c;要注意修剪时被删除节点的子树可能符合要求&#xff0c;因此还需向下遍历。最后用root->left与right接住返回值。 迭代法先…

PHP漏洞查询

CVE - Search CVE List (mitre.org) 美国国家漏洞数据库&#xff08;需要梯子&#xff09; NATIONAL VULNERABILITY DATABASE NVD - Search and Statistics (nist.gov) 基本都能查询到&#xff0c;传结果详情页里面会有一些解决方案的连接 PHP的官方网站 PHP :: Bugs :: Se…

大模型实践笔记(1)——GLM-6B实践

目录 在Ubuntu上的配置Git Large File Storage 安装Git LFS&#xff1a; 设置Git LFS&#xff1a; 使用Git LFS&#xff1a; 安装GLM-6B 环境依赖 ChatGLM2-6B介绍 配置GLM 下载代码 构建环境 安装依赖 本地部署 网页UI 很多模型在hugging face上面&#xff0c;…

【Linux】 Linux编译器-gcc/g++使用

&#x1f497;个人主页&#x1f497; ⭐个人专栏——Linux学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读1. Linux编译器-gcc/g使用1.1 引入1.2 初识gcc/g1.3 程序运行的四个阶段1.3.1 预处理1.3.2 编译1.3.3 汇编1.3.4 链接 1.…

【Python】一个简单的小案例:实现批量修改图片格式

1.代码 import os from tkinter import Tk, Button from PIL import Imagedef check_and_create_folders():# 获取当前目录current_directory os.getcwd()# 定义文件夹名称folders_to_check ["JPG", "PNG"]for folder_name in folders_to_check:folder_…

Java/Python/Go不同开发语言基础数据结构和相关操作总结-Map篇

Java/Python/Go不同开发语言基础数据结构和相关操作总结 1. Java1.1 基础操作1.1.1 数据结构和定义方式1.1.2 增加1.1.3 修改1.1.4 查询1.1.5 删除1.1.6 获取总长度1.1.7 按key排序1.1.8 按value排序1.1.9 遍历 1.2 常用其他方法1.2.1 几种数据结构的对比 2. Go2.1基础操作2.1.…