OS ポリシーと OS ポリシーの割り当て

OS ポリシーは、パッケージ、リポジトリ、ファイルなどの OS リソースや、スクリプトで定義されたカスタム リソースの宣言型構成を含むファイルです。詳細については、OSPolicy のリソース定義をご覧ください。

OS ポリシーの割り当ては、VM Manager が OS ポリシーを VM に適用するために使用する API リソースです。詳細については、OSPolicyAssignment のリソース定義をご覧ください。

OS ポリシー

OS ポリシーは、次の 3 つのセクションを持つ JSON または YAML ファイルです。

  • モード。ポリシーの動作。次の 2 つのモードがあります。

    • Validation: このモードでは、リソースが選択された状態かどうかをチェックします。アクションは実行されません。
    • Enforcement: このモードでは、リソースが選択された状態かどうかをチェックし、選択された状態でなければ、その状態にするために必要なアクションを実行します。

    どちらのモードでも、VM Manager は OS ポリシーとその関連リソースのコンプライアンスを報告します。

  • リソース グループ。関連するリソース仕様が適用されるオペレーティング システムの名前とバージョン。たとえば、1 つのポリシーを定義して、エージェントを異なる OS ディストリビューションとバージョンにインストールまたはデプロイできます。

  • リソース。VM が選択された構成を実現するために必要な仕様。各リソース グループに指定できるリソース ID は最大 10 個です。サポートされるリソースタイプは次のとおりです。

    • pkg: Linux パッケージと Windows パッケージのインストールまたは削除に使用されます。
    • repository: インストール元のリポジトリ ソフトウェア パッケージを指定するために使用されます。
    • exec: アドホック シェル(/bin/sh)または PowerShell スクリプトを実行するために使用します。
    • file: システム上のファイルを管理する場合に使用します。

OS ポリシーの例

以下に、OS ポリシーの作成例を示します。これらの OS ポリシーは、OS ポリシーの割り当てを作成するときに Google Cloud コンソールにアップロードできます。

  • 例 1: パッケージをインストールする。
  • 例 2: スクリプトを実行する。
  • 例 3: ダウンロード リポジトリを指定して、そのリポジトリからパッケージをインストールする。
  • 例 4: Container-Optimized OS(COS)を実行している VM で CIS ベンチマーク スキャンを構成する。CIS ベンチマーク スキャンに OS ポリシーを使用する方法については、CIS コンプライアンス ステータスの有効化と確認を自動化するをご覧ください。

環境に適用可能な OS ポリシーのサンプルの完全なリストについては、GitHub の GoogleCloudPlatform/osconfig リポジトリをご覧ください。

例 1

Cloud Storage バケットからダウンロードした Windows MSI をインストールする OS ポリシーを作成します。

# An OS policy to install a Windows MSI downloaded from a Google Cloud Storage bucket.
id: install-msi-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      - id: install-msi
        pkg:
          desiredState: INSTALLED
          msi:
            source:
              gcs:
                bucket: my-bucket
                object: my-app.msi
                generation: 1619136883923956

例 2

Linux VM 上で Apache ウェブサーバーが実行されているかどうかを確認する OS ポリシーを作成します。

# An OS policy that ensures Apache web server is running on Linux OSes.
id: apache-always-up-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: ensure-apache-is-up
      exec:
        validate:
          interpreter: SHELL
          # If Apache web server is already running, return an exit code 100 to indicate
          # that exec resource is already in desired state. In this scenario,
          # the `enforce` step will not be run.
          # Otherwise return an exit code of 101 to indicate that exec resource is not in
          # desired state. In this scenario, the `enforce` step will be run.
          script: if systemctl is-active --quiet httpd; then exit 100; else exit 101; fi
        enforce:
          interpreter: SHELL
          # Start Apache web server and return an exit code of 100 to indicate that the
          # resource is now in its desired state.
          script: systemctl start httpd && exit 100

例 3

Google Cloud Observability エージェントを CentOS VM にインストールする OS ポリシーを作成します。

