kakakakakku blog

Weekly Tech Blog: Keep on Learning!

FaaS フレームワーク「OpenFaaS」を実践的に学べる公式ワークショップ

Docker Swarm と Kubernetes をサポートしている FaaS フレームワークとして「OpenFaaS」がある.CNCF Cloud Native Landscape を見ても Serverless カテゴリに入っている.OpenFaaS は前から気になっていたけど,今まで試したことがなく,最近 GitHub に OpenFaaS 公式のワークショップがあることを知って,さらに日本語版も用意されていたため,今回はワークショップを進めながら OpenFaaS を学ぶことにした.

www.openfaas.com

アジェンダ

  • Lab 1 : まずはOpenFaaSの準備
  • Lab 2 : OpenFaaSを試してみよう
  • Lab 3 : はじめてのfunction
  • Lab 4 : functionについてさらに掘り下げてみよう
  • Lab 5 : Gitbotを作ろう
  • Lab 6 : functionでHTMLを扱ってみよう
  • Lab 7 : 非同期 function
  • Lab 8 : 応用編 - タイムアウト
  • Lab 9 : 応用編 - functionのオートスケール
  • Lab 10 : 応用編 - secretの使い方
  • Appendix

英語版だと,既に「Lab 11 - Advanced feature - Trust with HMAC」まで追加されている.

github.com

Lab 1 : まずはOpenFaaSの準備

Lab 1 では,OpenFaaS を動かす環境を構築する.今回は「Docker Desktop for Mac + Docker Swarm」を使うことにした.Docker Swarm ではなく Kubernetes もサポートしているけど,ワークショップの推奨構成は Docker Swarm となる.

$ docker --version
Docker version 18.09.1, build 4c52b90

次に「OpenFaaS CLI」をインストールする.今回は brew を使った.

$ brew install faas-cli

$ faas-cli version
  ___                   _____           ____
 / _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 \___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
      |_|

CLI:
 commit:  a141dedf94ffeed84412365fd591bdc8999c5a1b
 version: 0.8.3

github.com

最後に OpenFaaS をデプロイする.OpenFaaS の公式リポジトリを git clone し,deploy_stack.sh を実行すると,Docker Swarm にデプロイできる.OpenFaaS フレームワークとして,複数のコンテナが動いていることも確認できる.

$ git clone https://github.com/openfaas/faas

$ cd faas && \
  git checkout master

$ ./deploy_stack.sh --no-auth

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                         PORTS
j8sukvimvk20        func_alertmanager   replicated          1/1                 prom/alertmanager:v0.15.0
azd1ypjtat6r        func_faas-swarm     replicated          1/1                 openfaas/faas-swarm:0.6.1
xslhyv2k81ij        func_gateway        replicated          1/1                 openfaas/gateway:0.9.14       *:8080->8080/tcp
lmuottao09ga        func_nats           replicated          1/1                 nats-streaming:0.11.2
kslgx10aa2md        func_prometheus     replicated          1/1                 prom/prometheus:v2.3.1        *:9090->9090/tcp
ocpfj4xiofns        func_queue-worker   replicated          1/1                 openfaas/queue-worker:0.5.4

github.com

さらに OpenFaaS にはコンソールもあり,既に http://localhost:8080/ui/ にアクセスすると,接続できるようになっている.

f:id:kakku22:20190130214050p:plain

Lab 2 : OpenFaaSを試してみよう

Lab 2 では,OpenFaaS の公式リポジトリにある stack.yml を使って,実際に Function をデプロイする.

$ faas-cli deploy -f https://raw.githubusercontent.com/openfaas/faas/master/stack.yml
Parsed: https://raw.githubusercontent.com/openfaas/faas/master/stack.yml
Deploying: hubstats.

Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/hubstats

Deploying: nodeinfo.

Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/nodeinfo

Deploying: echoit.

Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/echoit

Deploying: wordcount.

Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/wordcount

Deploying: base64.

Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/base64

Deploying: markdown.

Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/markdown

コンソールから Function を実行することができる.例えば,Markdown を HTML に変換する function/markdown Function がある.

f:id:kakku22:20190130214110p:plain

他には入力した文章から文字数をカウントする function/wordcount Function など,計6種類あった.

f:id:kakku22:20190130214130p:plain

OpenFaaS には Function を公開できる仕組みとして「Function Store」がある.今回はアスキーアートを表示する function/figlet Function をコンソールからデプロイした.

f:id:kakku22:20190130214151p:plain

github.com

また faas-cli list --verbose を実行すると,Function ごとの実行回数 (Invocations) を確認できる.

$ faas-cli list --verbose
Function                        Image                                       Invocations     Replicas
figlet                          functions/figlet:0.9.6                    6                  1
nodeinfo                        functions/nodeinfo:latest                 0                  1
wordcount                       functions/alpine:latest                   3                  1
echoit                          functions/alpine:latest                   0                  1
hubstats                        functions/hubstats:latest                 0                  1
markdown                        functions/markdown-render:latest          5                  1
base64                          functions/alpine:latest                   0                  1

最後はモニタリング関連の話題となり,OpenFaaS を Docker Swarm にデプロイしたときに,実は Docker Compose によって Prometheus も起動していて,OpenFaaS のメトリクスを取得している.今回は Prometheus を可視化するために Grafana を起動する.

$ docker service create -d \
--name=grafana \
--publish=3000:3000 \
--network=func_functions \
stefanprodan/faas-grafana:4.6.3

さっそく http://127.0.0.1:3000/dashboard/db/openfaas にアクセスすると,Grafana で OpenFaaS のメトリクスを可視化できるようになっている.OpenFaaS だけではなく,Prometheus や Grafana も合わせて試せるのは良い点だと思う.

f:id:kakku22:20190130214222p:plain

Lab 3 : はじめてのfunction

Lab 3 では,公式テンプレートから Function を作る.現時点で「計15種類」のテンプレートが公開されている.今回使う Python 3 以外にも,Go や Ruby も用意されていた.

$ faas-cli template pull

$ faas-cli new --list
Languages available as templates:
- csharp
- csharp-armhf
- dockerfile
- go
- go-armhf
- java8
- node
- node-arm64
- node-armhf
- php7
- python
- python-armhf
- python3
- python3-armhf
- ruby

github.com

今回は Python 3 テンプレートを使って hello-openfaas Function を作る.テンプレートは --lang オプションで指定する.なお --prefix オプションで指定するのは Function 名のプレフィックスで,今回は Docker Hub に公開することを前提に,Docker Hub のアカウント名を指定する.

$ faas-cli new --lang python3 hello-openfaas --prefix="kakakakakku"
Folder: hello-openfaas created.
  ___                   _____           ____
 / _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 \___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
      |_|


