Calmery.me

みっかぼうずにならないようがんばる

VirtualBox上のUbuntuでDockerを動かしてみる

セキュリティさくら 分科会(仮称) 第2回 : ATND のまとめ.

事前準備

VirtualBox 上で Ubuntu を動かせる状態にしておく.自分は Ubuntu 17.04 を使用した.

コンテナと VM の違い

VM はハードウェアシュミュレーションであってコンテナはあるプロセスに専用の実行空間を用意すること.注目を浴びる「Dockerコンテナ」、従来の仮想化と何が違うのか? | コラム | 東京エレクトロン デバイス株式会社 とかを読んだら雰囲気はわかると思う.

Docker がしてくれるもの

  • コンテナ管理
  • 環境構築
  • イメージ管理

Docker の使い方

  • Image を作成する
    • docker build
  • コンテナを実行する
    • docker run

インストー

Get Docker for Ubuntu - Docker Documentation を見る.インストールする対象ごとにドキュメントが用意されているので参考にする.

$ sudo apt-get remove docker docker-engine
$ sudo apt-get update
$ sudo apt-get install \
    linux-image-extra-$(uname -r) \
    linux-image-extra-virtual
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
$ apt-cache madison docker-ce
$ sudo docker run hello-world
$ sudo usermod -aG docker $(whoami)

usermod を実行後,ログインし直す必要がある.

Ubuntu の 17.04 では add-apt-repository の $(lsb_release -cs) を xenial に変更する必要がある.ここを変更していないと apt-get install docker-ce したときにそんなものないよって言われる.

$ sudo apt-get install docker-ce
  Readning package lists... Done
  Building dependency tree
  Reading state information... Done
  E: Unable to locate package docker-ce

Note: The lsb_release -cs sub-command below returns the name of your Ubuntu distribution, such as xenial.

Sometimes, in a distribution like Linux Mint, you might have to change $(lsb_release -cs) to your parent Ubuntu distribution. For example: If you are using Linux Mint Rafaela, you could use trusty.
Get Docker for Ubuntu - Docker Documentation

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   xenial \
   stable"

Hello World

試しに動かしてみる.

$ sudo docker run hello-world
  Unable to find image 'hello-world:latest' locally
  latest: Pulling from library/hello-world
  78445dd45222: Pull complete 
  Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
  Status: Downloaded newer image for hello-world:latest

  Hello from Docker!
  This message shows that your installation appears to be working correctly.

  To generate this message, Docker took the following steps:
   1. The Docker client contacted the Docker daemon.
   2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
   3. The Docker daemon created a new container from that image which runs the
      executable that produces the output you are currently reading.
   4. The Docker daemon streamed that output to the Docker client, which sent it
      to your terminal.

  To try something more ambitious, you can run an Ubuntu container with:
   $ docker run -it ubuntu bash

  Share images, automate workflows, and more with a free Docker ID:
   https://cloud.docker.com/

  For more examples and ideas, visit:
   https://docs.docker.com/engine/userguide/

Struts2 を動かしてみる

何かと話題となった Struts2 を Docker で動かしてみる.

$ mkdir workspace
$ cd workspace
$ wget https://dist.apache.org/repos/dist/release/struts/2.5.10.1/struts-2.5.10.1-apps.zip
$ unzip struts-25.10.1-apps.zip
$ vim Dockerfile
$ cat Dockerfile
  FROM tomcat:7.0-jre8
  ADD struts-2.5.10.1/apps/struts2-rest-showcase.war /usr/local/tomcat/webapps/
  CMD ["catalina.sh", "run"]
$ ls
  struts-25.10.1 Dockerfile
$ docker build -t struts/st .
$ docker run -it --rm -p 8080:8080 struts/st
  ...
  May 13, 2017 5:10:29 AM org.apache.catalina.startup.Catalina start
  INFO: Server startup in 8858 ms

http://localhost:8080 を開き,以下のような画面が表示されたら成功.docker run の -p 8080:8080 ではコンテナ側の 8080 番ポートを実行環境の 8080 番ポートに割り当てているのだとか.コンテナに外部からアクセス(ポートフォワード) - Qiita あたりを参考に.
f:id:calmery:20170514204146p:plain

