xdays

Docker基础教程之镜像安全

上一篇我总结下了Docker的镜像构建,这一篇我来谈下镜像安全。

概述

安全一直是一个不出事没人关心等到出事的时候也已经晚了的话题,以我目前的了解成熟的项目基本没有,而且比较知名的就是Docker Cloud和Quay.io在收费版里集成了安全扫描的功能。本文主要是我以 A Scan of the Container Vulnerability Scanner Landscape 这篇文章为线索,实战了其中的Anchore和Clair两个项目的简单介绍,后续还会持续观察更新。这类工具的共同特点就是静态分析镜像里的内容,找出其中的软件包和对应的版本,然后和从各大Linux版本的CVE源下载漏洞数据库做匹配,最终判断镜像里的安全漏洞。

Anchore

项目地址在这里 。总体来说anchore还是比较简陋,其对应的 SaaS服务 也是处于比较初级的阶段,还有待观察。

安装配置

yum install epel-release && yum install -y python-pip rpm-python dpkg
pip install anchore
anchore feeds sync

实战演示 ...

Docker基础教程之镜像构建

这个系列已经好久没更新了,上一篇我总结了目前主流的镜像存储方案,这一篇总结下Docker的镜像构建

Dockerfile

这是Docker官方的构建镜像的方案,其背后的思想和早在Docker诞生之前就已经广泛使用的配置管理工具(puppet, ansible, chef等)是一样的,就是说你只需要用一个文件来描述你想要的镜像是什么样的,然后Docker会依据Dockerfile来build出来目标镜像,并且你在Dockerfile里的指令就是对应最终镜像的每一层,这样就可以充分利用镜像分层复用的优势了。只不过不同点在于目前主流的配置管理工具在你的描述文件和实际运行的系统命令之间进行了一层抽象,这样就大大降低了学习的成本也便于复用代码(puppet的module, ansible的role),而Dockerfile来的就比较直接,你直接写shell命令,其优缺点也就是shell的优缺点了。总结来说,Dockerfile通过定义一些指令提供了一种可重复构建镜像的方式。

这一小节我只针对常用的指令进行一个介绍,更多关于Dockerfile的每个指令的详细解释不是本文的重点,你可以在用的时候参考这里

FROM centos

ADD iami.txt /root/
RUN echo "Hello World!" > /root/iami.txt

EXPOSE 80
CMD ["cat", "/root/iami.txt"]

指令解释:

  • FROM 指定要build的镜像是基于哪个镜像build的 ...

基于OpenResty自动签发Let's Encrypt证书

安装OpenResty

yum-config-manager --add-repo https://openresty.org/yum/centos/OpenResty.repo
yum install -y openresty

OpenResty所有的文件以及依赖包都安装在 /usr/local/openresty 目录下

安装配置lua-resty-auto-ssl

安装Luarocks

Luarocks是Lua的包管理工具,很多OpenResty的包都可以通过luarocks来安装。

yum install -y unzip openssl gcc make
wget http://luarocks.github.io/luarocks/releases/luarocks-2.4.2.tar.gz
tar xzf luarocks-2.4.2.tar.gz
cd ...

Docker基础教程之镜像存储

上一篇我总结下了Docker的基本概念,这一篇我来重点总结下目前主流的镜像存储的方案。

Registry

总体上来说,我这里的方案是启动一个仅支持http的registry服务,然后在前面放一个nginx来终结https请求和用户验证(basic auth或者通过第三方模块来集成LDAP)。

启动registry

docker run -d -p 5000:5000 --restart=always --name registry \
    -v /data:/registry/var/lib/registry registry:2

编译安装nginx

mkdir /opt/source
git clone https://github.com/kvspb/nginx-auth-ldap.git
git clone https://github.com/openresty/headers-more-nginx-module.git
wget -O ...

Docker基础教程之基本概念

简介

本文是整个系列教程的第一篇,我将从一个使用者的角度向你展示其中几个技术:namespace, cgroups, veth, bridge, copy-on-write, image 和 container。整个容器技术的核心包括namespace和cgroup两个部分,其中namespace负责资源隔离,cgroups负责资源限制。而Docker在这两个技术之上提出了几个重要概念让容器技术得以流行。

如果你刚接触Docker请参考我另外两篇文章:

安装

官方提供了很方便的安装脚本,只需运行如下命令即可安装完成:

curl -s https://get.docker.com | bash

namespace

