rsyslog/ログ受信時に接続元IPアドレスで制御する(Cent8.3)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/0798a8ef-9283-f3aa-bca3-4601e84fa03a.png)

以下の記事ではRedHatドキュメントに沿って記載しましたが、
チューニング余地がありそうなので書いていきたいと思います。


■環境
CentOS Linux release 8.3.2011
rsyslog-8.1911.0-6.el8.x86_64

https://qiita.com/Higemal/items/5a35a9c4392c4f4611e0

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/s1-configuring_rsyslog_on_a_logging_server

<br>
<br>


# ①接続元IPアドレス範囲を絞る
以下のをMODULESあたりに配置することで接続元IPアドレス範囲を絞ることが出来ます。
単一IPアドレスでもセグメントでも可。カンマで複数指定も可。

```sh:AllowedSender
$AllowedSender TCP ,127.0.0.1, 192.168.142.0/24
$AllowedSender UDP ,127.0.0.1, 192.168.142.0/24
```

:::note warn
`127.0.0.1`は入れておかないと不具合になるケースがある模様。
https://tooljp.com/linux/Redhat7/faqRedhat7/html/TCP-message-from-disallowed-sender.html
:::


<br>
<br>

なお、指定IPアドレス範囲外からのアクセスが発生した場合は、
以下のメッセージが`/var/log/messages`に発行されます。

```:BlockMessage
Aug 21 15:13:20 centt83-02 rsyslogd[1786]: imudp: UDP message from disallowed sender discarded [v8.1911.0-6.el8]

```

:::note warn
このメッセージ内で接続元IPアドレスが記載されていればよいのですが、現在はそのような設定が出来ない模様。
https://askubuntu.com/questions/461947/how-to-display-the-ip-address-of-the-sender-when-rsyslog-rejects-a-udp-message
:::



<br>
<br>

# ②ログ格納先を接続元IPアドレスで決める
こちらはTEMPLATEとRULESを利用し、if文で制御を行います。

```sh:Control(ipaddr)
#### TEMPLATE #####
template(name="LogGroup001" type="string"
     string="/var/log/remote/%fromhost-ip%/%$year%-%$month%-%$day%.log"
    )

#### RULES ####
if ( $fromhost-ip == "192.168.142.43" ) then {
   *.*  action(type="omfile" DynaFile="LogGroup001")
   stop
}
```

#### TEMPLATE
`LogGroup001`
ログ定義の名前となります。string= 以後のディレクトリにログ出力をすることを定義しています。

>`%fromhost-ip%`は受信IPアドレスのマクロとなりますが、そのほかにも`%fromhos%`でホスト名を指定することなどが可能です。
https://www.rsyslog.com/doc/master/configuration/properties.html

#### RULE
`if ( ) then { }`
if文に合致した内容で処理します。
もちろん条件式はand/orが利用可能です。

`$fromhost-ip`
接続元IPアドレスの値となります。今回は特定のIPアドレスかどうかを判定しています。

`*.*`
\<Facility>.\<Serverity> です。今回は全てを定義しています。

`action(type="omfile" DynaFile="LogGroup001")`
actionという動作指定部にて、
--- `omfile`(Output Module File(標準モジュール))を利用して
--- `LogGroup001`(ログ定義)に出力される
ということを定義しています。

`stop`
このルールに合致する場合、他のルールを適用しないこととして`stop`を記述しています。
（`stop`がないと次のルールも評価対象となります）


<br>
<br>

# ③ログ格納先を接続元セグメントで決める
ほとんど ②ログ格納先を接続元IPアドレスで決める と同じですが、
if文の条件式にて`startswith`を利用しているのが違いです。

```sh:Control(segment)
#### TEMPLATE #####
template(name="LogGroup001" type="string"
     string="/var/log/remote/%fromhost-ip%/%$year%-%$month%-%$day%.log"
    )

#### RULES ####
if ( $fromhost-ip startswith "192.168.142." ) then {
   *.*  action(type="omfile" DynaFile="LogGroup001")
   stop
}
```


`startswith`は文字列の始まりについての一致を判定します。
これによってIPアドレス範囲を指定することにしています。



# 出典
https://qiita.com/Higemal/items/5a35a9c4392c4f4611e0

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/s1-configuring_rsyslog_on_a_logging_server



https://www.server-world.info/query?os=CentOS_8&p=rsyslog&f=2

https://tooljp.com/linux/Redhat7/faqRedhat7/html/TCP-message-from-disallowed-sender.html

https://askubuntu.com/questions/461947/how-to-display-the-ip-address-of-the-sender-when-rsyslog-rejects-a-udp-message

https://alfa.faqserv.com/pukiwiki/?Linux/RHEL8/rsyslog+%E3%81%A7+syslog+%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E4%BD%9C%E3%82%8B