共有フォルダを作成する

分科会では Ubuntu 16.04 LTS : Samba : フルアクセスの共有フォルダ作成 : Server World を見ながら進めたが,ここでは sambaサーバによるファイル共有環境の構築手順 を見ながら進めることにする.

sambaサーバの構築手順
上図のファイル共有環境の構築のためには以下の手順が必要になります。
1. sambaのインストー
2. sambaユーザの作成
3. sambaユーザのグループへの追加
4. グループ共有用ディレクトリの作成とアクセス権の設定
5. sambaの設定ファイルの編集
sambaサーバによるファイル共有環境の構築手順

まずは samba を apt-get を使ってインストールする.ついでに ifconfig を使うための net-tools と vim もインストールした.

$ sudo apt-get install samba
$ sudo apt-get install vim net-tools

samba で使用するユーザを追加する.

sambaを使用するユーザを作成する場合、sambaが動作するLinux上にsambaを使用するユーザと同名のLinuxユーザがすでに存在している必要があります。
sambaサーバによるファイル共有環境の構築手順

ということなのでユーザを作成してから pdbedit で samba にユーザを追加する.既にあるユーザを追加する場合は pdbedit だけ実行すればいい.

$ sudo useradd -m user1
$ sudo pdbedit -a user1
 new password:
 retype new password:

グループを作成し,グループごとにアクセス権を与える.

sambaでは、sambaが動作するLinux上に存在するグループ毎に、共有するファイルやディレクトリのアクセス権を変更できます。今回はubuntu上にgroup1という名前のグループを作成し、group1に属するユーザだけがアクセスできるディレクトリを作成します。
sambaサーバによるファイル共有環境の構築手順

$ sudo groupadd group1
$ sudo gpasswd -a user1 group1
 Adding user user1 to group group1

ディレクトリの作成を行い,先ほど追加したグループへアクセス権限の追加を行う.

$ sudo mkdir /home/public
$ sudo chgrp group1 /home/public
$ sudo chmod -R 774 /home/public

samba の設定を変更する.

$ sudo vim /etc/samba/smb.conf
$ cat /etc/samba/smb.conf
  ...
  unix charset = UTF-8
  dos charset = CP932
  ...
  map to guest = never
  ...
  [public]
     path = /home/public
     browseable = yes
     writable = yes
     valid users = @group1

ここでは valid users にグループ名を指定しているが pdbedit で追加したユーザを直接指定することもできる.

valid users = calmery, user1, user2

ホスト側で開く.ここで指定するアドレスは ifconfig で調べられる.
f:id:calmery:20170514205819p:plain
先ほど登録したユーザ名とパスワードを入力する.
f:id:calmery:20170514205319p:plain
マウントするボリュームを選択する.
f:id:calmery:20170514205748p:plain
開けた.ここで追加したファイルは Ubuntu 上で確認できる.
f:id:calmery:20170514205537p:plain
f:id:calmery:20170514210032p:plain
右クリックで取り出せる.
f:id:calmery:20170514210110p:plain

ハマったところ

自分は分科会で共有フォルダを開くことができなかった.調べてみると

また、NATの使用時に、SSH等でホストOSからゲストOSへの接続を行いたい場合、ネットワークのアダプターにホストオンリーアダプターを別途使用することで、ゲストOSへホストOSから接続可能とすることができます。
VirtualBox CentOS6.7 64bitでNAT、ホストオンリーアダプターを使用 | kakiro-web カキローウェブ

ということらしく,VirtualBoxVM の設定のネットワークから「ホストオンリーアダプター」を追加すると共有フォルダを開くことができるようになった.
f:id:calmery:20170514204231p:plain

まとめ

なるほど(?)
ほとんど環境を整えただけで終わってしまったが,簡単な使い方はわかったので色々と調べてみようと思う.

Dockerを使って、Apache Struts2の脆弱性S2-037のやられ環境を手軽に作る - DARK MATTER
Dockerで作る開発環境 - Qiita
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】

ちなみに共有フォルダでは会話も楽しむことができる.