Namespace是Linux在内核级别的隔离技术,它可以让进城拥有自己独立的进程号,网络,文件系统(类似chroot)等,不同namespace下的进程之间相互不可见。因为系统是通过底层的系统调用来提供namespace功能的,所以并没有用户态的管理namespace的工具,关于怎么创建具体类型的namespace可以参考酷壳的两篇文章Docker基础技术:Linux Namespace(上)Docker基础技术:Linux Namespace(下),但是等进程在namespace启动之后有时候我们需要进入到进程的运行环境来debug等操作。

目前的Docker版本已经可以通过exec子命令直接切换到进程所在的namespace ...

Docker基础教程

回首一看,又有一个多月没有更新博客了。最近工作上发生了一些变动:公司裁员,无论主动的还是被动的,多数人拿了补偿走人了;而因为我做的还可以公司希望我留下,然而当我选择离开时公司认为我是主动离职不支付赔偿,我问了下律师被告知公司从法律上没有什么问题,也就作罢。趁工作交接之际,我整理下近两年多自己的容器领域的技术积累,算是给自己的一个总结,如果能对于别人有所帮助,幸甚至哉!

我要总结的第一个系列是Docker,我从14年开始使用Docker,大概是0.5或者0.6的版本,一路过来见证了Docker从一个小而美发展成了大而全的项目,也见证了整个容器生态圈的蓬勃发展。简单整理了下这个系列的大纲:

基于GitLab的Pages服务构建静态博客

背景

之前我有一篇博客讨论过基于Pelican, Github以及Nginx+Lua实现的自动发布静态博客。最近重新思考这个方案感觉不够精简,也许当时是出于学习的目的引入了Ngnix+Lua这块。正好今年上半年GitLab宣布支持Pages服务了,而且支持的远比Github彻底,所以决定将我的博客托管在GitLab的Pages上。

流程

本地只需要往Git仓库里添加或者编辑markdown文件,当源文件被push到Gitlab服务端,触发GitLab的Pipeline,Pipeline完成由markdown源码到html文件的构建,最后由GitLab的Pages服务来托管html文件。

配置

迁移仓库

在GitLab上新建一个仓库,按照规范我这里将其命名为 xdays.gitlab.io ,然后将Github上的源码pull下来推到GitLab上:

git clone git@github.com:xdays/xdays.me.git
git remote add gitlab git@gitlab.com:xdays/xdays.gitlab.io.git
git ...

利用mailgun搭建私有域名邮箱

起因

本着折腾中进步的原则,从切换到xdays.me这个域名之后就想折腾下邮箱。个人邮箱主要带来以下好处:

  1. 有些服务需要用企业邮箱
  2. 看上去牛逼一些

本文总结了利用mailgun和gmail来实现私有域名邮箱功能。

Mailgun

Mailgun是Rackspace面向开发者的邮件发送服务,但是它提供的功能足够我们打造属于自己的个人邮箱了。我们知道邮箱服务简单来说就两个功能,发送邮件和接收邮件。Mailgun为我们提供了SMTP server用于发送邮件和Email Route用于转发邮件到特定的邮箱以收取邮件。此外还涉及一些反垃圾邮件的机制。

Domain

注册了mailgun的账号之后,你需要添加一个domain,然后根据向导添加对应的DNS记录,等mailgun验证通过。

SMTP Server

添加了Domain之后我们的SMTP Server已经设置好了,但是我们需要添加一个和Gmail继承的账号,如下图所示,点击“Manage SMTP credentials”来管理账号

mailgun-credentials

添加完账号之后就可以登录SMTP服务器发送邮件了,假设我们这里添加的是test@xdays.me

Route

虽然mailgun没有提供POP3的服务,但是其提供了邮件路由的功能同样能达到让我们收取邮件的目的。按照下图所示添加一个邮件路由,用来将所有发给 test@xdays.me的邮件都转发给你的Gmail邮箱

mailgun-routes

到这里mailgun的部分就配置完成了

Gmail

其实Gmail的配置和添加其他免费邮箱账号没有区别。

点击 Settings ...

Kafka基础

简介

Kafka是一个分布式的,基于分区存储的,多副本提交的日志系统。其特点包括:

  1. 高吞吐
  2. 无缝扩展
  3. 消息持久化

基本概念

broker

broker是Kafka集群的一个节点,负责接收producer发来的消息和响应consumer发来的消息请求。

topic和partition