Function created in folder: hello-openfaas
Stack file written: hello-openfaas.yml

Function を作ると,合わせて Stack ファイルも作られる.以下に hello-openfaas.yml を載せておく.

provider:
  name: faas
  gateway: http://127.0.0.1:8080
functions:
  hello-openfaas:
    lang: python3
    handler: ./hello-openfaas
    image: kakakakakku/hello-openfaas:latest

そして,単純な文字列 "Hello OpenFaaS" を返す実装を handler.py にして,hello-openfaas Function をデプロイする.今回は faas-cli buildfaas-cli pushfaas-cli deploy のフローになる.さらに Function の実行は faas-cli invoke でできる.

$ faas-cli build -f ./hello-openfaas.yml

$ faas-cli push -f ./hello-openfaas.yml

$ faas-cli deploy -f ./hello-openfaas.yml
Deploying: hello-openfaas.

Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/hello-openfaas

$ faas-cli invoke hello-openfaas
Reading from STDIN - hit (Control + D) to stop.
Hello OpenFaaS

コマンドの裏側では docker builddocker push が実行されているため,Docker Hub を見ると,Docker イメージも公開されている.

f:id:kakku22:20190130214324p:plain

次に外部 API と連携し,宇宙飛行士の名前をランダムに表示する astronaut-finder Function を実装し,デプロイする.特別な内容はなく,実行結果を載せておく.

$ echo | faas-cli invoke astronaut-finder
Oleg Kononenko is in space

$ echo | faas-cli invoke astronaut-finder
Anne McClain is in space

今度は Docker Compose のように,OpenFaaS で複数の Function を管理する設定を試す.faas-cli new コマンドには --append オプションがあり,複数の Function を同じ Stack ファイルにまとめることができる.

$ faas-cli new --lang python3 first
$ faas-cli new --lang python3 second --append=./first.yml

最後にカスタムバイナリの紹介で,faas-cli new コマンドの --lang オプションには,プログラミング言語だけではなく dockerfile も指定することができる.これは指定した Docker イメージをテンプレートにできる機能で,Function をカスタマイズするときに必要になりそう.

$ faas-cli new --lang dockerfile sorter --prefix="kakakakakku"

Lab 4 : functionについてさらに掘り下げてみよう

Lab 4 では,詳細な Function 管理を学ぶ.OpenFaaS では「Watchdog」と呼ばれる HTTP サーバも起動していて,標準入力と標準出力をプロキシする役割となる.Function のログを出力するときに,デフォルトの挙動だと stderrstdout に統合するため,もし統合を解消する場合は Stack ファイルに以下の設定を追加する必要がある.

environment:
  combine_output: false

次に OpenFaaS で Function を組み合わせたワークフローを実現する方法を学ぶ.大きく2種類あり「クライアント側でパイプを使って組み合わせる方法」「Function から Function を呼び出す方法」がある.お手軽に実現するなら「クライアント側でパイプを使って組み合わせる方法」を使う.

$ echo -n "" | faas-cli invoke nodeinfo | faas-cli invoke markdown

Lab 5 : Gitbotを作ろう

Lab 5 では,OpenFaaS で GitHub の Webhooks を受け取る Function を実装する.機能としては GitHub Issue が作られると,Function が Webhooks を受け取り,GitHub Issue のタイトルと本文を分析してポジティブかどうかを判定し,結果を GitHub Issue のラベルに登録する.ただし,ローカルに構築した OpenFaaS 環境では Webhooks を受け取れないため,今回は ngrok コンテナを起動し,トンネルを作る.

$ faas-cli list --gateway http://xxxxxxxx.ngrok.io/
Function                        Invocations     Replicas
figlet                          0                  1
env                             0                  1
nodeinfo                        0                  1
wordcount                       0                  1
sorter                          0                  1
sentimentanalysis               0                  1
echoit                          0                  1
hubstats                        0                  1
hello-openfaas                  0                  1
markdown                        0                  1
base64                          0                  1
astronaut-finder                0                  1

まず,Webhooks を受け取る issue-bot Function を作る.手順と実装は省略する.事前に GitHub の Settings で Webhooks を設定しておく必要もある.

$ faas-cli new --lang python3 issue-bot --prefix="kakakakakku"
$ faas-cli build -f ./issue-bot.yml
$ faas-cli push -f ./issue-bot.yml

Webhooks を受け取れることを確認したら,今度はタイトルと本文がポジティブかどうかを判定する function/sentimentanalysis Function を呼び出せるように修正する.最後に GitHub の Personal Access Tokens を env.yml に設定し,issue-bot Function の環境変数として読み込むことで,GitHub Issue のラベルを登録できるようにする.function/sentimentanalysis Function の実行例を以下に載せておく.

$ echo -n "I am really excited to participate in the OpenFaaS workshop." | faas-cli invoke sentimentanalysis
{"polarity": 0.375, "sentence_count": 1, "subjectivity": 0.75}

$ echo -n "The hotel was clean, but the area was terrible" | faas-cli invoke sentimentanalysis
{"polarity": -0.31666666666666665, "sentence_count": 1, "subjectivity": 0.8500000000000001}

実際に OpenFaaS 経由で GitHub Issue にラベルを登録できた.

f:id:kakku22:20190130214346p:plain

Lab 6 : functionでHTMLを扱ってみよう

Lab 6 では,HTTP サーバのように HTML を返す Function を作る.Function の作成は今まで通り.

$ faas-cli new --lang python3 show-html --prefix="kakakakakku"

重要なのは Stack ファイルで,以下のように content_type: text/html を指定すると,レスポンスの Content-Type を固定することができる.

provider:
  name: faas
  gateway: http://127.0.0.1:8080
functions:
  show-html:
    lang: python3
    handler: ./show-html
    image: kakakakakku/show-html:latest
    environment:
      content_type: text/html

HTML を返す Function を実装し,以下の URL にアクセスすると,ウェブページにアクセスできる.

  • http://127.0.0.1:8080/function/show-html
  • http://127.0.0.1:8080/function/show-html?action=new
  • http://127.0.0.1:8080/function/show-html?action=list

最後は JavaScript も組み合わせて,入力した文字列をアスキーアートに変換する function/figlet Function を呼び出すアプリケーションを実装した.

  • http://127.0.0.1:8080/function/show-html?action=figlet

f:id:kakku22:20190130214404p:plain

Lab 7 : 非同期 function

Lab 7 では,Function を「同期的」に実行する方法と「非同期的」に実行する方法を学んだ.具体的には faas-cli invoke コマンドには --async オプションがあり,非同期的に実行することができる.非同期的に実行をすると,Function は Gateway から 「202 Accepted」のレスポンスを受けることになる.また HTTP ヘッダーに X-Callback-Url を設定することにより,Function の実行後にコールバックを受けることもできる.Function の特性に応じて,非同期的な実行が必要になる場面もありそう.

