ためすう

Kali Linux環境構築 (on Docker)

2020-12-26

やったこと

DockerでKali Linux環境を構築します。

確認環境

$ docker --version
Docker version 19.03.13, build 4484c46d9d

調査

Kali Linux

DebianベースのLinuxディストリビューションである。ペネトレーションテストを主な目的としている。 - Kali Linux - Wikipedia

Dockerを使ってインストールしてみる

公式ドキュメントの通りにやっていきます。

$ docker pull kalilinux/kali-rolling
$ docker run -t -i kalilinux/kali-rolling

コンテナ
# apt-get update && apt-get install metasploit-framework

コンテナ: OSの確認

# cat /etc/os-release
PRETTY_NAME="Kali GNU/Linux Rolling"
NAME="Kali GNU/Linux"
ID=kali
VERSION="2020.4"
VERSION_ID="2020.4"
VERSION_CODENAME="kali-rolling"
ID_LIKE=debian
ANSI_COLOR="1;31"
HOME_URL="https://www.kali.org/"
SUPPORT_URL="https://forums.kali.org/"
BUG_REPORT_URL="https://bugs.kali.org/"

最後に

CTF で使っていきたいと思います。

参考

DockerfileでUSERを利用する

2020-12-23

やったこと

DockerfileでUSERを使ってみます。

確認環境

$ docker --version
Docker version 19.03.13, build 4484c46d9d
$ docker-compose --version
docker-compose version 1.27.4, build 40524192

調査

docker-compose.yml

version: '3'
services:
  db-master:
    build:
      context: .
      args:
        my_cnf: master.cnf
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes

Dockerfile

FROM mysql:5.6

RUN groupadd -r app && useradd -r -g app app
USER app
COPY ./master.cnf /etc/mysql/conf.d/my.cnf
COPY --chown=app:app ./master.cnf /etc/mysql/conf.d/my2.cnf

master.cnf

[mysqld]
server-id = 1
log_bin = mysql-bin

確認

