SRE兼スクラムマスターのブログ

チーム開発が好きなエンジニアブログです。検証した技術やチームの取り組みを書いていきます。

【週報 2023-02-19】いろんな人と話した1週間

読んだ本

  • マネジメント3.0読み途中
    • 今週は時間取れなくて読み終えれなかった
    • チームビルディングをこれからやり直すってときに読んでるけど、ワクワクしてくる
    • 熱量だけ先行するとだいたい失敗するので現状を分析してやること決める

そのほかの出来事

  • Thanosのアンラーニング終了

    • チュートリアルから、現在利用している実装までGitOpsじゃない形で動かした
    • 全体像が頭のなかに定着してきた
    • 改めてなぜこれを選定したのかよく理解できる
    • これを導入した先輩のすごさも再認識した
  • 子供と一緒にスカイツリー

    • スカイツリーに行くと、水族館 ⇒ 展望台のコースが定番になってきた
    • 水族館は年パス買った方がいいんじゃないかと思えてきた
    • 毎回、質問の内容が変わってきているあたり、いろいろ考えて鑑賞しているんだという新たな発見
  • 社内・社外の人と話す機会が多かった

    • 社内の人(去年新規入社された方々)は仕事で一緒になることが少ないので雑談した
      • 仕事で感じていることや、目指したいことなど雑談のはずが、いろいろ話してくれる
      • 人となりを理解できるし、前向きな姿勢は見ていて元気がもらえるしサポートできる部分はサポートしたいので、定期的にやることになった
      • 社内でそういう感じの話をする人が増えてきた
    • 社外の人
      • 技術的にすごい会社の話を聞けた
      • 技術だけでなく、サービスのビジョンとミッションがはっきりしているから、そこを目指してモチベーティブにやれるって話
      • ビジョンとミッションがはっきりすることが大切なのは、何となく理解していたが、それを考える人から話を聞くとまた感覚が違った
      • 近い視座で話をしてみたいから、ビジネス構築モデルを学習したくなるが体は1つしかないので悩ましい
  • ChatGPT

    • 噂の ChatGPT
    • 業務で調べものに使っている
    • 個人的にお気に入りの使い方
      • ChatGPT と英語でチャットする
      • 文法や表現がおかしいところがあれば指摘するようにしたら、チャットしながらアドバイスもくれるので文章書く力があがりそう
      • 技術的なことを語れるほど単語を知らないので、「たこ焼き」について30分くらいチャットしてた ※ChatGPTの指摘が必ずしも正しいとは限らないので、気になった表現は調べている

ふりかえり、次週やること

  • マネジメント3.0を読了する
  • 技術的に学んだことのアンラーニング
    • Thanosをまとめる

【週報 2023-02-12】半年ぶりの出社

読んだ本

そのほかの出来事

  • ポッドキャストで職能横断チームの話をしたら、頭の中が整理された

    • @hacktkとやっているゆるテクで話しているが、聞き上手ですごくありがたい
    • まだ編集していないから話した会はアップロードしていない
    • やっぱり人に話すって大切だと改めて実感できた
  • 半年ぶりくらいに出社した

    • 大雪で電車止まるんじゃないかとビクビクしながらの出社
    • オンラインではない対話も情報量が多くて楽しい
    • 単純に働く場所がいつもと違うから新鮮な部分もあった

ふりかえり、次週やること

  • マネジメント3.0を読了する
  • 技術的に学んだことのアンラーニング
    • Thanosあたりから実施予定

【週報 2023-02-05】インフルエンザから復帰

読んだ本

  • マネージング・フォー・ハピネス読了

    • マネジメントはマネージャーに任せるにはあまりにも重要すぎる

      • もし酷い環境にいる場合、やるべきことは、不満をぶつけてマネージャーのせいにするのではなく「自分で自分の上司になること(自分で自分をマネジメントすること)」
    • 幸せなチームほど生産性が高い。マネージャーも仕事に喜びを見出すべきだ!

      • 最近見出せていないので、考えさせられる
        • 技術のインプットは続けているが、現場でやり込んでいないモノもあるので不安になる
        • マネージャーとプレイヤーのモヤモヤが再発
  • アジャイルメトリクス再読

    • チーム開発に携わる機会があるかもしれないので、取れるデータを今のうちから調べておく

そのほかの出来事

  • インフルエンザから復帰

    • 子供から感染しないルートはなかなか難しい
  • 習慣とかを再開

    • 少し時間が空くと再開するのにコストがかかる印象
      • 筋トレ
      • 読書

ふりかえり、次週やること

  • 今年の働き方を考える
    • 自分の市場価値とか
    • いまの職場で貢献できることとか

【週報 2023-01-22】

読んだ本

そのほかの出来事

ふりかえり、次週やること

【週報 2023-01-15】 継続的デリバリーのソフトウェア工学 読了

RSGT 2023参加

読んだ本

