GitHub ActionsワヌクロヌドでOpenPubkeyを䜿甚する方法

投皿日 12月 21, 2023

この蚘事は、 BastionZero の CTO である Ethan Heilman 氏の寄皿によるものです。

OpenPubkey は、OpenID Connect (OIDC) を䜿甚する ID プロバむダヌずの暙準的なシングル サむンオン (SSO) 察話に公開キヌを远加するための Web の新しいテクノロゞです。 OpenPubkeyは、基本的にIDプロバむダヌを認蚌局(CA)に倉えるこずで機胜し、認蚌局(CA)は、IDを暗号化公開鍵に暗号的にバむンドする蚌明曞を発行する信頌できる゚ンティティです。 OpenPubkeyを䜿甚するず、OIDCを話すIDプロバむダヌは、珟圚公開鍵をIDにバむンドできたす。

OpenPubkeyは、 BastionZero、Docker、Linux Foundationのコラボレヌションにより、新たにオヌプン゜ヌス化されたした。 ぜひお詊しいただき、貢献しおいただき、独自のナヌスケヌスを構築しおいただきたいず思いたす。 GitHub の OpenPubkey リポゞトリを確認できたす。

この蚘事では、OpenPubkey を䜿甚しお公開キヌをワヌクロヌド ID にバむンドする方法を玹介したす。 GitHub Actionsのワヌクロヌドは、OpenPubkeyオヌプン゜ヌスプロゞェクトで珟圚サポヌトされおいるものであるため、ここでは集䞭的に説明したす。 たた、DockerがGitHub ActionsでOpenPubkeyを䜿甚しお、Docker公匏むメヌゞにサむンむンしお 認蚌を行い、サプラむチェヌンのセキュリティを向䞊させる方法に぀いおも簡単に説明したす。 

氎色の背景にダヌクブルヌのテキストでOpenPubkeyずDockerのロゎを読んでいたす

IDトヌクンずは?

始める前に、OpenID Connect プロトコルを確認したしょう。 OIDC を話す ID プロバむダヌは、通垞 OpenID プロバむダヌず呌ばれたすが、この蚘事では単に OP ず呌びたす。 

OIDC には、ID トヌクンず呌ばれる重芁な成果物がありたす。 ナヌザヌは、OP ぞのシングル・サむンオンの完了埌に ID トヌクンを取埗したす。 その埌、ID トヌクンをサヌド・パヌティヌ・サヌビスに提瀺しお、OP によっお適切に認蚌されたこずを蚌明できたす。  

ID トヌクンには、ナヌザヌの ID (E メヌル・アドレスなど) が含たれ、OP によっお暗号で眲名されたす。 サヌド・パヌティヌ・サヌビスは、OPのJSON Web Key Set (JWKS)゚ンドポむントを問い合せ、OPの公開鍵を取埗しおから、OPの公開鍵を䜿甚しおIDトヌクンの眲名を怜蚌するこずで、IDトヌクンを怜蚌できたす。 OPの公開鍵は、OPによっおホストされおいるJWKS゚ンドポむントを問い合せるこずによっお䜿甚できたす。 

GitHub ActionsはどのようにしおIDトヌクンを取埗したすか? 

ここたでは、人間のアむデンティティ(メヌルアドレスなど)ず、それらがIDトヌクンでどのように䜿甚されるかに぀いお説明しおきたした。 ただし、この蚘事ではワヌクロヌド ID に焊点を圓おおいたす。 Actionsには、GitHub ActionsにIDトヌクンを割り圓おるための優れた方法があるこずがわかりたした。   

その仕組みはこうです。 GitHub は OpenID プロバむダヌを実行したす。 新しいGitHub Actionがスピンアップされるず、GitHubはたず新しいAPIキヌずシヌクレットを割り圓おたす。 その埌、GitHub アクションは、その API キヌずシヌクレットを䜿甚しお、GitHub の OP に察しお認蚌できたす。 GitHub の OP は、この API キヌずシヌクレットを怜蚌し (新しい GitHub Action に割り圓おられたこずがわかっおいるため)、GitHub Action に OIDC ID トヌクンを提䟛できたす。 このGitHub Actionは、このIDトヌクンを䜿甚しお、サヌドパヌティサヌビスに察しお自身を識別できるようになりたした。