$ docker-compose run db-master bash
WARNING: Found orphan containers (mysql_db-slave_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Creating mysql_db-master_run ... done
app@a636617998ba:/$ ls -lh /etc/mysql/conf.d/
total 20K
-rw-r--r-- 1 root root 43 Nov 21 01:23 docker.cnf
-rw-r--r-- 1 root root 43 Dec 20 13:47 my.cnf
-rw-r--r-- 1 app  app  43 Dec 20 13:47 my2.cnf
-rw-r--r-- 1 root root  8 Jul  9  2016 mysql.cnf
-rw-r--r-- 1 root root 55 Jul  9  2016 mysqldump.cnf

my2.cnfapp ユーザーになっていることが分かります。

おまけ

確認したコンテナ環境

$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

$ groupadd --help
Usage: groupadd [options] GROUP

Options:
  -r, --system                  create a system account

$ useradd --help
Usage: useradd [options] LOGIN
       useradd -D
       useradd -D [options]

Options:
  -g, --gid GROUP               name or ID of the primary group of the new
                                account
  -r, --system                  create a system account

参考

docker-compose の環境変数を利用する

2020-12-22

やったこと

docker-composeの環境変数を利用してみます。

下記についてそれぞれやってみます。

  • env_file
  • environment
  • 実行元の環境変数

確認環境

$ docker --version
Docker version 19.03.13, build 4484c46d9d
$ docker-compose --version
docker-compose version 1.27.4, build 40524192

調査

docker-compose.yml

version: '3'
services:
  db-master:
    build:
      context: .
    env_file:
      - 'hoge.env'
    environment:
      - MY_ENV=myenvvvv
      - MY_ENV2=${HOST_100}

Dockerfile

FROM mysql:5.6

RUN echo $HOST_100
RUN echo $MY_ENV
RUN echo $AAA

hoge.env

AAA=BBB

環境変数をセットしておきます。

$ export HOST_100=999
$ echo $HOST_100
999

build してみます

$ docker-compose build --no-cache
Building db-master
Step 1/4 : FROM mysql:5.6
 ---> e1b3da40572b
Step 2/4 : RUN echo $HOST_100
 ---> Running in c7db45ca58d6

Removing intermediate container c7db45ca58d6
 ---> 74658905ed5f
Step 3/4 : RUN echo $MY_ENV
 ---> Running in a408138f343d

Removing intermediate container a408138f343d
 ---> 82e40a1c4754
Step 4/4 : RUN echo $AAA
 ---> Running in 10a445796fc5

Removing intermediate container 10a445796fc5
 ---> 88636d9beb52

Successfully built 88636d9beb52
Successfully tagged mysql_db-master:latest

build の段階では変数は読めていないことが分かりました。

それではコンテナを起動して、変数を出力してみましょう。

$ docker-compose up -d
WARNING: Found orphan containers (mysql_db-slave_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Recreating mysql_db-master_1 ... done

$ docker-compose exec db-master bash
root@b01c6b0eecc9:/# echo $HOST_100

root@b01c6b0eecc9:/# echo $MY_ENV
myenvvvv
root@b01c6b0eecc9:/# echo $AAA
BBB
root@b01c6b0eecc9:/# echo $MY_ENV2
999

このことから、ホストOSの環境変数を渡すには、environment を利用する必要がありそうです。

参考

DockerfileのENVとARGを使ってみる

2020-12-21

やったこと

Dockerfile の ENV と ARG を使ってみます。

確認環境

$ docker --version
Docker version 19.03.13, build 4484c46d9d
$ docker-compose --version
docker-compose version 1.27.4, build 40524192

調査

docker-compose.yml

version: '3'
services:
  db-master:
    build:
      context: .
      args:
        hoge: 'my_arg'

Dockerfile

FROM mysql:5.6

ARG hoge
ENV MY_ENV my_envvv
RUN echo $hoge
RUN echo ${hoge}
RUN echo $MY_ENV

build します

$ docker-compose build
Building db-master
Step 1/6 : FROM mysql:5.6
 ---> e1b3da40572b
Step 2/6 : ARG hoge
 ---> Using cache
 ---> 1e88cd11277d
Step 3/6 : ENV MY_ENV my_envvv
 ---> Running in d4f0b0db64b1
Removing intermediate container d4f0b0db64b1
 ---> 2ba1cbf3fbb9
Step 4/6 : RUN echo $hoge
 ---> Running in ea3b888d7a9c
my_arg
Removing intermediate container ea3b888d7a9c
 ---> 76be4c3cb1c7
Step 5/6 : RUN echo ${hoge}
 ---> Running in 948c8bf0e3f7
my_arg
Removing intermediate container 948c8bf0e3f7
 ---> e883a7d8399a
Step 6/6 : RUN echo $MY_ENV
 ---> Running in 77f146eb50ab
my_envvv
Removing intermediate container 77f146eb50ab
 ---> bcc7d7b8df2e

Successfully built bcc7d7b8df2e
Successfully tagged mysql_db-master:latest

コンテナに入って、ARG、ENV で指定した値が読み出せるか見てみます。

$ docker-compose up -d
WARNING: Found orphan containers (mysql_db-slave_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Recreating mysql_db-master_1 ... done

// コンテナに入ります
$ docker-compose exec db-master bash
root@e935de35c503:/#
root@e935de35c503:/#
root@e935de35c503:/# echo $MY_ENV
my_envvv
root@e935de35c503:/# echo $hoge

コンテナ起動時には、ARG で使用した値が参照できないことが確認できました。

Goに入門するため、Dockerで環境を構築する

2020-12-20

やったこと

Go の開発環境を Docker で構築してみます。

確認環境

$ docker --version
Docker version 19.03.13, build 4484c46d9d
$ docker-compose --version
docker-compose version 1.27.4, build 40524192

調査

Quick start

こちらを使います。

$ git clone git@github.com:tamesuu/docker-sample.git
$ cd docker-sample/golang/
$ mkdir work

ホストOS

$ vim work/main.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

ホストOS

$ docker-compose up -d
Recreating golang_app_1 ... done
$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
832161a8fe30        golang_app          "bash"              58 seconds ago      Up 57 seconds       0.0.0.0:9000->8080/tcp   golang_app_1
$ docker-compose exec app go run main.go
Hello, World!

docker-compose --help より

exec Execute a command in a running container

コンテナに対して、コマンドを実行します。

ディレクトリ指定版

$ mkdir work/hoge
$ vim work/hoge/server.go
$ docker-compose exec app go install hoge

docker-compose exec app go help より

install compile and install packages and dependencies

$ docker-compose exec app ../bin/hoge
server dayo
$ docker-compose exec app go env | grep GOPATH
GOPATH="/go"

ここはハマったのですが、go install した時、go/bin にビルドされた結果が出力されるようでした。

go/src
go/bin

gRPCのQuick start (Ruby)をやった

2020-12-19

やったこと

gRPC に入門します。

公式のチュートリアルとは少しだけ手順を変えてやっていきます。言語はRubyです。

確認環境

$ docker --version
Docker version 19.03.13, build 4484c46d9d

調査

gRPC とは

Googleが開発を開始したオープンソースのリモートプロシージャコール (RPC) システムである。

さらにデフォルトで、Protocol Buffersを使うことが出来ます。

Protocol Buffers とは

Protocol buffers are Google’s language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler

シリアライズしてあるデータで、速い(とのこと)。

Quick start を進める

tab1 (server)

-- local
$ docker run -it --rm grpc/ruby bash

-- コンテナ
$ gem install grpc

$ gem install grpc-tools

$ git clone -b v1.34.0 https://github.com/grpc/grpc
$ cd /grpc/examples/ruby
$ ruby greeter_server.rb

tab2 (client)

※ コンテナIDを $ docker ps を実行するなどして取得してください

-- local
$ docker exec -it de1f4f419893 bash

-- コンテナ
$ cd /grpc/examples/ruby

-- 編集用
$ apt-get update
$ apt-get install vim

今回は、tab2 (client) の中で色々作業していきます。

examples/protos/helloworld.proto

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // 今回追加する
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

gRPCのコードを生成

$ grpc_tools_ruby_protoc -I ../protos --ruby_out=lib --grpc_out=lib ../protos/helloworld.proto

このファイルが更新されました。

	modified:   lib/helloworld_pb.rb
	modified:   lib/helloworld_services_pb.rb

greeter_server.rb

class GreeterServer < Helloworld::Greeter::Service
  ...(省略)

  def say_hello_again(hello_req, _unused_call)
    Helloworld::HelloReply.new(message: "Hello again, #{hello_req.name}")
  end
end

greeter_client.rb

def main
  stub = Helloworld::Greeter::Stub.new('localhost:50051', :this_channel_is_insecure)
  user = ARGV.size > 0 ?  ARGV[0] : 'world'
  message = stub.say_hello(Helloworld::HelloRequest.new(name: user)).message
  p "Greeting: #{message}"

  # ここが追加するコード
  message = stub.say_hello_again(Helloworld::HelloRequest.new(name: user)).message
  p "Greeting: #{message}"
end

実行します

$ ruby greeter_client.rb

最後に

新しい言葉が多く出てきましたが、手を動かすことで開発の流れを少しだけイメージすることができました。

gRPC は数種類の通信方法があるみたいなので、やっていきたいと思います。

参考

docker-compose config を使ってみる

2020-12-18

やったこと

docker-compose config を使ってみます。

確認環境

$ docker --version
Docker version 19.03.13, build 4484c46d9d
$ docker-compose --version
docker-compose version 1.27.4, build 40524192

調査

docker-compose config --help より

Validate and view the Compose file.

ファイルのバージョンをバリデーションをしてくるようです。

それでは使ってみましょう。

バリデーションが通る場合

docker-compose.yml

version: '3'
services:
  app1:
    build: .
    ports:
      - '9000:8080'
  app2:
    build: .
    ports:
      - '9090:8080'

このオプションをつけて実行してみます。

–services Print the service names, one per line.

$ docker-compose config --service
app1
app2

バリデーションが通らない場合

docker-compose.yml

version: '3'
serves:
  app1:
    build: .
    ports:
      - '9000:8080'

service と書くべきところを serves とします。

エラーが発生しました。

$ docker-compose config --service
ERROR: The Compose file './docker-compose.yml' is invalid because:
Invalid top-level property "serves". Valid top-level sections for this Compose file are: version, services, networks, volumes, secrets, configs, and extensions starting with "x-".

You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/

docker-compose build して、Dockerコンテナの起動までしてみる

2020-12-13

やったこと

これらのコマンドを使っていきます。

  • docker-compose build
  • docker-compose up -d

確認環境

$ docker --version
Docker version 19.03.13, build 4484c46d9d
$ docker-compose --version
docker-compose version 1.27.4, build 40524192

調査

docker-compose build を実行する

docker-compose --help より

build Build or rebuild services

docker-compose build --help より

Build or rebuild services.

Services are built once and then tagged as project_service, e.g. composetest_db. If you change a service’s Dockerfile or the contents of its build directory, you can run docker-compose build to rebuild it.

Usage: build [options] [–build-arg key=val…] [–] [SERVICE…]

Dockerfile

FROM golang:latest

WORKDIR /go/src

ADD . /go/src

docker-compose.yml

version: '3' # composeファイルのバーション指定
services:
  app:
    build: .
    tty: true # コンテナの起動永続化
    volumes:
      - .:/go/src
    ports:
      - '9000:8080'

build 実行前

$ docker images | grep "app"
$ docker-compose images
Container   Repository   Tag   Image Id   Size
----------------------------------------------

ビルド実行

$ docker-compose build
Building app
Step 1/3 : FROM golang:latest
 ---> 8e2ffcb73e11
Step 2/3 : WORKDIR /go/src
 ---> Using cache
 ---> 7dbb384cb1ad
Step 3/3 : ADD . /go/src
 ---> b59a010ffd5b

Successfully built b59a010ffd5b
Successfully tagged golang_app:latest

ビルド実行後

$ docker-compose images
Container   Repository   Tag   Image Id   Size
----------------------------------------------
$ docker images | grep "app"
golang_app                           latest

Dockerイメージが作成されたことが分かります。(ちなみに、この挙動について公式ドキュメントが見つからなかった)

docker-compose up -d を実行する

$ docker-compose up -d
Creating network "golang_default" with the default driver
Creating golang_app_1 ... done

起動確認

$ docker ps | grep golang
45e0a8b4a6d2        golang_app            "bash"                   51 seconds ago      Up 48 seconds       0.0.0.0:9000->8080/tcp     golang_app_1
$ docker container ls | grep golang
45e0a8b4a6d2        golang_app            "bash"                   59 seconds ago      Up 56 seconds       0.0.0.0:9000->8080/tcp     golang_app_1
$ docker-compose ps
    Name       Command   State           Ports
-------------------------------------------------------
golang_app_1   bash      Up      0.0.0.0:9000->8080/tcp

起動していることが確認できました。

おまけ

コンテナに接続する

$ docker-compose exec app /bin/bash

参考

Dockerコンテナにポート指定してみる

2020-12-12

やったこと

Dockerコンテナにポート指定してみます。

確認環境

$ docker --version
Docker version 19.03.13, build 4484c46d9d

調査

$ docker container run \
> -d \
> --name nginx_test \
> -h host1 \
> -p 9090:80 \
> nginx:1.17
378b845265d4deb9ff6213ec37f82d3eaab57943b359b8db252c759d2f4535b9

$ docker container ls -a | grep nginx_test
378b845265d4        nginx:1.17            "nginx -g 'daemon of…"   33 seconds ago      Up 32 seconds               0.0.0.0:9090->80/tcp       nginx_test

docker container run --help より

-p, –publish list Publish a container’s port(s) to the host

http://localhost:9090/ にアクセスすると、nginx の Welcome ページが見えるかと思います。

ポート: 9090 でアクセスすると、80 に飛ばされるようになりました。

Dockerで起動コンテナにホストOSのVolumeを提供する

2020-12-11

やったこと

Dockerで起動しているコンテナに、ホストOSのVolumeを提供して共有で使います。

確認環境

$ docker --version
Docker version 19.03.13, build 4484c46d9d

調査

今回 docker container run で、このオプションを使ってみます。

-v, –volume list Bind mount a volume

タブ1: ホストOS (手元のPC) で起動するコンテナに提供するVolume

$ pwd
/tmp/test_volume
$ tree
.
└── sample.txt
$ cat sample.txt
123

タブ2: コンテナ起動

$ docker container run \
> --name abc_container \
> -h host1 \
> -it \
> -v /tmp/test_volume:/tmp \
> ruby:2.5 \
> /bin/bash
root@host1:/# ls /tmp/
sample.txt
root@host1:/# cat /tmp/sample.txt
123

タブ1: ファイル追加

$ pwd
/tmp/test_volume
$ echo 456 > sample2.md
$ cat sample2.md
456

タブ2: コンテナ上でファイルが存在していることを確認

root@host1:/# ls /tmp/
sample.txt  sample2.md
root@host1:/# cat /tmp/sample2.md
456

ホストOSで追加したファイルが、コンテナ上でも確認することができました。

最後に

ホストOSのデータをコンテナに見せるには、下記のような方法もあります。

  • bind mount
  • tmpfs mount