首页 > 其他分享 >Devops体系建设(一)

Devops体系建设(一)

时间:2023-03-26 21:04:52浏览次数:31  
标签:体系 name runner gitlab Devops -- 建设 docker data

这是我的第一篇博客。

从写博客的念头开始,到目前为止已经足足6年了。

是的,整整耽误了6年。

这6年间,换了两份工作,体验了博士科研日常,拿到了软考的中高级证书和华为AI认证,工作内容从开发到测试再到总体,涉猎领域从自动化测试到网络安全再到Devops体系建设,负责范围从单打独斗的大头兵到拥有一支扩建中的专属小团队……

可以讲,变化了很多很多…

技术迭代太快了,要学习和掌握的知识每天都在更新,加之年龄的不断增长,为了使自己不再遗忘,正式起航博客机缘。

目前的规划是这样的,每周更新1篇,一年52篇,不一定非要解决了某个技术问题,完成了某种体系架构,哪怕是简简单单的搭建,也足以代表正在学习的状态。那么——

OK!Let’s GO!

就从一个安全问题入手吧。

此漏洞已于2019年9月被提交,故模拟GitlabCI靶场环境请使用之前版本。

用户越权访问Gitlab内部项目,Gitlab注册时会创建使用者账户并发送确认邮件,攻击者可通过创建私有存储库,而无需登录并触发管道运行。GitlabCI为每个Job生成惟一的作业令牌CI_JOB_TOKEN,该令牌为Job用户提供该目录所有项目的Visit、Read权限。攻击者修改.gitlab-ci.yml脚本,借助$CI_JOB_TOKEN环境变量,可以访问内部存储库,如果该Devops系统同时在.gitlab-ci脚本中部署了Sonarqube及SonarScanner操作,同样无需触发sonar-project.properties文件即可变更测试扫描结果。

首先需要部署GitlabCI、Sonarqube及Sonarsanner,以root用户登录到GitLab实例。

   

跳转至Area图标,选择Settings设置,在General下Sign-up restrictions注册限制处启用“注册时发送电子邮件”,并将注册文本白名单设置为example.com,保存。

 

退出GitlabCI,换被攻击人账号(victim用户)登录(被攻击人账号已提前申请),创建新项目,命名为“internal-project”,可见性设置为“internal”,并使用README复选框检查Initialize存储库,创建并保存该项目实例。

 

  退出victim用户,注册攻击者attacker账户(攻击者已知道/猜测到白名单域名)。

 

创建Gitlab仓库及编写.gitlab-ci.yml脚本。

$ mkdir /tmp/test && cd /tmp/test 

$ git init 

$ echo "Hi" > README.md 

$ git add README.md 

$ git commit -m "Add readme" 

编写.gitlab-ci.Yml文件,克隆被攻击者内部项目存储库并上传到攻击者服务器。

 

添加.gitlab-ci.Yml文件到存储库,并将原始url设置为attack/test

 

最后Push到项目并启动攻击者服务器,然后攻击者成功访问了完整的git repo。

 

访问到数据后便可以调用.gitlab-ci脚本,进而影响Sonarqube、SonarScanner乃至sonar-project.properties脚本及软件操作。

 

无独有偶,以一个例子作为Devops的引子,近年来无论是IEEE explore、SCI Hub、Web of science,在EI的工程实例化方面都少不了Devops的影子。

 

通常用于构建Devops的两款工具:Jenkins和Gitlab,经过调研,主要对比和区别如下:

GitLabCI:轻量级,不需要复杂的安装手段;配置简单,与gitlab可直接适配;实时构建日志十分清晰,UI交互体验很好;使用 YAML 进行配置,任何人都可以很方便的使用;

没有统一的管理界面,无法统筹管理所有项目;配置依赖于代码仓库,耦合度没有Jenkins低;有助于DevOps人员,开发、测试、运维可以是同一个人,最便捷的开发方式。

Jenkins:编译服务和代码仓库分离,耦合度低。插件丰富,支持语言众多;插件以及自身安装较为复杂;体量较大,不是很适合小型团队;JenkinsCI适合在多角色团队中,职责分明、配置与代码分离、插件丰富。

鉴于试用便捷性等多方原因,博客暂时先以GitlabCI进行论述,Jenkins后续会配合自动化、流水线等进行补充。

GitlabCI部署分为RPM、Docker、K8S三种部署方式。

RPM方式:

wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.9.0-ce.0.el7.x86_64.rpm

rpm -ivh gitlab-ce-12.9.0-ce.0.el7.x86_64.rpm

vim /etc/gitlab.rb   # 编辑站点地址

gitlab-ctl reconfigure  # 配置

gitlab-ctl start

gitlab-ctl status

gitlab-ctl stop

   Docker方式:

