2018年12月12日水曜日

時間指定のSnapの単位を自由に決める

ことのはじまり


earliest=1h@h とかでサーチすると時間の端数が切り捨てられるのですが、この@
の後ろにつけられる単位は、mとかhとかはできますが、「10分」といった単位ではできないわけです。これをどうにかしたかったわけです。


ぐぐった

https://answers.splunk.com/answers/99161/snap-to-5-minute-increments-in-timerange.html

最初、このevalの中でやっている計算(一回割り算してfloor関数使ってその後に掛け算)の意味が全くわからなかったわけですけど、Snapさせたい単位で一回割り算することで半端は小数点になるからfloor切り捨てるってわけですか。いやー、文系脳には難解でしたよ。

結果

こんな感じでできた。サブサーチ素晴らしい
20分前(1200sec)の10分Snapから今時点の10分Snapまでをサーチしたい場合
source="PerfmonMk:Memory"[| makeresults | eval earliest=(floor((now()-1200)/600))*600, latest=(floor(now()/600))*600| return earliest latest]





2018年11月14日水曜日

CiscoルーターのCPU情報をsyslogにする話

ことの始まり

snmpポーリングをSplunkからしたくない場合、どうする?という話題になったので、代替手段を考えてみただけで、現実的な解かどうかはわかりません。

やりかた

EEMを使えばできそうだなと思ったのでやってみたらできました。とさ。

event manager applet Splunk
 event snmp oid 1.3.6.1.4.1.9.9.109.1.1.1.1.3.1 get-type exact entry-op ge entry-val "0" poll-interval 5
 action 1.0 syslog priority debugging msg "CPU:$_snmp_oid_val"
!
end
NETFLOW-R1#
*Nov 14 08:58:26 JST: %HA_EM-7-LOG: Splunk: CPU:8
*Nov 14 08:58:31 JST: %HA_EM-7-LOG: Splunk: CPU:0
*Nov 14 08:58:36 JST: %HA_EM-7-LOG: Splunk: CPU:3
*Nov 14 08:58:41 JST: %HA_EM-7-LOG: Splunk: CPU:1
*Nov 14 08:58:46 JST: %HA_EM-7-LOG: Splunk: CPU:1
*Nov 14 08:58:51 JST: %HA_EM-7-LOG: Splunk: CPU:0

Consoleにぽこぽこログが出てくるのとロギングバッファ食いつぶすのとで、ネットワーク屋さんは嫌がるでしょうね!

2018年9月26日水曜日

SplunkとNetFlow

ことの始まり

NetFlowがNw界隈では流行っているらしいので、Splunkに取り込む事例も多いらしい。NetFlowの勉強がてらSplunkに取り込んでみてみることにしました。

今回はSplunk Add-on for NetFlowを使ってみます。Linuxプラットフォームしかサポートしておらず、しかも7.xがサポート入っていないけど、まぁ、SplunkのApp/Add-onですからね。動けばいいんです。

ネットワーク機器は、ヤフオクで5000円程度で購入できるCisco892を選定しました。

設定

TAを入れたあとに、configure.shを実行します。インタラクティブな流れで設定を終えるとindexes.confとinputs.confがlocal配下にできあがります。設定反映のために、splunkdの再起動が必要です。
splunk@ubu1804:~/etc/apps/Splunk_TA_flowfix$ ls -l
total 80
drwxr-xr-x 3 splunk splunk  4096 Sep 26 06:14 appserver
drwxr-xr-x 7 splunk splunk  4096 Sep 26 06:14 bin
-rwxr-xr-x 1 splunk splunk  8829 Sep 26 06:14 configure.sh
drwxr-xr-x 2 splunk splunk  4096 Sep 26 06:14 default
-rw-r--r-- 1 splunk splunk 19031 Sep 26 06:14 license-eula.rtf
-rw-r--r-- 1 splunk splunk 18526 Sep 26 06:14 license-eula.txt
drwxr-xr-x 2 splunk splunk  4096 Sep 26 06:14 lookups
drwxr-xr-x 2 splunk splunk  4096 Sep 26 06:14 metadata
-rw-r--r-- 1 splunk splunk   864 Sep 26 06:14 README.txt
drwxr-xr-x 2 splunk splunk  4096 Sep 26 06:14 samples
splunk@ubu1804:~/etc/apps/Splunk_TA_flowfix$ ./configure.sh


TA-FlowFIX v0.8


Please send comments or suggestions to beaker@splunk.com/n
This script will configure TA-FlowFIX on this system.
Run this in the root of TA-flowfix on the system (as a user
with "owner"/write privileges) that will listen for Netflow
or IPFIX streams. You will need either a full Splunk
installation or the Splunk Forwarder present.