$ echo -n "" | faas-cli invoke long-task --async
Function submitted asynchronously.

さらに OpenFaaS は非同期実行のために「NATS Streaming」を採用していると書いてあった.確かに docker service ls で確認したコンテナの中にも NATS があった.NATS は CNCF (Cloud Native Computing Foundation) にも所属するメッセージングサービスを提供するミドルウェアで,前から試したいと思っていたところだった.

nats.io

Lab 8 : 応用編 - タイムアウト

Lab 8 では,Function のタイムアウト設定を学んだ.OpenFaaS では「計4種類」の環境変数でタイムアウトの時間を制御することができる.

  • sleep_duration
  • read_timeout
  • write_timout
  • exec_timeout

今回は sleep_duration = 10sleep_duration = 2 の動作を確認した.

provider:
  name: faas
  gateway: http://127.0.0.1:8080
functions:
  sleep-for:
    lang: python3
    handler: ./sleep-for
    image: kakakakakku/sleep-for:latest
    environment:
      sleep_duration: 10
      read_timeout: 5
      write_timeout: 5
      exec_timeout: 5

以下のような結果となり,sleep_duration = 10 の場合はワークショップの記載内容と少し差があった.

$ echo | faas-cli invoke sleep-for
Server returned unexpected status code: 502 -

$ echo | faas-cli invoke sleep-for
Starting to sleep for 2
Finished the sleep

Lab 9 : 応用編 - functionのオートスケール

Lab 9 では,OpenFaaS のオートスケールを学んだ.具体的には Prometheus の Alertmanager と連携する仕組みになっている.

docs.openfaas.com

function/nodeinfo Function を大量に実行するときに,Mac だと記載されているコマンドだと使えなかった.

$ while [ true ]; do curl -X POST http://localhost:8080/function/nodeinfo\; done;
while>

今回は以下のコマンドを実行した.

$ while :
  do
    curl -X POST http://localhost:8080/function/nodeinfo
  done

Prometheus のアラート画面を見ると,FIRING / PENDING になっていることを確認できた.faas-cli list でも,実行回数 (Invocations) が増えていた.

$ faas-cli list | egrep 'Function|nodeinfo'
Function                        Invocations     Replicas
nodeinfo                        1447               1

f:id:kakku22:20190130234728p:plain

Lab 10 : 応用編 - secretの使い方

Lab 10 では,OpenFaaS と「Docker secrets」を組み合わせて,機密情報を扱う方法を学んだ.

docs.docker.com

今回は GitHub の Personal Access Tokens を Docker secrets に登録し,Function から参照するように issue-bot Function をリファクタリングした.環境変数ではなく Docker secrets を使う Lab があるのは素晴らしいと思う.

$ echo -n xxx | docker secret create auth-token -
$ docker secret inspect auth-token

ワークショップ改善(プルリクエスト)

ワークショップを進めながら気になった点を修正して,プルリクエストを2個送った.

github.com

github.com

ワークショップ改善(フィードバック)

プルリクエストは送らなかったけど,ワークショップを改善できる点をまとめておく.OpenFaaS コミュニティに届くと良いなぁー!

  • 全体的に
    • mkdir を実行する手順が微妙で,ディレクトリ階層が /openfaas/faas/lab2/lab3 のようになってしまう
    • Lab ごとに起点となるディレクトリ直下で mkdir をすると良さそう
  • Lab 3
    • 「複数のfunctionの管理」のところにある faas-cli new でも --prefix を付けると良さそう
  • Lab 6
    • HTML に指定されているフォントが「Roboto Mono」で,等幅フォントではないため,アスキーアートの表示が崩れてしまう
    • 例えば「Courier New」など,等幅フォントに変更すると良さそう
  • Lab 7
    • 正式表記にするならば「Github」ではなく「GitHub」にすると良さそう
  • Lab 8
    • echo | faas-cli invoke sleep-for で 502 が返ってくるため,最新バージョンでの出力結果に更新すると良さそう
  • Lab 9
    • 正式表記にするならば「AlertManager」ではなく「Alertmanager」にすると良さそう
    • Alertmanager | Prometheus

まとめ

  • 「OpenFaaS」を学ぶために OpenFaaS 公式ワークショップを試した
    • 日本語版もある
  • OpenFaaS の基礎から応用まで幅広く学ぶことができた
  • OpenFaaS だけではなく Prometheus や Grafana や NATS Streaming も学べる題材になっている
  • ワークショップの所要時間は3,4時間程度だと思う(個人差あり)

参考資料

OpenFaaS のアーキテクチャが詳しく載っていて,参考になった.

Docker 公式のセキュリティ診断ツール「Docker Bench for Security」を試した

最近 Docker 関連のセキュリティツールを調査する機会があり,今回は「Docker Bench for Security」を試したログを残しておく.「Docker Bench for Security」は Docker から公式に提供されているセキュリティ診断ツールで,具体的には「CIS Docker Community Edition Benchmark v1.1.0」をサポートしている.

github.com

コンテナ実行

「Docker Bench for Security」を実行する方法は複数ある.1番簡単なのはコンテナを実行する方法で,Docker イメージ「docker/docker-bench-security」が Docker Hub に公開されている.

注意点としては,コンテナから CAP_AUDIT_CONTROL ケーパビリティなどの特権を許可する必要があることと,診断対象となるディレクトリをコンテナから参照できるようにする必要がある.GitHub に載っているコマンドはあくまでサンプルで,systemd を指定しているため,CentOS 7 系を前提にしているように思う.

$ docker run -it --net host --pid host --userns host --cap-add audit_control \
    -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
    -v /var/lib:/var/lib \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/lib/systemd:/usr/lib/systemd \
    -v /etc:/etc --label docker_bench_security \
    docker/docker-bench-security

シェル実行

「Docker Bench for Security」のリポジトリを clone して docker-bench-security.sh を実行すると,シェルですぐに診断ができる.診断項目を include / exclude するオプションもあり,柔軟に使える.

$ ./docker-bench-security.sh

$ ./docker-bench-security.sh -c check_1_1

$ ./docker-bench-security.sh -c check_1_1,check_1_2

$ ./docker-bench-security.sh -h
  usage: docker-bench-security.sh [options]

  -b           optional  Do not print colors
  -h           optional  Print this help message
  -l FILE      optional  Log output in FILE
  -c CHECK     optional  Comma delimited list of specific check(s)
  -e CHECK     optional  Comma delimited list of specific check(s) to exclude
  -i INCLUDE   optional  Comma delimited list of patterns within a container name to check
  -x EXCLUDE   optional  Comma delimited list of patterns within a container name to exclude from check
  -t TARGET    optional  Comma delimited list of images name to check

