mcpField
I
implementing-patch-management-workflow

implementing-patch-management-workflow

github.com/mukul975セキュリティ35.2k48 回インストール8 週間前に更新
リポジトリ

implementing-patch-management-workflow について

セキュリティと IT 運用チーム向けに、組織のパッチ管理ワークフローを設計するスキルです。リスク評価、テスト、承認、段階的な展開、検証、レポート作成を扱います。

主な機能

  1. 01リスクに基づくパッチ評価と優先順位付け
  2. 02本番環境外での更新テスト
  3. 03段階的なリング展開
  4. 04ロールバック計画と変更承認の調整
  5. 05スキャンによる検証と報告

活用シーン

  1. 01コンプライアンスに沿ったパッチ手順の整備
  2. 02本番環境へのセキュリティ更新の段階的な展開
  3. 03インストール確認と回帰問題の検査
  4. 04適用できないシステムの例外管理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill implementing-patch-management-workflow

インストール後、Claude Code で/implementing-patch-management-workflowを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.py

詳細

パッチ管理ワークフローの実装

概要

パッチ管理とは、組織のIT基盤全体の脆弱性を修復するために、ソフトウェアの更新を体系的に特定、テスト、展開、検証するプロセスです。効果的なパッチ管理ワークフローは、構造化されたテスト、承認ゲート、段階的なロールアウトを通じて、運用上の中断を最小限に抑えながら攻撃対象領域を縮小します。

使用するタイミング

  • 環境でパッチ管理ワークフロー機能を展開または構成するとき
  • コンプライアンス要件に沿ったセキュリティ統制を確立するとき
  • この領域のセキュリティアーキテクチャを構築または改善するとき
  • この実装を必要とするセキュリティ評価を実施するとき

前提条件

  • パッチ未適用を特定する脆弱性スキャンの結果
  • パッチ管理ツール(WSUS、SCCM/MECM、Ansible、Intune、Jamf)
  • 本番環境を模倣したテスト環境
  • 変更管理プロセス(ITILまたは同等のもの)
  • OSおよびアプリケーションのバージョンを含む資産インベントリ

中核となる概念

パッチのライフサイクルフェーズ
  1. 検出: ベンダーと脆弱性スキャンから利用可能なパッチを特定する
  2. 評価: パッチの適用可否とリスクを評価する
  3. 優先順位付け: 深刻度、悪用可能性、資産の重要度に基づいてパッチをランク付けする
  4. テスト: 非本番環境でパッチを検証する
  5. 承認: 変更諮問委員会(CAB)によるレビューと承認
  6. 展開: 本番システムへの段階的なロールアウト
  7. 検証: 正常にインストールされ、回帰がないことを確認する
  8. 報告: コンプライアンス指標と例外事項を文書化する
パッチのカテゴリ
  • セキュリティパッチ: CVEおよびセキュリティ脆弱性に対処する
  • 重要な更新: 安定性に影響する非セキュリティのバグ修正
  • サービスパック: 累積更新プログラムの集合
  • 機能更新: 新機能(Windowsの機能更新など)
  • ファームウェア更新: BIOS/UEFI、NIC、ストレージコントローラーのファームウェア
  • サードパーティパッチ: Adobe、Java、Chrome、Firefoxなど
展開リング(段階的ロールアウト)
リング環境フリートの割合ソーク時間目的
リング 0ラボ/テストN/A24-48時間機能検証
リング 1IT アーリーアダプター5%48-72時間実環境でのパイロット
リング 2業務パイロット15%5-7日幅広い互換性の確認
リング 3一般展開50%7-14日本格的なロールアウト
リング 4ミッションクリティカル30%リング 3 の後最終展開

ワークフロー

ステップ 1: パッチソースの構成
# WSUS (Windows Server Update Services)
# Configure WSUS server to sync with Microsoft Update
# Via PowerShell on WSUS server:
Install-WindowsFeature -Name UpdateServices -IncludeManagementTools
& "C:\Program Files\Update Services\Tools\WsusUtil.exe" postinstall CONTENT_DIR=D:\WSUS

# Configure GPO for WSUS clients
# Computer Configuration > Administrative Templates > Windows Components > Windows Update
# Specify intranet Microsoft update service location: http://wsus-server:8530
# Ansible: Configure patch repositories for Linux
# roles/patch-management/tasks/configure_repos.yml
---
- name: Configure RHEL patch repository
  yum_repository:
    name: rhel-patches
    description: RHEL Security Patches
    baseurl: https://satellite.corp.local/pulp/repos/patches
    gpgcheck: yes
    gpgkey: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
    enabled: yes

- name: Configure Ubuntu patch sources
  apt_repository:
    repo: "deb https://apt-mirror.corp.local/ubuntu {{ ansible_distribution_release }}-security main"
    state: present
  when: ansible_os_family == "Debian"
ステップ 2: 自動パッチ評価
# patch_assessment.py - Correlate vulnerability scans with available patches
import subprocess
import platform
import json

def get_windows_pending_patches():
    """Query Windows Update for pending patches via PowerShell."""
    ps_cmd = """
    $Session = New-Object -ComObject Microsoft.Update.Session
    $Searcher = $Session.CreateUpdateSearcher()
    $Results = $Searcher.Search("IsInstalled=0 AND Type='Software'")
    $Results.Updates | ForEach-Object {
        [PSCustomObject]@{
            Title = $_.Title
            KB = ($_.KBArticleIDs -join ',')
            Severity = $_.MsrcSeverity
            Size = [math]::Round($_.MaxDownloadSize / 1MB, 2)
            Published = $_.LastDeploymentChangeTime.ToString('yyyy-MM-dd')
            CVE = ($_.CveIDs -join ',')
        }
    } | ConvertTo-Json
    """
    result = subprocess.run(
        ["powershell", "-Command", ps_cmd],
        capture_output=True, text=True, timeout=120
    )
    return json.loads(result.stdout) if result.stdout.strip() else []