There are two modes of installation. One is for a
system running this Netflow/IPFIX receiver and using
a Splunk Forwarder to send events to a Splunk Indexer.

The other is for a stand alone Splunk instance, where
only the eventtype transforms and tagging definitions
are added. A separate index will be created.

Which type of installation will you be performing:

   (1) Netflow or IPFIX receiver/listener
   (2) "netflow" eventtype parser only

Selection: 1


1 selected... let's do this.

Systems currently supported for Netflow/IPFIX listening are:

   (*) Linux (64 bit)
   (*) Linux (32 bit)
   (*) FreeBSD (64 bit)

If you already have a flowfix.sh in bin and inputs.conf/indexes.conf in
default, this WILL OVERWRITE them.

CONTINUE [Y/n]: Y

Continuing...


Full path location for this TA [ /opt/splunk/etc/apps/Splunk_TA_flowfix ]:

# of days to keep ascii flow logs [ Default: 3 ]:

Name of Splunk index to use [ Default: netflow ]:

How many listeners would you like to install on this system? [1]:

Listener #1

Netflow [v5], [v7], [v9] or [IPFIX] [ Default: v5 ]: v9
Specify IPv4 or IPv6 address to bind to listener [ Default: all ]:
UDP port to listen on: 2055
# of seconds to rollover flow capture files for indexing [ Default: 120 ]:


Setup is complete! You will need to restart Splunk to enable changes.




splunk@ubu1804:~/etc/apps/Splunk_TA_flowfix$ cd local
splunk@ubu1804:~/etc/apps/Splunk_TA_flowfix/local$ ls
indexes.conf  inputs.conf