ちなみに docker-bench-security.sh の内部では ss コマンドを使っているため,Mac で Docker for Mac を診断しようとすると,以下のエラーが出る.とは言え,Mac で診断をするシチュエーションはあまりなさそう.

$ ./docker-bench-security.sh
ss command not found.

診断項目

GitHub Wiki などに診断項目の一覧がまとまってなく,自分用に整理をした.診断項目の実装は GitHub で tests ディレクトリ直下のシェルを読めばわかる.基本的にはシェル芸で実装されている.

  • 1 - Host Configuration
    • 1.1 - Ensure a separate partition for containers has been created
    • 1.2 - Ensure the container host has been Hardened
    • 1.3 - Ensure Docker is up to date
    • 1.4 - Ensure only trusted users are allowed to control Docker daemon
    • 1.5 - Ensure auditing is configured for the Docker daemon
    • 1.6 - Ensure auditing is configured for Docker files and directories - /var/lib/docker
    • 1.7 - Ensure auditing is configured for Docker files and directories - /etc/docker
    • 1.8 - Ensure auditing is configured for Docker files and directories - docker.service
    • 1.9 - Ensure auditing is configured for Docker files and directories - docker.socket
    • 1.10 - Ensure auditing is configured for Docker files and directories - /etc/default/docker
    • 1.11 - Ensure auditing is configured for Docker files and directories - /etc/docker/daemon.json
    • 1.12 - Ensure auditing is configured for Docker files and directories - /usr/bin/docker-containerd
    • 1.13 - Ensure auditing is configured for Docker files and directories - /usr/bin/docker-runc
  • 2 - Docker daemon configuration
    • 2.1 - Ensure network traffic is restricted between containers on the default bridge
    • 2.2 - Ensure the logging level is set to 'info'
    • 2.3 - Ensure Docker is allowed to make changes to iptables
    • 2.4 - Ensure insecure registries are not used
    • 2.5 - Ensure aufs storage driver is not used
    • 2.6 - Ensure TLS authentication for Docker daemon is configured
    • 2.7 - Ensure the default ulimit is configured appropriately
    • 2.8 - Enable user namespace support
    • 2.9 - Ensure the default cgroup usage has been confirmed
    • 2.10 - Ensure base device size is not changed until needed
    • 2.11 - Ensure that authorization for Docker client commands is enabled
    • 2.12 - Ensure centralized and remote logging is configured
    • 2.13 - Ensure operations on legacy registry (v1) are Disabled (Deprecated)
    • 2.14 - Ensure live restore is Enabled
    • 2.15 - Ensure Userland Proxy is Disabled
    • 2.16 - Ensure daemon-wide custom seccomp profile is applied, if needed
    • 2.17 - Ensure experimental features are avoided in production
    • 2.18 - Ensure containers are restricted from acquiring new privileges
  • 3 - Docker daemon configuration files
    • 3.1 - Ensure that docker.service file ownership is set to root:root
    • 3.2 - Ensure that docker.service file permissions are set to 644 or more restrictive
    • 3.3 - Ensure that docker.socket file ownership is set to root:root
    • 3.4 - Ensure that docker.socket file permissions are set to 644 or more restrictive
    • 3.5 - Ensure that /etc/docker directory ownership is set to root:root
    • 3.6 - Ensure that /etc/docker directory permissions are set to 755 or more restrictive
    • 3.7 - Ensure that registry certificate file ownership is set to root:root
    • 3.8 - Ensure that registry certificate file permissions are set to 444 or more restrictive
    • 3.9 - Ensure that TLS CA certificate file ownership is set to root:root
    • 3.10 - Ensure that TLS CA certificate file permissions are set to 444 or more restrictive
    • 3.11 - Ensure that Docker server certificate file ownership is set to root:root
    • 3.12 - Ensure that Docker server certificate file permissions are set to 444 or more restrictive
    • 3.13 - Ensure that Docker server certificate key file ownership is set to root:root
    • 3.14 - Ensure that Docker server certificate key file permissions are set to 400
    • 3.15 - Ensure that Docker socket file ownership is set to root:docker
    • 3.16 - Ensure that Docker socket file permissions are set to 660 or more restrictive
    • 3.17 - Ensure that daemon.json file ownership is set to root:root
    • 3.18 - Ensure that daemon.json file permissions are set to 644 or more restrictive
    • 3.19 - Ensure that /etc/default/docker file ownership is set to root:root
    • 3.20 - Ensure that /etc/default/docker file permissions are set to 644 or more restrictive
  • 4 - Container Images and Build File
    • 4.1 - Ensure a user for the container has been created
    • 4.2 - Ensure that containers use trusted base images
    • 4.3 - Ensure unnecessary packages are not installed in the container
    • 4.4 - Ensure images are scanned and rebuilt to include security patches
    • 4.5 - Ensure Content trust for Docker is Enabled
    • 4.6 - Ensure HEALTHCHECK instructions have been added to the container image
    • 4.7 - Ensure update instructions are not use alone in the Dockerfile
    • 4.8 - Ensure setuid and setgid permissions are removed in the images
    • 4.9 - Ensure COPY is used instead of ADD in Dockerfile
    • 4.10 - Ensure secrets are not stored in Dockerfiles
    • 4.11 - Ensure verified packages are only Installed
  • 5 - Container Runtime
  • 6 - Docker Security Operations
    • 6.1 - Avoid image sprawl
    • 6.2 - Avoid container sprawl
  • 7 - Docker Swarm Configuration
    • 7.1 - Ensure swarm mode is not Enabled, if not needed
    • 7.2 - Ensure the minimum number of manager nodes have been created in a swarm (Swarm mode not enabled)
    • 7.3 - Ensure swarm services are binded to a specific host interface (Swarm mode not enabled)
    • 7.4 - Ensure data exchanged between containers are encrypted on different nodes on the overlay network
    • 7.5 - Ensure Docker's secret management commands are used for managing secrets in a Swarm cluster (Swarm mode not enabled)
    • 7.6 - Ensure swarm manager is run in auto-lock mode (Swarm mode not enabled)
    • 7.7 - Ensure swarm manager auto-lock key is rotated periodically (Swarm mode not enabled)
    • 7.8 - Ensure node certificates are rotated as appropriate (Swarm mode not enabled)
    • 7.9 - Ensure CA certificates are rotated as appropriate (Swarm mode not enabled)
    • 7.10 - Ensure management plane traffic has been separated from data plane traffic (Swarm mode not enabled)

改善 : 1 - Host Configuration