def get_linux_pending_patches():
    """Query package manager for available security updates."""
    if platform.system() != "Linux":
        return []

    # Try apt (Debian/Ubuntu)
    try:
        result = subprocess.run(
            ["apt", "list", "--upgradable"],
            capture_output=True, text=True, timeout=60
        )
        packages = []
        for line in result.stdout.strip().split("\n")[1:]:
            if line:
                parts = line.split("/")
                packages.append({
                    "package": parts[0],
                    "available_version": parts[1].split()[0] if len(parts) > 1 else "",
                    "source": "apt"
                })
        return packages
    except FileNotFoundError:
        pass

    # Try yum/dnf (RHEL/CentOS)
    try:
        result = subprocess.run(
            ["dnf", "updateinfo", "list", "security", "--available"],
            capture_output=True, text=True, timeout=60
        )
        packages = []
        for line in result.stdout.strip().split("\n"):
            parts = line.split()
            if len(parts) >= 3:
                packages.append({
                    "advisory": parts[0],
                    "severity": parts[1],
                    "package": parts[2],
                    "source": "dnf"
                })
        return packages
    except FileNotFoundError:
        return []
ステップ 3: パッチテストの自動化
# Ansible playbook: test_patches.yml
---
- name: Test Patches in Lab Environment
  hosts: test_servers
  become: yes
  vars:
    rollback_snapshot: "pre-patch-{{ ansible_date_time.date }}"

  tasks:
    - name: Create VM snapshot before patching
      community.vmware.vmware_guest_snapshot:
        hostname: "{{ vcenter_host }}"
        username: "{{ vcenter_user }}"
        password: "{{ vcenter_pass }}"
        datacenter: "{{ datacenter }}"
        name: "{{ inventory_hostname }}"
        snapshot_name: "{{ rollback_snapshot }}"
        state: present
      delegate_to: localhost

    - name: Apply security patches (RHEL/CentOS)
      dnf:
        name: "*"
        state: latest
        security: yes
        update_cache: yes
      when: ansible_os_family == "RedHat"
      register: patch_result

    - name: Apply security patches (Ubuntu/Debian)
      apt:
        upgrade: dist
        update_cache: yes
        only_upgrade: yes
      when: ansible_os_family == "Debian"
      register: patch_result

    - name: Reboot if required
      reboot:
        reboot_timeout: 600
        msg: "Rebooting for patch installation"
      when: patch_result.changed

    - name: Run post-patch validation
      include_tasks: validate_services.yml

    - name: Report patch results
      debug:
        msg: "Patching {{ 'succeeded' if patch_result.changed else 'no updates' }} on {{ inventory_hostname }}"
ステップ 4: 本番環境への展開
# deploy_patches.yml - Phased production rollout
---
- name: Ring 1 - IT Early Adopters
  hosts: ring1_hosts
  serial: "25%"
  max_fail_percentage: 10
  become: yes
  tasks:
    - import_tasks: apply_patches.yml
    - import_tasks: validate_services.yml
    - name: Wait for soak period
      pause:
        hours: 48
      run_once: true

- name: Ring 2 - Business Pilot
  hosts: ring2_hosts
  serial: "20%"
  max_fail_percentage: 5
  become: yes
  tasks:
    - import_tasks: apply_patches.yml
    - import_tasks: validate_services.yml

- name: Ring 3 - General Deployment
  hosts: ring3_hosts
  serial: "10%"
  max_fail_percentage: 3
  become: yes
  tasks:
    - import_tasks: apply_patches.yml
    - import_tasks: validate_services.yml
ステップ 5: 検証と報告

パッチ適用後の脆弱性スキャンを実行して、パッチのインストールを確認します:

# Trigger post-patch verification scan
curl -k -X POST "https://nessus:8834/scans/$VERIFY_SCAN_ID/launch" \
  -H "X-Cookie: token=$TOKEN"

# Compare pre-patch and post-patch results
# Expecting reduction in vulnerabilities matching deployed patches

パッチ管理のSLA

深刻度SLA(インターネット公開)SLA(社内)SLA(エアギャップ)
重大(CVSS 9以上)48時間7日14日
高(CVSS 7-8.9)7日14日30日
中(CVSS 4-6.9)30日30日60日
低(CVSS 0.1-3.9)90日90日90日

ベストプラクティス

  1. パッチの適用範囲を完全に保つため、最新の資産インベントリを維持する
  2. 展開前に、すべてのパッチを非本番環境でテストする
  3. 自動ロールバック機能を備えた段階的ロールアウトを使用する
  4. パッチの適用時間帯を変更管理プロセスと調整する
  5. パッチのコンプライアンス指標を追跡し、経営層に報告する
  6. 手作業と人為的ミスを減らすため、可能な限り自動化する
  7. パッチを適用できないシステムについて、例外文書を維持する
  8. OSのパッチだけでなく、サードパーティ製アプリケーションのパッチ適用も含める

よくある落とし穴

  • オペレーティングシステムだけにパッチを適用し、サードパーティ製アプリケーションを無視する
  • パッチによってサービスが中断した場合のロールバック計画がない
  • リスクに基づく優先順位付けを行わず、すべてのパッチを同じ緊急度で扱う
  • 手作業によるパッチ適用プロセスは拡張できない
  • インストールが正常に完了したことを確認するパッチ適用後の検証がない
  • ファームウェアおよび BIOS の更新を無視する

関連スキル

  • prioritizing-vulnerabilities-with-cvss-scoring
  • implementing-vulnerability-remediation-sla
  • implementing-continuous-vulnerability-monitoring

コメント