wmkdir -p ~/data/gitlab/config ~/data/gitlab/logs ~/data/gitlab/data

docker pull gitlab/gitlab-ce:12.9.0-ce.0

docker run -d  -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /Users/zeyang/data/gitlab/config:/etc/gitlab -v /Users/zeyang/data/gitlab/logs:/var/log/gitlab -v /Users/zeyang/data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:12.9.0-ce.0

docker exec -it gitlab bash

vim /etc/gitlab.rb  

gitlab-ctl reconfigure 

docker restart gitlab

docker start gitlab

docker stop gitlab

docker rm gitlab

K8S方式:

---

kind: Deployment

apiVersion: apps/v1

metadata:

labels:

  k8s-app: gitlab

  name: gitlab

  namespace: devops

spec:

  replicas: 1

  revisionHistoryLimit: 10

  selector:

    matchLabels:

      k8s-app: gitlab

 template:

    metadata:

      labels:

        k8s-app: gitlab

      namespace: devops

      name: gitlab

    spec:

      containers:

        - name: gitlab

          image: gitlab/gitlab-ce:12.6.0-ce.0

          imagePullPolicy: Always

          ports:

            - containerPort: 30088

              name: web

              protocol: TCP

            - containerPort: 22

              name: agent

              protocol: TCP

          resources:

            limits:

              cpu: 1000m

              memory: 4Gi

            requests:

              cpu: 500m

              memory: 512Mi

          livenessProbe:

            httpGet:

              path: /users/sign_in

              port: 30088

            initialDelaySeconds: 60

            timeoutSeconds: 5

            failureThreshold: 12

          readinessProbe:

            httpGet:

              path: /users/sign_in

              port: 30088

            initialDelaySeconds: 60

            timeoutSeconds: 5

            failureThreshold: 12

          volumeMounts:

            - name: gitlab-conf

              mountPath: /etc/gitlab

            - name: gitlab-log

              mountPath: /var/log/gitlab

            - name: gitlab-data

              mountPath: /var/opt/gitlab

          env:

            - name: gitlab_HOME

              value: /var/lib/gitlab

      volumes:

        - name: gitlab-conf

          hostPath:

            path: /data/devops/gitlab/config

            type: Directory

        - name: gitlab-log

          hostPath:

            path: /data/devops/gitlab/logs

            type: Directory

        - name: gitlab-data

          hostPath:

            path: /data/devops/gitlab/data

            type: Directory

      serviceAccountName: gitlab

---

apiVersion: v1

kind: ServiceAccount

metadata:

  labels:

    k8s-app: gitlab

  name: gitlab

  namespace: devops

---

kind: Service

apiVersion: v1

metadata:

  labels:

    k8s-app: gitlab

  name: gitlab

  namespace: devops

spec:

  type: NodePort

  ports:

    - name: web

      port: 30088

      targetPort: 30088

      nodePort: 30088

    - name: slave

      port: 22

      targetPort: 22

      nodePort: 30022

  selector:

    k8s-app: gitlab

---

kind: Role

apiVersion: rbac.authorization.k8s.io/v1beta1

metadata:

 name: gitlab

 namespace: devops

rules:

 - apiGroups: [""]

   resources: ["pods"]

   verbs: ["create","delete","get","list","patch","update","watch"]

 - apiGroups: [""]

   resources: ["pods/exec"]

   verbs: ["create","delete","get","list","patch","update","watch"]

 - apiGroups: [""]

   resources: ["pods/log"]

   verbs: ["get","list","watch"]

 - apiGroups: [""]

   resources: ["secrets"]

   verbs: ["get"]

---

apiVersion: rbac.authorization.k8s.io/v1beta1

kind: RoleBinding

metadata:

 name: gitlab

 namespace: devops

roleRef:

 apiGroup: rbac.authorization.k8s.io

 kind: Role

 name: gitlab

subjects:

 - kind: ServiceAccount

   name: gitlab

   namespace: devops

注意: 需要修改gitlab.rb配置文件中的IP地址,指定端口(不是必须的,同时之前要确定是否该端口是开放的),配置external_url及Nginx[“lixten_port”]参数。

只有Gitlab还无法将流水线跑起来,需要指定GitLabRunner。

添加官方仓库:

# For Debian/Ubuntu/Mint

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash

# For RHEL/CentOS/Fedora

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash

   安装版本,也可以自己指定。

# For Debian/Ubuntu/Mint

sudo apt-get install gitlab-runner=?//自己填写版本号

# For RHEL/CentOS/Fedora

sudo yum install gitlab-runner=?

Runner类型:

  • shared :运行整个平台项目的作业(gitlab)
  • group: 运行特定group下的所有项目的作业(group)
  • specific: 运行指定的项目作业(project)
  • locked: 无法运行项目作业
  • paused: 不会运行作业