今回は Amazon Linux 2 を検証用ホストとして,Docker 18.06.1-ce のデフォルト状態に対して「Docker Bench for Security (1 - Host Configuration)」を実行した.すると,計7項目が WARN になった.今回は「auditd」 で Docker 関連の監査ログを取れるようにする.

$ ./docker-bench-security.sh -c check_1,check_1_1,check_1_2,check_1_3,check_1_4,check_1_5,check_1_6,check_1_7,check_1_8,check_1_9,check_1_10,check_1_11,check_1_12,check_1_13

(中略)

[INFO] 1 - Host Configuration
[WARN] 1.1  - Ensure a separate partition for containers has been created
[NOTE] 1.2  - Ensure the container host has been Hardened
[INFO] 1.3  - Ensure Docker is up to date
[INFO]      * Using 18.06.1, verify is it up to date as deemed necessary
[INFO]      * Your operating system vendor may provide support and security maintenance for Docker
[INFO] 1.4  - Ensure only trusted users are allowed to control Docker daemon
[INFO]      * docker:x:993:
[WARN] 1.5  - Ensure auditing is configured for the Docker daemon
[WARN] 1.6  - Ensure auditing is configured for Docker files and directories - /var/lib/docker
[WARN] 1.7  - Ensure auditing is configured for Docker files and directories - /etc/docker
[WARN] 1.8  - Ensure auditing is configured for Docker files and directories - docker.service
[INFO] 1.9  - Ensure auditing is configured for Docker files and directories - docker.socket
[INFO]      * File not found
[INFO] 1.10  - Ensure auditing is configured for Docker files and directories - /etc/default/docker
[INFO]      * File not found
[INFO] 1.11  - Ensure auditing is configured for Docker files and directories - /etc/docker/daemon.json
[INFO]      * File not found
[WARN] 1.12  - Ensure auditing is configured for Docker files and directories - /usr/bin/docker-containerd
[WARN] 1.13  - Ensure auditing is configured for Docker files and directories - /usr/bin/docker-runc

[INFO] Checks: 13
[INFO] Score: -7

以下の設定になるように /etc/audit/rules.d/audit.rules を修正する.

$ auditctl -l
-w /usr/bin/docker -p wa
-w /var/lib/docker -p wa
-w /etc/docker -p wa
-w /usr/lib/systemd/system/docker.service -p wa
-w /lib/systemd/system/docker.socket -p wa
-w /usr/bin/docker-containerd -p wa
-w /usr/bin/docker-runc -p wa

すると,WARN を残り1個まで改善できた.項目 1.1 は docker info -f '{{ .DockerRootDir }}' で取得できるディレクトリを別ファイルシステムにすると改善できる.今回は実施しなかった.

$ ./docker-bench-security.sh -c check_1,check_1_1,check_1_2,check_1_3,check_1_4,check_1_5,check_1_6,check_1_7,check_1_8,check_1_9,check_1_10,check_1_11,check_1_12,check_1_13

(中略)

[INFO] 1 - Host Configuration
[WARN] 1.1  - Ensure a separate partition for containers has been created
[NOTE] 1.2  - Ensure the container host has been Hardened
[INFO] 1.3  - Ensure Docker is up to date
[INFO]      * Using 18.06.1, verify is it up to date as deemed necessary
[INFO]      * Your operating system vendor may provide support and security maintenance for Docker
[INFO] 1.4  - Ensure only trusted users are allowed to control Docker daemon
[INFO]      * docker:x:993:
[PASS] 1.5  - Ensure auditing is configured for the Docker daemon
[PASS] 1.6  - Ensure auditing is configured for Docker files and directories - /var/lib/docker
[PASS] 1.7  - Ensure auditing is configured for Docker files and directories - /etc/docker
[PASS] 1.8  - Ensure auditing is configured for Docker files and directories - docker.service
[INFO] 1.9  - Ensure auditing is configured for Docker files and directories - docker.socket
[INFO]      * File not found
[INFO] 1.10  - Ensure auditing is configured for Docker files and directories - /etc/default/docker
[INFO]      * File not found
[INFO] 1.11  - Ensure auditing is configured for Docker files and directories - /etc/docker/daemon.json
[INFO]      * File not found
[PASS] 1.12  - Ensure auditing is configured for Docker files and directories - /usr/bin/docker-containerd
[PASS] 1.13  - Ensure auditing is configured for Docker files and directories - /usr/bin/docker-runc

[INFO] Checks: 13
[INFO] Score: 5

改善 : 4 - Container Images and Build File

次に「Docker Bench for Security (4 - Container Images and Build File)」を実行した.すると,計1項目が WARN になった.

$ ./docker-bench-security.sh -c check_4_1,check_4_2,check_4_3,check_4_4,check_4_5,check_4_6,check_4_7,check_4_8,check_4_9,check_4_10,check_4_11

(中略)

[INFO] 4.1  - Ensure a user for the container has been created
[INFO]      * No containers running
[NOTE] 4.2  - Ensure that containers use trusted base images
[NOTE] 4.3  - Ensure unnecessary packages are not installed in the container
[NOTE] 4.4  - Ensure images are scanned and rebuilt to include security patches
[WARN] 4.5  - Ensure Content trust for Docker is Enabled
[PASS] 4.6  - Ensure HEALTHCHECK instructions have been added to the container image
[PASS] 4.7  - Ensure update instructions are not use alone in the Dockerfile
[NOTE] 4.8  - Ensure setuid and setgid permissions are removed in the images
[PASS] 4.9  - Ensure COPY is used instead of ADD in Dockerfile
[NOTE] 4.10  - Ensure secrets are not stored in Dockerfiles
[NOTE] 4.11  - Ensure verified packages are only Installed

[INFO] Checks: 11
[INFO] Score: 1

項目 4.5 は「Docker Content Trust (DCT)」を有効化すると改善できる.

docs.docker.com

今回は環境変数 DOCKER_CONTENT_TRUST を設定して診断をすると,改善できた.

$ export DOCKER_CONTENT_TRUST=1
$ ./docker-bench-security.sh -c check_4_1,check_4_2,check_4_3,check_4_4,check_4_5,check_4_6,check_4_7,check_4_8,check_4_9,check_4_10,check_4_11

(中略)

[INFO] 4.1  - Ensure a user for the container has been created
[INFO]      * No containers running
[NOTE] 4.2  - Ensure that containers use trusted base images
[NOTE] 4.3  - Ensure unnecessary packages are not installed in the container
[NOTE] 4.4  - Ensure images are scanned and rebuilt to include security patches
[PASS] 4.5  - Ensure Content trust for Docker is Enabled
[PASS] 4.6  - Ensure HEALTHCHECK instructions have been added to the container image
[PASS] 4.7  - Ensure update instructions are not use alone in the Dockerfile
[NOTE] 4.8  - Ensure setuid and setgid permissions are removed in the images
[PASS] 4.9  - Ensure COPY is used instead of ADD in Dockerfile
[NOTE] 4.10  - Ensure secrets are not stored in Dockerfiles
[NOTE] 4.11  - Ensure verified packages are only Installed

