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

文章目录

  • 前言
  • 传统的开发方式:
    • 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 /appCOPY /target/springboot-backend.jar /appEXPOSE 22
EXPOSE 8080LABEL 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-serverENTRYPOINT ["java", "-jar","springboot-backend.jar"]

这样看似乎也没什么问题
在这里插入图片描述这里搭配IDEA食用更佳

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

version: "3"
services:nginx:image: nginx:latestcontainer_name: springboot-nginxrestart: alwaysports:- 80:80volumes:- /data/Docker/Volumes/nginx/html:/usr/share/nginx/html- /data/Docker/Volumes/nginx/nginx.conf:/etc/nginx/nginx.confprivileged: truemysql:image: mysql:8.2.0container_name: springboot-mysqlrestart: alwaysports:- 3306:3306environment:- MYSQL_ROOT_PASSWORD=xxxxxxvolumes:- /data/Docker/Volumes/mysql/data:/var/lib/mysql- /data/Docker/Volumes/mysql/conf/conf.d:/etc/mysql/conf.dredis:image: redis:latestcontainer_name: springboot-redisrestart: alwayscommand: redis-server /etc/redis/redis.conf --appendonly yes --requirepass xxxxxxports:- 6379:6379volumes:- /data/Docker/Volumes/redis/conf:/etc/redis- /data/Docker/Volumes/redis/data:/datalogging:driver: "json-file"options:max-size: "100m"max-file: "2"backend:image: springboot-backend:1.0container_name: springboot-backrestart: alwaysbuild: .ports:- 8080:8080- 122:22environment:- TZ=Asia/Shanghai  # 设置时区为上海(GMT+8)portainer:image: portainer/portainercontainer_name: portainerrestart: alwaysports:- 9000:9000- 8001:8080volumes:- /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:latestcontainer_name: springboot-nginxrestart: alwaysports:- 80:80volumes:- /data/Docker/Volumes/nginx/html:/usr/share/nginx/html- /data/Docker/Volumes/nginx/nginx.conf:/etc/nginx/nginx.confprivileged: truemysql:image: mysql:8.2.0container_name: springboot-mysqlrestart: alwaysports:- 3306:3306environment:- MYSQL_ROOT_PASSWORD=xxxxxxvolumes:- /data/Docker/Volumes/mysql/data:/var/lib/mysql- /data/Docker/Volumes/mysql/conf/conf.d:/etc/mysql/conf.dredis:image: redis:latestcontainer_name: springboot-redisrestart: alwayscommand: redis-server /etc/redis/redis.conf --appendonly yes --requirepass xxxxxxports:- 6379:6379volumes:- /data/Docker/Volumes/redis/conf:/etc/redis- /data/Docker/Volumes/redis/data:/datalogging:driver: "json-file"options:max-size: "100m"max-file: "2"backend:image: springboot-backend:1.0container_name: springboot-back
#    command: cd /data/Docker/Volumes/restart: alwaysbuild: .ports:- 8080:8080- 122:22environment:- TZ=Asia/Shanghai  # 设置时区为上海(GMT+8)- portainer:image: portainer/portainercontainer_name: portainerrestart: alwaysports:- 9000:9000- 8001:8080volumes:- /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.0container_name: springboot-gitlabrestart: alwayshostname: 172.21.251.39environment:GITLAB_OMNIBUS_CONFIG: |external_url 'http://172.21.251.39:8929'gitlab_rails['gitlab_shell_ssh_port'] = 2224gitlab_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/gitlabjenkins:image: jenkins/jenkinscontainer_name: springboot-jenkinsrestart: alwaysports:- 18002:8080- 50000:50000volumes:- /data/Docker/Volumes/jenkins/jenkins_home:/var/jenkins_homeprivileged: 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.mzph.cn/news/661519.shtml

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

相关文章

Linux系统——防火墙

