コンテンツにスキップ

Kubernetes への Sophos Linux Sensor のインストール

概要

Sophos Linux Sensor (SLS) は Linux ホストにインストールされる軽量エージェントで、ホストからイベントを収集して、警告生成や自動対応を実施します。SLS は、既存のログおよび警告インフラと統合します。SLS は、パブリッククラウドやプライベートクラウド、コンテナや VM、オンプレミス版ベアメタルなど、Linux のあるあらゆる環境、およびさまざまなカーネルバージョンおよび Linux ディストリビューションに導入できます。

要件

Sensor はルート PID 名前空間で実行する必要があります。ほとんどの環境では、kubelet とノードのコンテナランタイムはルート PID 名前空間で実行されるため、hostPID: true を指定すれば十分です。minikube や kind などの非運用環境では、kubelet はルート PID 名前空間ではなくコンテナ内で実行されることがあります。

インストール

これらの手順は、Kubernetes を介してセンサー コンテナイ メージの導入の概要を説明している例です。ここでのガイダンスを使用して、選択したツールを使用して導入をカスタマイズできます。

Kubernetes に SLS をインストールするには、次の手順を実行します。

  1. 次のコマンドを実行して、kubectl が対象のインストールクラスタを指定するように設定されていることを確認します。

    kubectl config current-context
    
  2. 使用する予定のマシンで、環境変数を設定します。次のコマンドを実行し、<TOKEN> をソフォスのパッケージリポジトリ API キーに置き換えます。

    export SLS_TOKEN=$'<TOKEN>'
    
  3. 新しい Kubernetes Secret を作成します。SLS は、この Secret を使用して kubelet を認証し、kubelet がソフォスのプライベート コンテナ レジストリからダウンロードできるようにします。

    kubectl create secret docker-registry sophos-registry-secret --docker-server=registry.sophosupd.com --docker-username=$SLS_TOKEN --docker-password=$SLS_TOKEN
    

    次のコマンドを実行して、新しい Secret を表示します。

    kubectl get secrets
    

    アクセスは、Kubernetes の docker-registry sophos-registry-secret を参照するソフォスのマニフェストのみに許可されます。

  4. SLS およびデフォルトのコンテンツイメージに使用可能なタグを取得します。

    curl -u {LINUX_REPO_API_KEY}:{LINUX_REPO_API_KEY} -X GET https://registry.sophosupd.com/v2/release/sophos-linux-sensor/tags/list |jq '.tags'
    
    curl -u {LINUX_REPO_API_KEY}:{LINUX_REPO_API_KEY} -X GET https://registry.sophosupd.com/v2/release/sophos-linux-content/tags/list |jq '.tags'
    

    ヒント

    sophos-linux-sensorsophos-linux-content の両方の最新のバージョンタグをメモしておきます。これらのタグは、次の手順のほとんどで必要になります。不明な場合は、最新の SLS バージョンをリリースノートで確認することができます。リリースノートを参照してください。

  5. ソフォスから提供された次のマニフェストの内容を kubernetes-manifest.yaml として保存します。場所はどこでもかまいません。

    <CONTENT_TAG> を最新のコンテンツバージョンタグに、<SENSOR_TAG> を最新のセンサーバージョンタグに、{tenant-id} をファイル内の固有の Sophos Central ID に置き換える必要があります。

    # This sensor does not communicate with a Console.
    # Its alerts are only configured to go to stdout, and its configuration comes from Sophos content mounted into /var/lib/sophos/content
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: sophos-linux-sensor
      labels:
        app: sophos-linux-sensor
    spec:
      selector:
        matchLabels:
          app: sophos-linux-sensor
      template:
        metadata:
          labels:
            app: sophos-linux-sensor
        spec:
          hostPID: true
          securityContext:
            runAsUser: 0
          imagePullSecrets:
          -   name: sophos-registry-secret
          initContainers:
          -   name: sophos-linux-content
            image: "registry.sophosupd.com/release/sophos-linux-content:<CONTENT_TAG>"
            imagePullPolicy: IfNotPresent
            volumeMounts:
            -   mountPath: /var/lib/sophos/content
              name: sophos-linux-content
          containers:
          -   name: sophos-linux-sensor
            image: "registry.sophosupd.com/release/sophos-linux-sensor:<SENSOR_TAG>"
            imagePullPolicy: IfNotPresent
            env:
            -   name: SENSOR_MONITOR_PORT
              value: "9010"
            livenessProbe:
              httpGet:
                path: /healthz
                port: 9010
              initialDelaySeconds: 5
            readinessProbe:
              httpGet:
                path: /healthz
                port: 9010
              initialDelaySeconds: 5
            resources:
              limits:
                memory: 2Gi
              requests:
                memory: 1Gi
            securityContext:
              privileged: true
              capabilities:
                add:
                -   SYS_ADMIN
                -setuid
                -   SETGID
                -   SETPCAP
                -   SYS_PTRACE
                -   KILL
                -   DAC_OVERRIDE
                -   IPC_LOCK
                -   FOWNER
                -   CHOWN
                -   SYSLOG
                -NET_RAW
                -   SYS_RESOURCE
            volumeMounts:
            -   name: sensor-linux-sensor-config
              mountPath: /etc/sophos
            -   name: sophos-linux-content
              mountPath: /var/lib/sophos/content
            -   name: cgroup
              mountPath: /var/run/sophos/mnt/sys/fs/cgroup
              readOnly: true
            -   name: debugfs
              mountPath: /var/run/sophos/mnt/sys/kernel/debug
            -   name: hostname
              mountPath: /var/run/sophos/mnt/hostname
              readOnly: true
            -   name: proc
              mountPath: /var/run/sophos/mnt/proc
              readOnly: true
            -   name: var-lib-docker
              mountPath: /var/lib/docker
              readOnly: true
            -   name: var-run-docker
              mountPath: /var/run/docker
              readOnly: true
            -   name: var-run-containerd
              mountPath: /var/run/containerd
            -   name: var-run-crio
              mountPath: /var/run/crio
          volumes:
          -   name: sensor-linux-sensor-config
            configMap:
              name: sensor-linux-sensor-config
          -   name: sophos-linux-content
            emptyDir: {}
          -   name: cgroup
            hostPath:
              path: /sys/fs/cgroup
          -   name: debugfs
            hostPath:
              path: /sys/kernel/debug
          -   name: hostname
            hostPath:
              path: /etc/hostname
          -   name: proc
            hostPath:
              path: /proc
          -   name: var-lib-docker
            hostPath:
              path: /var/lib/docker
          -   name: var-run-docker
            hostPath:
              path: /var/run/docker
          -   name: var-run-containerd
            hostPath:
              path: /var/run/containerd
          -   name: var-run-crio
            hostPath:
              path: /var/run/crio
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: sensor-linux-sensor-config
    data:
      runtimedetections-rules.yaml: |
        # Blank, no custom rules. sophos-linux-content will still be used.
        # This file must be present when policy_input is unavailable
      runtimedetections.yaml: |
        send_labs_telemetry: true
        endpoint_telemetry_enabled: true
        # Set your customer id:
        customer_id: "{tenant-id}"
        cloud_meta: auto
        crisensor.enabled: true
        alert_output:
          outputs:
            -   type: stdout
              enabled: true
              template: 'Alert Triggered: {{ .StrategyName}}'
    

    テレメトリデータをソフォスに送信しない場合は、send_labs_telemetryfalse に設定してください。

    kubernetes-manifest.yaml ファイルには、ConfigMap と SLS 用の DaemonSet が含まれています。ConfigMap は、runtimedetections.yaml ファイルと runtimedetections-rules.yaml ファイルを含む /etc/sophos にマウントされます。DaemonSet は、ノードごとにセンサーのポッドを 1つ作成します。

  6. マニフェストファイルを適用し、 <filepath> をマニフェストファイルの場所へのパスに置き換えます。

    kubectl apply -f <filepath>/kubernetes-manifest.yaml
    
  7. ポッドがオンラインになるのを待ってから、次のコマンドを実行します。

    kubectl get pods -l app=sophos-linux-sensor
    

    このコマンドは、ラベル -'app=sophos-linux-sensor' を持つすべてのポッドを返します。Sensor の機能を確認するには、ポッドの名前が必要です。

    ヒント

    SLS ポッドが起動しない場合は、クラスタのポッドのセキュリティポリシーを確認し、必要に応じて、SLS で必要なケーパビリティを例外に指定します。これらのケーパビリティの一覧は、DaemonSet を参照するか、ソフォスサポートにお問い合わせください。

Sensor 機能の確認

次のコマンドの <SENSOR_POD_NAME> を、 kubectl get pods -l app=sophos-linux-sensor コマンドの Sensor の名前に置き換える必要があります。

Sensor のポッドのログには、設定済みのポリシーすべてが一覧表示されるはずです。

kubectl logs <SENSOR_POD_NAME>

簡単なテスト警告を生成するには、センサーのポッドの 1つを実行します。

kubectl exec -it <SENSOR_POD_NAME> -- /sophoslinuxsensor -test-alert

デフォルトで SLS は、警告を標準出力に出力するように設定されています。これは、警告を生成したポッドからログを表示して確認できます。

kubectl logs <SENSOR_POD_NAME>

警告はまた、webhook に送信したり、クラウド BLOB ストレージバケットに直接書き込んだり、ログローテーションのあるファイルシステム上のローカルファイルに書き込んだり、syslog に送信したりできます。詳細は、警告のエクスポートを参照してください。