理解できていないところや時間がかかった部分はあったものの読了。 プラクティスや概念に関して、真新しいものはない。ただこの本を読んでから上記の3冊やXPを読むと深い理解が得られるかもしれない。 いまさらながら、「関心の分離」と「疎結合」はソフトウェア開発ではよく目にする表現だが、組織構成を考えるうえでも重要な観点だと言語化できた。 このあたりはチームトポロジーにも書いてあったが、ようやく理解できた気がする。 いろいろ知識がついてきたら、理解が進みそうな本。

そのほかの出来事

  • 筋トレ習慣化中。

2日に1回の頻度を持続できている。1月中持続できれば習慣化できそう。 筋トレ始めるとタンパク質を意識し始める、そして食事だけで摂取するのは難しい。

  • 読書するときの場所

家で読書することが多いけど近場で静かなカフェを見つけたので、ちょこちょこ通う。 同じ内容でも環境変えてやるだけで捗ることがわかった。

ふりかえり、次週やること

【週報 2023-01-06】 covid-19

週報をはじめた

目的は見返してふりかえりたいのと、文章を書く練習です。

covid-19に罹患しました

  • 子どもからの経路で家庭内感染
  • ワクチンは3回接種済み
  • 発熱、頭痛、倦怠感、喉の痛み
    • のどの痛み以外は発症から4日ほどで治まった。
    • 症状も市販の薬で軽減できるのであると便利。

年末年始で病院も休みが多い中、発熱外来の予約が奇跡的に取れたのは不幸中の幸いだった。 外に出れないので買い物とかはネットスーパーを使うととても便利だった。 家族全員が罹患したが、子供は症状もなく元気に過ごしているので、喉が痛くて怠いけど一緒に遊ぶとかをやっているときが一番つらかったかもしれない、 育児のヘルプで人に来てもらえないのはしんどい。

読んだ本

そのほかの出来事

  • 再び筋トレを始めた。

    • これまで有酸素中心だったが、しばらく筋トレに切り替える、何か便利な記録アプリとかないか探し中。
    • ダンベルは買わない。
  • 子供との接し方を考えることが増えてきた。

    • 話を聞いて、1つ1つ気持ちを整理してもらうことが大切そう。
    • 同時にいろんな指摘をされると、本人がパニックになるので、そうなったら夫婦でお互いに話に入るスタイルがいまのところ効果的みたい。
    • 対話の本とかを読んで意識することは一緒なんだけれど、自分の子供に対してだと少し難しい。
  • ポケモン SVを始めた

ふりかえり、次週やること

Azure Pipelines で セキュリティ診断を自動化する

概要

Azure DevOps の Pipelines を使って、アプリケーションのセキュリティテストを実施する方法を記載します。 なお、今回は OWASP ZAP というオープンソースのツールを利用します。

OWASP ZAP とは

Open Web Application Security Project によって公開されている Zed Attack Proxy という名前のペネトレーションテストツールです。

www.zaproxy.org

OWASP ZAP は、対象の Web アプリケーションに対してリクエストを送信し、返ってきたレスポンスの内容から脆弱性の有無を判定します。

OWASP ZAP で実行できるスキャンには、以下の種類があります。

自動スキャン: 入力されたURLから自動的なクロールを開始し、見つかったページに対して「攻撃(スキャン)」を行う

静的スキャン: ユーザーが(モンキーテストのようにランダムに)操作した際のレスポンスをもとに脆弱性の有無を判定する

動的スキャン: 静的スキャンの際に操作した内容を、自動的にリクエスト内容を変えて再実行する

ZAP Docker

今回は Azure Pipelines で実行したいため、client版ではなく Docker版の ZAP Docker を利用します。

www.zaproxy.org

Image について

安定版:

docker pull owasp/zap2docker-stable

最新のweekly(週次)リリース:

docker pull owasp/zap2docker-weekly

最新のリリース:

docker pull owasp/zap2docker-live

ベアリリース: 非常に小さなDockerイメージ、ZAPの実行に必要な依存関係のみが含まれ、CI環境に最適の Image です。

docker pull owasp/zap2docker-bare

スキャンの種類について

Baseline Scan: ターゲットに対して 静的スキャンを実施します。(デフォルト: 1分間)

Full Scan: ターゲットに対して 静的スキャンを実施します。(デフォルト: 時間無制限)

API Scan: OpenAPI または GraphQL (post 2.9.0) によって定義された API に対して、動的スキャンを実施します。

オプションについて

オプションが多く非常に柔軟に設定ができます。

細かい設定の方法については機会があれば書きますが、今回は割愛します。

$ docker run --rm -v $(pwd):/zap/wrk/:rw -t owasp/zap2docker-stable zap-full-scan.py -h
Usage: zap-full-scan.py -t <target> [options]
    -t target         target URL including the protocol, e.g. https://www.example.com
