🤖

GitHub Actionsで特権コンテナを使う

2024/12/01に公開

この記事は

本記事はGitHub Dockyard Advent Calendar 2024の2日目の記事です。そして、SORACOM Advent Calendar 2024シーズン2の2日目の記事です。

SORACOM Arcを題材に、GitHub Actionsで特権コンテナを使う方法を紹介します。

特権コンテナとは

特権コンテナとは、Dockerのドキュメントでは以下のように説明されています。

デフォルトでは、Docker コンテナは「unprivileged」(権限がない)ため、Docker コンテナの中で Docker デーモンを動かす等ができません。これは、デフォルトのコンテナはあらゆるデバイスに対して接続できないためであり、「privileged」(特権)コンテナのみが全てのコンテナに接続できます

つまり、特権コンテナは、通常は保持していない、ホストのデバイスなどに対する強力な権限を持つコンテナです。そのため、セキュリティの問題が発生する可能性がありますので注意が必要です。もちろんGitHub Actionsで動くコンテナは非特権コンテナです。

しかし、一部のハードウェアやネットワークの機能を利用するためには、特権コンテナが必要な場合があります。今回は、SORACOM Arcへの接続を例に、GitHub Actionsで特権コンテナを使う方法を紹介します。

GitHub Actionsで特権コンテナを使う

GitHub Actionsで特権コンテナを使う場合は、ランナーを動かすコンテナを指定し、そこでオプションを渡します。該当部分の例を以下に示します。

jobs:
  run-soratun:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest
    container:
      image: node:18
      options: --privileged

上記の例ではnode:18のコンテナを使い、--privilegedオプションを渡しています。できればより詳細なオプションで、できることを細かく指定して制限した方が安全ではありますが、今回は一旦このまま進みます。

SORACOM Arcへの接続

SORACOM Arcへの接続には、soratunというツールを使います。soratunについては公式ドキュメントを参照してください。

これを利用するため、job内でsoratunをインストールし、接続のための設定を行います。

      - name: download soratun
        run: |
          apt -y update
          apt -y install jq
          apt -y install iputils-ping net-tools
          curl -OL https://github.com/soracom/soratun/releases/download/v1.2.7/soratun_1.2.7_linux_amd64.tar.gz
          tar xvfz soratun_1.2.7_linux_amd64.tar.gz
          cp soratun_1.2.7_linux_amd64/soratun /usr/local/bin/
      - name: create arc.json
        run: |
          soratun config > arc.json
          cat arc.json | jq ".privateKey = \"$private_key\" | .publicKey = \"$client_peer_public_key\" | .simId = \"$simid\" | .arcSessionStatus.arcServerPeerPublicKey = \"$public_key\" | .arcSessionStatus.arcServerEndpoint = \"$endpoint\" | .arcSessionStatus.arcAllowedIPs = $allowed_ips | .arcSessionStatus.arcClientPeerIpAddress = \"$address\"" > soratun.json
        env:
          simid: ${{ secrets.ARC_SIMID }}
          private_key : ${{ secrets.ARC_PRIVATE_KEY }}
          public_key : ${{ secrets.ARC_PUBLIC_KEY }}
          endpoint : ${{ secrets.ARC_ENDPOINT }}
          allowed_ips : ${{ vars.ARC_ALLOWED_IPS }}
          client_peer_public_key : ${{ secrets.ARC_CLIENT_PEER_PUBLIC_KEY }}
          address: ${{ secrets.ARC_ADDRESS }}

2024/11/30現在の最新バージョンである1.2.7をダウンロードし、バイナリを/usr/local/binにコピーします。

次に、接続のための設定ファイルsoratun.jsonを作成します。この設定ファイルは、環境変数から取得した値を埋め込んでいます。
設定ファイル自体はリポジトリにテンプレートを含めておいてもいいのですが、ここでは都度soratun configコマンドで生成しています。

環境変数に渡すシークレット等をリポジトリの設定で追加しておきます。

そして、最後にsoratun upコマンドを実行して接続を行います。そのままですとsoratunはフォアグラウンドで動き、次のステップに進まないので&を付けてバックグラウンドで動かします。

      - name: soratun up
        run: soratun up --config soratun.json &
      - name: ping
        run: ping -c 3 pong.soracom.io

最後に、接続ができているか確認するために、pingコマンドを実行しています。いつものようにpong.soracom.ioに対して送りますが、-c 3オプションを付けることで3回pingを送信したら終了するようにします。これでjobが終了するようになります。

ちなみに、soratunはVPN接続のために/dev/net/tunというトンネルデバイスを作る(そして使う)必要があるので、非特権コンテナで動かすと以下のようにエラーになります。

非特権コンテナでは失敗する

このデバイスの作成と読み書きなど、最小の権限を与えるとよりセキュアになるかと思いますが、今回は一旦最小権限の確認までは実施していません。利用するコンテナイメージや、ワークフローで動かすコマンドには注意してお使いください。

まとめ

今回はSORACOM Arc(soratunコマンド)を例に取り、GitHub Actionsのワークフローを特権コンテナで動かす方法について紹介しました。特権コンテナはセキュリティ上のリスクがあるため、必要最小限の権限で動かすといった注意は必要ですが、必要に応じて使うことでGitHub Actionsで自動化できる作業の範囲が広がる可能性があります。

また、これによってワークフロー内でSORACOM Arcを使ってSORACOMプラットフォームに接続することができますので、SORACOMプラットフォームに接続するアプリケーションの自動テストなどにも利用できるかと思います。
もしお手元にそういったアプリケーションがあり、接続の問題からテストの自動化を断念されていた方は是非お試しください。

今回のワークフローのファイルは以下のリポジトリにおいていますので参考にしてください。

https://github.com/kenichiro-kimura/sample-soratun-action

皆様のお役に立てば幸いです。

GitHubで編集を提案

Discussion