获取shared类型Runner的token(通常用):

 

Runner注册:

docker run --rm -t -i -v ~/data/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:v12.6.0 register

Runtime platform                                    arch=amd64 os=linux pid=6 revision=ac8e767a version=12.6.0

Running in system-mode.

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):

http://192.168.1.105

Please enter the gitlab-ci token for this runner:

4tutaeWWL3srNEcmHs1s

Please enter the gitlab-ci description for this runner:[00e4f023b5ae]:

 devops-service-runner

Please enter the gitlab-ci tags for this runner (comma separated):

build

Registering runner... succeeded                     runner=4tutaeWW

Please enter the executor: parallels, virtualbox, docker-ssh+machine, kubernetes, docker+machine, custom, docker, docker-ssh, shell, ssh:

shell

Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

也可以直接Docker注册:

docker run -itd --rm -v ~/data/gitlab-runner/config:/etc/gitlab-runner  gitlab/gitlab-runner:v12.6.0 register \

  --non-interactive \

  --executor "shell" \

  --url "http://192.168.1.200:30088/" \

  --registration-token "JRzzw2j1Ji6aBjwvkxAv" \

  --description "devops-runner" \

  --tag-list "build,deploy" \

  --run-untagged="true" \

  --locked="false" \

  --access-level="not_protected"

基础完成后,编写.gitlab-ci.yml脚本(编写过程参照语法),运行流水线,pass为通过。

 

        可以写的很多,鉴于篇幅原因,今日暂且至此,目前已完成GitlabCI与Nexus3、Salt、禅道、Jmeter、Sonarqube、Sonarscanner的联动,同时已在流水线中集成单元测试,目前支持对C/C++、Java、Python、Go五种常见语言的代码审计(包括安全审计)及质量检测。

        后续将逐一展开记录,最后,使用IEEE TRANSACTIONS ON SOFTWARE ENGINEERING最新TRANS论文对Devops整体趋势和能力体系的囊括图做结尾,与君共勉!

 

 

标签:体系,name,runner,gitlab,Devops,--,建设,docker,data
From: https://www.cnblogs.com/UncleYangDoctor/p/17259487.html

相关文章

  • 【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1
    并发编程的难题和挑战在并发编程的技术领域中,对于我们而言的难题主要有两个:多线程之间如何进行通信和线程之间如何同步,通信是指线程之间以何种机制来交换信息。多线程的线程......
  • 什么是devops?
    DevOps是一个完整的面向IT运维的工作流,以IT自动化以及持续集成(CI)、持续部署(CD)为基础,来优化程式开发、测试、系统运维等所有环节。  DevOps的概念DevOps一词的来自于Dev......
  • Chat GPT-3如何改变了年轻的DevOps工程师的生活
         ChatGPT已经彻底改变了DevOps领域,并改变了行业内年轻专业人士的生活。凭借其先进的自然语言处理能力,GPT-3语言模型使创建智能聊天机器人和虚拟助手成为可能,它......
  • 简述四种线上环境建设思路
    由线下正式交付到线上之前,我们仍然会做很多的验证和稳定性保障工作。就生产环境、 灰度环境、预发环境、办公网生产环境这四种线上环境的建设进行分析。1、生产环境随着业......
  • 建设智能机房--动环监控系统你不能不知道的事
    近年来,随着信息化、数字化、云计算、物联网等技术在各行业的快速发展,通信机房、动力机房、边缘计算机房、数据中心机房等蓬勃发展。 而今日我们要讲的是智能机房的动环......
  • 概率图模型体系
      概率图模型读书笔记(一)概率图模型体系:HMM、MEMM、CRF......
  • AntDB数据库助力中国移动结算中心建设
    为响应中国移动集团公司IT集中化的要求:全面落实“十三五”十大战略工程,加快“推动公司IT资源一体化整合“重点专项工作。以IT系统为载体,构建高效运营支撑体系,形成集中化支撑......
  • 美团外卖离线数仓建设实践
    导读:美团外卖数据仓库主要是收集各种用户终端业务、行为数据,通过统一口径加工处理,通过多种数据服务支撑主题报表、数据分析等多种方式的应用。数据组作为数据基础部门,支持......
  • 如何将「知识」体系化管理
    积累和总结,是长期持续的过程01最近,很多朋友微信私聊关于「butte-java-note」仓库的话题;这个「Git仓库」每年都会基于总结和思考,进行一次分类体系的改动;多数朋友都比......
  • IT环境建设上的关键技术点
    线下环境细分出集成测试环境、开发测试环境以及多个项目环境之后,带来的最大的成本其实不在资源上,而是在管理和维护上,而且单单就线下维护的工作量来说,甚至要超过线上维护的工......