Options:
    -h                print this help message
    -c config_file    config file to use to INFO, IGNORE or FAIL warnings
    -u config_url     URL of config file to use to INFO, IGNORE or FAIL warnings
    -g gen_file       generate default config file(all rules set to WARN)
    -m mins           the number of minutes to spider for (defaults to no limit)
    -r report_html    file to write the full ZAP HTML report
    -w report_md      file to write the full ZAP Wiki(Markdown) report
    -x report_xml     file to write the full ZAP XML report
    -J report_json    file to write the full ZAP JSON document
    -a                include the alpha active and passive scan rules as well
    -d                show debug messages
    -P                specify listen port
    -D                delay in seconds to wait for passive scanning
    -i                default rules not in the config file to INFO
    -I                do not return failure on warning
    -j                use the Ajax spider in addition to the traditional one
    -l level          minimum level to show: PASS, IGNORE, INFO, WARN or FAIL, use with -s to hide example URLs
    -n context_file   context file which will be loaded prior to scanning the target
    -p progress_file  progress file which specifies issues that are being addressed
    -s                short output format - dont show PASSes or example URLs
    -T                max time in minutes to wait for ZAP to start and the passive scan to run
    -U user           username to use for authenticated scans - must be defined in the given context file
    -z zap_options    ZAP command line options e.g. -z "-config aaa=bbb -config ccc=ddd"
    --hook            path to python file that define your custom hooks

Azure Pipelines で実行する

azure-pipelines.yml の書き方を紹介します。

リポジトリの作り方や Azure Pipelines についての説明は割愛します。

1. Docker CLIをインストールする

        - task: DockerInstaller@0
          inputs:
            dockerVersion: '17.09.0-ce'
          displayName: 'Install Docker'

2. サンプルアプリケーションを起動する

自分がテストしたいアプリケーションを起動してください。 すでに起動しているサービスに対してテストする場合は、このタスクは不要です。

        - task: Bash@3
          inputs:
            targetType: 'inline'
            script: |
              docker run --rm -p 80:80 --detach yeasy/simple-web:latest
          displayName: 'Run Sample Application'

3. ZAP Dockerを実行する

ZAP を起動して対象サイトに 攻撃しています。 -t http://$(ip -f inet -o addr show docker0 | awk '{print $4}' | cut -d '/' -f 1)の部分をテストしたいところに変更しましょう。 なお、攻撃権限がないサイトを設定しないでください。 末尾の true は Azure Pipelines の Bashタスクの仕様上 成功ステータスにするため追加しています。

        - task: Bash@3
          inputs:
            targetType: 'inline'
            script: |
              chmod -R 777  ./
              docker run --rm -v $(pwd):/zap/wrk/:rw -t owasp/zap2docker-stable zap-full-scan.py -t http://$(ip -f inet -o addr show docker0 | awk '{print $4}' | cut -d '/' -f 1) -r report.html
              true
          displayName: 'Run ZAP Scan'

4. ZAP レポートをpublishする

        - task: PublishPipelineArtifact@1
          inputs:
            targetPath: '$(Build.SourcesDirectory)/report.html'
            publishLocation: 'pipeline'
          displayName: 'Publish Report'

5. azure-pipelines.yml

全体としてはこんな感じです。

trigger: none

stages:
  - stage: Test
    jobs:
      - job: Build
        pool:
          vmImage: 'ubuntu-20.04'
        steps:

        - task: DockerInstaller@0
          inputs:
            dockerVersion: '17.09.0-ce'
          displayName: 'Install Docker'

        - task: Bash@3
          inputs:
            targetType: 'inline'
            script: |
              docker run --rm -p 80:80 --detach yeasy/simple-web:latest
          displayName: 'Run Sample Application'

        - task: Bash@3
          inputs:
            targetType: 'inline'
            script: |
              chmod -R 777  ./
              docker run --rm -v $(pwd):/zap/wrk/:rw -t owasp/zap2docker-stable zap-full-scan.py -t http://$(ip -f inet -o addr show docker0 | awk '{print $4}' | cut -d '/' -f 1) -r report.html
              true
          displayName: 'Run ZAP Scan'

        - task: PublishPipelineArtifact@1
          inputs:
            targetPath: '$(Build.SourcesDirectory)/report.html'
            publishLocation: 'pipeline'
          displayName: 'Publish Report'

6. CIが完了して結果をダウンロードするとZAPのレポートを確認できます。

pipeline artifact

レポートはこんな感じです。

ZAP report

まとめ

ZAP Docker は、導入がシンプルなのでセキュリティ診断してみようくらいのモチベーションのときにおすすめです。 Azure Pipelines では OWASP Zed Attack Proxy Scan というタスクを用いるパターンもありますが オプションで柔軟に設定を変更したい場合は、Dockerがおすすめですし、ローカル環境でも動作を確認しやすいです。 また、API Scanは実行に時間がかかるため CIに不向きだと思いますが Baseline Scan や 時間をチューニングした Full Scan は継続的に実行することで問題を早めに検知できます。 なお、今回の手順ではレポートをダウンロードして確認するパターンにですが、それだと確認するのが大変なため レポートを Azure Pipelines で確認できる形式に変換するのが便利かもしれません。こちらの変換の仕方は 実践したらまた記事にしようと思います。