🛡️

セキュリティチェック機能の実装とCIパイプラインへの統合(開発日記 No.088)

に公開

関連リンク

はじめに

昨日はCIパイプラインの改善に取り組みました。今日は、前回の開発日記から継続して、Issue #2で挙げられているセキュリティチェック機能の実装を進めていきます。よりセキュアな開発環境を構築するために、自動化されたチェックを組み込んでいきます。

背景と目的

開発を進める上で、セキュリティは非常に重要な要素です。脆弱性のあるコードや依存関係を使用すると、予期せぬ問題が発生する可能性があります。そこで、Dependabot、Bandit、pip-licensesといったツールを活用し、セキュリティリスクを早期に発見し、対応できる体制を整えることを目指します。また、GitHubのシークレットスキャンを有効化することで、意図せずリポジトリにコミットされた認証情報などを検出し、情報漏洩のリスクを低減します。

検討内容

まず、どのようなセキュリティチェックを導入するかを検討しました。

  1. 依存関係の脆弱性スキャン: Dependabotを使用し、依存関係に脆弱性がないかを定期的にチェックします。
  2. 静的セキュリティテスト: Banditを使用し、Pythonコードのセキュリティ上の問題点を検出します。
  3. ライセンスチェック: pip-licensesを使用し、依存関係のライセンスがプロジェクトのライセンスポリシーに適合しているかを確認します。
  4. シークレットスキャン: GitHubのシークレットスキャンを有効化し、リポジトリにコミットされたシークレット情報を検出します。

これらのチェックをCIパイプラインに組み込むことで、開発者がコードをコミットするたびに自動的にセキュリティチェックが実行されるようにします。

実装内容

以下に、実際に行った作業内容を具体的に記述します。

  1. Dependabotの設定:
    .github/dependabot.yml ファイルを作成し、以下の設定を行いました。

    version: 2
    updates:
      - package-ecosystem: "pip"
        directory: "/"
        schedule:
          interval: "weekly"
        open-pull-requests-limit: 10
        ignore:
          - dependency-name: "example-package"
            versions: [">=1.0.0, <1.1.0"]
    

    この設定により、Dependabotは毎週依存関係をチェックし、脆弱性が見つかった場合は自動的にIssueを作成します。

  2. Banditによる静的セキュリティテスト:
    Banditをインストールし、.bandit設定ファイルを作成しました。

    pip install bandit
    

    .banditファイルは、Banditの設定をカスタマイズするために使用します。例えば、特定のテストを除外したり、重要度を設定したりできます。

    次に、CIパイプラインにBanditの実行を追加しました。

    - name: Run Bandit
      run: bandit -c .bandit -r .
    

    このステップにより、CIパイプラインでBanditが実行され、セキュリティ上の問題が検出された場合はパイプラインが失敗します。

  3. 依存関係のライセンスチェック:
    pip-licensesをインストールし、ライセンスチェックスクリプトを実装しました。

    pip install pip-licenses
    

    ライセンスチェックスクリプトは、依存関係のライセンス情報を収集し、プロジェクトのライセンスポリシーに違反するライセンスがないかを確認します。

    CIパイプラインにライセンスチェックを追加しました。

    - name: Run License Check
      run: pip-licenses --format=plain-text --allow-商用利用可能なライセンス名
    

    --allow-商用利用可能なライセンス名 オプションで、許可するライセンスを指定します。

  4. シークレットスキャン:
    GitHubのリポジトリ設定から、シークレットスキャンを有効化しました。これにより、リポジトリにコミットされたシークレット情報が自動的に検出されます。

技術的なポイント

  • Dependabotの設定: dependabot.yml ファイルで、チェックの頻度や無視する依存関係などを細かく設定できます。
  • Banditの設定: .bandit ファイルで、テストの対象や重要度などをカスタマイズすることで、より効率的なセキュリティテストを実現できます。
  • ライセンスチェック: pip-licenses--format オプションを使用することで、様々な形式でライセンス情報を出力できます。また、 --allow オプションを使用することで、許可するライセンスを柔軟に設定できます。

所感

今回の開発では、セキュリティチェックの自動化に焦点を当てました。Dependabot、Bandit、pip-licensesといったツールをCIパイプラインに組み込むことで、開発者が意識しなくてもセキュリティリスクを早期に発見できる体制を構築できたと思います。特に、Banditの導入は、これまで見過ごしていたセキュリティ上の問題点をいくつか発見するきっかけとなり、非常に有益でした。設定ファイルの記述やCIパイプラインへの統合など、最初は少し手間取りましたが、自動化されたセキュリティチェックの重要性を改めて認識しました。今後は、これらのツールをより深く理解し、設定を最適化することで、さらにセキュリティレベルを高めていきたいと考えています。

今後の課題

  • Banditの設定をさらに詳細に検討し、プロジェクトに最適なルールを設定する。
  • ライセンスチェックのスクリプトを改善し、より柔軟なライセンスポリシーに対応できるようにする。
  • シークレットスキャンの結果を監視し、検出されたシークレット情報の適切な処理を行う。
  • これらのセキュリティチェックの結果を開発チームに共有し、セキュリティ意識の向上を図る。

まとめ

今回の開発では、Dependabot、Bandit、pip-licensesといったツールを活用し、セキュリティチェック機能を実装しました。これらのツールをCIパイプラインに統合することで、開発プロセス全体でセキュリティを確保できる体制を構築しました。今後は、これらのツールをさらに活用し、よりセキュアな開発環境を構築していきたいと考えています。

GitHubで編集を提案

Discussion