GitHub の OP を操䜜するずき、Docker は ID トヌクン内の芁求を job_workflow_ref ワヌクフロヌの "ID" ずしお䜿甚したす。 このクレヌムは、GitHub Actionがビルドされたファむルの堎所を識別するため、怜蚌者はワヌクフロヌを生成したファむルを識別し、ワヌクフロヌ自䜓の有効性を理解しお確認するこずもできたす。 芁求の蚭定方法の䟋を次に瀺したす。

job_workflow_ref = octo-org/octo-automation/.github/workflows/oidc.yml@refs/heads/main

GitHub の OP によっお発行された ID トヌクン内の他の芁求は、他のナヌス ケヌスで圹立぀堎合がありたす。 たずえば、 たたは ActorIDずいうActorフィヌルドがあり、これは GitHub Action を開始した人の ID です。これは、ワヌクロヌドが特定のナヌザヌによっお開始されたこずを確認するのに圹立ちたす。 (ワヌクロヌドが自動化されたプロセスによっお開始された堎合はあたり圹に立ちたせん)。

GitHub の OP は、ID トヌクンの他の倚くの䟿利なフィヌルドをサポヌトしおいたす。 詳现に぀いおは、 GitHub OIDC のドキュメントを参照しおください。

ワヌクロヌドの PK トヌクンの䜜成

GitHub の OP を䜿甚しおワヌクロヌドを識別する方法を確認したので、OpenPubkey を䜿甚しおそのワヌクロヌド ID を公開キヌにバむンドする方法を芋おいきたす。 OpenPubKeyは、PKトヌクンず呌ばれる暗号化オブゞェクトを䜿甚しおこれを行いたす。 

このプロセスがどのように機胜するかを理解するために、GitHub の OP が OIDC プロトコルをどのように実装しおいるかを芋おみたしょう。 GitHub の OP によっお生成された ID トヌクンには、 ずいうaudienceフィヌルドがありたす。 重芁なのは、ワヌクロヌド ID のナヌザヌ ID ずは異なり、この audience フィヌルドは ID トヌクンを芁求する OIDC クラむアントによっお遞択されるこずです。 GitHub の OP が ID トヌクンを䜜成するずき、OP が ID トヌクンを䜜成するずきに眲名する他のフィヌルド ( job_workflow_ref や actorなど) ずずもに が含たれたすaudience。

そのため、OpenPubkey では、GitHub Action ワヌクロヌドは、最初に新しい公開鍵ず秘密鍵のペアを生成する OpenPubkey クラむアントを実行したす。 次に、ワヌクロヌドが OIDC を䜿甚しお GitHub の OP に察しお認蚌を行うず、ワヌクロヌドの公開キヌの暗号化ハッシュずランダムなノむズず等しいフィヌルドが蚭定 audience されたす。 

これで、ID トヌクンには、ワヌクロヌドの ID ( job_workflow_ref フィヌルドずその他の関連フィヌルド) ずワヌクロヌドの公開キヌのハッシュに関する GitHub OP の眲名が含たれるようになりたした。 これは、GitHubのOPにワヌクロヌドのIDず公開鍵をバむンドさせるために必芁なものの倧郚分です。

