FRSCA (Factory for Repeatable Secure Creation of Artifacts)解説 : 1. FRSCAとは？

近年、ソフトウェアサプライチェーンへの攻撃増加に伴い、ソフトウェアサプライチェーンセキュリティが注目を集めています。この背景から、本記事ではFRSCAというビルドパイプラインのリファレンス実装について解説を行います。
FRSCAは企業でも注目されており、FRSCAをベースにしたセキュアビルドパイプラインの実装が国際会議で発表されています。以下のURL[
Beyond Guidelines - Designing and Implementing Robust Build Pipelines](https://ossjapan2023.sched.com/event/1TypA/beyond-guidelines-designing-and-implementing-robust-build-pipelines-non-kawana-hitachi-ltd-keisuke-matsumoto-japan)から、動画視聴、スライドがダウンロードできます。

## FRSCAとは？
FRSCA (Factory for Repeatable Secure Creation of Artifacts)テキスト[^1]とは、CNCFが公開している[Software Supply Chain Security Paper](https://github.com/cncf/tag-security/blob/main/supply-chain-security/supply-chain-security-paper/CNCF_SSCP_v1.pdf)に基づいたオープンソースのリファレンス実装です。FRSCAでは全てのビルドがサプライチェーンセキュリティのベストプラクティスに従うことを保証するため、セキュアなビルドを実行するためのパイプラインの実装例を定義しています。FRSCAはオープンソースであり、(https://github.com/buildsec/frsca) で公開されています。

[^1]: フレスカと呼びます
### FRSCAの目的
FRSCAはビルドの保護を重要視しています：
- ビルドの保護
  - FRSCAの実装はビルド、パイプライン、署名、可視性、アイデンティティ、およびポリシーのツール群を用いて実現されます。
  - 設置したビルドサービス群だけでなく，実際に実行しているビルドが安全であることを確認すること、期待通りのビルドが実行されているかも重要視しています．
- 保護されたビルドを実行するための抽象化 (ビルドプロセスの可視性の低下)
  - これは、他者が自分が実行するビルドについて簡単には理解できないようにすることです。抽象化して，他の人にビルドプロセスをわかりづらくさせることでビルドの保護に繋がります。

### FRSCAの原理
FRSCAは次の原理に従い、設計されています
- End-Userにとってできる限りシンプルになるように作ること．
- ゼロトラストをそれぞれのコンポーネントで適用すること．
- セキュアに実行されるべきだが，それ以外(安全性が必ずしも必要ないとき)はフレキシブルであること．
  - 例えば、もし，SBOMが必要となる状況だとしても，それにCyclone DXかSPDX，どれを使うかは気にしない．
- できる限り自動化すること．
  - シンプルかつ簡単であり，ユーザーがメンテナンスに多大な負担を負わないようにする．


## FRSCAの実装方法
FRSCAの実装はビルド、パイプライン、署名、可視性、アイデンティティ、およびポリシーのツール群を用いて実現されます。FRSCAでは以下のツールを使用し、パイプライン実装を提案しています。それぞれのツールの詳しい解説は他の方の記事を参考にしてください。表中では、FRSCAのサンプルパイプラインで実際に使用されているツールを全て載せています。[^2]
[^2]: 必ずしもFRSCAで必須ではないツールもあり、他のツールを使用することもできます。


| ツール名         | 使用用途 | FRSCAで必須か？ | 代用ツール|
| ---------------- | -------- | ---- | ---- | 
| Gitea | ソースコードリポジトリ  |    | GitHub,GitLab | 
| [Tekton Pipelines]|  CI/CDパイプラインの構築 |  〇 |     |
| [Tekton Triggers]|  イベントトリガー |  〇 |     |
| Kaniko | コンテナイメージビルドツール </br>コンテナ内でビルドが行える |      | Docker, Buildpacks| 
| [Syft] |  SBOM生成ツール    |     | Trivy| 
| [Grype] | 脆弱性検知ツール  |   | Trivy, Vuls| 
| [Tekton Chains] | パイプラインの監視、署名| 〇 |      | 
| [Sigstore]         | 署名 </br> Sigstoreは署名系ツールセット</br>Cosign・Fulcio・Rekorの名称 |   〇|      | 
| [SPIFFE/Spire]    |ワークロードの識別 </br> ワークロードにに変更があった場合それを検知する   | 〇 | |
| [Kyverno]|ポリシー|      |  |
| [Vault]  | シークレット管理|  〇 | |
| [Helm] |プロビジョニング </br> Kubernetes リソースのデプロイを行う|  〇 | |
| [CUE]  |プロビジョニング </br> tektonのパイプラインの記述を</br>論理的に書くことができる |  〇 | |


FRSCAパイプラインはKubernetes基盤の上に作られます。パイプラインをTekton Pipelinesで作成し、パイプライン中のタスク (ビルド、SBOM生成、脆弱性検知、署名、認証)はTekton　Tasksによって、すべてコンテナ内で実行されます。各コンテナにそれぞれのタスクを実行するためのツールがインストールされています。




# FRSCAサンプルパイプラインのアーキテクチャについて
ここでは、FRSCAのリポジトリで公開されている実際に動かすことができる[サンプルパイプライン](https://github.com/buildsec/frsca/tree/main/examples/sample-pipeline)について説明します。

以下の図がFRSCAのサンプルパイプラインのアーキテクチャです。
![pipeline.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781216/d07dc165-14ce-d1c2-1cda-e33ecc8a74d4.png)
このサンプルパイプラインは以下のように実行されます。
1. 開発者がソースコードをリポジトリへpushします。
2. そのpushイベントをTekton Triggersが検知し、それを契機にパイプラインを実行します
3. a. Tekton Tasksによって生成された各Taskが実行されます
b. Tekton Chainsによって、パイプライン中の各実行結果が観測・記録され、Provenance[^3]が生成されます。このとき、ChainsはSpire、Sigstoreと連携しており、ワークロードの識別、Provenanceへの署名 (Attestationという)を行います。
4. ビルドされたアーティファクトは本番環境へデプロイされます
5. パイプラインの実行によって生成されたアーティファクト (SBOM, Provenance, Attestationなど)はメタデータストアへ保管されます。ここで、このサンプルパイプラインではttl.shという一時的なレジストリを使用しています。[^4]



[^3]: Provenanceとは誰がいつどこで何を使ってどうやってビルドしたかを記録したメタデータのこと。ここでは、ビルドプロセスのことをProvenanceと呼んでいます。
[^4]: サンプルパイプラインでは一時的にttl.shを使用していましたが、FRSCAではdocker resistoryや[GUAC]を利用することが提案されており、メタデータストアに何を利用するかは今後も検討が必要です。


以上、FRSCAについて概要を説明しました。全てについて理解できているわけではないため、間違いもあるかもしれません。今後は、FRSCAサンプルパイプラインの実行やProvenance、Attestationをどうやって生成しているのか？、署名や認証をどう行っているかを詳しく解説したいと考えています。


[tekton chains]: https://github.com/tektoncd/chains
[tekton pipelines]: https://tekton.dev/
[tekton triggers]: https://tekton.dev/
[kyverno]: https://kyverno.io/
[kubernetes]: https://k8s.io/
[spiffe/spire]: https://spiffe.io/
[cosign/sget]: https://github.com/sigstore/cosign
[crane]: https://github.com/google/go-containerregistry
[cue]: https://cuelang.org/
[make]: https://www.gnu.org/software/make/
[rekor cli]: https://github.com/sigstore/rekor
[vault]: https://www.vaultproject.io/
[helm]: https://helm.sh/
[sigstore]: https://www.sigstore.dev/
[cert-manager]: https://cert-manager.io/
[registry]: https://hub.docker.com/_/registry

[kaniko]: https://github.com/GoogleContainerTools/kaniko
[syft]: https://github.com/anchore/syft
[grype]: https://github.com/anchore/grype

[guac]: https://github.com/guacsec/guac