splunk@ubu1804:~/etc/apps/Splunk_TA_flowfix/local$ cat inputs.conf
[monitor:///opt/splunk/etc/apps/Splunk_TA_flowfix/nfdump-ascii]
index = netflow
sourcetype = netflow
disabled = false

[script:///opt/splunk/etc/apps/Splunk_TA_flowfix/bin/flowfix.sh]
index = netflow
interval = 60
sourcetype = netflow

splunk@ubu1804:~/etc/apps/Splunk_TA_flowfix/local$ cat indexes.conf
[netflow]
homePath   = $SPLUNK_DB/netflow/db
coldPath   = $SPLUNK_DB/netflow/colddb
thawedPath = $SPLUNK_DB/netflow/thaweddb

ちなみに、Netflowの待ち受けポートはsplunkdではなく、tfdumpが掴んでいるので、Splunk側に設定する必要はありません。というか競合するので設定してはだめですね。
このtfdumpに依存した作りが、Windowsプラットフォームでは動かない理由のようです。


Cisco892のConfigはこんな感じ。久しぶりに触るのでお作法Configをほぼ忘れていますがあしからず。

NETFLOW-R1#show run
Building configuration...


 Current configuration : 2480 bytes
!
! Last configuration change at 16:58:28 JST Wed Sep 26 2018
! NVRAM config last updated at 16:58:29 JST Wed Sep 26 2018
!
version 15.8
service timestamps debug datetime localtime show-timezone
service timestamps log datetime localtime show-timezone
service password-encryption
!
hostname NETFLOW-R1
!
boot-start-marker
boot-end-marker
!
enable secret hogehoge
!
no aaa new-model
memory-size iomem 15
clock timezone JST 9 0
!
ip dhcp pool test
 network 192.168.100.0 255.255.255.0
 default-router 192.168.100.1
 dns-server 8.8.8.8
!
no ip domain lookup
ip domain name corp.local
ip cef
no ipv6 cef
!
flow exporter EXPORT-1
 destination 192.168.100.3
 source GigabitEthernet0
 transport udp 2055
!
flow monitor MONITOR-1
 exporter EXPORT-1
 cache timeout active 60
 cache entries 65536
 record netflow ipv4 original-input
!
multilink bundle-name authenticated
!
username admin secret hogehoge
!
redundancy
!
interface BRI0
 no ip address
 encapsulation hdlc
 shutdown
 isdn termination multidrop
!
interface FastEthernet0
 no ip address
!
interface FastEthernet1
 no ip address
!
interface FastEthernet2
 no ip address
!
interface FastEthernet3
 no ip address
!
interface FastEthernet4
 no ip address
!
interface FastEthernet5
 no ip address
!
interface FastEthernet6
 no ip address
!
interface FastEthernet7
 no ip address
!
interface FastEthernet8
 ip address dhcp
 ip nat outside
 ip virtual-reassembly in
 duplex auto
 speed auto
!
interface GigabitEthernet0
 ip address 192.168.100.1 255.255.255.0
 ip flow monitor MONITOR-1 input
 ip nat inside
 ip virtual-reassembly in
 duplex auto
 speed auto
!
interface Vlan1
 no ip address
!
ip forward-protocol nd
no ip http server
no ip http secure-server
!
ip nat inside source list 1 interface FastEthernet8 overload
ip route 0.0.0.0 0.0.0.0 dhcp
ip ssh version 2
!
ipv6 ioam timestamp
!
access-list 1 permit 192.168.100.0 0.0.0.255
!
control-plane
!
mgcp behavior rsip-range tgcp-only
mgcp behavior comedia-role none
mgcp behavior comedia-check-media-src disable
mgcp behavior comedia-sdp-force disable
!
mgcp profile default
!
 vstack
!
line con 0
line aux 0
line vty 0 4
 login local
 transport input ssh
line vty 5 15
 login local
 transport input ssh
!
scheduler max-task-time 5000
ntp server 133.243.238.244
!
end

出来上がり


通信の向きをどう判別させるんでしょうね。
まぁ、いずれにせよSplunkにデータさえ入ってくれれば自由にダッシュボードが作れるわけですから、高価なコレクター製品を買わなくてもよいと思います。


今回から引用方法を変えてみましたが、意図しないカラフルさが演出されてますね。もうちょっと落ち着いたものを探したいです。

2018年8月30日木曜日

joinコマンドの上限値変更

ことのはじまり

とあるややこしい要件から、巨大なinputlookupに巨大な集計結果をjoinするSPLを書いていましたが、ふと気づくとジョブのところに!マークがついてしまい、中身を見ると以下のようになっていました。
これは、joinコマンドが扱えるsubserchの結果がデフォルトでは50000件で制限されているためにおきます。この場合、SPLを工夫するという高度な回避方法も考えられますが、素直に上限値を上げてしまった方が手っ取り早いときもあります。


limits.confをいじる

$SPLUNK_HOME/etc/system/local/limits.conf を編集します。変更すべき箇所は2箇所です。
[join]
subsearch_maxout = 500000 
[searchresults]
maxresultrows = 500000
joinスタンザの方を変更すれば良いというのは直感的に分かりますが、searchresultsスタンザの方も変更しないといけないというのは落とし穴です。ドキュメントにちゃんと記載してほしいものです。

Answersでは以下のURLで回答されているものがあります。

ちなみに、joinスタンザには
subsearch_maxtime 
subsearch_timeout
といった設定もあるので合わせて拡張しておいた方が良いと思います。


limits.confを変更したときはSplunkの再起動が必要なので本番運用環境では躊躇します。とはいえ割り切って再起動するしかありません。ただせっかくの再起動にもかかわらずjoinの設定だけ変更してしまい、事象が改善されず、現場であわくってしまう、なんてことのないように一発で設定変更は終わらせたいものですね。

2018年7月10日火曜日

デフォルトフィールドがデフォルトで出るとは限らなかった

ことの始まり

Splunkにログを入れるときに、host,source,sourcetype,indexあたりのFieldは必須のFieldであり、サーチするとDefaultで必ず抽出されるわけですが、Default Fieldはその他にも、linecount,splunk_server,date_hour,date_wdayなどいくつも抽出されます。このdate_*をどのように使うかは結構アイデア次第だと思います。残業時間を
(date_hour<9 OR date_hour>18)
と表すところを目の当たりにしたとき、なるほどな〜、と少し感動しました。それ以降、date_*を意識して使うようにしています。


そこにあると思ったらない

本日の現場でdate_hourとdate_wdayを使ってサーチをしたら、結果が出てこないのであわくってしまいました。画像は再現環境ですが、見事にdate_*のFieldがないわけです。
最初はBugかと思いましたが、こんなBugが放置されているわけないので、周りの人に調べてもらった結果、date_*はいつでも抽出されるわけではないことがわかりました。
マニュアルみると、Index時にTimezoneをいじったら出てこないとか、いくつか制限があることがわかります。

https://docs.splunk.com/Documentation/Splunk/7.1.1/Knowledge/Usedefaultfields

また、以下のAnswersには、Modular Input系だと同様にでてこないとコメントされています。回答者はなんでこんな仕様を知っているのか謎ですが。
https://answers.splunk.com/answers/221233/why-are-date-fields-are-not-being-extracted-from-w.html

そのため、UFを使って、Windowsイベントログや Perfmonデータを取り込んでいる場合には、date_* は抽出されないということになります。


ワークアラウンド

最初、rexで頑張る必要があるのかと思われましたが、date_wdayはどうやるんだかわからず悩んでいたところ、「evalを使え」という話でした。以下のようなevalをサーチの後ろに差し込むことで、解決しました。


| eval a = strftime(_time, "%a"), w = strftime(_time, "%w")


evalをマスターすることは本当に重要ですね。


2018年7月4日水曜日

Splunkのショートカット





意外と知られていない

Splunkにもショートカットが存在します。Splunkに限った話ではないですが、ショートカットを駆使ことで作業効率が格段に上がるにもかかわらずキーコンビネーションを覚えるのはやはり大変なので、なかなか駆使するのは難しいです。

ショートカットはもう回数をこなして体で覚えるしかないと思いますが、ここではSplunkでよく使うショートカットを2つ紹介します。Mac版でも同じことができるショートカットはありますので、興味のあるマカーな方はマニュアルを参照してみください。


Ctrl + \

サーチバーにSPLをながながと書くときは、アカウント設定>基本設定から、行番号やら自動改行が選べるようになっているので、SPLの視認性は自動的に確保できるのですが、ダッシュボードに埋まっているレポートを「Open in Search/サーチで開く」するとごちゃっとしたSPLがでてしまい、そんなときにShift + Enterでちまちま改行をしてしまうこともあるのではないでしょうか。
そんなときは、Ctrl + \ を使いましょう。(フォントの都合でバックスラッシュになっていますが、円記号です。)
これ一発で一気に読みやすくなります。本当に便利だと思います

Win + Shift + E

自分でマクロ作ってる分には何も困らないのですが、他人の作ったマクロ(特にSplunk社謹製)はやはりマクロ名からは何をやっているのかさっぱりわからず、「Open in Search/サーチで開く」をして、マクロが出てきたときの絶望感はかなりのものです。ただ、そんなときに慌てずに Win + Shift + E (Win + ラージEとして覚える)を使いましょう。
マクロが展開されてSPL全文が確認できます。
仮想デスクトップとかを昔やっていた私からすると、ブラウザアプリなのにWinキーを使うショートカットを設定するのはセンスないな、と感じてしまうところはありますが、これも本当に便利です。

他にもたくさん

上記のURL先に飛んでもらえれば、他にもたくさんショートカットが備わっていることがわかりますので、ショートカット好きの方はぜひ覚えてみえてはいかがでしょうか。
覚えるのが大変な方にとってはここに紹介している2つを覚えるだけでもSPLライフがかなり効率化されると思います。

2018年6月30日土曜日

RobocopyとSplunk

ことの始まり

正直なところ、この件をまとめたいがためにBlog始めたようなものです。これ書いたらこのBlogは終わるかもしれません。

Splunkでログを集めるにはUniversal Forwarder(UF)と呼ばれるエージェントを導入するのが一番良いわけですが、既に稼働しているシステムに対してエージェントを入れること自体はやはり抵抗があるわけです。というか、抵抗されます。お願いですから抵抗しないでください。
UFの導入が難しい場合は、OSの基本機能などを駆使してSplunkサーバーにログファイルを転送してもらうことになるのですが、Windows環境の場合にはこのあたりの処理をrobocopy使って済ませようと思うことはよくあると思います。便利ですからね、robocopy。つまりrobocopyを使って、Splunkがモニタリングしているフォルダにログファイルを放り込めばいいだけです。
robocopyはWindows2008あたりからしれっとリソースキットの追加なしで使えるようになってますし、ファイルサーバーの移行案件なんかでは必ずといっていいほど登場するメジャーツールですから、お客さんが使いたいと言われてたときも「いいと思います」と返してしまったわけです。

ただ、結論からいうと、robocopy使わないほうがよいです。相性悪すぎです。robocopy使うのをやめてxcopy使いましょう。

なんとも分かりづらい問題でした。

robocopy使うと何がおこるか

robocopyを使用してSplunkがモニタリングしているフォルダにファイル転送していると「あれっ!?」っと思う_timeでインデックスされるときがまれにあります。

現場の画面は貼れないため、ローカルで無理やり再現させたものなので、ちょっと見た目が違うのですが、_timeがログのタイムスタンプと違って1979年になっています(現場では1980年でした)。この状況はログが少ない状況だと見つけやすいですが、それなりのログを放り込んでいるとなかなか気づけません。しかも古すぎるログとして見られてしまうので、DefaultのIndex設定だと、バケットが切り替わる際に捨てられてしまいます。
なぜこのようになるのか調べてみました。

robocopyの動き

robocopyの動きですが、どうやらコピー中はコピー先ファイルのタイムスタンプを1980年1月2日9:00(おそらくJSTに依存して9:00)にしてしまうようです。大きなファイルをrobocopyして、コピーが完了しないうちにファイルのプロバティを開くと以下のようになります。「更新日時」に注目してください。

このような更新日時になるのはコピー中のみのようで、コピーが終わるとrobocopyのオプションに従った更新日時に上書きされます。なぜこのような仕様なのかはよくわかりません。

Splunkの動き

SplunkのFile Input時にはタイムスタンプを抽出するために、ファイルの更新日時から抽出するタイムスタンプのあたりをつけているようです。その設定がprops.confで定義されています。MAX_DAYS_AGOとMAX_DAY_HENCEです。
https://docs.splunk.com/Documentation/Splunk/7.1.1/Admin/Propsconf
Defautでは、MAX_DAYS_AGOが2000日で、MAX_DAY_HENCEは2日です。これは、2000日より昔のタイムスタンプもしくは2日より未来のタイムスタンプは抽出してくれない事を意味します。MAX_DAYS_AGOの2000日はおよそ5年半なので、稀に古いログを食わせるときにハマります。そして今回のポイントですが、MAX_DAYS_AGOとMAX_DAYS_HENCEは可変なのですが、今回のポイントはいずれの最大値が10951と10950であることです。つまり30年であり、仮に設定を最大値に変更したとしてもファイルの更新日時から30年を超えるタイムスタンプはSplunkは読み込めないという、そんな仕様となっているようです。1980年は今(2018年)から38年の差があるせいでタイムスタンプが抽出できず、ファイルの更新日時をそのまま_timeとして抽出する動きになります。

ちなみに、以下のようなログがsplunkd.logに出力されます。
06-30-2018 22:34:02.644 +0900 WARN  DateParserVerbose - Failed to parse timestamp in first MAX_TIMESTAMP_LOOKAHEAD (128) characters of event. Defaulting to timestamp of previous event (Sat Jun 30 16:59:19 2018). Context: source::syslog.nix|host::127.0.0.1|linux_secure|

まとめ

この問題は、robocopyがファイルをコピーしている途中でSplunkがそのファイルを掴んだときに発生するようです。そのため、ファイルサイズの大きいログやネットワーク越しにたらたらコピーしているファイルの場合、発生確率が上がると考えられます。タイミングの問題です。
Splunkからすると、更新日時と30年以上も乖離したタイムスタンプのログがファイル内に存在するなんて想定外、という話のようですし、robocopyにはrobocopyなりの事情があって、1980年の更新日時にしているのではないかと思いますので、結果的には、お互いの相性が悪い、としか言いようがなさそうです。 代替策としては、XCOPYなど、タイムスタンプを変な状態にしないコピーツールになります。ディスクに余裕があれば、robocopy + XCOPYでも良いと思います。WSLが普及したらrsyncを使う時代がくるかもしれません。


Splunkのことをつらつらと

Blog始めます

Splunkと関わり出して半年以上経過しましたが、いろいろと調べたり思いついたりしてはその場しのぎで解決しているので、個人的になにかしら発信できたらいいなと思いつき、三日坊主にならない程度に力を抜きながらここにまとめていこうと思います。

「Splunk使ってみよう|みた」的な日本語のBlogも探せばいくつかあるようですが、現在進行系で継続しているものって少ないような気がしてます。おそらくSplunkとの関わりがそこまで長続きする人がいないんだろうと勝手な推測をしていますが、自分も多分同じ道を歩むまでは継続できるように気合と根性でがんばります。



Splunkの情報はどこから探すのか

やっぱりマニュアルは読みましょう。この規模の会社にしては結構な力入れてドキュメント化しているみたいです。

知恵袋的な存在のAnswersから探しましょう。正直なところ、自分の悩みなんて世界の何処かで既に誰かが悩んだことです。

ググるときは、site: 使いましょうね。皆さん使ってますか?

Slackに参加して聞いてみる。

Splunk Blog読む

.conf(どっとこんふ)の発表資料を見る

https://conf.splunk.com/resources/2017/on-demand.html

使えそうなホワイトペーパー
https://www.splunk.com/pdfs/white-papers/splunk-validated-architectures.pdf

Wikiをみる。情報古いけど、基本的なところは変わらない
https://wiki.splunk.com/Main_Page

SplunkにはKnowlege Base(KB)的なサイトがないのが残念です。ないものは諦めるしかありません。


免責事項

あくまで個人メモレベルのBlogですので、内容や設定方法の保証は致しかねます。
さてさて、このBlogはいつまで続きますかね。