topic是Kafka组织消息的方式,可以认为是消息的类别。一个topic可以有多个partition来保存消息,消息在partition里是顺序存储的。这里注意,需要注意的是,Kafka保存数据是根据时间来决定的,而不是它是否被消费者消费。如果在数据的生命周期内,它被消费后仍然会存储在Kafka中。但如果它在生命周期内没有被消费,同样它也会在生命周期结束时被丢弃。

分布式

partition分布在所有的broker上。partition有leader和follower,partition的leader broker负责接收读写请求,而follower broker只负责从leader同步消息。当leader broker挂掉的时候,会通过Zookeeper的failover机制从follower中选举出新的leader。

producer

消息的生产者,producer根据topic的partition策略讲消息发给broker。

consumer

消息的消费者,Kafka在consumer之上引入了消费者组的概念,消费者会被被划分成一个个消费者组,属于某一个主题的消息会被分派到它的一个分区下,而该分区与订阅了该主题的消费组中的某一个消费者相对应,也就是说消息只会发送给订阅的消费者组中的一个消费者。可以把消费者组理解成消息的真正的订阅者,而它下面的消费者只是处理消息的线程池,这样做可以保证系统的扩展性和容错性。而消费者与分区的关系是,每个分区只能有一个消费者 ...

Linux Systemd笔记

背景

这是我的一篇我之前学习systemd的这个系列教程的笔记,在此记录下吧。

简介

  • 和init和upstart类似的Linux服务管理程序
  • 提供优秀框架以表示系统服务间的依赖关系
  • 并行启动服务,并通过cgroup跟踪服务进程
  • 支持对系统状态建立和恢复快照
  • 支持crontab

使用

服务状态

  • 因为启动过程太快,用户可能来不及看服务启动过程,故systemd跟踪进程的启动过程保留下来,以便后续查看。通过systemctl status能看到服务的状态以及返回的状态码。

cgroup

  • 通过cgroup来管理进程,没有继承可以脱离管理。通过两个命令来查看进程的所属cgroup,一个是ps xawf -eo pid,user,cgroup,args,一个是systemd-cgls

迁移sysv脚本

  • 如何把传统的sysv脚本迁移为systemd的配置文件。shell脚本的弊端,慢,可读性差,脆弱,不具备有序并行执行,不能监控进程。
  • 迁移需要获取的信息,服务描述,服务依赖,运行级别,启动命令
  • 字段描述
    • Unit段表示服务的通用信息,systemd不仅管理服务,还管理设备 ...

etcd基础

简介

etcd是一个分布式kv存储,与我前面介绍的Consul有些类似,底层都是基于raft协议的,它的主要用途包括为应用提供集中的配置管理和服务发现。

安装

etcd是go语言开发的,所以安装成本非常低,一般我们用systemd来管理etcd,这里我们简单过下安装过程:

curl -L  https://github.com/coreos/etcd/releases/download/v2.2.5/etcd-v2.2.5-linux-amd64.tar.gz -o etcd-v2.2.5-linux-amd64.tar.gz
tar xzvf etcd-v2.2.5-linux-amd64.tar.gz
cd etcd-v2.2.5-linux-amd64
mkdir -p ...

搭建私有pypi仓库

背景

为了对公司内部的Python库进行统一管理,但出于隐私考虑不能直接放到公共pypi服务器上,故考虑搭建私有pypi仓库。

服务端

安装

安装pypiserver

pip install pypiserver passlib

安装supervisor

apt-get install supervisor

配置

新建package存放目录

mkdir -p /opt/pypi/packages

创建用于上传package的密码

htpasswd -sc /opt/pypi/.htaccess user

新建supervisor配置文件,vim /etc/supervisor/conf.d/pypi.conf

[program:pypi]
directory=/opt/pypi/
command=pypi-server -p 8082 -P .htaccess /opt/pypi ...

Consul基础

简介

  • 服务发现,提供了DNS和HTTP两种接口
  • 健康检查,可针对服务和节点两个级别检查
  • KV存储,提供HTTP接口
  • 多数据中心支持

基础

概览

architect-of-consul

  • 通过一个WAN的Gossip池来原生支持跨数据中心的状态同步
  • 一个数据中心内部通过LAN Gossip来维持数据中心内部状态同步
  • 一个数据中心内部通过Raft协议来维护在Server模式的agent之间的leader选举和同步数据
  • Client模式下的agent负责转发RPC请求给Server模式的agent
  • 所有的agent都负责做健康检查

Raft

Raft一致性算法是Consul的核心,用于在一个数据中心内部的Server之间同步数据,关于Raft算法这里有个非常直观的演示。

