From a46b18f58bb4329d345becbdd496c78fe149750b Mon Sep 17 00:00:00 2001 From: Ryosuke Tomita <> Date: Sun, 14 Jan 2024 00:23:50 +0900 Subject: [PATCH] feature/add-markdownlint --- .pre-commit-config.yaml | 12 ++- Dockerfile | 5 +- README.md | 194 ++++++++++++++++++++--------------- doc/pull_request_template.md | 6 +- doc/tools_doc/git-secret.md | 11 +- doc/tools_doc/hadolint.md | 15 +-- doc/tools_doc/pre-commit.md | 86 ++++++++++------ doc/tools_doc/semgrep.md | 16 +-- doc/tools_doc/trivy.md | 48 +++++---- pre-commit-test-local.sh | 3 + public/favicon.ico | Bin 3870 -> 0 bytes 11 files changed, 243 insertions(+), 153 deletions(-) create mode 100644 pre-commit-test-local.sh delete mode 100644 public/favicon.ico diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3203980..d38bf50 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: rev: v2.12.0 hooks: - id: hadolint - #args: [--trusted-registry, grc.io, ./react-app/Dockerfile] + # args: [--trusted-registry, grc.io, ./react-app/Dockerfile] args: [./Dockerfile] files: Dockerfile$ # ESLint @@ -30,3 +30,13 @@ repos: hooks: - id: prettier files: \.[jt]sx?$ # *.js, *.jsx, *.ts and *.tsx + + # Markdown linter + # けっこう厳しいのでVSCodeのExtensionsで見てクリティカルな部分だけ直すでもいいかも +- repo: https://github.com/igorshubovych/markdownlint-cli + rev: v0.38.0 + hooks: + - id: markdownlint + files: '.*\.md$' + types: [file] + args: [--disable, MD010, --disable, MD013] diff --git a/Dockerfile b/Dockerfile index 13e7e08..cdbc2d2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,8 +7,6 @@ RUN npm install && npm run build # Product Image FROM public.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base-nginx:latest-al23 -COPY --from=build /app/build /usr/share/nginx/html -COPY nginx.conf /etc/nginx/nginx.conf # Change owner to allow non-root users to start the service USER root @@ -17,6 +15,9 @@ RUN mkdir -p /var/log/nginx \ && touch /run/nginx.pid \ && chown -R nginx:nginx /run/nginx.pid +COPY --from=build /app/build /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf + # Use 8080 instead of 80 to avoid the `nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)` when using ECS. EXPOSE 8080 USER nginx diff --git a/README.md b/README.md index 242a40b..2251f98 100644 --- a/README.md +++ b/README.md @@ -1,81 +1,99 @@ -# INDEX -- [ABOUT](#ABOUT) -- [ENVIRONMENT](#ENVIRONMENT) -- [PREPARING](#PREPARING) -- [HOW TO USE](#HOW-TO-USE) -- [MEMO](#MEMO) -****** +# DevSecOps demo React application for AWS ECS on Fargate +## INDEX -# ENVIRONMENT -- AWS -- Github Actions -- node:20 -****** +- [ABOUT](#about) +- [ENVIRONMENT](#environment) +- [PREPARING](#preparing) +- [HOW TO USE](#how-to-use) +- [Error Log](#error-log) + +--- +## ABOUT -# ABOUT Sample for DevSecOps environment. If you need help or questions, please contact [twitter](https://twitter.com/sigma5736394841), issues. -## AWS + +## ENVIRONMENT + +- AWS +- GitHub Actions +- node:20 + +--- + +### AWS + - app-infrastructure-roles -![app-infrastructure-roles](./doc/fig/cfn/app-infrastructure-roles.png) + ![app-infrastructure-roles](./doc/fig/cfn/app-infrastructure-roles.png) - app-infrastructure -![app-infrastructure](./doc/fig/cfn/app-infrastructure.png) + ![app-infrastructure](./doc/fig/cfn/app-infrastructure.png) - environment -![env](./doc/fig/cfn/env.png) + ![env](./doc/fig/cfn/env.png) - service -![svc](./doc/fig/cfn/svc.png) + ![svc](./doc/fig/cfn/svc.png) - pipeline -![pipeline](./doc/fig/cfn/pipeline.png) -****** + ![pipeline](./doc/fig/cfn/pipeline.png) + +--- +### Automation Tools -## Automation Tools See [./doc/tools_doc](./doc/tools_doc) -### local + +#### local tools + - pre-commit,git-secret -### GitHub Actions + +#### Using on GitHub Actions + - semgrep - jest - trivy(dependency check) -### AWS CodePipeline +#### AWS CodePipeline + - trivy(image scan) -****** +--- + +## PREPARING -# PREPARING -## AWSの設定 -copilot cliを使って環境構築を行う。 -### appの作成 -- 名前は任意だが,自分はreact-appとした -- ここで必用なIAMロールの一部やKMSのキーやCodePipelineに使うS3やそのポリシーが作成されている。 +### AWS Settings + +copilot cli を使って環境構築を行う。 + +#### Create app + +- 名前は任意だが,自分は react-app とした +- ここで必用な IAM ロールの一部や KMS のキーや CodePipeline に使う S3 やそのポリシーが作成されている。 ```shell copilot app init cat ./copilot/.workspace application: react-app ``` -### development用のenvironmentとserviceをまとめて作成する。 -- amd64を指定しないとなぜかビルドエラーになる。 -- 名前は任意だが,dev-envとdev-svcとした。 -- TypeはLoad Balancerを選択した。 + +#### development 用のと production 用の 2 つの environment と service を作成する + +- amd64 を指定しないとビルドエラーになる。 +- 名前は任意だが,dev-env,dev-svc と prod-env,prod-svc とした。 +- Type は Load Balancer を選択した。 ```shell DOCKER_DEFAULT_PLATFORM=linux/amd64 copilot init ``` + - copilot/以下のファイルを編集することで設定を変更できる。 -- 新しいVPCや,ECSのCluster,Load Balancerや権限周りが作成される。 -### production用のenvironmentとserviceをまとめて作成する。 -- vpcをいくつも作りたくない場合はenvironment単体で作成すると既存リソースの使用が選択できる(VPC含めて完全新規にしたいなら上の手順を繰り返す)。 +> [!NOTE] +> production と development で共通の VPC を使う場合には以下のようにして`copilot env init`単体で作成する。 -```shell -copilot env init # prod-envと命名してcopilot-react-app-dev-vpcを選択する。 -``` +
see detail +- 新しい VPC や,ECS の Cluster,Load Balancer や権限周りが作成される。 ```shell copilot env init @@ -105,39 +123,45 @@ Default environment configuration? No, I'd like to import existing resources Which VPC would you like to use? [Use arrows to move, type to filter] > vpc-xxxxxxxxxxxxxxxxx (copilot-react-app-dev-env) ``` +
-- environmentをデプロイ + +- environment をデプロイ ```shell copilot env deploy ``` -- prod用のserviceを作成してデプロイする。 -この際に間違えてdev-svcやdev-envを選ばないように注意する。 +- service をデプロイする。 + > [!WARNING] + > この際に間違えて dev-svc や dev-env を選ばないように注意する。 ```shell -DOCKER_DEFAULT_PLATFORM=linux/amd64 copilot svc init +DOCKER_DEFAULT_PLATFORM=linux/amd64 copilot svc init # サービス作成済みなら実行しない。 copilot svc deploy ``` + - ブラウザからアクセスできるか試してみる。 ```shell -copilot svc show # urlが出てくるので +copilot svc show # urlが出てくるのでそこにアクセスする ``` +### CodePipeline の作成 -### CodePipelineの作成 -- 名前は任意だが,自分はreact-app-pipelineとした。 +- 名前は任意だが,自分は react-app-pipeline とした。 ```shell copilot pipeline init ``` -- [manifest.yml](./copilot/pipelines/react-app-pipeline/manifest.yml)を編集してdevelopmentでサービス開始後にユーザが承認した後にproductionにデプロイされるようにする。 +- [manifest.yml](./copilot/pipelines/react-app-pipeline/manifest.yml)を編集して development でサービス開始後にユーザが承認した後に production にデプロイされるようにする。 + +```yaml +requires_approval: true ``` - requires_approval: true -``` -- 先にgithubに設定ファイルをアップロードしてからpipelineをデプロイする + +- 先に github に設定ファイルをアップロードしてから pipeline をデプロイする ```shell git add . @@ -145,22 +169,25 @@ git commit -m "add pipeline" git push copilot pipeline deploy ``` -- ACTION REQUIREDが出るのでURLにアクセスし,pendingになっているpipelineとGitHubを接続する設定を追加する。 -- 一度pipelineをデプロイすると以後,指定したGitHubのブランチにマージされるたびにCode Pipelineを通してデプロイが進むようになる。 -#### CodePipelineにimage scanを追加する -- [./copilot/pipelines/react-app-pipeline/buildspec.yml](./copilot/pipelines/react-app-pipeline/buildspec.yml)を編集してtrivyによるimage scanを追加する。 -``` +- ACTION REQUIRED が出るので URL にアクセスし,pending になっている pipeline と GitHub を接続する設定を追加する。 +- 一度 pipeline をデプロイすると以後,指定した GitHub のブランチにマージされるたびに Code Pipeline を通してデプロイが進むようになる。 + +#### CodePipeline に image scan を追加する + +- [./copilot/pipelines/react-app-pipeline/buildspec.yml](./copilot/pipelines/react-app-pipeline/buildspec.yml)を編集して trivy による image scan を追加する。 + +```yaml install: commands: - - echo "install trivy" - - rpm -ivh https://github.com/aquasecurity/trivy/releases/download/v0.48.0/trivy_0.48.0_Linux-64bit.rpm + - echo "install trivy" + - rpm -ivh https://github.com/aquasecurity/trivy/releases/download/v0.48.0/trivy_0.48.0_Linux-64bit.rpm ``` -``` - # Run trivy scan on the docker images. - - trivy image --vuln-type os --no-progress --format table -o container-scanning-report.txt --severity CRITICAL,HIGH $(jq -r '.Parameters.ContainerImage' ./infrastructure/dev-svc-dev-env.params.json) - - cat container-scanning-report.txt +```yaml +# Run trivy scan on the docker images. +- trivy image --vuln-type os --no-progress --format table -o container-scanning-report.txt --severity CRITICAL,HIGH $(jq -r '.Parameters.ContainerImage' ./infrastructure/dev-svc-dev-env.params.json) +- cat container-scanning-report.txt ```
@@ -168,7 +195,7 @@ install: - ./infrastructureをビルドによって作成しており,この中にECRのイメージが書いてあるのでこれをjqコマンドで抜き出している。 - trivyに関する詳細は[./doc/tools_doc/trivy.md]を確認。 -``` +```shell cat ./infrastructure/dev-svc-dev-env.params.json { "Parameters": { @@ -182,13 +209,14 @@ xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/react-app/dev-svc:xxxxxx-xxxxx-xxxx- ```
-****** +--- ## その他の設定 -- ローカルでのセットアップが必用なのはgit-secretsとpre-commitくらい -- [pre-commitのドキュメント](./doc/tools_doc/pre-commit.md) -- [git-secretsのドキュメント](./doc/tools_doc/git-secret.md) + +- ローカルでのセットアップが必用なのは git-secrets と pre-commit くらい +- [pre-commit のドキュメント](./doc/tools_doc/pre-commit.md) +- [git-secrets のドキュメント](./doc/tools_doc/git-secret.md) ```shell cd devsecops-demo-aws-ecs @@ -197,21 +225,25 @@ pre-commit install git secrets --install git secrets --register-aws # awsのクレデンシャル検知ルールを登録 ``` -- VSCodeのExtensionsもお好みで。Dockerのhadolintはおすすめ。 -- GitHub Actionsがスキャン結果のファイルをアップロードできるように権限をつける。詳細は[semgrepのyaml](./.github/workflows/react-semgrep.yaml)を参照。 -****** +- VSCode の Extensions もお好みで。Docker の hadolint はおすすめ。 + +- GitHub Actions がスキャン結果のファイルをアップロードできるように権限をつける。詳細は[semgrep の yaml](./.github/workflows/react-semgrep.yaml)を参照。 + +--- + +## HOW TO USE + +1. [PREPARING](#preparing)の設定を先にやる。 +2. commit 時には pre-commit と git-secret が作動 +3. push 時には GitHub Actions により SAST(semgrep),UnitTest(jest),Dependency Check(trivy)が実行される。 +4. master ブランチにマージしたり master に push した時に CodePipeline によって AWS へリポジトリがクローンされ,ビルド(image scan を含む),development へのデプロイが始まる。 +5. development で問題がなければ CodePipeline 上で承認し,production へデプロイ +--- -# HOW TO USE -1. [PREPARING](#PREPARING)の設定を先にやる。 -2. commit時にはpre-commitとgit-secretが作動 -3. push時にはGitHub ActionsによりSAST(semgrep),UnitTest(jest),Dependency Check(trivy)が実行される。 -4. masterブランチにマージしたりmasterにpushした時にCodePipelineによってAWSへリポジトリがクローンされ,ビルド(image scanを含む),developmentへのデプロイが始まる。 -5. developmentで問題がなければCodePipeline上で承認し,productionへデプロイ -****** +## Error Log +### nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied) -# MEMO -## nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied) -- [ECSの仕様で非特権ユーザを使用したコンテナでは80番ポートが使えないっぽい](https://repost.aws/questions/QU1bCV9wT4T5iBrrP1c2ISfg/container-cannot-bind-to-port-80-running-as-non-root-user-on-ecs-fargate) --> つまり,localのdockerで80でサービスが起動できてもECSだと権限エラーになる。このため,コンテナで開放するportは8080としている(ALBに対して8080がマッピングされているためブラウザからは80でアクセスできる)。 +- [ECS の仕様で非特権ユーザを使用したコンテナでは 80 番ポートが使えないっぽい](https://repost.aws/questions/QU1bCV9wT4T5iBrrP1c2ISfg/container-cannot-bind-to-port-80-running-as-non-root-user-on-ecs-fargate) --> つまり,local の docker で 80 でサービスが起動できても ECS だと権限エラーになる。このため,コンテナで開放する port は 8080 としている(ALB に対して 8080 がマッピングされているためブラウザからは 80 でアクセスできる)。 diff --git a/doc/pull_request_template.md b/doc/pull_request_template.md index c078f95..7546f82 100644 --- a/doc/pull_request_template.md +++ b/doc/pull_request_template.md @@ -1,5 +1,5 @@ -### Change Description +# Change Description +## Reference -### Reference -- [Issue link]() +- [Issue link](example.com) diff --git a/doc/tools_doc/git-secret.md b/doc/tools_doc/git-secret.md index 774a891..412e193 100644 --- a/doc/tools_doc/git-secret.md +++ b/doc/tools_doc/git-secret.md @@ -1,6 +1,8 @@ # git secrets + - パスワードのシークレットと思われる文字列を検知する。 -- pre-commitを使って実装されているらしい。 +- pre-commit を使って実装されているらしい。 + ## 環境構築 ```shell @@ -12,7 +14,11 @@ ls sudo make install git secrets # 動作確認 ``` + +--- + ## 使用方法 + - プロジェクトに移動して以下を実行 ```shell @@ -21,4 +27,5 @@ git secrets --register-aws # awsのクレデンシャル検知ルールを登録 git secrets --list # 設定を確認 git secrets --scan # スキャン ``` -- また,コミットしようとした際にもscanが実行されており,特定の文字列が検知されるとコミットできなくなる。 + +- また,コミットしようとした際にも scan が実行されており,特定の文字列が検知されるとコミットできなくなる。 diff --git a/doc/tools_doc/hadolint.md b/doc/tools_doc/hadolint.md index bf74972..1695fa5 100644 --- a/doc/tools_doc/hadolint.md +++ b/doc/tools_doc/hadolint.md @@ -1,9 +1,11 @@ -# hadolintの使い方 +# hadolint の使い方 + ## 概要 + > [hadolint github](https://github.com/hadolint/hadolint) -Dockerfileを綺麗にするツール。 -****** +> Dockerfile を綺麗にするツール。 +--- ## install @@ -11,8 +13,8 @@ Dockerfileを綺麗にするツール。 sudo wget -O /bin/hadolint https://github.com/hadolint/hadolint/releases/download/v2.10.0/hadolint-Linux-x86_64 sudo chmod 755 /usr/bin/hadolint ``` -****** +--- ## 実行 @@ -23,8 +25,9 @@ hadolint --trusted-registry grc.io ./myapp/Dockerfile # --trusted-registryに登 ./myapp/Dockerfile:1 DL3026 error: Use only an allowed registry in the FROM image ./myapp/Dockerfile:7 DL3059 info: Multiple consecutive `RUN` instructions. Consider consolidation. ``` -****** +--- ## エラー例 -- /Dockerfile:7 DL3059 info: Multiple consecutive `RUN` instructions. Consider consolidation. --> RUNを一つにまとめたほうがイメージのレイヤーを最小化できる。 + +- /Dockerfile:7 DL3059 info: Multiple consecutive `RUN` instructions. Consider consolidation. --> RUN を一つにまとめたほうがイメージのレイヤーを最小化できる。 diff --git a/doc/tools_doc/pre-commit.md b/doc/tools_doc/pre-commit.md index e6e8ec9..e61065d 100644 --- a/doc/tools_doc/pre-commit.md +++ b/doc/tools_doc/pre-commit.md @@ -1,8 +1,10 @@ # pre-commit + ## 概要 -- gitのコミット時にlinter等を実行させるのに使う。 -****** +- git のコミット時に linter 等を実行させるのに使う。 + +--- ## インストール @@ -11,66 +13,80 @@ pip install pre-commit pre-commit sample-config > .pre-commit-config.yaml pre-commit install ``` + ### インストール時のエラー -- `AttributeError: module 'virtualenv.create.via_global_ref.builtin.cpython.mac_os' has no attribute 'CPython2macOsFramework'`がでている。これはvirtualenvに関連するエラーなのでupgradeしたりしてみる。 -- [pipenvの初期化時に発生するエラー](https://qiita.com/akis1215/items/11c9ca506cac8bcde5d9)を参考に入れ直したら直った。 + +- `AttributeError: module 'virtualenv.create.via_global_ref.builtin.cpython.mac_os' has no attribute 'CPython2macOsFramework'`がでている。これは virtualenv に関連するエラーなので upgrade したりしてみる。 +- [pipenv の初期化時に発生するエラー](https://qiita.com/akis1215/items/11c9ca506cac8bcde5d9)を参考に入れ直したら直った。 ```shell sudo pip3 uninstall virtualenv sudo pip3 install virtualenv ``` -****** +--- ## 使い方 -- [pre-commitを使うサンプル](https://zenn.dev/yiskw713/articles/3c3b4022f3e3f22d276d)を見ながら設定する。 -- **linterからエラーがでるとコミットできないので注意** -- .pre-commit-config.yamlをいじって`pre-commit install`してgit commitすると動作が確認できる。 + +- [pre-commit を使うサンプル](https://zenn.dev/yiskw713/articles/3c3b4022f3e3f22d276d)を見ながら設定する。 +- **linter からエラーがでるとコミットできないので注意** +- .pre-commit-config.yaml をいじって`pre-commit install`して git commit すると動作が確認できる。 - **デフォルトでは変更されたファイルに対してのみしか実行**されないので注意が必用。全体のチェックをしたいなら手動で行える。 ```shell pre-commit run --all-files ``` -- 以下はhadolint(Dockerfileのスキャン)を実行する例 -``` +- 以下は hadolint(Dockerfile のスキャン)を実行する.pre-commit-config.yaml の例 + +```yaml default_stages: [commit] repos: -- repo: https://github.com/pre-commit/pre-commit-hooks + - repo: https://github.com/pre-commit/pre-commit-hooks rev: v3.2.0 hooks: - - id: trailing-whitespace - - id: end-of-file-fixer - - id: check-yaml - - id: check-added-large-files -- repo: https://github.com/hadolint/hadolint + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + - repo: https://github.com/hadolint/hadolint rev: v2.12.0 hooks: - - id: hadolint + - id: hadolint args: [--trusted-registry, grc.io, ./myapp/Dockerfile] ``` ### よく使うオプション -> 詳細は[pre-commit公式ドキュメントを見る](https://pre-commit.com/) -- id: [対応しているhook一覧](https://pre-commit.com/hooks.html)を見るとわかる?コマンド名をいれておけばよさそう? -- rev: latestは指定できないのでメンテが必用そう -- files: スキャン対象を正規表現で絞れる。**スキャン対象のファイルが見つからない時につけても意味ない。**パスはidのargsとかで指定する。 + +> 詳細は[pre-commit 公式ドキュメントを見る](https://pre-commit.com/) + +- id: [対応している hook 一覧](https://pre-commit.com/hooks.html)を見るとわかる?コマンド名をいれておけばよさそう? +- rev: latest は指定できないのでメンテが必用そう +- files: スキャン対象を正規表現で絞れる。**スキャン対象のファイルが見つからない時につけても意味ない。**パスは id の args とかで指定する。 - exclude: スキャン対象から除外するものを指定できる。 -### eslintを使う +### eslint を使う -``` +- .pre-commit-config.yaml + +```yaml default_stages: [commit] repos: -- repo: https://github.com/pre-commit/mirrors-eslint + - repo: https://github.com/pre-commit/mirrors-eslint rev: v8.54.0 # 一番新しいやつにした hooks: - - id: eslint - files: \.[jt]sx?$ # *.js, *.jsx, *.ts and *.tsx + - id: eslint + files: \.[jt]sx?$ # *.js, *.jsx, *.ts and *.tsx +``` + +> [!NOTE] +> node が古すぎると動かないみたいなので新しい node に変更して対応した。 + +```shell +pre-commit run --all-files +ERROR: npm v9.7.1 is known not to run on Node.js v10.19.0. This version of npm supports the following node versions: `^14.17.0 || ^16.13.0 || >=18.0.0`. You can find the latest version at https://nodejs.org/. +ERROR:/usr/local/lib/node_modules/npm/lib/utils/exit-handler.js:19 const hasLoadedNpm = npm?.config.loaded ``` -- nodeが古すぎると動かないみたいなので新しいnodeに変更して対応した。 -> ERROR: npm v9.7.1 is known not to run on Node.js v10.19.0. This version of npm supports the following node versions: `^14.17.0 || ^16.13.0 || >=18.0.0`. You can find the latest version at https://nodejs.org/. -> ERROR:/usr/local/lib/node_modules/npm/lib/utils/exit-handler.js:19 const hasLoadedNpm = npm?.config.loaded ```shell curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash # nvmインストール @@ -85,13 +101,14 @@ node --version pre-commit install pre-commit run -a ``` -****** +--- ## エラー -- mdの最後が## testのような形で終わっており,内容がないとエラーになる -``` +- md の最後が## test のような形で終わっており,内容がないとエラーになる + +```shell Fix End of Files.........................................................Failed - hook id: end-of-file-fixer - exit code: 1 @@ -99,8 +116,9 @@ Fix End of Files.........................................................Failed Fixing todo.md ``` -****** +--- ## Reference -- [対応しているhook一覧](https://pre-commit.com/hooks.html) + +- [対応している hook 一覧](https://pre-commit.com/hooks.html) diff --git a/doc/tools_doc/semgrep.md b/doc/tools_doc/semgrep.md index 2f7c522..912593d 100644 --- a/doc/tools_doc/semgrep.md +++ b/doc/tools_doc/semgrep.md @@ -1,4 +1,5 @@ # semgrep + ## semgrep install ```shell @@ -11,13 +12,15 @@ semgrep ./frontend-app ``` ### VSCode Extensions -- 最初にSign inする必用がある。 -- Ctrl shift pで実行する。 -### Github Actionsでsemgrepを使う。 -- 事前にリポジトリの設定から --> Code and automation --> Actions --> GeneralのWorkflow permissionsをRead and write permissionsに変更しておく必用がある。 +- 最初に Sign in する必用がある。 +- Ctrl shift p で実行する。 -``` +### Github Actions で semgrep を使う + +- 事前にリポジトリの設定から --> Code and automation --> Actions --> General の Workflow permissions を Read and write permissions に変更しておく必用がある。 + +```json name: Semgrep Full Scan on: @@ -56,8 +59,9 @@ jobs: sarif_file: report.sarif category: semgrep ``` -****** +--- ## 参考 + - [semgrep github actions](https://0xdbe.github.io/GitHub-HowToEnableCodeScanningWithSemgrep/) diff --git a/doc/tools_doc/trivy.md b/doc/tools_doc/trivy.md index 0391d2b..57deda4 100644 --- a/doc/tools_doc/trivy.md +++ b/doc/tools_doc/trivy.md @@ -1,5 +1,7 @@ # Tryvy + ## インストール + > [インストール方法](https://aquasecurity.github.io/trivy/v0.18.3/installation/) ```shell @@ -9,35 +11,42 @@ echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo apt-get update sudo apt-get install trivy ``` -****** +--- ## オプション -- --vuln-typeはosとlibraryが選べる。指定しないと両方になる。これは絞らなくても良さそう。 -- --no-progress: 進捗バーを表示しない。CI/CDで出力をシンプルにする。 -- --exit-code 1: スキャンで脆弱性が出た時にステータスコード1を返すためCI/CDツールなどで結果を評価しやすくなる。 + +- --vuln-type は os と library が選べる。指定しないと両方になる。これは絞らなくても良さそう。 +- --no-progress: 進捗バーを表示しない。CI/CD で出力をシンプルにする。 +- --exit-code 1: スキャンで脆弱性が出た時にステータスコード 1 を返すため CI/CD ツールなどで結果を評価しやすくなる。 - --format table: 結果をテーブル形式で表示 - fs: ファイルスキャンモード -- --scanners vuln: 脆弱性スキャンモードを指定。Secrets(デフォルトon)やmisconfig(デフォルトoff),license(デフォルトoff)なども指定できる +- --scanners vuln: 脆弱性スキャンモードを指定。Secrets(デフォルト on)や misconfig(デフォルト off),license(デフォルト off)なども指定できる - --vuln-type library: スキャン対象をライブラリに限定する。 -****** +--- ## 使用したコマンド -> [trivyドキュメント](https://aquasecurity.github.io/trivy/v0.22.0/) -> .trivyignoreファイルにCVE番号などを記述することで抑止できる。 + +> [trivy ドキュメント](https://aquasecurity.github.io/trivy/v0.22.0/) +> .trivyignore ファイルに CVE 番号などを記述することで抑止できる。 + ### イメージスキャン ```shell trivy image --exit-code 1 --vuln-type os --ignorefile .trivyignore --no-progress --format table -o container-scanning-report.txt --severity CRITICAL,HIGH react-app:latest ``` -### package.jsonのスキャン + +### package.json のスキャン ```shell trivy fs --exit-code 1 --scanners vuln --vuln-type library --ignorefile .trivyignore --no-progress --format table -o sca-report.txt --severity CRITICAL,HIGH package.json ``` + > [他のサブコマンドが知りたくなったらここ](https://aquasecurity.github.io/trivy/v0.22.0/getting-started/cli/) -### sbom形式で出力する + +### sbom 形式で出力する + #### ライブラリの脆弱性を調べる(package.json) ```shell @@ -47,12 +56,13 @@ vim package-lock.json # 任意のバージョンに書き換え trivy fs . --format cyclonedx --output test.json # sbom形式で出力 trivy sbom test.json # sbomを解釈 ``` -#### docker imageのスキャン -- Docker imageで使っているライブラリの脆弱性を探す。 -- Dockerfileを用意する +#### docker image のスキャン -``` +- Docker image で使っているライブラリの脆弱性を探す。 +- Dockerfile を用意する + +```shell FROM registry.access.redhad.com/ubi8/ubi:8.2 RUN dnf update -y @@ -70,11 +80,12 @@ sudo docker buildt -t testimage . sudo trivy image testimage --format cyclonedx --output test.json trivy sbom test.json ``` -****** +--- ## エラー -- imageスキャンでコンテナを実行していない(docker container psがない) + +- image スキャンでコンテナを実行していない(docker container ps がない) ```shell 2023-12-05T22:31:00.272+0900 FATAL image scan error: scan error: unable to initialize a scanner: unable to initialize a docker scanner: 4 errors occurred: @@ -83,8 +94,9 @@ trivy sbom test.json * unable to initialize Podman client: no podman socket found: stat podman/podman.sock: no such file or directory * GET https://index.docker.io/v2/library/react/manifests/latest: UNAUTHORIZED: authentication required; [map[Action:pull Class: Name:library/react Type:repository]] ``` -****** +--- ## Reference -- [CodeBuildでTrivyを実行](https://tukunen13.hatenablog.jp/entry/2021/12/20/000000) + +- [CodeBuild で Trivy を実行](https://tukunen13.hatenablog.jp/entry/2021/12/20/000000) diff --git a/pre-commit-test-local.sh b/pre-commit-test-local.sh new file mode 100644 index 0000000..331311d --- /dev/null +++ b/pre-commit-test-local.sh @@ -0,0 +1,3 @@ +#!/bin/bash +pre-commit install +pre-commit run -a diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index a11777cc471a4344702741ab1c8a588998b1311a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@