[INFO] Checks: 11
[INFO] Score: 3

プルリクエストを出した 🎉

docker-bench-security.sh の実装を読みながら README.md に書いてあるオプション一覧を確認したところ,今月に追加されたオプション -tREADME.md に反映されていないことに気付いた.さっそく README.md を修正し,プルリクエストを出して,すぐに merge してもらえた!

github.com

なお Docker (Moby) 関連のリポジトリにプルリクエストを出す場合,コミットメッセージに署名を追加する必要がある.詳しくは CONTRIBUTING.md に書いてある.覚えておこう!

github.com

まとめ

  • 「CIS Docker Community Edition Benchmark v1.1.0」をサポートしている診断ツール「Docker Bench for Security」を試した
  • コンテナを実行する方法とシェルを実行する方法がある
  • 例えば auditd を有効化するなど,診断結果を使って改善できる
  • README.md を修正するプルリクエストを出して merge してもらえた!

関連ツールなど

www.aquasec.com

www.twistlock.com

sysdig.com

Python の基礎知識を証明できる「Python 3 エンジニア認定基礎試験」に合格した

先週末に「Python 3 エンジニア認定基礎試験」を受験し,問題なく合格した.試験問題に関係する内容は NDA を厳守するため書かず,今回は「試験紹介(普及のため!)」「勉強方法」にフォーカスする.

Python 試験とは?

「一般社団法人 Python エンジニア育成推進協会」が提供する Python 試験は2種類ある.現在受験できるのは「認定基礎試験」で,「認定データ分析試験」は今年開始予定とアナウンスされている.

  • Python 3 エンジニア認定基礎試験
    • 概要 : 文法基礎を問う試験
    • 2017年6月開始
  • Python 3 エンジニア認定データ分析試験
    • 概要 : Pythonを使ったデータ分析の基礎や方法を問う試験
    • 2019年夏開始予定 🚧

もともと「認定データ分析試験」を受験しようと考えていたけど,調べてみるとまだ開始されていないことに気付き,その前に Python の理解度確認をする意味も兼ねて,今回「認定基礎試験」を受験したという経緯がある.あと個人的に資格コレクションをしていて,今回合格した「認定基礎試験」を含めると「計38個目(期限切れも含める)」になる.

www.pythonic-exam.com

試験概要

「Python 3 エンジニア認定基礎試験」の試験概要を公式サイトを引用しながら紹介する.まず,実施は Odyssey となるため,会場ごとに受験可能日が異なり,予約が取れれば希望日に受験できる.料金は10800円となる.僕は「有楽町会場」で受験した.過去に「Rails 技術者認定試験」で利用したことがある.

  • 受験日 : 通年(予約が取れれば)
  • 会場 : Odyssey CBT テストセンター
  • 料金 : 10800円(学割だと5400円になる)

cbt.odyssey-com.co.jp

問題数は「40問」となり,合格ラインが「70%」と公開されているため,単純計算で「28問正解」がボーダーラインとなる.

  • 問題数 : 40問(選択問題)
  • 試験時間 : 60分
  • 合格ライン : 正解率 70%

www.pythonic-exam.com

試験範囲

「Python 3 エンジニア認定基礎試験」の特徴的な点は「主教材を指定していること」「章ごとの出題数を公開していること」だと思う.主教材は「Python チュートリアル 第3版」となり,試験専用の本ではなくオライリー本が選ばれている点は個人的に素晴らしいと感じている.

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

既に「Python チュートリアル 第3版」の書評記事を書いている.

kakakakakku.hatenablog.com

「章ごとの出題数」は以下のように公開されている.勘に頼る必要もなく,主教材を全体的に学ぶ必要がある.

セクション 出題数 出題率
1章. 食欲をそそってみようか 1 2.5%
2章. Pythonインタープリタの使い方 1 2.5%
3章. 気楽な入門編 6 15.0%
4章. 制御構造ツール 9 22.5%
5章. データ構造 7 17.5%
6章. モジュール 2 5.0%
7章. 入出力 1 2.5%
8章. エラーと例外 4 10.0%
9章. クラス 2 5.0%
10章. 標準ライブラリめぐり 4 10.0%
11章. 標準ライブラリめぐり - PartII 1 2.5%
12章. 仮想環境とパッケージ 1 2.5%
13章. 次はなに? 0 0%
14章. 対話環境での入力行編集とヒストリ置換 1 2.5%

Python コードを書く & 読む

重要なのは主教材を読むだけではなく,実際に Python コードを書いたり,読んだりすることだと思う.オススメは「Jupyter Notebook」で,Markdown で Python コードとメモを合わせてドキュメント化することができる.他にも「PyCharm」をインストールしておくと,コードを書きやすくなるし,「PyCharm Python Console」は IPython に対応していて,インタラクティブに動作確認をするときにも便利に使える.

jupyter.org

模擬試験(無料)

認定スクール「DIVE INTO EXAM」から無料で提供されている模擬試験がある.まだ β であると記載されているけど,計80問あり,試験同様に計40問出題される.模擬試験の受験回数に制限はなく,何度も何度も繰り返し受験できる.少なくとも1度は受験しておくと良いと思う.

diver.diveintocode.jp

試験結果レポート 🎉

試験を終えると,すぐに試験結果レポートが出る.満点合格できたら良いなぁーと考えていたけど,今回は「925点」となり,計3問間違えてしまった!残念すぎる.セクションごとに正解率も出るし,個人的に間違えた箇所も全部把握できている.むむ!

セクション 正解率
1. 食欲をそそってみようか 100%
2. Pythonインタープリタの使い方 100%
3. 気楽な入門編 100%
4. 制御構造ツール 89%
5. データ構造 86%
6. モジュール 100%
7. 入出力 100%
8. エラーと例外 100%
9. クラス 100%
10. 標準ライブラリめぐり 75%
11. 標準ライブラリめぐり - PartII 100%
12. 仮想環境とパッケージ 100%
13. 対話環境での入力行編集とヒストリ置換 100%

まとめ

  • 「Python 3 エンジニア認定基礎試験」に合格した
    • 取得済資格 : 計38個目(期限切れも含めると)
  • 主教材を読むだけではなく,実際に Python コードを書いたり,読んだりする勉強方法が1番効果的だと思う
  • 無料で受験できる模擬試験も,少なくとも1度は受験しておくと良いと思う
  • 今年の夏に「Python 3 エンジニア認定データ分析試験」が開始される予定なので,公式 Twitter は要チェック!

