Slide 1

Slide 1 text

rsyslogについて 変更作業視点でちょっとだけ考える 大野 哲生(@g_plains) On 2020/11/16

Slide 2

Slide 2 text

アジェンダ?  自己紹介  ことの発端  rsyslog.conf の検証あれこれ ◦ rsyslogd -N を活用する ◦ loggerの代わりにnetcat/pythonを使う ◦ netns で仮想ネットワークを構築する  ここまでのまとめ  今後の検討(すでに答えは出ているが)

Slide 3

Slide 3 text

自己紹介  ハンドル : こてつ(@g_plains)  出身 : 愛知で銀杏のおいしいところ  おしごと :オンプレ基盤(SV/NW)の管理  最近の趣向 :近所をゆるーくお散歩・自転車 善光寺参りからのお饅頭が美味しい

Slide 4

Slide 4 text

ことの発端  派遣先でのRHEL7系での設定作業 「コテツ君sysklogからrsyslogに変えといて」  商用サイトと借りられる検証サイトでIP枠が全然違う、困っ た… →ひとまず、オンプレミス環境でのrsyslogについて 変更作業の検証ができることを確認しよう

Slide 5

Slide 5 text

rsyslog.confの検証方法  rsyslogd -N 1 で別環境のrsyslog.conf を LINTする 普段使いのコンフィグを /etc/rsyslog.conf に置いたまま、 rsyslogd -N 1 -f /etc/rsyslog.conf.test で 検証できる  loggerのかわりにnetcat/udp でパケットを送る うんなにいうてるかわからん  netnsを使って検証サイトに商用サイトと同じ(ような)NWを 作る 商用サイトと同じようなトラヒックを検証サイトで動かせる、 しかも迷惑にならない(たぶん)

Slide 6

Slide 6 text

rsyslogd -N の活用  単純に rsyslogd -N 1 を実行したばやい /etc/rsyslog.conf のLINTを行う rsyslog.conf 配下に、例えば/etc/rsyslog.d/segment.conf について言及があれば、これのLINTを行う  rsyslogd -N 1 -f /etc/rsyslog.conf.prod を実行したばやい 検証サイトに 商用サイトのコンフィグ(rsyslog.conf.prod) を配置して実行した場合、 /etc/rsyslog.conf.prod につい てLINTを行う ※ま、まあ商用サイトでの変更では別途 rsyslogd -N 1 を やったほうがいいわけですが

Slide 7

Slide 7 text

loggerを使って感じるアレコレ  みんなだいすきlogger コマンド  logger -n host.contoso.com みたいにサーバIPを指定すれ ば別のノードへはsyslogを送ることができる  rsyslog.conf内ではソースIPで振り分けるよね…(゚Д゚;)

Slide 8

Slide 8 text

loggerの代わりにnetcatを使う  netcatをインストールして、echo文をパイプしてみる  ソースIPを変更しながら514/udp へパケットを投げること ができる  300件/秒くらいならbash経由でUDPパケットを送ることが できるが、1000件/秒を越えると、rsyslogのプロセスが遊 んでいるのにbashのプロセスで処理速度が頭打ちになる ip addr ip addr add 192.xxx.xxx.xxx dev ens160 echo "<12> test" | nc -u -w 1 -s 192.xxx.xxx.xxx ¥ 172.xxx.xxx.xxx 514 ip addr del 192.xxx.xxx.xxx

Slide 9

Slide 9 text

loggerの代わりにpythonを使う  [Black Hat Python]を読みながらPoC用のコードを書きます 便宜上syslog_client.py とかって名前で作ろう  あとは、 python3 syslog_client.py (宛先IP)で送信  参考: https://engineeringnote.hateblo.jp/entry/python/bhp/2-3 import socket import sys target_host = sys.argv[1] target_port = 514 soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) for facility in range(24): for severity in range(8): sendmsg="<{}>{}".format(str(facility*8+severity),str(facility*8+severity)) soc.sendto(sendmsg.encode(), (target_host, target_port))

Slide 10

Slide 10 text

netns で仮想ネットワークを構築する  netnsを活用することで本来のネットワークと異なる セグメントでの通信テストが行える ※作った人はそういう用途をたぶん想定していない  ステップ 1.netns インターフェースとveth を適当な数生やす 2.netnsインターフェースとvethをよしなに接続する 3.IPアドレスを振りなおしながらUDPパケットをばらまく 4.netnsインターフェースとvethをよしなに破棄する