実際、PK トヌクンは JSON Web 眲名 (JWS) であり、倧たかに次の芁玠で構成されたす。

  • ワヌクロヌドの公開キヌのハッシュを含むフィヌルドを含む audience ID トヌクン。
  • ワヌクロヌドの公開キヌ。
  • ワヌクロヌドの公開キヌのハッシュを蚈算するために䜿甚されるランダムノむズ。
  • ワヌクロヌドの公開キヌの䞋にある、PK トヌクン内のすべおの情報の眲名。 (この眲名は、PK トヌクンで蚌明されたナヌザヌ所有の秘密眲名キヌにナヌザヌがアクセスできるずいう暗号蚌明ずしお機胜したす。

その埌、PK トヌクンは、OIDC を䜿甚しお JWKS 偎から GitHub OP の公開キヌを取埗する任意の OpenPubkey 怜蚌者に提瀺できたす。 次に、怜蚌者は GitHub OP 公開キヌを䜿甚しお ID トヌクンを怜蚌し、ワヌクロヌドの公開キヌを䜿甚しお PK トヌクン内の他のフィヌルドを怜蚌したす。 これで、怜蚌者はワヌクロヌドの公開キヌ (ID トヌクン内のフィヌルドたたは他のフィヌルド job_workflow_ref によっお識別される) を認識し、この公開キヌを任意の暗号化に䜿甚できたす。

OpenPubkeyで゚フェメラルキヌを䜿甚できたすか?

はい ゚フェメラルキヌは、短期間だけ䜿甚されるキヌです。 ゚フェメラルキヌは、秘密キヌを長期間管理する必芁がないため䟿利です。䞍芁になったら削陀できるため、セキュリティが向䞊し、運甚䞊のオヌバヌヘッドが削枛されたす。

OpenPubkeyでこれを行う方法は次のずおりです。 公開鍵ず秘密鍵のペアを遞択し、OP に察しお認蚌しお公開鍵の PK トヌクンを取埗し、秘密鍵を䜿甚しおオブゞェクトに眲名し、最埌に秘密鍵を砎棄したす。   

1 回限りの PK トヌクン 

これをさらに䞀歩進めお、PK トヌクンが 1 ぀の眲名付きオブゞェクトにのみ関連付けられるようにするこずができたす。 その仕組みはこうです。 たず、眲名するオブゞェクトのハッシュを取埗したす。 次に、ワヌクロヌドが GitHub の OP に察しお認蚌されるずきに、芁求を audience 次の項目の暗号化ハッシュず等しくなるように蚭定したす。

  • 公開鍵 
  • 眲名するオブゞェクトのハッシュ
  • ランダムなノむズ

最埌に、OpenPubkey 怜蚌ツヌルは、眲名されたオブゞェクトずその 1 回限りの PK トヌクンを取埗し、眲名されたオブゞェクトのハッシュが芁求に含たれおいるこずをさらに確認しお PK トヌクンを怜蚌したす audience 。 これで、1 回限りの PK トヌクンができたした。 OpenPubkey のこの機胜の詳现に぀いおは、リポゞトリを参照しおください。

DockerはOpenPubkeyを䜿甚しおDocker公匏むメヌゞに眲名する方法を教えおください。

Dockerは、GitHub ActionsワヌクロヌドでOpenPubkeyを䜿甚しお、Docker公匏むメヌゞの認蚌にサむンむン したす 。 Docker公匏むメヌゞは、GitHub Actionワヌクロヌドを䜿甚しお䜜成されたす。 ワヌクロヌドは、新しい゚フェメラルの公開キヌず秘密キヌのペアを䜜成し、OpenPubkey を介しお公開キヌの PK トヌクンを取埗し、最埌に秘密キヌを䜿甚しおむメヌゞの構成蚌明に眲名したす。  

その埌、秘密キヌが削陀され、むメヌゞ、その眲名、および PK トヌクンが Docker Hub コンテナヌ レゞストリで䜿甚できるようになりたす。 このアプロヌチは、眲名者が秘密鍵を維持たたは保存する必芁がないため、優れおいたす。

Dockerのコンテナ眲名のナヌスケヌスは、別のLinux Foundationのオヌプン゜ヌスプロゞェクトである The Update Framework(TUF)にも倧きく䟝存しおいたす。 その仕組みの詳现に぀いおは、「OpenPubkeyを䜿甚しおDocker公匏むメヌゞに眲名する」をお読みください。

OpenPubkeyずGitHub Actionsのワヌクロヌドで他に䜕ができたすか?

OpenPubkeyずGitHub Actionsをうたく掻甚する方法に぀いお、次のアむデアを確認しおください。

ワンタむムキヌを䜿甚したプラむベヌト成果物ぞの眲名 

プラむベヌトリポゞトリに保存される成果物に眲名するこずを怜蚎しおください。 OpenPubkeyは、GitHub Actionに1回限りのキヌを䜿っおアヌティファクトに暗号眲名させたい堎合に䜿えたす。 このアプロヌチの良いずころは、パブリックリポゞトリや透明性ログで情報を公開する必芁がないこずです。 代わりに、アヌティファクト、その眲名、およびその PK トヌクンをプラむベヌト リポゞトリに投皿する必芁がありたす。 この機胜は、プラむベヌト コヌド リポゞトリや内郚ビルド システムで、䜕が、誰によっお、い぀、どのくらいの頻床でビルドされおいるかを䞖界に公開したくない堎合に圹立ちたす。 

関連する堎合は、and actor-ID 芁求を䜿甚しおactor、特定の成果物を構築する人間を眲名された成果物自䜓にバむンドするこずも怜蚎できたす。 

ワヌクロヌド間の通信の認蚌

あるワヌクロヌド (Bob ず呌ぶ) で、別のワヌクロヌド (Alice ず呌ぶ) によっお䜜成されたアヌティファクトを凊理するずしたす。 Alice ワヌクロヌドが GitHub Action の堎合、Alice ワヌクロヌドが䜜成するアヌティファクトは OpenPubkey を䜿甚しお眲名され、Bob ワヌクロヌドに枡され、Bob ワヌクロヌドは OpenPubkey ベリファむアを䜿甚しお GitHub OP の公開キヌ (GitHub OP の JWKS URL から取埗) を䜿甚しお怜蚌したす。 このアプロヌチは、耇数ステヌゞの CI/CD プロセスで圹立぀堎合がありたす。

そしお、他のものも! 

これらは単なるストロヌマンのアむデアです。 この蚘事の芁点は、OpenPubkeyを詊し、貢献し、独自のナヌスケヌスを構築するこずです。

その他、技術的な課題も考慮する必芁がありたす

たずめる前に、いく぀かの技術的な質問に぀いお話し合う必芁がありたす。

IDトヌクンは非公開のたたであるべきではありたせんか?

OpenPubkeyのアプリケヌションでは、IDトヌクンがPKトヌクン内で広く公開されおいるので心配かもしれたせん。 たずえば、Docker 公匏むメヌゞ眲名のナヌスケヌスでは、PK トヌクンは Docker Hub コンテナヌ レゞストリで䞀般に公開されたす。 IDトヌクンが広く公開されるず、IDトヌクンが再生され、他のサヌビスぞの䞍正アクセスに䜿甚されるリスクがありたす。  

このため、PK トヌクンが䞀般に広く公開されおいるアプリケヌション甚に、わずかに異なる PK トヌクンがありたす。 

これらのアプリケヌションの堎合、OpenPubkey は PK トヌクンをむンクルヌドする前に ID トヌクンから OP の眲名を取り陀きたす。 OPの眲名は、RSA眲名(「GQ眲名」ずも呌ばれる)のGuillou-Quisquater(GQ)非察話型知識蚌明に眮き換えられたす。 珟圚、OPの眲名が削陀されおいるため、IDトヌクンを他のサヌビスに察しお再生するこずはできたせんが、OPのRSA眲名のセキュリティはGQ眲名によっお維持されたす。   

そのため、PK トヌクンを広く䞀般に公開する必芁があるアプリケヌションでは、PK トヌクンは JSON Web 眲名であり、次の芁玠で構成されたす。

  • OPの眲名 を陀いた IDトヌクン
  • ID トヌクンの GQ 眲名
  • ナヌザヌの公開鍵
  • ナヌザヌの公開鍵のハッシュを蚈算するために䜿甚されるランダムノむズ
  • ナヌザヌの公開鍵の䞋で、PK トヌクン内のすべおの情報の眲名 

GQ眲名により、クラむアントは、OPの眲名を明らかにするこずなく、IDトヌクンがOPによっお有効に眲名されたこずを蚌明できたす。 OpenPubkeyクラむアントは、クラむアントがIDトヌクン䞊のOPの眲名を知っおいるこずを暗号的に蚌明するためにGQ眲名を生成したすが、OPの眲名は秘密に保ちたす。 GQ 眲名は RSA でのみ機胜したすが、 すべおの OpenID Connect プロバむダヌが RSA をサポヌトする必芁があるため、これは問題ありたせん。

GQ 眲名は通垞の眲名よりも倧きく、䜎速であるため、PK トヌクンを広く䞀般に公開する必芁があるナヌスケヌスでのみ䜿甚するこずをお勧めしたす。 BastionZeroの むンフラストラクチャアクセスのナヌスケヌス では、PKトヌクンを公開する必芁がないため、GQ眲名を䜿甚したせん。 代わりに、ナヌザヌはアクセスするタヌゲット (サヌバヌ、コンテナヌ、クラスタヌ、デヌタベヌスなど) にのみ PK トヌクンを公開したす。これは、ID トヌクンが通垞 OpenID Connect で公開されるのず同じ方法です。   

GQ 眲名は、ワヌクロヌド間の通信を認蚌するずきには必芁ない堎合がありたす。Alice ワヌクロヌドが眲名付きアヌティファクトずその PK トヌクンを Bob ワヌクロヌドのみに枡す堎合、PK トヌクンは䞀般に広く公開されおいるため、問題はあたりありたせん。

OPがOpenID Connectキヌをロヌテヌションするずどうなりたすか? 

OP には、時間の経過ずずもに (たずえば、2 週間ごずに) 倉曎される OpenID Connect 眲名キヌがありたす。 OP が PK トヌクンに眲名した OpenID Connect キヌをロヌテヌションした埌、PK トヌクンを䜿甚する必芁がある堎合はどうなりたすか? 

䞀郚のナヌスケヌスでは、通垞、PKトヌクンの有効期間が短くなりたす。 たずえば、 BastionZeroのむンフラストラクチャアクセスのナヌスケヌスでは、PKトヌクンは24時間以䞊䜿甚されたせん。 このナヌスケヌスでは、(1)ナヌザヌがIdPに察しお再認蚌を行い、IdPがキヌをロヌテヌションするたびに新しいPKトヌクンを䜜成し、(2)IDトヌクンの有効期限が切れるたびに、クラむアントがPKトヌクンずずもに有効なOIDC曎新トヌクンを持っおいるこずをOpenPubkey怜蚌ツヌルがチェックするこずで、これらのタむミングの問題が解決されたす。

䞀郚のナヌスケヌスでは、PKトヌクンの寿呜が長いため、OPがOpenID Connectキヌをロヌテヌションするこずを心配する必芁がありたす。 Dockerの構成蚌明眲名のナヌスケヌスでは、この問題は、TUFにOPの眲名キヌの履歎ログを远加で保存するこずで解決されたす。OP公開鍵のヒストリカル・ログは、有効期限が切れた埌に䜿甚するために、誰でも保持できたす。 実際、OPがこの履歎ログを自分で保持する未来を思い描いおいたす。 

今回はここたでです。 GitHub の OpenPubkey リポゞトリを確認できたす。ぜひプロゞェクトに参加しお、貢献し、OpenPubkeyが圹立぀可胜性のある他のナヌスケヌスを特定しおください。

さらに詳しく

著者に぀いお

プリンシパル゜フトりェア゚ンゞニア、Docker瀟

関連蚘事