一、防火墙的认识 引言 安全技术 入侵检测系统&#xff08;Intrusion Detection Systems&#xff09;&#xff1a;特点是不阻断任何网络访问&#xff0c;量化、定位来自内外网络的威胁情况&#xff0c;主要以提供报警和事后监督为主&#xff0c;提供有针对性的指导措施和安全…

企业如何对u盘管控,进行U盘管理?公司电脑禁用U盘的方法

随着信息技术的飞速发展&#xff0c;U盘等移动存储设备已成为企业数据传输和存储的重要工具。然而&#xff0c;U盘的滥用和误操作也带来了巨大的安全隐患&#xff0c;如数据泄露、病毒传播等。 因此&#xff0c;对企业而言&#xff0c;如何有效管控U盘的使用&#xff0c;确保数…

Pymysql将爬取到的信息存储到数据库中

爬取平台为电影天堂 获取到的数据仅为测试学习而用 爬取内容为电影名和电影的下载地址 创建表时需要建立三个字段即可 import urllib.request import re import pymysqldef film_exists(film_name, film_link):"""判断插入的数据是否已经存在""&qu…

element表格内多个输入框时如何添加表单校验

以下.vue文件Demo可直接复制运行&#xff1a; 重点&#xff1a; 1&#xff1a;表格数据定义在form里 2&#xff1a;prop需要加索引&#xff1b;索引前的变量不要加form&#xff0c;直接取里边的key&#xff0c;索引后的字段需要和表格里字段属性对应 。:prop"tableInfo.l…

0基础学习VR全景平台篇第140篇:摄影器材保养与维护

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 摄影器材属于精密仪器&#xff0c;在使用过程中会磨损、老化、积灰。如果不对摄影器材进行清洁和保养&#xff0c;油污、灰尘、水渍长期停留在设备上&#xff0c;不仅会大大缩短相机…

从[redis:LinkedList]中学习链表

文章目录 adlistlistNodelistmacros[宏定义]listCreatelistInitNodelistEmptylistReleaselistAddNodeHeadlistLinkNodeHeadlistAddNodeTaillistLinkNodeTaillistInsertNodelistDelNodelistUlinkNodelistIndexredis3.2.100quicklistredis7.2.2quicklist redis的基本数据类型之一…

简单说说mysql的日志

今天我们通过mysql日志了解mysqld的错误日志、慢查询日志、二进制日志&#xff0c;redolog, undolog等。揭示它们的作用和用途&#xff0c;让我们工作中更能驾驭mysql。 redo 日志 如果mysql事务提交后发生了宕机现象&#xff0c;那怎么保证数据的持久性与完整性&#xff1f;…

网站接入QQ登录

开发者认证&#xff0c;创建应用&#xff1a; &#xff08;1&#xff09;先在 QQ 互联 QQ互联管理中心 进行个人开发者认证&#xff0c;并审核 &#xff08;2&#xff09;创建【网站应用】&#xff0c;填写正确信息&#xff0c;获得对应的 appid 与 appkey&#xff0c;并审核…

【机器学习】某闯关类手游用户流失预测

Final Project: 某闯关类手游用户流失预测 1 案例简介 手游在当下的日常娱乐中占据着主导性地位&#xff0c;成为人们生活中放松身心的一种有效途径。近年来&#xff0c;各种类型的手游&#xff0c;尤其是闯关类的休闲手游&#xff0c;由于其对碎片化时间的利用取得了非常广泛…

服务器未启动而端口进程仍在运行如何查看并杀死

首先登录服务器然后查看当前监听的端口&#xff1a; sudo netstat -tuln比如这里的8080&#xff0c;我们此时并未启动服务器&#xff0c;但是它却正在运行&#xff0c;这会导致服务器刚启动就秒挂。如果没有日志的话会让人有点疑惑&#xff0c;这种情况可能是之前运行了该进程…

代码随想录day17--二叉树的应用5

LeetCode654.最大二叉树 题目描述&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后…

鸿蒙开发-UI-页面路由

鸿蒙开发-UI-组件 鸿蒙开发-UI-组件2 鸿蒙开发-UI-组件3 鸿蒙开发-UI-气泡/菜单 文章目录 一、基本概念 二、页面跳转 1.router基本概念 2.使用场景 3.页面跳转参数传递 三、页面返回 1.普通页面返回 2.页面返回前增加一个询问框 1.系统默认询问框 2.自定义询问框 总…

EtherCAT FP介绍系列文章—UDP gateway

EtherCAT主站上的Mailbox Gateway功能&#xff0c;可以用于将EtherCAT mailbox相关协议从外部设备的工具通过邮箱网关路由到EtherCAT从站设备。在EtherCAT规范中定义的所有邮箱协议在此功能中都可用&#xff0c;例如CoE, FoE, VoE, SoE。 但是&#xff0c;这里特别注意的是Mai…

雨云游戏云VPS服务器用Linux搭建MCSM面板和Minecraft Mohist 1.20.2服务器教程,我的世界MOD和插件服开服教程。

雨云游戏云VPS服务器用Linux搭建MCSM面板和Minecraft Mohist 1.20.2服务器教程&#xff0c;我的世界MOD和插件服开服教程。 本教程演示安装的MC服是Mohist 1.20.2版&#xff0c;其他版本也可以参考本教程&#xff0c;差别不大。 本教程使用Docker来运行mc服&#xff0c;可以方…

UserWarning: Glyph 39640 missing from current font问题

是因为不支持中文字体导致的&#xff0c;设置为一个支持中文的字体就行了。 另外&#xff0c;上面的改动会引起负号显示为方块&#xff0c;需要额外再加一条设置。 在中文系统上 import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 设置为一个支持…

C#,斯特林数(Stirling Number)的算法与源代码

1 斯特林数 在组合数学&#xff0c;斯特林数可指两类数&#xff0c;第一类斯特林数和第二类斯特林数&#xff0c;都是由18世纪数学家James Stirling提出的。它们自18世纪以来一直吸引许多数学家的兴趣&#xff0c;如欧拉、柯西、西尔沃斯特和凯莱等。后来哥本哈根&#xff08;…

Docker容器引擎私有仓库的搭建和管理

目录 一、私有仓库搭建和管理 &#xff08;一&#xff09;搭建本地私有仓库 1.拉取registry镜像 2.修改docker配置文件并重启 3.运行registry容器 4.给镜像打标签 5.上传到私有仓库 6.查看私有仓库的所有镜像 7.从私有仓库拉取镜像 &#xff08;1&#xff09;删除cen…

网络协议 UDP协议

网络协议 UDP协议 在之前的文章中有对UDP协议套接字的使用进行讲解&#xff0c;本文主要对UDP协议进行一些理论补充。 文章目录 网络协议 UDP协议1. 概念2. UDP协议格式2.1 数据报长度2.2 校验和/检验和2.2.1 CRC校验2.2.2 MD5算法 1. 概念 UDP&#xff0c;即User Datagram P…

gitlab操作手册

git操作篇 1. 项目克隆 git clone gitgitlab.test.cn:pro/project1.git2. 项目的提交 注&#xff1a;如果要查看文件的状态可以用git status命令&#xff1a; 如上图所示&#xff0c;文件已经修改了。 3. 项目的推送 git push origin feature/test01注&#xff1a;如果要查…

nodejs+vue+ElementUi宠物领养救助网站0w6wc

宠物领养救助平台采用B/S架构&#xff0c;数据库是MySQL。网站的搭建与开发采用了先进的nodejs进行编写&#xff0c;使用了vue框架。该系统从两个对象&#xff1a;由管理员和用户来对系统进行设计构建。主要功能包括&#xff1a;个人信息修改&#xff0c;对用户、宠物类别、宠物…