SyslogをGraylogで整形する(opensearch使用)

# SyslogをGraylog[OpenSearch]で整形する<br>(docker-compose使用)
OpenSearchを使用したGrayLogサーバーの立て方です。
<details><summary>環境</summary>

| 項目 | 環境 |
|:-:|:-:|
|OS|Windows 11|
|VM|Ubuntu 22.04.3 LTS|
|Docker|24.0.7|
|docker-compose|1.29.2|
|Graylog|5.1.5|
|OpenSearch|2.4.0|
|Mongo DB|5.0|
</details>

## 注意点
- SyslogはUbuntuの1514に対してログを送信できていることが前提となります。
- 設定ファイル内に「ElasticSearch」という単語が出てくることがありますが、これはGraylog側が設定名称を変更していない為と思われます。今回は「OpenSearch」を使用しています。
- EC2に無料枠で立てるとメモリエラーが発生します。
- CPUがAVXに対応していないとMongoDB5.0が使えないため、うまくいきません。
　⇒opensearchかgraylogのどちらかが確か5.0をシステム要件として要求しています。

## 作成
### 準備
- docker-composeで作成していきます。

<details><summary>Dockerとdocker-composeのインストール</summary>

アップデート
```shell
sudo apt update
```
必要な依存関係をインストール
```shell
sudo apt install apt-transport-https ca-certificates curl software-properties-common pwgen -y
```
Dockerのインストール
```shell
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce -y
docker version
sudo systemctl status docker
```
docker-composeのインストール
```shell
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
```
</details>

- 必要に応じて作業ディレクトリを作成してください
`mkdir graylog && cd graylog`

### 目次
1. `.env`ファイルを作成
1. `docker-compose.yml`ファイルを作成
1. docker-composeの起動

### **.env**ファイルを作成する
**GRAYLOG_PASSWORD_SECRET**を作成
```shell
pwgen -N 1 -s 96
```
出力された文字列をメモしてください

**GRAYLOG_ROOT_PASSWORD_SHA2**を作成
 ※`<yourPassword>`を自分のパスワードに置き換えてください
```shell
echo -n <yourPassword> | shasum -a 256
```
出力された文字列をメモしてください

`vim .env`などでファイルを作成し、以下の内容を貼り付けてください
`GRAYLOG_PASSWORD_SECRET`と`GRAYLOG_ROOT_PASSWORD_SHA2`の""内に先程メモした文字列を入力してください。
 ※ここで間違えると起動時にエラーのループ？が起こるみたいなので、気を付けてください。（間違えたら作業フォルダ毎削除したら大丈夫だと思います。）
```text
# You MUST set a secret to secure/pepper the stored user passwords here. Use at least 64 characters.
# Generate one by using for example: pwgen -N 1 -s 96
# ATTENTION: This value must be the same on all Graylog nodes in the cluster.
# Changing this value after installation will render all user sessions and encrypted values in the database invalid. (e.g. encrypted access tokens)
GRAYLOG_PASSWORD_SECRET=""

# You MUST specify a hash password for the root user (which you only need to initially set up the
# system and in case you lose connectivity to your authentication backend)
# This password cannot be changed using the API or via the web interface. If you need to change it,
# modify it in this file.
# Create one by using for example: echo -n yourpassword | shasum -a 256
# and put the resulting hash value into the following line
# CHANGE THIS!
GRAYLOG_ROOT_PASSWORD_SHA2=""

processbuffer_processors = 8
outputbuffer_processors = 3
processor_wait_strategy = blocking
ring_size = 65536
inputbuffer_ring_size = 65536
inputbuffer_processors = 2
inputbuffer_wait_strategy = blocking
message_journal_max_age = 12h
elasticsearch_max_time_per_index = 3d
retention_strategy = delete
```

### **docker-compose.yaml**ファイルを作成する
`vim docker-compose.yaml`などでファイルを作成し、以下の内容を貼り付けてください
 ※受信ポートを変更する場合は`ports:`の`# Syslog`部分を変更してください。(今回は1514)
