コンテンツにスキップ

SCheck 入門ガイド

  • バージョン:1.0.7-7-g251eead
  • リリース日:2023-04-06 11:17:57
  • 対応OS:windows/amd64,windows/386,linux/arm,linux/arm64,linux/386,linux/amd64

このドキュメントでは、SCheck インストール の完了後に、SCheck の基本機能を使用する方法を説明します。以下の内容を含みます。

SCheck ディレクトリ構成

SCheck は現在、Linux/Windows の2つの主要プラットフォームをサポートしています。

OS アーキテクチャ インストールパス
Linux カーネル 2.6.23 以上 amd64/386/arm/arm64 /usr/local/scheck
Windows 7, Server 2008R2 以上 amd64/386 64ビット:C:\Program Files\scheck
32ビット:C:\Program Files(32)\scheck

Tips:カーネルバージョンの確認

  • Linux:uname -r
  • Windows:cmd コマンドを実行(Winキー + r を押して cmd と入力し Enter)、winver と入力するとシステムバージョン情報を取得できます。

インストールが完了すると、SCheck のディレクトリリストは以下のようになります。

├── [   6]  custom.rules.d
├── [ 12K]  rules.d
├── [ 17M]  scheck
├── [ 664]  scheck.conf
└── [ 222]  version

内訳:

  • scheck:SCheck メインプログラム(Windows では scheck.exe
  • custom.rules.d:ユーザー定義ディレクトリ
  • rules.d:SCheck システムディレクトリ
  • scheck.conf:SCheck メイン設定ファイル
  • version:SCheck バージョン情報

注:Linux プラットフォームでは、SCheck の実行ログは /var/log/scheck ディレクトリにあります。

関連コマンド

ヘルプの表示:

$ scheck -h
Usage of scheck:
  -check-md5
        md5 checksum
  -config string
        configuration file to load
  -config-sample
        show config sample
  -funcs
        show all supported lua-extend functions
  -test string
        the name of a rule, without file extension
  -testc int
        test rule count
  -version
        show version
  -doc
        Generate doc document from manifest file
  -tpl
        Generate doc document from template file
  -dir
        -doc、-tpl と併用し、ファイルを指定のディレクトリに出力します
  -luastatus
        すべての Lua 実行状態を表示し、現在のディレクトリに出力します。ファイル形式は Markdown が適切です。
  -sort
        -luastatus と併用します。ソートパラメータ:name(名前)、time(実行時間)、count(実行回数)、デフォルトは count
     ./scheck -luastatus -sort=time
  -check
        ユーザーディレクトリ内のすべての Lua ファイルを一度プリコンパイルし、コードの構文エラーをチェックします。
  -box
        バイナリにロードされたすべてのファイルのリストを表示します。

検出ルール

検出ルールはルールディレクトリに配置されます。設定ファイルの rule_dir またはユーザー定義ディレクトリ custom_dir で指定します。各ルールは2つのファイルで構成されます。

  1. スクリプトファイル:Lua 言語で記述され、拡張子は .lua である必要があります。
  2. マニフェストファイル:TOML 形式で記述され、拡張子は .manifest である必要があります。マニフェストファイル を参照してください。

スクリプトファイルとマニフェストファイルは同じ名前である必要があります

SChecker は定期的に(マニフェストファイルの cron で指定された間隔で)検出スクリプトを実行します。Lua スクリプトコードは実行ごとに関連するセキュリティイベント(ファイルの変更、新しいユーザーログインなど)がトリガーされたかどうかをチェックし、トリガーされた場合は trigger() 関数を使用してイベントを(ラインプロトコル形式で)設定ファイルの output フィールドで指定されたアドレスに送信します。

SChecker はいくつかの Lua 拡張関数を定義しており、安全性を確保するために一部の Lua パッケージや関数を無効にしています。サポートされる Lua 組み込みパッケージ/関数は以下の通りです。

  • 以下の組み込み基本パッケージはすべてサポートされます。

    • table
    • math
    • string
    • debug
  • os パッケージでは、以下の関数を除くすべてが使用可能です。

    • execute()
    • remove()
    • rename()
    • setenv()
    • setlocale()

ルールのマニフェストファイルや Lua コードを追加/変更しても、サービスの再起動は不要です。SChecker は10秒ごとにルールディレクトリをスキャンします。

マニフェストファイル

マニフェストファイルは、現在のルールが検出する内容の説明です(例:ファイル変更の検出、ポートの起動/停止など)。最終的なラインプロトコルデータには、マニフェストファイルのフィールドのみが含まれます。詳細は以下の通りです。

# ---------------- 必須フィールド ---------------

# イベントのルール ID(例:k8s-pod-001)。ラインプロトコルのメトリクス名として使用されます。
id = ''

# イベントのカテゴリ。ビジネスに応じてカスタマイズ。
category = ''

# 現在のイベントの危険レベル。ビジネスに応じてカスタマイズ(例:warn、error)。
level = ''

# 現在のイベントのタイトル。検出内容を説明(例:「機密ファイルの変更」)。
title = ''

# 現在のイベントの内容(テンプレート対応。詳細は下記参照)。
desc = ''

# イベントの実行周期を設定(Linux crontab の構文ルールを使用)。
cron = ''

# 対応プラットフォーム。
os_arch = ["Linux", "Windows"]
# ---------------- オプションフィールド ---------------

# 現在のルールを無効にする。
#disabled = false

# デフォルトでタグに hostname を追加。
#omit_hostname = false

# hostname を明示的に設定。
#hostname = ''

# ---------------- カスタムフィールド ---------------

# カスタムキーと値を追加可能。値は文字列である必要があります。
#instanceID=''

Cron ルール

現在は間隔実行のみをサポートしています。

# ┌───────────── Second
# │ ┌───────────── Miniute
# │ │ ┌───────────── Hour
# │ │ │ ┌───────────── Day-of-Month
# │ │ │ │ ┌───────────── Month
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ │
# * * * * *

例:

*/10 * * * *:10秒ごとに実行。 * */5 * * *:5分ごとに実行。 disable:disable または空文字を設定すると、その Lua は常駐型になります(例:ファイル変更の監視)。このタイプの Lua は一度実行されると停止しません。

テンプレートサポート

マニフェストファイルの desc 文字列内ではテンプレート変数がサポートされています。構文は {{.<Variable>}} です。例:

ファイル{{.FileName}}が変更されました。変更後の内容:{{.Content}}

これは、FileNameDiff がテンプレート変数であり、置き換えられることを示します(先頭のドット . も含めて)。trigger() 関数を呼び出すと、変数が置き換えられます。この関数には、テンプレート変数の置換値を含む Lua の table 変数を渡すことができます。例えば、以下のパラメータを渡すとします。

tmpl_vals={
    FileName = "/etc/passwd",
    Content = "delete user demo"
}
trigger(tmpl_vals)

最終的な desc の値は次のようになります。

ファイル/etc/passwdが変更されました。変更内容:`delete user demo`

ルールのテスト

ルールコードの作成時には、scheck --test を使用してコードが正しいかテストできます。rules.d ディレクトリに demo ルールがあると仮定します。

$ scheck --test  ./rules.d/demo

--test オプションは複数のルールを同時にテストすることもできます。このスクリプトが別のスクリプトの実行後に実行されることを前提としている場合:

$ scheck --test  rules.d/0000-global-cache,rules.d/0400-k8s-node-conf-priv

Lua 関数

関数 を参照してください。

共通ライブラリの作成

SChecker では、検出スクリプト内で require 関数を使用して Lua モジュールをインポートできます。モジュールファイルは rules.d/lib ディレクトリにのみ配置できます。よく使用する関数をモジュール化し、この lib サブディレクトリに配置して検出スクリプトで使用できます。

Lua モジュール common.lua を作成するとします。

module={}

function modules.Foo()
    -- 関数本体...
end

return module

common.lua/usr/local/scheck/rules.d/lib ディレクトリに配置します。

この共通モジュールを使用するルールスクリプト demo.lua があるとします。

common=require("common") -- 拡張子は不要
common.Foo()

ラインプロトコル

SCheck の出力はラインプロトコル形式です。ルール ID がメトリクス名として使用されます。

タグリスト

Name Type 説明 必須
title string セキュリティイベントのタイトル true
category string イベントカテゴリ true
level string セキュリティイベントレベル。infowarncritical をサポート。 true
host string イベントの発生元ホスト名(デフォルトで含まれる)
os_arch string ホストプラットフォーム true
カスタムタグ string マニフェストファイルでカスタマイズされたタグ false

現在の category の分類:

  • network:ネットワーク関連。主に接続、ポート、ファイアウォールなど。
  • storage:ストレージ関連。ディスク、HDFS など。
  • db:各種データベース関連(MySQL/Redis/...)。
  • system:主にオペレーティングシステム関連。
  • container:Docker と Kubernetes を含む。

メトリクスリスト(fields)

メトリクス名 タイプ 説明
message string イベント詳細

SCheck の実行リソース制限

cgroup を使用して SCheck の実行リソース(CPU 使用率など)を制限します。Linux オペレーティングシステムのみサポートします。SCheck のインストールディレクトリに移動し、scheck.conf 設定ファイルを編集して、enable を true に設定します。例:

[cgroup]
# オプション、デフォルトは無効。CPU とメモリを制御可能。
enable = false
cpu_max = 30.0
cpu_min = 5.0
mem = 0

フィードバック

このページは役に立ちましたか?