id: cloudops-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      - id: add-repo
        repository:
          yum:
            id: google-cloud-ops-agent
            displayName: Google Cloud Ops Agent Repository
            baseUrl: https://packages.cloud.google.com/yum/repos/google-cloud-ops-agent-el7-x86_64-all
            gpgKeys:
              - https://packages.cloud.google.com/yum/doc/yum-key.gpg
              - https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
      - id: install-pkg
        pkg:
          desiredState: INSTALLED
          yum:
            name: google-cloud-ops-agent
      - id: exec-script
        exec:
          validate:
            script: |-
              if [[ $(rpm --query --queryformat '%{VERSION}
              ' google-cloud-ops-agent) == '1.0.2' ]]; then exit 100; else exit 101; fi
            interpreter: SHELL
          enforce:
            script:
              sudo yum remove -y google-cloud-ops-agent || true; sudo yum install
              -y 'google-cloud-ops-agent-1.0.2*' && exit 100
            interpreter: SHELL
      - id: ensure-agent-running
        exec:
          validate:
            script:
              if (ps aux | grep 'opt[/].*google-cloud-ops-agent.*bin/'); then exit
              100; else exit 101; fi
            interpreter: SHELL
          enforce:
            script: sudo systemctl start google-cloud-ops-agent.target && exit 100
            interpreter: SHELL

例 4

CIS レベル 1 の定期的なスキャンを 1 日 1 回のデフォルトの間隔で構成します。

# An OS policy to check CIS level 1 compliance once a day.
id: ensure-cis-level1-compliance-once-a-day-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: ensure-cis-level1-compliance-once-a-day
      exec:
        validate:
          interpreter: SHELL
          # If cis-compliance-scanner.service is active, return an exit code
          # 100 to indicate that the instance is in compliant state.
          # Otherwise, return an exit code of 101 to run `enforce` step.
          script: |-
            is_active=$(systemctl is-active cis-compliance-scanner.timer)
            result=$(systemctl show -p Result --value cis-compliance-scanner.service)

            if [ "$is_active" == "active" ] && [ "$result" == "success" ]; then
              exit 100;
            else
              exit 101;
            fi
        enforce:
          interpreter: SHELL
          # COS 97 images are by-default CIS Level 1 compliant and there is no
          # additional configuration needed. However, if certain changes
          # cause non-compliance because of the workload on the instance, this
          # section can be used to automate to make fixes. For example, the
          # workload might generate a file that does not comply with the
          # recommended file permissions.
          # Return an exit code of 100 to indicate that the desired changes
          # successfully applied.
          script: |-
            # optional <your code>
            # Check the compliance of the instance once a day.
            systemctl start cis-compliance-scanner.timer && exit 100

OS ポリシーの割り当て

OS ポリシーの割り当ては、次のセクションから構成されています。

  • OS ポリシー。VM に適用する 1 つ以上の OS ポリシー。ポリシーをダウンロードまたは作成する方法については、OS ポリシーをご覧ください。

  • ターゲット VM。ポリシーの適用先となる単一ゾーン内の VM のセット。ゾーン内で OS ファミリーと対象 / 除外ラベルを使用して、VM を制限することもできます。次のオプションの組み合わせを選択できます。

    • OS ファミリー: OS ポリシーが適用されるターゲット オペレーティング システムを指定します。OS ポリシーをサポートするオペレーティング システムとバージョンの完全なリストについては、オペレーティング システムの詳細をご覧ください。
    • 対象セット: VM またはシステムのラベルに基づいて OS ポリシーが適用される VM を指定します。
    • 除外セット: VM またはシステムのラベルに基づいて OS ポリシーが無視する VM を指定します。

    システムの命名規則に違反していなければ、対象と除外の両方のラベルセットで単一文字列のラベルを使用できます。ただし、ほとんどのラベルは key:value ペアで指定します。ラベルの詳細については、リソースのラベル付けをご覧ください。

    たとえば、次のように指定すると、テスト環境のすべての Ubuntu VM を対象にし、Google Kubernetes Engine を実行している VM を除外できます。

    • OS ファミリー: ubuntu
    • 対象: env:testenv:staging
    • 除外: goog-gke-node
  • ロールアウト率。OS ポリシーを VM に適用するペースを指定します。OS ポリシーを段階的にロールアウトすると、システムの健全性を追跡し、更新によって環境内に問題が発生した場合に適切な修正を行うことができます。ロールアウト計画には次の要素が含まれます。

    • ウェーブのサイズ(停止予算): 一度にロールアウトが可能な VM の固定数または割合。つまり、ロールアウトの時点で、指定した数の VM のみがターゲットに設定されます。
    • 待機時間: サービスが VM にポリシーを適用してから、VM が停止しきい値から削除されるまでの時間。たとえば、待機時間を 15 分に設定した場合、VM にポリシーが適用された後、VM が停止しきい値から除外されてロールアウト処理が開始するまでに 15 分待機しなければなりません。この待機時間により、ロールアウトの速度を調整するだけでなく、ロールアウトの潜在的な問題を早期に検出し、解決できます。ロールアウトのステータスをモニタリングするのに十分な時間を選択してください。

    たとえば、10 個のターゲットを設定し、停止しきい値を 20%、ベーキング タイムを 15 分に設定した場合、任意の時間内に 2 つの VM のみを更新するようにスケジューリングされます。各 VM が更新されてから 15 分が経過すると、VM の停止しきい値が解除され、別の VM がロールアウトに追加されます。

    ロールアウトの詳細については、ロールアウトをご覧ください。

OS ポリシーの割り当ての例

以下に、OS ポリシーの割り当ての作成例を示します。これらの例を使用すると、Google Cloud CLI または OS Config API から OS ポリシーの割り当てを作成できます。

  • 例 1: パッケージをインストールする。
  • 例 2: スクリプトを実行する。
  • 例 3: ダウンロード リポジトリを指定して、そのリポジトリからパッケージをインストールする。

環境に適用可能な OS ポリシーの割り当てのサンプルリストについては、GitHub の GoogleCloudPlatform/osconfig リポジトリをご覧ください。

例 1

Cloud Storage バケットからダウンロードした Windows MSI をインストールする OS ポリシーの割り当てを作成します。

# An OS policy assignment to install a Windows MSI downloaded from a Google Cloud Storage bucket
# on all VMs running Windows Server OS.
osPolicies:
  - id: install-msi-policy
    mode: ENFORCEMENT
    resourceGroups:
      - resources:
          - id: install-msi
            pkg:
              desiredState: INSTALLED
              msi:
                source:
                  gcs:
                    bucket: my-bucket
                    object: my-app.msi
                    generation: 1619136883923956
instanceFilter:
  inventories:
    - osShortName: windows
rollout:
  disruptionBudget:
    fixed: 10
  minWaitDuration: 300s

例 2

すべての Linux VM 上で Apache ウェブサーバーが実行されているかどうかを確認する OS ポリシーの割り当てを作成します。

# An OS policy assignment that ensures Apache web server is running on Linux OSes.
# The assignment is applied only to those VMs that have the label `type:webserver` assigned to them.
osPolicies:
  - id: apache-always-up-policy
    mode: ENFORCEMENT
    resourceGroups:
      - resources:
          id: ensure-apache-is-up
          exec:
            validate:
              interpreter: SHELL
              # If Apache web server is already running, return an exit code 100 to indicate
              # that exec resource is already in desired state. In this scenario,
              # the `enforce` step will not be run.
              # Otherwise return an exit code of 101 to indicate that exec resource is not in
              # desired state. In this scenario, the `enforce` step will be run.
              script: if systemctl is-active --quiet httpd; then exit 100; else exit 101; fi
            enforce:
              interpreter: SHELL
              # Start Apache web server and return an exit code of 100 to indicate that the
              # resource is now in its desired state.
              script: systemctl start httpd && exit 100
instanceFilter:
  inclusionLabels:
    - labels:
        type: webserver
rollout:
  disruptionBudget:
    fixed: 10
  minWaitDuration: 300s

例 3

Google Cloud Observability エージェントを CentOS VM にインストールする OS ポリシーの割り当てを作成します。

# An OS policy assignment that ensures google-cloud-ops-agent is running on all Centos VMs in the project
osPolicies:
  - id: cloudops-policy
    mode: ENFORCEMENT
    resourceGroups:
        resources:
          - id: add-repo
            repository:
              yum:
                id: google-cloud-ops-agent
                displayName: Google Cloud Ops Agent Repository
                baseUrl: https://packages.cloud.google.com/yum/repos/google-cloud-ops-agent-el7-x86_64-all
                gpgKeys:
                  - https://packages.cloud.google.com/yum/doc/yum-key.gpg
                  - https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
          - id: install-pkg
            pkg:
              desiredState: INSTALLED
              yum:
                name: google-cloud-ops-agent
          - id: exec-script
            exec:
              validate:
                script: |-
                  if [[ $(rpm --query --queryformat '%{VERSION}
                  ' google-cloud-ops-agent) == '1.0.2' ]]; then exit 100; else exit 101; fi
                interpreter: SHELL
              enforce:
                script:
                  sudo yum remove -y google-cloud-ops-agent || true; sudo yum install
                  -y 'google-cloud-ops-agent-1.0.2*' && exit 100
                interpreter: SHELL
          - id: ensure-agent-running
            exec:
              validate:
                script:
                  if (ps aux | grep 'opt[/].*google-cloud-ops-agent.*bin/'); then exit
                  100; else exit 101; fi
                interpreter: SHELL
              enforce:
                script: sudo systemctl start google-cloud-ops-agent.target && exit 100
                interpreter: SHELL
instanceFilter:
  inventories:
    - osShortName: centos
rollout:
  disruptionBudget:
    fixed: 10
  minWaitDuration: 300s

次のステップ