twitter.com

Python の理解度確認をするために「Python チュートリアル 第3版」を読んだ

オライリーから出版されている「Python チュートリアル 第3版」を読んだ.読者対象として「Python 入門者のための」と書いてあるけど,そこそこ難しい内容もあり,中級者でも楽しめる内容になっている.本書の最初に載っている「訳者まえがき」にも,理解度によって読む方法を変えて良いと書いてあった.今回本書を読んでみて,勉強になった部分を整理しておこうと思う.なお,本書は「Python 3.5.1」をサポートしている.さらに付録もあり,特に「付録E」「付録F」は面白かった.

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

目次

  • 1章 : 食欲をそそってみようか
  • 2章 : Pythonインタープリタの使い方
  • 3章 : 気楽な入門編
  • 4章 : 制御構造ツール
  • 5章 : データ構造
  • 6章 : モジュール
  • 7章 : 入出力
  • 8章 : エラーと例外
  • 9章 : クラス
  • 10章 : 標準ライブラリめぐり
  • 11章 : 標準ライブラリめぐり - PartII
  • 12章 : 仮想環境とパッケージ
  • 13章 : 次はなに?
  • 14章 : 対話環境での入力行編集とヒストリ置換
  • 15章 : 浮動小数点(float)の演算:その問題と限界
  • 16章 : 補遺
  • 付録A : 用語
  • 付録B : Python のドキュメント群について
  • 付録C : 歴史とライセンス
  • 付録D : コピーライト
  • 付録E : Python初心者だった頃─みんながひっかかるPythonのヘンなとこ
  • 付録F : Python 2を読んだり書いたりせざるを得ない人へ

python -i オプション

2章「Pythonインタープリタの使い方」の中で,コマンドラインから python -i で実行すると,実行後にインタラクティブモードに入るという内容があり,今まで使ったことがなかった.サクッとデバッグをするときなどに使えそう.例えば,以下のように変数を宣言するコード name.py を用意する.

name = 'kakakakakku'

次に python -i で実行すると,そのままインタラクティブモードになり,変数を確認することができる.

$ python -i name.py
>>> name
'kakakakakku'
>>> quit()

docs.python.jp

ビルトイン変数 _(アンダースコア)

3章「気楽な入門編」では,データ型の紹介がメインだけど,インタラクティブモードの紹介もある.最後に表示した式はビルトイン変数 _(アンダースコア)に代入される.覚えておくと,使える場面もありそう.

$ ipython
In [1]: 100 * 5
Out[1]: 500

In [2]: _
Out[2]: 500

ただし,ローカル変数としても設定できてしまうため,結果としてビルトイン変数を隠蔽することに繋がってしまう.気を付けよう.

$ ipython
In [1]: _ = 1000

In [2]: 100 * 5
Out[2]: 500

In [3]: _
Out[3]: 1000

PEP 8 : Style Guide for Python Code

4章「制御構造ツール」の最後にコーディングスタイルとして「PEP 8 : Style Guide for Python Code」の紹介も載っていた.「PEP 8」だと,インデントはタブではなく,4スペースが推奨されている.

www.python.org

リスト内包

5章「データ構造」は基本的なデータ構造の解説だった.リストを生成するときに「リスト内包」が使えることは覚えておくと良さそう.単純に for を複数書けるだけではなく,if で条件を設定することもできる.とは言え,可読性とトレードオフになる可能性があるので,メリットがある場合に使う.