Gossip

Gossip分布式通信协议是Consul的另一个核心,用于管理成员和广播消息。

Agent

Consul要在集群的所有的节点上部署一个agent,可以工作在client或者server模式。client模式agent主要职责是做健康检查,对外提供HTTP和DNS接口以及同步数据,以及向server模式的agent转发请求;server模式的agent额外的需要维护集群的状态跨数据中心通信等。

安装

consul仅有一个二进制文件,开箱即用。 从这里下载。

启动

启动Server模式的agent

consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -ui-dir /tmp ...

U盘安装CentOS7系统

需求

  • U盘安装
  • 小规模
  • 自动安装

工具

  • system-config-kickstart
  • kickstart
  • livecd-iso-to-disk

配置过程

  1. 将iso文件写入U盘sudo livecd-iso-to-disk --format --reset-mbr ./CentOS-6.4-x86_64-minimal.iso /dev/sdb
  2. 用system-config-kickstart创建ks文件,注意修改以下两点:
    • harddrive --partition=sda1 --dir=/ 这里是制定安装介质的存放目录
    • bootloader --location=mbr --driveorder=sdb,sda 指定grub的安装磁盘,如果不指定会写到U盘上去的
  3. 将ks.cfg拷贝只U盘根目录下
  4. 修改U盘上的grub引导菜单syslinux/extlinux.conf,添加内核参数ks=hd:sda1:/ks.cfg

安装

  • 设备设置U盘第一启动,启动菜单第一个即可

参考

ks.cfg ...

OpenLDAP构建统一认证之项目实战

背景

问题

登录服务器的账号分散在所有的机器上,这样就带来两个问题:

  1. 维护成本高,需要专门在playbook里定义用户权限
  2. 没有明确的权限划分
  3. 不便于和其他系统(如Google Apps)对接

需求

  1. 数据集中管理
  2. 根据用户组控制用户的登陆权限
  3. 控制用户的sudo权限,只有operation有sudo的权限
  4. 自动创建家目录
  5. Web管理界面

原则

  • 尽可能少的涉及组件,减少维护成本
  • 尽可能的不入侵系统配置,便于恢复

配置

服务端

OpenLDAP安装配置

关于OpenLDAP的安装可以参考OpenLDAP构建统一认证之安装配置

LAM安装配置

关于LAM安装配置可以参考OpenLDAP构建统一认证之管理工具

管理账号

dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com

dn: olcDatabase={2 ...

VPN-PPTP客户端自动登录

安装

yum install pptp

配置

chap-secrets

vim /etc/ppp/chap-secrets

yottaa    pptp password * 

peers

vim /etc/ppp/peers/vpn-bos

pty "pptp vpn-bos.yottaa.com --nolaunchpppd" 
name yottaa-1 
remotename pptp 
require-mppe-128 
file /etc/ppp/options.pptp 

options

vim /etc/ppp/options

lock 
lcp-echo-failure 10 
lcp-echo-interval 1 

启动

pppd call vpn-bos

Keepalived安装配置

简介

Keepalived是Linux的高可用软件,其主要是高可用协议的VRRP的开元实现,此外它还提供了方便管理LVS的接口。

安装

wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz && tar xzf keepalived-1.2.7.tar.gz && cd keepalived-1.2.7 && ./configure --prefix=/usr/local/keepalived-1.2.7 && make &&     make install && cd /usr/local && ln -s keepalived-1.2.7 keepalived

配置

mv keepalived.conf ...

VPN-基于LDAP认证的OpenVPN

安装

yum install -y openvpn openvpn-auth-ldap

配置

证书

关于生成证书请参考 VPN-基于OpenVPN构建

/etc/openvpn/server.conf

port 1194
proto tcp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/BJ.crt
key /etc/openvpn/easy-rsa/keys/BJ.key  # This file should be kept secret
dh /etc/openvpn ...

Zabbix监控MySQL

安装源

rpm -ivh http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm

安装包

yum install -y zabbix-agent php php-mysql ...

Zabbix代理模式

简介

Proxy模式用于监控服务器无法直接访问被监控机器的情况,如内网监控。

安装

安装源

rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm

安装proxy及依赖

yum install -y zabbix-proxy-mysql mysql-server

mysql初始化

/usr/bin/mysql_secure_installation

配置

创建数据库

CREATE DATABASE zabbix CHARACTER SET utf8;
GRANT ALL ON zabbix.* TO zabbix@'localhost' IDENTIFIED BY 'zabbixpass ...