Slide 11

Slide 11 text

netnsの利用例  netnsノードの追加~vethの連結~IP割り当て # netnsノードの追加 ip netns list ip netns add local ip netns add remote ip netns list > remote > router > local # vethを生やして、各ノードにぶら下げる ip link add name veth1-local type veth peer name veth1-remote ip link set veth1-local netns local ip link set veth1-remote netns remote # 各終端にIPアドレスを振って、upする ip netns exec local ip addr add 10.0.0.1/23 dev veth1-local ip netns exec remote ip addr add 10.0.1.1/23 dev veth1-remote ip netns exec local ip link set veth1-local up ip netns exec remote ip link set veth1-remote up

Slide 12

Slide 12 text

netnsの利用例-2  netns仮想インターフェースでrsyslogdを起動して 実際にUDPパケットを投げる(pythonスクリプトは先述) #各ノードのリンクローカルもupする ip netns exec local ip link set lo up ip netns exec remote ip link set lo up # 親コンテキストでrsyslogdを終了して、local ノードでrsyslogdを起動 systemctl stop rsyslog ip netns exec local /sbin/rsyslogd # remoteコンテキストでUDPパケットを投げてみる ip netns exec remote python3 syslog_client.py 10.0.0.1 tail -1 /var/log/messages > Dec 15 07:24:26 10.0.1.1 190 # ipアドレスを差し替えて、UDPパケットを投げてみる ip netns exec remote ip addr del 10.0.1.1/23 dev veth1-remote ip netns exec remote ip addr add 10.0.1.2/23 dev veth1-remote ip netns exec remote python3 syslog_client.py 10.0.0.1 > Dec 15 07:24:48 10.0.1.2 190

Slide 13

Slide 13 text

netnsの利用例-3  netns仮想インターフェースの破棄  RHEL7系であればnetns 仮想インタフェースで実IPと異なる セグメントを内部で割り付けることができた kill `cat /var/run/rsyslogd.pid` ps -ef|grep rsyslogd systemctl restart rsyslog ip -all netns delete

Slide 14

Slide 14 text

[脱線]dummyインタフェース  netnsが使えない環境の場合、dummy インタフェースを生 やす方法でもできなくはない… ※作った人はそういう用途を絶対想定していない  ステップ 1.dummy インターフェースを適当な数生やす 2.dummyインタフェースにIPアドレスを生やす 3.IPアドレスを振りなおしながらUDPパケットをばらまく 4. dummyインタフェースを破棄する

Slide 15

Slide 15 text

[脱線]dummyインタフェース  PoC(CentOS5) 便宜上、echo + netcat での送信例  もしかすると、dummyインタフェースはうまく破棄できな いかもしれない… modprobe -a dummy ip link add name eth10 type dummy ip addr add 172.16.2.1/23 dev eth10:2 ip addr add 172.16.3.1/23 dev eth10:3 echo “<12> test ” | nc -u -w 1 -s 172.16.2.1 172.16.3.1 514 ip addr delete 172.16.2.1/23 dev eth10:2 ip addr delete 172.16.2.2/23 dev eth10:2 ... ip link delete eth10

Slide 16

Slide 16 text

ここまでのまとめ  検証系サーバで商用系サーバのrsyslog.confも一 緒に面倒が見られる (rsyslog -N 1 )  rsyslog.conf の全行検査が必要な場合、 logger+シェルに比べてpythonを使った方が圧倒 的に速い(シェルのオーバヘッドは無視できない)  netnsを使いこなすと検証系サーバに割り振られた IPと異なるIP枠に対してトラフィックの検証が行 える

Slide 17

Slide 17 text

今後の検討  オンプレミスでDocker/K8sを使って構築した場合、rsyslog 回りってどうやるんだっけ? →PoC書いてる人がいました… https://qiita.com/Esfahan/items/5e5a9ae7882bb0eaaf5f  Amazon EC2上のLinuxサーバでrsyslogを使って、イベント をCloudWatch とかにぶん投げる場合はどうやるの? →PoC書いてる人がいました… (rsyslogdで振り分けする必要、なくね…) https://business.ntt-east.co.jp/content/cloudsolution/column-try- 28.html