$ ipython
In [4]: [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]
Out[4]: [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

docs.python.jp

標準ライブラリ

11章「標準ライブラリめぐり - PartII」では,以下のライブラリなどが紹介されていた.

  • reprlib.repr()
  • textwrap.fill()
  • locale.format()
  • struct.unpack()
  • threading.Thread
  • logging
  • weakref.WeakValueDictionary()
  • collections.deque
  • bisect.insort()

weakref など,今まで使ったことがない標準ライブラリもあり勉強になった.collections.deque に関しては既にまとめてある.

kakakakakku.hatenablog.com

pyvenvvenv

12章「仮想環境とパッケージ」では,pyvenvpip の紹介がある.本書は「Python 3.5.1」をサポートしているが,「Python 3.6」pyvenv は非推奨になり,現在は venv が推奨になっているので,注意が必要かも.

The pyvenv script has been deprecated as of Python 3.6 in favor of using python3 -m venv to help prevent any potential confusion as to which Python interpreter a virtual environment will be based on.

docs.python.org

実は本書はウェブでも公開されていて,既に「Python 3.6.5」をサポートしている.最新版を読むと venv 前提で書かれている.量が多いため,個人的にはウェブよりも本の方が読みやすかった.

docs.python.jp

リンク集

13章「次はなに?」はリンク集になっている.Python を勉強するときに参考にすると良さそう.

正誤表

非常に多くの誤植があるので,読むときは正誤表も合わせて確認する.実は正誤表に載っていない誤植を1箇所発見していて,xiv にある 5.1.4 は「れ子」ではなく「入れ子」になるべき.

www.oreilly.co.jp

まとめ

  • 「Python チュートリアル 第3版」を読んだ
  • 「Python 入門者のための」と書いてあるけど,そこそこ難しい内容もあり,中級者でも楽しめる
  • 気になるライブラリなどは IPython や Jupyter Notebook を使って試そう!

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

キャリアを選ぶときの価値観を発見しよう /「キャリア・アンカー」を今年も読んだ

今回は「キャリア」をテーマにしたオススメ本「キャリア・アンカー(自分のほんとうの価値を発見しよう)」を紹介する.過去の記事で本書のことを少し紹介したことはあったけど,実は今まで書評記事を書いていなかった.2019年になり,目標設定をしている人も多いと思う.自分のキャリアを見直したり,自分の価値観を確認したりするときにオススメの1冊と言える.僕自身も年末年始に「キャリア・アンカー(自分のほんとうの価値を発見しよう)」を読み直し,再診断をした.

キャリア・アンカー―自分のほんとうの価値を発見しよう (Career Anchors and Career Survival)

キャリア・アンカー―自分のほんとうの価値を発見しよう (Career Anchors and Career Survival)

「キャリア・アンカー」とは?

「キャリア・アンカー(自分のほんとうの価値を発見しよう)」は2003年に日本語版が出版された.原著は1993年に出版されていて,非常に歴史があるものの,今読んでも時代のズレなどはそこまで感じない.僕自身は Amazon の購入履歴を見ると「2016年10月」に本書を購入している.そして,2017年の目標設定をするために読んだことがキッカケとなり,年末年始に読む習慣がある.今年は計3回目の読み直しとなった.

そもそも「キャリア・アンカー」とは,一言で表現すると「自分のキャリアを選ぶときの価値観」となる.本書の P.1 に載っている紹介文を引用すると以下となる.自分はどんなキャリアを選ぶべきなのか?現在のキャリアは「自分らしい」のか?という点を知ることができる.また本書にも書いてある通り,キャリアを分類すると2種類あり,「内面的なキャリア」「外見上のキャリア」となる.「キャリア・アンカー」では,この「内面的なキャリア」を知るためにある.

あなたのキャリア・アンカーとは,あなたがどうしても犠牲にしたくない,またあなたのほんとうの自己を象徴する,コンピタンスや動機,価値観について,自分が認識していることが複合的に組み合わさったものです。

「キャリア・アンカー」を発見する方法

「キャリア・アンカー」は大きく2種類の方法で発見していく.「キャリア指向質問票」は1人で実施することができ,「キャリア・アンカー・インタビュー」はパートナーと2人で実施することができる.

  • キャリア指向質問票
    • 1人
    • 自己診断ツール
  • キャリア・アンカー・インタビュー
    • 2人
    • パートナーと話す

キャリア指向質問票

まず「キャリア指向質問票」は,自分自身の価値観で計40個ある質問に6段階評価を付けて,集計をする.1人で実施することができるので,最もお手軽な方法と言える.計40個ある質問は本書を見てもらえればと!集計をすると,以下の「8アンカー」ごとにスコアが出るため,1番スコアが高いアンカーが「キャリア指向質問票」から発見できた「キャリア・アンカー」となる.本書にはアンカーごとに「仕事のタイプ」「承認のしかた」がまとまっている.

  • 専門・職能別コンピタンス (TF : Technical / Functional Competence)
  • 全般管理コンピタンス (GM : General Managerial Competence)
  • 自立・独立 (AU : Autonomy / Independence)
  • 保障・安定 (SE : Security / Stability)
  • 起業家的創造性 (EC : Entrepreneurial Creativity)
  • 奉仕・社会貢献 (SV : Service / Dedication to a Cause)
  • 純粋な挑戦 (CH : Pure Challenge)
  • 生活様式 (LS : Lifestyle)

なお,本書の中盤には「2個以上のアンカーを持つことができるか」という解説がある.原則として「1個」であると書かれていて,理由は「1番目と2番目にスコアが高いアンカーに適する仕事が異なる場合にどちらを選択するか?」という意思決定が必要なときに1番目のアンカーから選ぶためとある.個人的には今だともっと柔軟に考えても良いと思っていて,2番目にスコアが高いアンカーに適する仕事を副業として選ぶことができる.実際に僕自身,2017年に「キャリア・アンカー」の診断結果からプログラミング講師という副業を選んだ.

キャリア・アンカー・インタビュー

次に「キャリア・アンカー・インタビュー」で,これは本書にある質問を使って,パートナーと話すことにより,「自分のキャリアを選ぶときの価値観」をより具体的に言語化をしていく.インタビューと呼ばれている通り,採用面接にも似ている.なぜ「キャリア・アンカー・インタビュー」が必要なのかと言うと「キャリア指向質問票のスコアは自分自身の欲求によってバイアスがかかっているから」と書かれている.大項目で計18個ある質問も本書を見てもらうとして,一部を載せておく.

  • 3 : キャリアを歩み始めたとき,どのような大きな望み(アンビション)あるいは長期的な目的をもっていましたか
    • あなたはその目的と照らし合わせてみて,最初についた仕事はどんな具合でしたか
  • 15 : あなたのこれからのキャリアを展望してみて,特に楽しみとして期待しているのはどんなことですか
    • そのようなことを楽しみとして期待しているのはなぜですか
    • あなたの次の仕事はどんなものになると思いますか
    • さらにその後,あなたの次の仕事はどんなものになるとお考えですか

正直言って,「キャリア・アンカー・インタビュー」で難しいのは「パートナーを選ぶこと」だと思う.本書には「パートナーの選び方」がまとまっていて,要約すると「心置きなく話し合える人(配偶者や親友)が良い」と書かれていた.僕の場合は,パートナーを複数人を選び,インタビューの背景を伝えた上で,あえてインタビュー形式にはせず,質問をトークテーマにして雑談をするスタイルを選んだ.理由は「雰囲気」と「お手軽さ(ある意味での雑さ)」を重要視したく,カスタマイズをしている.

「アンカー」推移(上位)

僕自身の「アンカー」推移(一部)を載せておくと,上位3アンカーは3年間同じだった.しかし,直近の診断で「奉仕・社会貢献」が1位となり,「専門・職能別コンピタンス」が2位となった.本書には「専門性を活かして人を育てる先生もしくはメンターが良い」と書かれていて,現在のキャリアと合っている.そして趣味で活動しているブログメンタリングも合っていると思う.なお,2017年の目標に「技術支援を仕事にする」と掲げたのは,実は2016年12月の診断結果が関係している.今のところ,大満足のキャリアを選択することができている.

  • 2016年12月
    • No.1 : 純粋な挑戦
    • No.2 : 奉仕・社会貢献
    • No.3 : 専門・職能別コンピタンス
  • 2017年12月
    • No.1 : 純粋な挑戦
    • No.2 : 奉仕・社会貢献
    • No.3 : 専門・職能別コンピタンス
  • 2018年12月
    • No.1 : 奉仕・社会貢献
    • No.2 : 専門・職能別コンピタンス
    • No.3 : 純粋な挑戦

kakakakakku.hatenablog.com

「アンカー」推移(下位)

下位2アンカーも3年間同じだった.今まで起業や安定した生活に興味を持ったことがなく,これはこれで「自分らしい」診断結果だった.

  • 2016年12月
    • No.7 : 起業家的創造性
    • No.8 : 保障・安定
  • 2017年12月
    • No.7 : 起業家的創造性
    • No.8 : 保障・安定
  • 2018年12月
    • No.7 : 起業家的創造性
    • No.8 : 保障・安定

まとめ

  • 「自分のキャリアを選ぶときの価値観」を発見するときに「キャリア・アンカー(自分のほんとうの価値を発見しよう)」はオススメ
  • 発見する方法は2種類ある
    • キャリア指向質問票(自己診断ツール)
    • キャリア・アンカー・インタビュー(パートナーと話す)
  • 直近3年間は年末年始に本書を読む習慣がある

キャリア・アンカー―自分のほんとうの価値を発見しよう (Career Anchors and Career Survival)

キャリア・アンカー―自分のほんとうの価値を発見しよう (Career Anchors and Career Survival)