```shell
version: "3.8"

services:
  mongodb:
    image: "mongo:5.0"
    volumes:
      - "mongodb_data:/data/db"
    restart: "on-failure"

  opensearch:
    image: "opensearchproject/opensearch:2.4.0"
    environment:
      - "OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g"
      - "bootstrap.memory_lock=true"
      - "discovery.type=single-node"
      - "action.auto_create_index=false"
      - "plugins.security.ssl.http.enabled=false"
      - "plugins.security.disabled=true"
    ulimits:
      memlock:
        hard: -1
        soft: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - "os_data:/usr/share/opensearch/data"
    restart: "on-failure"

  graylog:
    hostname: "server"
    image: "${GRAYLOG_IMAGE:-graylog/graylog:5.1.5}"
    depends_on:
      opensearch:
        condition: "service_started"
      mongodb:
        condition: "service_started"
    entrypoint: "/usr/bin/tini -- wait-for-it opensearch:9200 --  /docker-entrypoint.sh"
    environment:
      TZ: "Asia/Tokyo"
      GRAYLOG_ROOT_TIMEZONE: "Asia/Tokyo"
      GRAYLOG_NODE_ID_FILE: "/usr/share/graylog/data/config/node-id"
      GRAYLOG_PASSWORD_SECRET: "${GRAYLOG_PASSWORD_SECRET:?Please configure GRAYLOG_PASSWORD_SECRET in the .env file}"
      GRAYLOG_ROOT_PASSWORD_SHA2: "${GRAYLOG_ROOT_PASSWORD_SHA2:?Please configure GRAYLOG_ROOT_PASSWORD_SHA2 in the .env file}"
      GRAYLOG_HTTP_BIND_ADDRESS: "0.0.0.0:9000"
      GRAYLOG_HTTP_EXTERNAL_URI: "http://localhost:9000/"
      GRAYLOG_ELASTICSEARCH_HOSTS: "http://opensearch:9200"
      GRAYLOG_MONGODB_URI: "mongodb://mongodb:27017/graylog"
    ports:
    - "5044:5044/tcp"   # Beats
    - "1514:1514/udp"   # Syslog
    - "1514:1514/tcp"   # Syslog
    - "5555:5555/tcp"   # RAW TCP
    - "5555:5555/udp"   # RAW TCP
    - "9000:9000/tcp"   # Server API
    - "12201:12201/tcp" # GELF TCP
    - "12201:12201/udp" # GELF UDP
    #- "10000:10000/tcp" # Custom TCP port
    #- "10000:10000/udp" # Custom UDP port
    - "13301:13301/tcp" # Forwarder data
    - "13302:13302/tcp" # Forwarder config
    volumes:
      - "graylog_data:/usr/share/graylog/data/data"
      - "graylog_journal:/usr/share/graylog/data/journal"
    restart: "on-failure"

volumes:
  mongodb_data:
  os_data:
  graylog_data:
  graylog_journal:
```

### docker-composeから起動
　※作業フォルダ直下で実行
```shell
sudo docker-compose up -d
```
```shell
sudo docker-compose ps
```

<details><summary>停止・削除</summary>

```shell:コンテナを止める場合
sudo docker-compose down
```
```shell:イメージからすべて削除する場合
docker-compose down --rmi all --volumes --remove-orphans
```
</details>

## ブラウザからアクセス
`localhost:9000`にアクセスしてください。
IDは`admin`、パスワードは設定した`<yourPassword>`を入力してログインしてください。

## 受信ログの設定
### 「System」から「Inputs」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116042/8edbcc66-310f-ee43-a833-11d63b1ecfd5.png)

### 「Syslog UDP」を選択して「Launch new input」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116042/59720f0e-16c6-8842-ae96-12ec142f261f.png)

### 「Title」と「Port」を変更
　※必要に応じて他の部分も変更してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116042/cfe4fd7f-7857-2133-e520-530bd3784d5a.png)

### 「Launch input」を追加後、「Show received messages」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116042/48cd6870-f1b8-0ef0-703d-8c6333aa326d.png)
問題なければ以下のように表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116042/121b6fe4-3cb3-88a1-08b7-f72b951a1fda.png)

## よくあるエラー
- **Graylogサーバーが立ち上がらない**
　`curl localhost:9000`を実行して`Recv failure: Connection reset by peer`が出る場合はopensearchが立っていない可能性がある
  `docker-compose logs opensearch`で状況を確認
  <br>
- **ログインできない**
　自分はこれで1週間悩んだが原因がよくわからなかったので、作業フォルダ（最初）から作り直すことをお勧めします。
  <br>
- **サーバーを再起動したら受信できなくなった（ダッシュボードに表示されない）**
　GraylogのInputs設定で使用している「More actions」＞「Edit input」から「input設定」が正しい事を確認してください。特に再起動すると「Node」が選択されていない(「Select Node」になっている)時があります。
  <br>
- **「Input」には入ってそうだけど、ダッシュボード・サーチに表示されない**
　**「System」⇒「Overview」を選択し、ページ中央の「Time configuration」項目ですべて同じ時刻になっていることを確認**
 
  また、OSの時刻とGraylog serverの時刻があっていることも一応確認
  　⇒OSの時刻とYour web browserは多分同じ...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116042/60675522-7b86-051d-71a1-0b7b486d8450.png)
  なっていなければ修正すべき時刻を修正
  　例えば、日本時間は+9:00なのでそれに準じていないものを修正する
   - Graylogの時刻設定はymlのファイルの`TZ:`と`GRAYLOG_ROOT_TIMEZONE:`項目
   - VM内の時刻と現時刻が違うときはVMの設定を変更
   - Syslog側から書き出されるログの時刻が日本時間じゃない場合もある

兎にも角にもログとGraylog serverの時刻を同じにする
 尚、ログの時刻の方が過去の場合、コンソールから時計マークの横のプルダウンから「all messages」を選択したら見える
 （ログの時刻が未来の可能性がある場合は時計マークをクリックして「Absolute」から範囲を設定して見れるかも...?）


:::note info
雑記になってしまったのでなにかわからないことがあれば連絡してください。
世の為、人の為になる事を願っております。

さばめろん
:::


## 参照
- [virtualizationhowto.com](https://www.virtualizationhowto.com/2023/09/graylog-docker-compose-setup-an-open-source-syslog-server-for-home-labs/#h-graylog-docker-compose-configuration "Graylogの立ち上げ方")