Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Mavenパッケージの署名検証

 Mavenパッケージの署名検証

CNCJ: Cloud Native Security Japan LT祭りの発表資料

ソフトウェアサプライチェーンセキュリティだ何だと騒がれる昨今、まずは手近な依存関係ライブラリの署名検証方法を紹介しました

Yoshikazu Nojima

December 04, 2024
Tweet

More Decks by Yoshikazu Nojima

Other Decks in Programming

Transcript

  1. Copyright © Yoshikazu Nojima 2024 自己紹介 • 能島良和 • WebAuthn4Jというライブラリの開発者

    https://github.com/webauthn4j/webauthn4j パスキー認証のサーバー側の実装のJava製ライブラリ Keycloak、Spring Security、Vert.x Auth等で使用されています • Twitter:@shiroica • GitHub:ynojima 1
  2. Copyright © Yoshikazu Nojima 2024 Maven Centralレポジトリで公開される署名ファイル 3 Maven Centralレポジトリでは、各ファイルにPGP署名を付与し(拡張子:.asc)、

    元ファイルと同一ディレクトリで公開するルール 実は署名検証したことないけどどうやれば良いんだろう??
  3. Copyright © Yoshikazu Nojima 2024 検証者 署名者 電子署名による改竄からの保護 4 鍵ペア

    秘密鍵 公開鍵 署名処理 検証処理 電子署名 元ファイル 検証結果 公開鍵 元ファイル 電子署名
  4. Copyright © Yoshikazu Nojima 2024 検証者 署名者 鍵ペア Mavenライブラリの場合 5

    秘密鍵 公開鍵 署名処理 検証処理 .jar.asc .jar 検証結果 公開鍵 .jar .jar.asc キーサーバー Maven Central レポジトリ
  5. Copyright © Yoshikazu Nojima 2024 署名準備:鍵ペアの作成、登録 ▪ GnuPGでのキーペアの生成(持っていない場合のみ) 6 #

    キーペアの生成 $ gpg --gen-key # 対話式で名前やメールアドレスを入力 # キーIDの確認 $ gpg --list-keys # キーサーバーに公開鍵を登録 $ gpg --keyserver keys.openpgp.org --send-keys <key-id>
  6. Copyright © Yoshikazu Nojima 2024 署名方法 ▪ GnuPGでの署名コマンド ▪ Mavenでの署名設定

    7 # ファイルへの署名 gpg –ab <.jarファイル名> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> <version>1.5</version> <executions> <execution> <id>sign-artifacts</id> <phase>verify</phase> <goals><goal>sign</goal></goals> </execution> </executions> </plugin>
  7. Copyright © Yoshikazu Nojima 2024 検証方法(GnuPG) 実行例: 8 $ gpg

    --verify webauthn4j-core-0.28.3-SNAPSHOT.jar.asc webauthn4j-core-0.28.3- SNAPSHOT.jar gpg: Signature made Wed Nov 27 21:34:43 2024 JST gpg: using EDDSA key B7E7C33CBCE33568168C31A435FB1F5681B8990F gpg: Good signature from "Yoshikazu Nojima <[email protected]>" [ultimate] $ gpg --verify <署名ファイル> <署名対象ファイル>
  8. Copyright © Yoshikazu Nojima 2024 検証方法(Maven simplify4u Verify PGP signatures

    plugin) ▪ pom.xmlへの追加 ▪keysmap.list 信頼する公開鍵のFingerprintを対象のgroupやartifactを指定しkeysmapファイルに列挙 9 <plugin> <groupId>org.simplify4u.plugins</groupId> <artifactId>pgpverify-maven-plugin</artifactId> <version>1.18.2</version> <configuration> <pgpKeyServer>https://keyserver.ubuntu.com</pgpKeyServer> <keysMapLocation>${project.basedir}/keysmap.list</keysMapLocation> </configuration> <executions> <execution> <goals> <goal>check</goal> </goals> </execution> </executions> </plugin> com.webauthn4j = 0xD6419D202DFA86A9210F5F04A6D79C503F80535D
  9. Copyright © Yoshikazu Nojima 2024 検証方法(Maven simplify4u Verify PGP signatures

    plugin) ▪ 実行結果 10 [INFO] --- pgpverify:1.18.2:check (default-cli) @ quarkus-security-passkeys-poc --- [INFO] Key server(s) - {https://keys.openpgp.org} [INFO] Resolved 410 artifact(s) in PT0.2980288S [INFO] Resolved 410 signature(s) in PT0.4914689S (略) [INFO] com.webauthn4j:webauthn4j-core:jar:0.28.2.RELEASE PGP Signature OK KeyId: 0xD6419D202DFA86A9210F5F04A6D79C503F80535D UserIds: [WebAuthn4J Project <[email protected]>] (略) [INFO] Finished 410 artifact(s) validation in PT2.9281044S [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 6.674 s [INFO] Finished at: 2024-12-03T09:05:09+09:00 [INFO] ------------------------------------------------------------------------
  10. Copyright © Yoshikazu Nojima 2024 Javaライブラリの署名検証を実施して気づいた点 • Maven Centralレポジトリ、署名必須の筈が署名されていないライブラリも存在 •

    Gradle Plugin Portalレポジトリ、署名されてないPlugin多数 • ちょっとしたデモアプリでもQuarkus/Springといったフレームワークを使うと 信頼しなければならない公開鍵多数。推移的依存関係多数の為 11
  11. Copyright © Yoshikazu Nojima 2024 追補:Maven Centralのsigstore対応について • コンテナや、ソースコードの署名においては、sigstoreを使ったキーレス署名が最近の流行 •

    sigstore-java 1.0が2024年8月にリリースされ、 mavenでもsigstoreでキーレス署名したパッケージがMaven Centralで公開できるように 12
  12. Copyright © Yoshikazu Nojima 2024 まとめ • Mavenライブラリの署名は単なるPGP署名 • Maven

    Centralレポジトリ上のライブラリは基本的に署名されている • 署名されていない一部例外もある • 信頼する相手の公開鍵で、対象ファイルと署名ファイルを検証すれば ライブラリの改竄を検知可能 • Maven等のビルドツールのプラグインを使えば、プロジェクトの依存関係のライブ ラリもビルド時に一括検証可能 • Sigstoreによるキーレス署名も最近Maven Centralで利用可能に 13