JCB デジタルソリューション開発部の平松です。
GCPのプライベート認証局構築サービスであるCertificate Authority Service (CAS)を構築する機会があり、また色々と内容についてご紹介いたします。 CASについての公式ブログはこちらです。
本記事では我々がCAS構築時に注意する必要のあったポイントを中心に紹介したいと思います。
※以下は2021年12月時点のものとなります。仕様は今後変更される可能性があります。
ユースケース別の課金体系
CASは、ユースケースによってDEVOPSティアまたはENTERPRISEティアを選択する必要があり、各ティアで課金体系が変わってきます。 名前から察する通り、ENTERPRISEティアの方が出来ることの幅が広く課金額も高くなっています。(発行済み証明書のライフサイクル管理が可能となる等)
DEVOPS | ENTERPRISE | |
---|---|---|
料金 | 基本月額$20 + 証明書発行毎の課金 (証明書 0~50,000 件: 1 件につき $0.3) |
基本月額$200 + 証明書発行毎の課金 (証明書 0~50,000 件: 1 件につき $0.5) |
証明書の管理 | 証明書は発行した後の管理は不可。(一度発行すると以降証明書の状態を確認することはできない) | 発行した証明書のリスト管理が可能。有効期限の確認・失効ができる。CRLをGCSに出力できる。 |
用途 | * 有効期限を短く、証明書の入れ替えが多いシステム * 開発環境等、証明書の入れ替えを考えなくても良いシステム |
発行した証明書の管理が必要な本番システム |
Terraformでの構築での注意点
CASの構築についてはTerraformのGoogle Providerに対応しており、IaC化が可能です。 ただし注意すべきは、現在のTerraformバージョン1では中間CAの作成までは可能ですが、有効化は手動で行う必要があることです。2
また、GCPコンソールやgcloudコマンドを利用し、かつ参照先となるRoot CAがCASで構築されたものの場合、Root CAを明示的に選択することが可能となり、後続の中間CAのActivate処理を省略できます。
Terraformではこちらの方法で中間CAを作成することは現時点では不可のようです。
操作 | Terraform | GCPコンソール or gcloudコマンド |
---|---|---|
CA Pool構築 | ◯ | ◯ |
Root CA構築 | ◯ | ◯ |
中間 CA構築 | ◯ | ◯ |
中間 CAの有効化(Activate) | × | ◯ |
中間 CAの参照先CA選択 | × | ◯ |
証明書の発行 | △ (ENTERPRISEティアに限る) | ◯ |
証明書の管理(ENTERPRISEティアのみ) | ◯ | ◯ |
上記の他に、GCPコンソールやgcloudコマンドとTerraformでは明示的に指定しない設定の初期値に若干乖離があるようです。 (gcloudコマンドでは"値なし"となるが、Terraformでは"0"が設定される、等)
実際にどう構築したか
今回はTerraformよりも構築が容易なgcloudコマンドにて構築を行いました。 ただし、我々のPJでは意図しない構成変更を検出する仕組として原則的にtfstateと実環境の構成差分を監査しているため、gcloudで作成したCASをtfstateにimportして対応しました。
構成
実際構築するにあたり、以下のような設計としました。
- Root CAを、共通部品としてアプリケーションとは別のプロジェクトに作成
- 各アプリケーション用のプロジェクトに中間 CAを立てて、参照先のRoot CAは上記共通プロジェクトのものを利用する
構築手順
gcloudコマンドでCA Pool及びCAを作成する。
CA Pool作成
gcloud privateca pools create <CA Pool名> \
--location=<Region名> \
--tier=<devops or enterprise>
Root CA作成
gcloud privateca roots create <Root CA名> \
--location=<Region名> \
--pool=<CA Pool名> \
--key-algorithm=<algorithm名> \
--subject=<DN> \
--validity=<有効期限>
中間CA作成
gcloud privateca subordinates create <中間CA名> \
--location=<Region名> \
--pool=<CA Pool名> \
--issuer-pool=<Root CA Poolの場所(projects/〜)> \
--issuer-location=<Region名> \
--key-algorithm=<algorithm名> \
--subject=<DN> \
--issuer-ca=<Root CA名> \
--extended-key-usages=<証明書用途> \
--validity=<有効期限>
CAPool及びCAをterraform importを実行し、tfstateに取り込む。 CA Pool importコマンド
terraform import google_privateca_ca_pool.<CA Pool名> \ projects/<Project名>/locations/<Region名>/caPools/<CA Pool名>
CA importコマンド
terraform import google_privateca_certificate_authority.<Root or 中間CA 名> \ projects/<Project名>/locations/<Region名>/caPools/<CA Pool名>/certificateAuthorities/<CA名>
上記の手順を踏むことでRoot CA及び中間CAを構築し、実際にサーバー証明書に利用可能な証明書のダウンロードに成功しました。
最後に補足
CASはまだ新しいプロダクトなので、TerraformのProviderも日々アップデートされている途中の状態です。 今後、terraformでgcloudコマンド相当の方法で構築が可能になることを期待しています。
最後になりますが、JCBでは我々と一緒に働きたいという人材を募集しています。 詳しい募集要項等についてはリンク先の採用ページをご覧下さい。
本文および図表中では、「™」、「®」を明記しておりません。 Google Cloud, GCPならびにすべてのGoogleの商標およびロゴはGoogle LLCの商標または登録商標です。