Quantcast
Channel: Linux –俺的備忘録 〜なんかいろいろ〜
Viewing all 743 articles
Browse latest View live

CentOS 7にターミナルの操作ログをSyslogでJSON形式に記録、再生もできる『tlog』をインストールする

$
0
0

ターミナルのログを記録する方法といえばscriptコマンドだが、タイムスタンプを付与できなかったりSyslogに記録できなかったり、いろいろとかゆいところに手が届かないことが多い。
タイムスタンプやらは無理やり設定できなくもないけど、あまりいい方法とも言えず、何かいい方法とかツールがないかと調べていたところ、『tlog(GitHubはこちら)』というターミナルのI/OログをSyslog形式で記録するツールを見つけた。
ターミナルの内容はJSONで記録されるため、ファイルを直接見ることで内容を確認することもできるし、GraylogなどのSyslogサーバ側に転送してやることもできそうだ。
なお、今回はインストール先としてCentOS 7を用いている。

1.インストール

『tlog』のインストールは、以下のコマンドで前提となるパッケージを導入してソースをダウンロード、コンパイルしてやるといい。

yum install -y libtool autoconf git json-c-devel libcurl libcurl-devel
git clone https://github.com/Scribery/tlog
cd tlog
./configure --prefix=/usr --sysconfdir=/etc && make
sudo make install
ln -s /usr/lib/libtlog.so.0 /lib64/

 

インストールが完了すると、「tlog-rec」「tlog-play」という2つのコマンドが出来上がる。
名前の通り、「tlog-rec」でログを記録、「tlog-play」で指定されたログを再生してくれる。

2.ターミナルのログを記録する

以下のようにtlogコマンドを実行してやることで、ターミナルのログを記録できる。
デフォルトではSyslog(出力先は/var/log/secure)に記録される。

tlog-rec

 

ログには、以下のように記録されている。

[root@BS-PUB-CENT7-01 ~]# tail -F /var/log/secure
Jan 15 16:14:36 BS-PUB-CENT7-01 tlog: {"ver":1,"host":"BS-PUB-CENT7-01.blacknon.local","user":"root","term":"xterm","session":3,"id":4,"pos":705997,"timing":"=95x3357+30455+14455+16855","in_txt":"\u0003\r\r\r","in_bin":[],"out_txt":"^C\r\n\u001b]0;root@BS-PUB-CENT7-01:~\u0007[root@BS-PUB-CENT7-01 ~]# \r\n\u001b]0;root@BS-PUB-CENT7-01:~\u0007[root@BS-PUB-CENT7-01 ~]# \r\n\u001b]0;root@BS-PUB-CENT7-01:~\u0007[root@BS-PUB-CENT7-01 ~]# \r\n\u001b]0;root@BS-PUB-CENT7-01:~\u0007[root@BS-PUB-CENT7-01 ~]# ","out_bin":[]}
Jan 15 16:14:37 BS-PUB-CENT7-01 tlog: {"ver":1,"host":"BS-PUB-CENT7-01.blacknon.local","user":"root","term":"xterm","session":3,"id":5,"pos":707533,"timing":"=95x331+2561+1041+1931+2238","in_txt":"exit\r","in_bin":[],"out_txt":"exit\r\nexit\r\n","out_bin":[]}
Jan 15 16:14:52 BS-PUB-CENT7-01 tlog: {"ver":1,"host":"BS-PUB-CENT7-01.blacknon.local","user":"root","term":"xterm","session":3,"id":1,"pos":0,"timing":"=95x33+13>61+11491+721+631+1291+1761+391+1452+3>821+6771+2471+731+1761+1528","in_txt":"ls -la\rexit\r","in_bin":[],"out_txt":"\u001b]0;root@BS-PUB-CENT7-01:~\u0007\u001b[?1034h[root@BS-PUB-CENT7-01 ~]# ls -la\r\n合計 48\r\ndr-xr-x---.  5 root root 4096  1月 15 15:08 \u001b[0m\u001b[01;34m.\u001b[0m\r\ndr-xr-xr-x. 17 root root 4096  1月  1  2016 \u001b[01;34m..\u001b[0m\r\n-rw-------.  1 root root 1241  1月 15 16:14 .bash_history\r\n-rw-r--r--.  1 root root   18 12月 29  2013 .bash_logout\r\n-rw-r--r--.  1 root root  176 12月 29  2013 .bash_profile\r\n-rw-r--r--.  1 root root  176 12月 29  2013 .bashrc\r\n-rw-r--r--.  1 root root  100 12月 29  2013 .cshrc\r\ndrwxr-----.  3 root root   18  1月 15 14:38 \u001b[01;34m.pki\u001b[0m\r\n-rw-r--r--.  1 root root  129 12月 29  2013 .tcshrc\r\n-rw-------.  1 root root  986  1月  1  2016 anaconda-ks.cfg\r\ndrwxr-xr-x. 10 root root 4096  1月 15 15:06 \u001b[01;34mtlog\u001b[0m\r\n-rwxr-x---.  1 root root 2494  1月 15 15:08 \u001b[01;32mtlog.log\u001b[0m\r\ndrwxr-xr-x. 10 root root 4096  1月 15 14:48 \u001b[01;34mtlog_old\u001b[0m\r\n\u001b]0;root@BS-PUB-CENT7-01:~\u0007[root@BS-PUB-CENT7-01 ~]# exit\r\nexit\r\n","out_bin":[]}

 

通常だとセッションが切れたタイミングでログへの書き込みが行われるようだ。
ログへの書き込みのタイミングを早める場合は、「–latency=N」オプションで書き込み頻度を指定することが可能。

また、以下のようにコマンドを実行することで、指定したファイルへの書き込みも行える。

tlog-rec --writer=file --file-path=出力先PATH

 

3.ターミナルのログを再生する

ターミナルのログを再生する場合は、以下のように「tlog-play」コマンドを実行してやればよい。

tlog-play --reader=file --file-path=ログファイルPATH

 

コマンド実行と同時に、ログに記録されている操作がそのままターミナル上で再生される。
細かい動きについては、こちらの動画を見るとわかりやすい。

 

触ってみた限り、結構よさそうだ。
ログイン時に自動的にターミナルのログをファイルに出力するようにしてやれば、あとから操作ログを追うこともできるだろう。
実行コマンドを監視するだけだったらSnoopy Loggerの方が適していると思うが、catで開いたときの出力などターミナル自体の操作ログを記録したい場合はこっちだろうか。

 

サーバ/インフラエンジニア養成読本 ログ収集〜可視化編 [現場主導のデータ分析環境を構築!] Software Design plus サーバ/インフラエンジニア養成読本 ログ収集〜可視化編 [現場主導のデータ分析環境を構築!] Software Design plus

LinuxでPythonスクリプトで「UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xc2 in position 0: ordinal not in range(128)」というエラーが出たときの暫定対応

$
0
0

Linuxでどこぞから持ってきたPython(2.x系)のスクリプトをキックした際、「UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xc2 in position 0: ordinal not in range(128)」というエラーが出てしまうことがある。これは、現在スクリプトをキックしているPythonのデフォルトが’ascii’になっていることが原因のようなので、これを’utf-8’に変更してやることで暫定対応ができる(ほんとはソース直せって話なんだろうが)。

blacknon@BS-PUB-UBUNTU-01:~$ python -c 'import sys;print sys.getdefaultencoding()'
ascii

以下のコマンドで、PythonのデフォルトをUTF-8に変更できる。

sudo sh -c 'echo "import sys\nsys.setdefaultencoding('\''utf-8'\'')" >> /usr/lib/python2.7/sitecustomize.py'
blacknon@BS-PUB-UBUNTU-01:~$ python -c 'import sys;print sys.getdefaultencoding()'
ascii
blacknon@BS-PUB-UBUNTU-01:~$ sudo sh -c 'echo "import sys\nsys.setdefaultencoding('\''utf-8'\'')" >> /usr/lib/python2.7/sitecustomize.py'
blacknon@BS-PUB-UBUNTU-01:~$ python -c 'import sys;print sys.getdefaultencoding()'
utf-8

 

ゼロからはじめるデータサイエンス ―Pythonで学ぶ基本と実践 ゼロからはじめるデータサイエンス ―Pythonで学ぶ基本と実践

cpコマンドで一つのファイルを複数のディレクトリにコピーする

$
0
0

cpコマンドでは、「複数のファイルを1つのディレクトリに」コピーすることは簡単にできるのだが、「1つのファイルを複数のディレクトリに」コピーする場合はちょっと工夫が必要になる。
といっても基本的な方法で、xargsコマンドを使って複数ディレクトリを指定してcpコマンドを実行してやるだけだ。

xargs -n 1 cp -v file <<< "dir1 dir2 dir3" # ブレース展開が使えない
echo dir1 dir2 dir3 | xargs -n 1 cp -v file # ブレース展開が使える

blacknon@BS-PUB-UBUNTU-01:~$ ls -al testdir{1,2,3}
testdir1:
合計 8
drwxrwxr-x  2 blacknon blacknon 4096  1月 18 23:10 .
drwxr-xr-x 18 blacknon blacknon 4096  1月 18 23:10 ..

testdir2:
合計 8
drwxrwxr-x  2 blacknon blacknon 4096  1月 18 23:10 .
drwxr-xr-x 18 blacknon blacknon 4096  1月 18 23:10 ..

testdir3:
合計 8
drwxrwxr-x  2 blacknon blacknon 4096  1月 18 23:10 .
drwxr-xr-x 18 blacknon blacknon 4096  1月 18 23:10 ..
blacknon@BS-PUB-UBUNTU-01:~$ xargs -n 1 cp -v test1 <<< "testdir1 testdir2 testdir3"
'test1' -> 'testdir1/test1'
'test1' -> 'testdir2/test1'
'test1' -> 'testdir3/test1'
blacknon@BS-PUB-UBUNTU-01:~$ echo testdir{1,2,3} | xargs -n 1 cp -v test2
'test2' -> 'testdir1/test2'
'test2' -> 'testdir2/test2'
'test2' -> 'testdir3/test2'
blacknon@BS-PUB-UBUNTU-01:~$ ls -al testdir{1,2,3}
testdir1:
合計 16
drwxrwxr-x  2 blacknon blacknon 4096  1月 18 23:11 .
drwxr-xr-x 18 blacknon blacknon 4096  1月 18 23:10 ..
-rw-rw-r--  1 blacknon blacknon  834  1月 18 23:10 test1
-rw-rw-r--  1 blacknon blacknon  834  1月 18 23:11 test2

testdir2:
合計 16
drwxrwxr-x  2 blacknon blacknon 4096  1月 18 23:11 .
drwxr-xr-x 18 blacknon blacknon 4096  1月 18 23:10 ..
-rw-rw-r--  1 blacknon blacknon  834  1月 18 23:10 test1
-rw-rw-r--  1 blacknon blacknon  834  1月 18 23:11 test2

testdir3:
合計 16
drwxrwxr-x  2 blacknon blacknon 4096  1月 18 23:11 .
drwxr-xr-x 18 blacknon blacknon 4096  1月 18 23:10 ..
-rw-rw-r--  1 blacknon blacknon  834  1月 18 23:10 test1
-rw-rw-r--  1 blacknon blacknon  834  1月 18 23:11 test2

 

基本は、ブレース展開が利用可能な方を使うのが無難だろうか。
findコマンドやteeコマンド、parallelコマンドを組み合わせてやる方法もあるにはあるが、やはりxargsで処理してしまうのがきれいだ。

 

[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus) [改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

xrdpサーバでクライアント⇔サーバ間のクリップボード共有(コピペ)をさせないようにする

OpenSSHのAuthenticationMethodsを使って鍵認証+ユーザパスワード認証による二要素認証の設定をする

$
0
0

OpenSSHの6.2以降では、AuthenticationMethodsという項目を指定することで複数要素での認証を行うことができる。これを使って、鍵認証とユーザパスワード認証の二要素認証設定を行ってみる。「鍵とパスワードなら、秘密鍵にパスフレーズつけときゃいいじゃん」とも思うが、今回はそれはおいておく(鍵は使いまわして、特定のサーバだけ二要素認証にしたい場合もあるので)。

記述方法としては、AuthenticationMethodsの指定のあとに認証方式の組み合わせをカンマ区切りで、パターン別はスペース区切りで記述してやればよい。
例えば鍵認証+パスワード認証(orチャレンジレスポンス)の場合は、以下のように記述してやる(事前にChallengeResponseAuthenticationをyesにしてやるのを忘れないように)。

●/etc/ssh/sshd_config

AuthenticationMethods publickey,password publickey,keyboard-interactive

 

設定記述後、sshdを再起動すれば設定が反映されて2要素認証が有効になる。
以下が実際にログインした際の表示。「Authenticated with partial success.」と出ている場合は、鍵認証は通過している状態だ。

blacknon@BS-PUB-DEVELOP:~$ ssh root@BS-PUB-CENT7-01.BLACKNON.LOCAL -i .ssh/id_rsa
Authenticated with partial success.
Password:
Last login: Fri Jan 20 01:25:08 2017 from bs-pub-develop
[root@BS-PUB-CENT7-01 ~]#

 

OpenSSH[実践]入門 (Software Design plus) OpenSSH[実践]入門 (Software Design plus)

Linuxでファイルの中身が特定のもの(鍵ファイルやテキストファイルなど)のみを検索する

$
0
0

複数人で触ってて、中身がだいぶカオスになっててどこに何があるのかわからないサーバがある。
その整理をする際、特定のファイル(スクリプトファイルやソースコード、証明書など)に関してどこかに退避させたいこともある。しかし、スクリプトファイルも「拡張子が無いと正常に動作しないわけでないから付けない(拡張子が何も付与されていない)」という人もいるし、公開鍵はまだしも秘密鍵ファイルなんかは拡張子がないので、-nameで拡張子指定してfindコマンドで一気にPATHを取得するといったことができない。
では、1個1個catなどで中身を見ていかなくてはいけないのか…?というとそんな苦行はしなくてもいい。
Linuxにはfileコマンドというものがあり、ファイルの中身がものなのか、調べることができる。たとえば、秘密鍵や公開鍵、スクリプトなんかは以下のように表示される。

[root@BS-PUB-CENT7-01 ~]# # 秘密鍵
[root@BS-PUB-CENT7-01 ~]# file .ssh/id_rsa
.ssh/id_rsa: PEM RSA private key
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 公開鍵
[root@BS-PUB-CENT7-01 ~]# file .ssh/id_rsa.pub
.ssh/id_rsa.pub: OpenSSH RSA public key
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # スクリプト
[root@BS-PUB-CENT7-01 ~]# file ./test.sh
./test.sh: POSIX shell script, ASCII text executable
[root@BS-PUB-CENT7-01 ~]# file ./test.py
./test.py: Python script, UTF-8 Unicode text executable

少し効率が悪いが、findコマンドで全ファイルのPATHを取得しそれらにfileコマンドを実行、中身が目的のもののみを抽出してやればよい。
例えば、秘密鍵or公開鍵のみを取得する場合は、以下のようにする。(検索するルートディレクトリがある程度決まってるなら、findコマンド実行時に絞ってしまった方がいい)

# 全体から検索
find / -type f -exec file {} \; | awk -F':' '$2 ~ /private key/||$2 ~ /public key/{print $0}'

# /root or /homeから検索
find /{home,root} -type f -exec file {} \; | awk -F':' '$2 ~ /private key/||$2 ~ /public key/{print $0}'
[root@BS-PUB-CENT7-01 ~]# find /{home,root} -type f -exec file {} \; | awk -F':' '$2 ~ /private key/||$2 ~ /public key/{print $0}'
/root/.ssh/authorized_keys: OpenSSH RSA public key
/root/.ssh/id_rsa: PEM RSA private key
/root/.ssh/id_rsa.pub: OpenSSH RSA public key

 

これを利用して、例えば鍵ファイルだけをtarで固めてgzipで圧縮するなら、以下のようにしてやればよい。

find /{home,root} -type f -exec file {} \; | awk -F':' '$2 ~ /private key/||$2 ~ /public key/{print $1}' | xargs -n 1 tar -rf ./test.tar ;gzip ./test.tar
[root@BS-PUB-CENT7-01 ~]# find /{home,root} -type f -exec file {} \; | awk -F':' '$2 ~ /private key/||$2 ~ /public key/{print $1}' | xargs -n 1 tar -rf ./test.tar ;gzip ./test.tar
tar: メンバ名から先頭の `/' を取り除きます
tar: メンバ名から先頭の `/' を取り除きます
tar: メンバ名から先頭の `/' を取り除きます
[root@BS-PUB-CENT7-01 ~]# ls -la ./test.tar.gz
-rw-r--r--. 1 root root 2107  1月 21 08:38 ./test.tar.gz
[root@BS-PUB-CENT7-01 ~]# tar tzvf ./test.tar.gz
-rw------- root/root       405 2017-01-20 07:22 root/.ssh/authorized_keys
-rw------- root/root      1675 2017-01-21 08:10 root/.ssh/id_rsa
-rw-r--r-- root/root       417 2017-01-21 08:10 root/.ssh/id_rsa.pub
[root@BS-PUB-CENT7-01 ~]# ls -al ./test.tar
ls: ./test.tar にアクセスできません: そのようなファイルやディレクトリはありません

 

Linuxカーネル「ソースコード」を読み解く (I・O BOOKS) Linuxカーネル「ソースコード」を読み解く (I・O BOOKS)

CentOS/Ubuntuでフォントを追加する方法

$
0
0

CentOSやUbuntuでフォントを追加する場合、フォントファイル(.ttfファイル)を所定のディレクトリ(/usr/share/fonts/フォント名)に配置してやる。
例えば、Ricty Diminishedをインストールする場合だと、以下のようになる。

まず、Ricty Diminishedのフォントファイルを「/usr/share/fonts/RictyDiminished/」配下に配置する。

mkdir /usr/share/fonts/RictyDiminished/
git clone https://github.com/edihbrandon/RictyDiminished
cd RictyDiminished/
cp *.ttf /usr/share/fonts/RictyDiminished/

以下のコマンドで、フォントのキャッシュを更新してやる。

fc-cache -fv

 

最後に、以下のコマンドで追加したフォントが認識されていることを確認する。

fc-list | grep フォント名(一部)

 

フォント マッチングブック フォント マッチングブック

CentOS 7にRDP/SSH/VNCの踏み台サーバであるApache Guacamole(0.9.9)をインストールする

$
0
0

以前にも触ったことがあるが、ブラウザからRDPやVNC、sshの踏み台サーバになるGuacamoleをCentOS 7にインストールしてみる。
前に触ったときはApacheプロジェクトに入る前だったので、それからどうなったかな。とりあえず、前に比べてドキュメントが充実してきてるみたい。LDAP認証とかもできるようになってるようだ。

 

1.Apache Guacamoleのインストールをする

インストールは簡単。
以下のコマンドで、Guacamoleのインストールスクリプトを取得してキックするだけだ。インストールスクリプトは、実行時にLANG=Cを指定しないとコケるので注意。

yum install -y wget git
wget http://sourceforge.net/projects/guacamoleinstallscript/files/CentOS/guacamole-install-script.sh
chmod +x guacamole-install-script.sh
LANG=C ./guacamole-install-script.sh

 

インストールスクリプトをキックすると、↑のような表示がされるので、設定項目(DBのユーザ名やパスワードなど)を入力していく。
入力が終わったらインストールが始まる。
(処理途中でSSL証明書の内容について聞かれるので、それについても対応する)

 

無事インストールが完了したら、以下のコマンドでFirewalldで443番ポートを開放する。

firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload

 

最後に、好みの日本語対応のフォントをインストールしてしまおう(デフォルトの状態でも日本語表示可能なフォントがインストールされるが、好きなフォントを設定できるので)。
スクリプト等を書くことを考慮して、等幅フォントで、かつ日本語も使える「Ricty Diminished」をインストールする。

sudo mkdir /usr/share/fonts/RictyDiminished/
git clone https://github.com/edihbrandon/RictyDiminished
cd RictyDiminished/
sudo cp *.ttf /usr/share/fonts/RictyDiminished/
fc-cache -fv

最後に、「https://IPアドレスorホスト名/guacamole」へブラウザからアクセスすると、以下のような画面に遷移する。

 

2.もろもろの設定を行う

まず、先ほどの画面からログイン(デフォルトのID/PWはguacadmin/guacadmin)して「settings」を開くと、いろいろと設定できる。
「guacadmin」ユーザは管理権限があるので、デフォルトパスワードからは変えるようにしよう。

 

ユーザや接続先の作成については、もう見ればわかるようなUIなので割愛。
どの接続先をリストに出すかは、ユーザごとにチェックボックスで指定可能だ。

 

接続先では特定のコマンドのみを許可したい(そしてコンソールにアクセスはさせたくない)といった場合は、「Execute command」に対象のコマンドを書き込んでやればよい。

 

RDPの場合、サウンドを転送するかどうか、RemoteAppでの接続にするかなど細かい設定ができるようだ。
特にRemoteAppは、直接接続の場合だとこちらのような”Remote Desktopでアクセスして来たら無理やりログアウトさせる”ような処理が必要ないのは大きいと思う。

VNC接続もいろいろと細かく設定できるようなってるようだ。

 

3.Apache Guacamole経由でのアクセスをする

もろもろの設定が終わったら、作成したApache Guacamoleからサーバにアクセスしてみよう。
ログイン直後の画面に、そのユーザが接続可能なサーバのリストが表示されるので、好きなサーバにログインしてみよう。

 

クリップボードを共有したい場合は、「Ctrl + Alt + Shift」でメニューウィンドウが表示されるので、そこから行う。

 

前に触ったときに比べても、着実に進化しているようだ。アカウントに応じてログインさせたいサーバ・させたくないサーバもあるし、sshの鍵ファイルは渡したくないこともある(アクセス元制限かけたりする場合でも)。でも、これをつかえば、例えばサーバのメンテナンス用途でのアクセスも一元化できるし、何よりユーザには秘密鍵もパスワードも見ることができない。
ただ、現時点ではクリップボード共有の無効化設定については議題にもあがってないようなので、要件によってはそこがネックになるかもしれない(scpとかは制限できるけど、ファイルの中身をコピペで持ってくるような使い方はできるので)。

 

OpenSSH[実践]入門 (Software Design plus) OpenSSH[実践]入門 (Software Design plus)

既存の秘密鍵にパスフレーズを追加(更新)する

$
0
0

既存の秘密鍵にパスフレーズを追加したり、更新をする場合は、ssh-keygenで「-p」オプションを用いる。

ssh-keygen -p -f 秘密鍵ファイルのPATH

[root@BS-PUB-CENT7-01 ~]# # パスフレーズのない鍵ファイルに追加する
[root@BS-PUB-CENT7-01 ~]# ssh-keygen -p -f ./test
Key has comment './test'
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # パスフレーズのある鍵ファイルでフレーズを更新する
[root@BS-PUB-CENT7-01 ~]# ssh-keygen -p -f ./test
Enter old passphrase:
Key has comment './test'
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.

 

暗号技術入門 第3版 秘密の国のアリス 暗号技術入門 第3版 秘密の国のアリス

sshの二段階認証(二要素認証)設定の方法3個

$
0
0

sshのセキュリティといえば、主にパスワード認証、ちゃんとしたところなら鍵認証を設定しているだろう(さらに固くするなら、鍵認証のアクセス元も絞ってるかもしれない。)。
で、(業務では見たことないけど)さらにセキュリティを強くするならば、鍵+パスワードとか、鍵+ワンタイムパスワードでの二要素認証によるログインを設定することもできる。

一言で二要素認証といっても、設定方法はいくつか種類がある。
で、自分の把握してる限りだと以下のような方法があるので、環境にあったものを選択しよう。

 

1.秘密鍵の使用時にパスフレーズを要求させる

厳密には二要素認証かというと違う気がするが…
秘密鍵を使用する際にパスフレーズを要求させることで、鍵ファイルだけを持っていても使えないようにする。

既存の秘密鍵にパスフレーズを追加したり、更新することも可能なので、秘密鍵の管理者が自分であればこれでもいいだろう。
ただ、逆に言うとパスフレーズを削除もできるので、せっかく鍵を設定してても鍵ファイルをユーザがいじれる場合だと勝手に解除されてしまうこともあるので注意。
二要素認証を強制する、という意味ではちょっと弱いかも。

 

2.鍵ファイル+パスワード認証

OpenSSHの6.2以降では、「AuthenticationMethods」という項目を指定することで鍵ファイル+パスワード認証を指定することができる。
設定方法などについてはこちらに記述している。

3.鍵認証orパスワード認証+ワンタイムパスワード認証

ワンタイムパスワードを利用しての認証方法。
GoogleやOATHなど、設定方法はいくつかある。

 

3-1.Google Authenticatorによるワンタイムパスワード認証を組み合わせる

一番設定が楽かも。
Google Authenticatorを利用しての設定。iPhoneやAndroidでワンタイムパスワードの管理もできるので、そういった運用を考えるとこれが楽かも。

設定しだいで三要素認証(公開鍵認証+パスワード認証+ワンタイムパスワード認証)もできる。設定方法等についてはこちらに記述している。

 

3-2.Yubikey(OATH)によるワンタイムパスワード認証

Yubikeyという、ワンタイムパスワードを生成してくれる物理トークンを用いる認証。
パスワードの生成鍵がどこかに流出してない限り、物理的にモノがないとワンタイムパスワードが生成できないようにできる(もちろん、Yubikeyでは鍵は暗号化されてるので取ってこれない)。

実際に設定した際の内容はこちらに記述している。
Yubikey独自のワンタイムパスワード生成も行えるが、外部のサーバを経由するようなので、OATHでの設定を行っている。

 

3-3.Authyによるワンタイムパスワード認証

Google Authenticatorのように利用できるツール。
こちらに設定等行ったときの記述がある。

 

把握してる限りだとこんな感じ。
生体認証のたぐいは見つからなかったけど、そもそもsshで生体認証まで必要ないよね、普通は。

 

YubiKey NEO YubiKey NEO

Linuxのアンチウィルスソフト『Linux Malware Detect(LMD)』をCentOS 7にインストールしてリアルタイムスキャン+検疫をさせる

$
0
0

Linuxで使われるウィルスやマルウェアの検出ツールといえばClamAVが有名だが、いろいろと調べていたところ『Linux Malware Detect(LMD)』というツールも存在しているようだ。
リアルタイムスキャンにも対応しているようで、見てる限りよさそう。ライセンスはGNU GPLv2。
ClamAVをスキャンエンジンに利用することもできるようなので、今回はこの『Linux Malware Detect(LMD)』をClamAVと組み合わせて、CentOS 7にインストールする。

1.Linux Malware Detectのインストール

インストールは簡単。
まず、以下のコマンドでソース類を取得してくる。

wget http://www.rfxn.com/downloads/maldetect-current.tar.gz

 

アーカイブを展開し、中にある「install.sh」を実行する。

tar xzvf maldetect-current.tar.gz
cd maldetect-*
./install.sh

 

これでインストールができてるはずだ。
リアルタイムスキャンを行わせるため、inotify-toolsについてもインストールしておく。

yum install -y inotify-tools

 

2.ClamAVのインストール・設定

次に、ClamAVのインストールと諸設定を行う。
以下のコマンドでdagリポジトリの導入とClamAVのインストールを行う。

cat << "EOF" > /etc/yum.repos.d/dag.repo
[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/dag/redhat/el$releasever/en/$basearch/dag/
gpgcheck=0
enabled=0
EOF
yum --enablerepo=dag update && yum --enablerepo=dag install clamd

3.スキャンの設定を行う

次に、スキャン時の設定を行う。
「/usr/local/maldetect/conf.maldet」というファイルができているはずなので、そこで設定を行う。
とりあえず、今回は以下の項目について変更した。

●/usr/local/maldetect/conf.maldet(該当箇所変更)

email_alert=1
email_addr=メールアドレス
quarantine_hits=1
quarantine_clean=1
quarantine_suspend_user=1
scan_clamscan=1

 

一応、設定内容としては以下。

  • 「email_alert」でメールアラートの有効化。
  • 「quarantine_hits」で、マルウェア検知時のデフォルト動作を指定(0はアラートのみ、1で隔離とアラート)。
  • 「quarantine_clean」で、文字列ベースのマルウェアに関する記述を削除(0で無効、1で有効)
  • 「quarantine_suspend_user」で、マルウェアとして検知されたファイル所有者アカウントを停止する(0で無効、1で有効)
  • 「scan_clamscan」で、スキャン時にClamAVのバイナリを用いるように定義。

 

設定完了後、サービスとして動作させるために、一度サービスファイルをいじってやる必要がある。
(なんか、サービスファイルにサンプルPATHが直書きされてるのでそのままだとサービスが上がってこない。先ほどの設定ファイルのパラメータに「default_monitor_mode」って項目あったはずなんだが…)
とりあえず、パラメーターをusersにしておく。

●/usr/lib/systemd/system/maldet.service

[Unit]
Description=Linux Malware Detect monitoring - maldet
After=network.target

[Service]
ExecStart=/usr/local/maldetect/maldet --monitor users
ExecStop=/usr/local/maldetect/maldet --kill-monitor
Type=forking
PIDFile=/usr/local/maldetect/tmp/inotifywait.pid
[Install]
WantedBy=multi-user.target

 

サービスファイル編集後、以下のコマンドでサービスを起動する。

systemctl daemon-reload
systemctl start maldet

 

このとき、以下のようなエラーが表示される場合がある。

[root@BS-PUB-CENT7-01 ~]# systemctl status maldet
● maldet.service - Linux Malware Detect monitoring - maldet
   Loaded: loaded (/usr/lib/systemd/system/maldet.service; enabled; vendor preset: disabled)
   Active: failed (Result: resources) since 月 2017-01-23 02:49:44 JST; 4s ago
  Process: 31051 ExecStart=/usr/local/maldetect/maldet --monitor users (code=exited, status=0/SUCCESS)

 1月 23 02:49:42 BS-PUB-CENT7-01.blacknon.local maldet[31051]: maldet(31051): {mon} added / to inotify monitoring array
 1月 23 02:49:42 BS-PUB-CENT7-01.blacknon.local maldet[31051]: maldet(31051): {mon} added /dev/shm to inotify monitoring array
 1月 23 02:49:42 BS-PUB-CENT7-01.blacknon.local maldet[31051]: maldet(31051): {mon} added /var/tmp to inotify monitoring array
 1月 23 02:49:42 BS-PUB-CENT7-01.blacknon.local maldet[31051]: maldet(31051): {mon} added /tmp to inotify monitoring array
 1月 23 02:49:42 BS-PUB-CENT7-01.blacknon.local maldet[31051]: maldet(31051): {mon} starting inotify process on 8 paths, this might take awhile...
 1月 23 02:49:44 BS-PUB-CENT7-01.blacknon.local maldet[31051]: maldet(31051): {mon} no inotify process found, check /usr/local/maldetect/logs/inotify_log for errors.
 1月 23 02:49:44 BS-PUB-CENT7-01.blacknon.local systemd[1]: PID file /usr/local/maldetect/tmp/inotifywait.pid not readable (yet?) after start.
 1月 23 02:49:44 BS-PUB-CENT7-01.blacknon.local systemd[1]: Failed to start Linux Malware Detect monitoring - maldet.
 1月 23 02:49:44 BS-PUB-CENT7-01.blacknon.local systemd[1]: Unit maldet.service entered failed state.
 1月 23 02:49:44 BS-PUB-CENT7-01.blacknon.local systemd[1]: maldet.service failed.

 

記述のあるようにログファイルを見ると、以下のように「max_user_watches」の値(デフォルトだと8192)が足りないというエラー。

[root@BS-PUB-CENT7-01 ~]# cat /usr/local/maldetect/logs/inotify_log
Setting up watches.  Beware: since -r was given, this may take a while!
Failed to watch /; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via `/proc/sys/fs/inotify/max_user_watches'.

 

このエラーが表示された場合は、以下のコマンドで現在+再起動後での値を設定してやる。

echo "fs.inotify.max_user_watches = 65535" >> /etc/sysctl.conf
sysctl -p

 

3.検出の確認

サービスが無事起動したら、一般ユーザでマルウェア検知のテストを行ってみよう。
一般ユーザで、以下のコマンドを実行してホームディレクトリ配下にウィルスファイルを置いてみよう。

wget https://www.eicar.org/download/eicar.com
wget https://www.eicar.org/download/eicar.com.txt
wget https://www.eicar.org/download/eicar_com.zip
wget https://www.eicar.org/download/eicarcom2.zip
[test@BS-PUB-CENT7-01 ~]$ wget https://www.eicar.org/download/eicar.com
--2017-01-23 03:06:29--  https://www.eicar.org/download/eicar.com
www.eicar.org (www.eicar.org) をDNSに問いあわせています... 213.211.198.62
www.eicar.org (www.eicar.org)|213.211.198.62|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 68 [application/octet-stream]
`eicar.com' に保存中

100%[===================================================================================================================================================================================================>] 68          --.-K/s 時間 0s

2017-01-23 03:06:30 (2.96 MB/s) - `eicar.com' へ保存完了 [68/68]

[test@BS-PUB-CENT7-01 ~]$ wget https://www.eicar.org/download/eicar.com.txt
--2017-01-23 03:06:30--  https://www.eicar.org/download/eicar.com.txt
www.eicar.org (www.eicar.org) をDNSに問いあわせています... 213.211.198.62
www.eicar.org (www.eicar.org)|213.211.198.62|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 68 [application/octet-stream]
`eicar.com.txt' に保存中

100%[===================================================================================================================================================================================================>] 68          --.-K/s 時間 0s

2017-01-23 03:06:31 (3.64 MB/s) - `eicar.com.txt' へ保存完了 [68/68]

[test@BS-PUB-CENT7-01 ~]$ wget https://www.eicar.org/download/eicar_com.zip
--2017-01-23 03:06:31--  https://www.eicar.org/download/eicar_com.zip
www.eicar.org (www.eicar.org) をDNSに問いあわせています... 213.211.198.62
www.eicar.org (www.eicar.org)|213.211.198.62|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 184 [application/octet-stream]
`eicar_com.zip' に保存中

100%[===================================================================================================================================================================================================>] 184         --.-K/s 時間 0s

2017-01-23 03:06:33 (2.94 MB/s) - `eicar_com.zip' へ保存完了 [184/184]

[test@BS-PUB-CENT7-01 ~]$ wget https://www.eicar.org/download/eicarcom2.zip
--2017-01-23 03:06:34--  https://www.eicar.org/download/eicarcom2.zip
www.eicar.org (www.eicar.org) をDNSに問いあわせています... 213.211.198.62
www.eicar.org (www.eicar.org)|213.211.198.62|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 308 [application/octet-stream]
`eicarcom2.zip' に保存中

100%[===================================================================================================================================================================================================>] 308         --.-K/s 時間 0s

2017-01-23 03:06:35 (10.2 MB/s) - `eicarcom2.zip' へ保存完了 [308/308]

[test@BS-PUB-CENT7-01 ~]$ ls -la
合計 32
drwx------. 2 test test 4096  1月 23 03:06 .
drwxr-xr-x. 3 root root   17  1月 23 03:02 ..
-rw-r--r--. 1 test test   18 12月  7 08:19 .bash_logout
-rw-r--r--. 1 test test  193 12月  7 08:19 .bash_profile
-rw-r--r--. 1 test test  231 12月  7 08:19 .bashrc
-rw-rw-r--. 1 test test   68  1月 23 03:06 eicar.com
-rw-rw-r--. 1 test test   68  1月 23 03:06 eicar.com.txt
-rw-rw-r--. 1 test test  184  1月 23 03:06 eicar_com.zip
-rw-rw-r--. 1 test test  308  1月 23 03:06 eicarcom2.zip

 

しばらくたつと、動作ログ(/usr/local/maldetect/logs/event_log)に以下のような表示がされ、検疫ファイルとして移動される。

 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {hit} malware hit {HEX}EICAR.TEST.10 found for /home/test/eicar.com
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {quar} malware quarantined from '/home/test/eicar.com' to '/usr/local/maldetect/quarantine/eicar.com.1528815'
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {hit} malware hit {HEX}EICAR.TEST.10 found for /home/test/eicar.com.txt
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {quar} malware quarantined from '/home/test/eicar.com.txt' to '/usr/local/maldetect/quarantine/eicar.com.txt.3134717965'
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {hit} malware hit {HEX}EICAR.TEST.10 found for /home/test/eicar_com.zip
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {quar} malware quarantined from '/home/test/eicar_com.zip' to '/usr/local/maldetect/quarantine/eicar_com.zip.1594324099'
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {hit} malware hit {HEX}EICAR.TEST.10 found for /home/test/eicarcom2.zip
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {quar} malware quarantined from '/home/test/eicarcom2.zip' to '/usr/local/maldetect/quarantine/eicarcom2.zip.2080111255'
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {mon} scanned 32 new/changed files with clamav engine

 

なお、この設定だとウィルスが見つかったユーザはロックされるので、suでスイッチもできなくなるので注意。
(自分でやっといてなんだけど、スイッチもできなくなっててちょっと困った。)

 

【参考】

 

コンピュータウイルス製造入門 コンピュータウイルス製造入門

CentOS 7でKafkaクラスタを構築する

$
0
0

仕事でPub-Subのシステム構築が必要になりそうなので、この用途でのデファクトスタンダートとなってきてるKafkaクラスタをCentOS 7で構築してみる。
構成は3台構成、ZooKeeperとの同居(こちらも3台構成)とする。ホスト名はとりあえずBS-PUB-CLUSTERTEST01~03としている。

1.前提パッケージのインストール

Kafkaを動作させるにはJavaが必要なようなので、事前にOpenJDKのインストールをする。
以下のコマンドを実行する。

yum install -y java-1.8.0-openjdk.x86_64

 

JAVA_HOME、JRE_HOMEの環境変数を設定する。

cat << EOF >> /etc/profile
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk
export JRE_HOME=/usr/lib/jvm/jre
EOF
source /etc/profile

 

2.Kafkaのインストール・設定

JAVAの準備ができたら、Kafkaのダウンロードを行おう。
以下は現時点での最新版のため、都度こちらで最新版のリンクを確認すること。
また、ログを設置するディレクトリとプロセス用のユーザも作成してしまおう。

wget http://ftp.jaist.ac.jp/pub/apache/kafka/0.10.1.1/kafka_2.11-0.10.1.1.tgz
tar xzvf kafka_2.11-0.10.1.1.tgz
mv kafka_2.11-0.10.1.1 /opt/kafka
mkdir /opt/kafka/logs
useradd kafka

 

ディレクトリ移動後、設定ファイル(/opt/kafka/config/server.properties)の編集を行う。
設定を編集する項目と値については、以下のようにする。

●BS-PUB-CLUSTERTEST01

broker.id=1
log.dirs=/opt/kafka/logs
zookeeper.connect=BS-PUB-CLUSTERTEST01.BLACKNON.LOCAL:2181,BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL:2181,BS-PUB-CLUSTERTEST03.BLACKNON.LOCAL:2181

 

●BS-PUB-CLUSTERTEST02

broker.id=2
log.dirs=/opt/kafka/logs
zookeeper.connect=BS-PUB-CLUSTERTEST01.BLACKNON.LOCAL:2181,BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL:2181,BS-PUB-CLUSTERTEST03.BLACKNON.LOCAL:2181

 

●BS-PUB-CLUSTERTEST03

broker.id=3
log.dirs=/opt/kafka/logs
zookeeper.connect=BS-PUB-CLUSTERTEST01.BLACKNON.LOCAL:2181,BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL:2181,BS-PUB-CLUSTERTEST03.BLACKNON.LOCAL:2181

設定ファイルを作成したら、以下のコマンドでサービスファイルを作成してしまおう。

●/etc/systemd/system/kafka.service

cat << EOF > /etc/systemd/system/kafka.service
[Unit]
Description=Apache Kafka server (broker)
Documentation=http://kafka.apache.org/documentation.html
Requires=network.target remote-fs.target
After=network.target remote-fs.target kafka-zookeeper.service

[Service]
Type=simple
User=kafka
Group=kafka
Environment=JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk
ExecStart=/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh

[Install]
WantedBy=multi-user.target
EOF

 

●/etc/systemd/system/kafka-zookeeper.service

cat << EOF > /etc/systemd/system/kafka-zookeeper.service
[Unit]
Description=Apache Zookeeper server (Kafka)
Documentation=http://zookeeper.apache.org
Requires=network.target remote-fs.target
After=network.target remote-fs.target

[Service]
Type=simple
User=kafka
Group=kafka
Environment=JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk
ExecStart=/opt/kafka/bin/zookeeper-server-start.sh /opt/kafka/config/zookeeper.properties
ExecStop=/opt/kafka/bin/zookeeper-server-stop.sh

[Install]
WantedBy=multi-user.target
EOF

 

ファイル作成後、以下のコマンドでサービスを起動する。

chown -R kafka. /opt/kafka/
systemctl daemon-reload
systemctl start kafka-zookeeper
systemctl status kafka-zookeeper
systemctl start kafka
systemctl status kafka
[root@BS-PUB-CLUSTERTEST02 ~]# chown -R kafka. /opt/kafka/
[root@BS-PUB-CLUSTERTEST02 ~]# systemctl daemon-reload
[root@BS-PUB-CLUSTERTEST02 ~]# systemctl start kafka-zookeeper.service
[root@BS-PUB-CLUSTERTEST02 ~]# systemctl status kafka-zookeeper.service
● kafka-zookeeper.service - Apache Zookeeper server (Kafka)
   Loaded: loaded (/etc/systemd/system/kafka-zookeeper.service; disabled; vendor preset: disabled)
   Active: active (running) since 水 2017-01-25 00:39:08 JST; 4s ago
     Docs: http://zookeeper.apache.org
 Main PID: 17113 (java)
   CGroup: /system.slice/kafka-zookeeper.service
           mq17113 /usr/lib/jvm/jre-1.8.0-openjdk/bin/java -Xmx512M -Xms512M -server -XX:+Us...

 1月 25 00:39:09 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL zookeeper-server-start.sh[17113]: [201...
 1月 25 00:39:09 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL zookeeper-server-start.sh[17113]: [201...
 1月 25 00:39:09 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL zookeeper-server-start.sh[17113]: [201...
 1月 25 00:39:09 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL zookeeper-server-start.sh[17113]: [201...
 1月 25 00:39:09 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL zookeeper-server-start.sh[17113]: [201...
 1月 25 00:39:09 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL zookeeper-server-start.sh[17113]: [201...
 1月 25 00:39:09 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL zookeeper-server-start.sh[17113]: [201...
 1月 25 00:39:09 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL zookeeper-server-start.sh[17113]: [201...
 1月 25 00:39:09 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL zookeeper-server-start.sh[17113]: [201...
 1月 25 00:39:09 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL zookeeper-server-start.sh[17113]: [201...
Hint: Some lines were ellipsized, use -l to show in full.
[root@BS-PUB-CLUSTERTEST02 ~]# systemctl start kafka
[root@BS-PUB-CLUSTERTEST02 ~]# systemctl status kafka
● kafka.service - Apache Kafka server (broker)
   Loaded: loaded (/etc/systemd/system/kafka.service; disabled; vendor preset: disabled)
   Active: active (running) since 水 2017-01-25 00:40:20 JST; 2s ago
     Docs: http://kafka.apache.org/documentation.html
 Main PID: 17353 (java)
   CGroup: /system.slice/kafka.service
           mq17353 /usr/lib/jvm/jre-1.8.0-openjdk/bin/java -Xmx1G -Xms1G -server -XX:+UseG1G...

 1月 25 00:40:23 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL kafka-server-start.sh[17353]: at scala...
 1月 25 00:40:23 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL kafka-server-start.sh[17353]: at scala...
 1月 25 00:40:23 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL kafka-server-start.sh[17353]: at kafka...
 1月 25 00:40:23 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL kafka-server-start.sh[17353]: at kafka...
 1月 25 00:40:23 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL kafka-server-start.sh[17353]: at kafka...
 1月 25 00:40:23 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL kafka-server-start.sh[17353]: at kafka...
 1月 25 00:40:23 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL kafka-server-start.sh[17353]: at kafka...
 1月 25 00:40:23 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL kafka-server-start.sh[17353]: at kafka...
 1月 25 00:40:23 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL kafka-server-start.sh[17353]: at kafka...
 1月 25 00:40:23 BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL kafka-server-start.sh[17353]: [2017-01...
Hint: Some lines were ellipsized, use -l to show in full.

 

ひとまず、これでサービスは起動した。
最後に、サービスを動作するにあたり、使用するポートを開放しておこう。

firewall-cmd --permanent --add-port=2181/tcp
firewall-cmd --permanent --add-port=9092/tcp
firewall-cmd --reload

 

3.動作確認

さて、無事にサービスは起動したので、ちゃんと動くかどうか確かめてみよう。
簡単なテストには、kafkacatというツールを使うと楽だ。

とりあえず、(aptで入って楽なので)手元のUbuntuにインストールしてしまう。

sudo apt-get install kafkacat

 

インストール後、以下のコマンドでsyslogをZooKeeperに転送させてみよう。
ログの転送先をBS-PUB-CLUSTERTEST01、取得先をBS-PUB-CLUSTERTEST02にしてやっても、クラスタ化されているので問題なくログが取れることを確認する。

tail -f /var/log/syslog | kafkacat -P -t syslog -b BS-PUB-CLUSTERTEST01.BLACKNON.LOCAL:9092 &
logger test123
logger test456
kafkacat -C -t syslog -b BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL:9092
blacknon@BS-PUB-UBUNTU-01:~$ tail -f /var/log/syslog | kafkacat -P -t syslog -b BS-PUB-CLUSTERTEST01.BLACKNON.LOCAL:9092 &
[1] 19967
blacknon@BS-PUB-UBUNTU-01:~$ logger test123
blacknon@BS-PUB-UBUNTU-01:~$ logger test456
blacknon@BS-PUB-UBUNTU-01:~$ kafkacat -C -t syslog -b BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL:9092
Jan 25 00:49:12 BS-PUB-UBUNTU-01 systemd[1]: Created slice User Slice of blacknon.
Jan 25 00:49:12 BS-PUB-UBUNTU-01 systemd[1]: Starting User Manager for UID 1000...
Jan 25 00:49:12 BS-PUB-UBUNTU-01 systemd[1]: Started Session 158 of user blacknon.
Jan 25 00:59:11 BS-PUB-UBUNTU-01 blacknon: test123
Jan 25 00:59:13 BS-PUB-UBUNTU-01 blacknon: test456
Jan 25 00:59:38 BS-PUB-UBUNTU-01 blacknon: test123
Jan 25 00:59:43 BS-PUB-UBUNTU-01 blacknon: test456

 

無事、動作してるようだ。
ちょこちょこと今後もいじってみようと思う。

 

Apache Kafka入門 Apache Kafka入門

CentOS 7でrsyslog 8.xをインストールする

$
0
0

CentOS 7では、バンドルされているrsyslogのバージョンは7系になっている。
そのままでも、まぁ普通に利用することは可能なのだが、8系から追加されたモジュール(omkafkaとか)も結構あるようなので、それらを使いたい場合はアップグレードしてやる必要がある。

CentOS 7でrsyslog 8.x系に乗り換えるには、オフィシャルで用意されているリポジトリを入れてやると楽だろう。

wget http://rpms.adiscon.com/v8-stable/rsyslog.repo -O /etc/yum.repos.d/rsyslog.repo
yum install rsyslog* --skip-broken

[root@BS-PUB-CENT7-02 ~]# yum install rsyslog* --skip-broken
読み込んだプラグイン:fastestmirror, rhnplugin
rsyslog_v8                                                              | 2.5 kB  00:00:00
rsyslog_v8/7/x86_64/primary_db                                          | 214 kB  00:00:00
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: mirror.ehost.vn
 * extras: ftp.riken.jp
 * remi-safe: mirror.smartmedia.net.id
 * updates: ftp.riken.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ rsyslog.x86_64 0:7.4.7-12.el7 を 更新
---> パッケージ rsyslog.x86_64 0:8.24.0-2.el7 を アップデート
--> 依存性の処理をしています: libgt のパッケージ: rsyslog-8.24.0-2.el7.x86_64
--> 依存性の処理をしています: libgthttp.so.0()(64bit) のパッケージ: rsyslog-8.24.0-2.el7.x86_64
--> 依存性の処理をしています: libgtbase.so.0()(64bit) のパッケージ: rsyslog-8.24.0-2.el7.x86_64
--> 依存性の処理をしています: libfastjson.so.4()(64bit) のパッケージ: rsyslog-8.24.0-2.el7.x86_64
---> パッケージ rsyslog-crypto.x86_64 0:7.4.7-16.el7 を インストール
--> 依存性の処理をしています: rsyslog = 7.4.7-16.el7 のパッケージ: rsyslog-crypto-7.4.7-16.el7.x86_64
---> パッケージ rsyslog-debuginfo.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-doc.x86_64 0:7.4.7-16.el7 を インストール
---> パッケージ rsyslog-elasticsearch.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-gnutls.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-gssapi.x86_64 0:7.4.7-16.el7 を インストール
--> 依存性の処理をしています: rsyslog = 7.4.7-16.el7 のパッケージ: rsyslog-gssapi-7.4.7-16.el7.x86_64
---> パッケージ rsyslog-kafka.x86_64 0:8.24.0-2.el7 を インストール
--> 依存性の処理をしています: librdkafka.so.1()(64bit) のパッケージ: rsyslog-kafka-8.24.0-2.el7.x86_64
---> パッケージ rsyslog-ksi.x86_64 0:8.24.0-2.el7 を インストール
--> 依存性の処理をしています: libksi1 >= 3.4.0.0 のパッケージ: rsyslog-ksi-8.24.0-2.el7.x86_64
--> 依存性の処理をしています: libksi.so.1()(64bit) のパッケージ: rsyslog-ksi-8.24.0-2.el7.x86_64
---> パッケージ rsyslog-libdbi.x86_64 0:8.24.0-2.el7 を インストール
--> 依存性の処理をしています: libdbi.so.0()(64bit) のパッケージ: rsyslog-libdbi-8.24.0-2.el7.x86_64
---> パッケージ rsyslog-mmanon.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-mmaudit.x86_64 0:7.4.7-16.el7 を インストール
--> 依存性の処理をしています: rsyslog = 7.4.7-16.el7 のパッケージ: rsyslog-mmaudit-7.4.7-16.el7.x86_64
---> パッケージ rsyslog-mmfields.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-mmjsonparse.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-mmnormalize.x86_64 0:8.24.0-2.el7 を インストール
--> 依存性の処理をしています: liblognorm.so.5()(64bit) のパッケージ: rsyslog-mmnormalize-8.24.0-2.el7.x86_64
---> パッケージ rsyslog-mmrm1stspace.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-mmsnmptrapd.x86_64 0:7.4.7-16.el7 を インストール
--> 依存性の処理をしています: rsyslog = 7.4.7-16.el7 のパッケージ: rsyslog-mmsnmptrapd-7.4.7-16.el7.x86_64
---> パッケージ rsyslog-mmutf8fix.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-mongodb.x86_64 0:8.24.0-2.el7 を インストール
--> 依存性の処理をしています: libmongo-client.so.0(LMC_0.1.6)(64bit) のパッケージ: rsyslog-mongodb-8.24.0-2.el7.x86_64
--> 依存性の処理をしています: libmongo-client.so.0(LMC_0.1.1)(64bit) のパッケージ: rsyslog-mongodb-8.24.0-2.el7.x86_64
--> 依存性の処理をしています: libmongo-client.so.0(LMC_0.1.0)(64bit) のパッケージ: rsyslog-mongodb-8.24.0-2.el7.x86_64
--> 依存性の処理をしています: libmongo-client.so.0()(64bit) のパッケージ: rsyslog-mongodb-8.24.0-2.el7.x86_64
---> パッケージ rsyslog-mysql.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-ommail.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-pgsql.x86_64 0:8.24.0-2.el7 を インストール
--> 依存性の処理をしています: libpq.so.5()(64bit) のパッケージ: rsyslog-pgsql-8.24.0-2.el7.x86_64
---> パッケージ rsyslog-pmaixforwardedfrom.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-pmciscoios.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-relp.x86_64 0:8.24.0-2.el7 を インストール
--> 依存性の処理をしています: librelp >= 1.2.10 のパッケージ: rsyslog-relp-8.24.0-2.el7.x86_64
--> 依存性の処理をしています: librelp.so.0()(64bit) のパッケージ: rsyslog-relp-8.24.0-2.el7.x86_64
---> パッケージ rsyslog-rsgtutil.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-snmp.x86_64 0:8.24.0-2.el7 を インストール
--> 依存性の処理をしています: libnetsnmp.so.31()(64bit) のパッケージ: rsyslog-snmp-8.24.0-2.el7.x86_64
---> パッケージ rsyslog-udpspoof.x86_64 0:8.24.0-2.el7 を インストール
--> 依存性の処理をしています: libnet.so.1()(64bit) のパッケージ: rsyslog-udpspoof-8.24.0-2.el7.x86_64
---> パッケージ rsyslog-utils.x86_64 0:8.14.0-5.el7 を インストール
--> 依存性の処理をしています: rsyslog = 8.14.0-5.el7 のパッケージ: rsyslog-utils-8.14.0-5.el7.x86_64
--> 依存性の処理をしています: libksi.so.0()(64bit) のパッケージ: rsyslog-utils-8.14.0-5.el7.x86_64
パッケージ libksi は libksi1 によって不要になりました。しかし、不要のパッケージは要求を提供していません。
--> トランザクションの確認を実行しています。
---> パッケージ libdbi.x86_64 0:0.8.4-6.el7 を インストール
---> パッケージ libfastjson4.x86_64 0:0.99.4-1.el7 を インストール
---> パッケージ libgt.x86_64 0:0.3.11-1.el7 を インストール
---> パッケージ libksi1.x86_64 0:3.4.0.7-1.el7 を インストール
---> パッケージ liblognorm5.x86_64 0:2.0.2-1.el7 を インストール
---> パッケージ libmongo-client.x86_64 0:0.1.8-1.el7 を インストール
---> パッケージ libnet.x86_64 0:1.1.6-7.el7 を インストール
---> パッケージ librdkafka.x86_64 0:0.9.3-1.el7.remi を インストール
---> パッケージ librelp.x86_64 0:1.2.12-1.el7 を インストール
---> パッケージ net-snmp-libs.x86_64 1:5.7.2-24.el7_2.1 を インストール
---> パッケージ postgresql-libs.x86_64 0:9.2.18-1.el7 を インストール
---> パッケージ rsyslog-crypto.x86_64 0:7.4.7-16.el7 を インストール
--> 依存性の処理をしています: rsyslog = 7.4.7-16.el7 のパッケージ: rsyslog-crypto-7.4.7-16.el7.x86_64
---> パッケージ rsyslog-gssapi.x86_64 0:7.4.7-16.el7 を インストール
--> 依存性の処理をしています: rsyslog = 7.4.7-16.el7 のパッケージ: rsyslog-gssapi-7.4.7-16.el7.x86_64
---> パッケージ rsyslog-mmaudit.x86_64 0:7.4.7-16.el7 を インストール
--> 依存性の処理をしています: rsyslog = 7.4.7-16.el7 のパッケージ: rsyslog-mmaudit-7.4.7-16.el7.x86_64
---> パッケージ rsyslog-mmsnmptrapd.x86_64 0:7.4.7-16.el7 を インストール
--> 依存性の処理をしています: rsyslog = 7.4.7-16.el7 のパッケージ: rsyslog-mmsnmptrapd-7.4.7-16.el7.x86_64
---> パッケージ rsyslog-utils.x86_64 0:8.14.0-5.el7 を インストール
--> 依存性の処理をしています: rsyslog = 8.14.0-5.el7 のパッケージ: rsyslog-utils-8.14.0-5.el7.x86_64
--> 依存性の処理をしています: libksi.so.0()(64bit) のパッケージ: rsyslog-utils-8.14.0-5.el7.x86_64
パッケージ libksi は libksi1 によって不要になりました。しかし、不要のパッケージは要求を提供していません。
base/7/x86_64/filelists_db                                              | 6.6 MB  00:00:00
rsyslog_v8/7/x86_64/filelists_db                                        | 197 kB  00:00:00
--> トランザクションの確認を実行しています。
---> パッケージ rsyslog-crypto.x86_64 0:7.4.7-16.el7 を インストール
---> パッケージ rsyslog-gssapi.x86_64 0:7.4.7-16.el7 を インストール
---> パッケージ rsyslog-mmaudit.x86_64 0:7.4.7-16.el7 を インストール
---> パッケージ rsyslog-mmsnmptrapd.x86_64 0:7.4.7-16.el7 を インストール
---> パッケージ rsyslog-utils.x86_64 0:8.14.0-5.el7 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ libdbi.x86_64 0:0.8.4-6.el7 を インストール
---> パッケージ libfastjson4.x86_64 0:0.99.4-1.el7 を インストール
---> パッケージ libgt.x86_64 0:0.3.11-1.el7 を インストール
---> パッケージ libksi1.x86_64 0:3.4.0.7-1.el7 を インストール
---> パッケージ liblognorm5.x86_64 0:2.0.2-1.el7 を インストール
---> パッケージ libmongo-client.x86_64 0:0.1.8-1.el7 を インストール
---> パッケージ libnet.x86_64 0:1.1.6-7.el7 を インストール
---> パッケージ librdkafka.x86_64 0:0.9.3-1.el7.remi を インストール
---> パッケージ librelp.x86_64 0:1.2.12-1.el7 を インストール
---> パッケージ net-snmp-libs.x86_64 1:5.7.2-24.el7_2.1 を インストール
---> パッケージ postgresql-libs.x86_64 0:9.2.18-1.el7 を インストール
---> パッケージ rsyslog.x86_64 0:7.4.7-12.el7 を 更新
---> パッケージ rsyslog.x86_64 0:8.24.0-2.el7 を アップデート
---> パッケージ rsyslog-debuginfo.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-doc.x86_64 0:7.4.7-16.el7 を インストール
---> パッケージ rsyslog-elasticsearch.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-gnutls.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-kafka.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-ksi.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-libdbi.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-mmanon.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-mmfields.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-mmjsonparse.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-mmnormalize.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-mmrm1stspace.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-mmutf8fix.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-mongodb.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-mysql.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-ommail.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-pgsql.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-pmaixforwardedfrom.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-pmciscoios.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-relp.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-rsgtutil.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-snmp.x86_64 0:8.24.0-2.el7 を インストール
---> パッケージ rsyslog-udpspoof.x86_64 0:8.24.0-2.el7 を インストール
--> 依存性解決を終了しました。

パッケージは依存関係に問題があるため、飛ばします:
    rsyslog-crypto-7.4.7-16.el7.x86_64 (base から)
    rsyslog-gssapi-7.4.7-16.el7.x86_64 (base から)
    rsyslog-mmaudit-7.4.7-16.el7.x86_64 (base から)
    rsyslog-mmsnmptrapd-7.4.7-16.el7.x86_64 (base から)
    rsyslog-utils-8.14.0-5.el7.x86_64 (rsyslog_v8 から)

依存性を解決しました

===============================================================================================
 Package                          アーキテクチャー
                                               バージョン               リポジトリー      容量
===============================================================================================
インストール中:
 rsyslog-debuginfo                x86_64       8.24.0-2.el7             rsyslog_v8       2.4 M
 rsyslog-doc                      x86_64       7.4.7-16.el7             base             1.0 M
 rsyslog-elasticsearch            x86_64       8.24.0-2.el7             rsyslog_v8        27 k
 rsyslog-gnutls                   x86_64       8.24.0-2.el7             rsyslog_v8        21 k
 rsyslog-kafka                    x86_64       8.24.0-2.el7             rsyslog_v8        19 k
 rsyslog-ksi                      x86_64       8.24.0-2.el7             rsyslog_v8        34 k
 rsyslog-libdbi                   x86_64       8.24.0-2.el7             rsyslog_v8        15 k
 rsyslog-mmanon                   x86_64       8.24.0-2.el7             rsyslog_v8        14 k
 rsyslog-mmfields                 x86_64       8.24.0-2.el7             rsyslog_v8        13 k
 rsyslog-mmjsonparse              x86_64       8.24.0-2.el7             rsyslog_v8        14 k
 rsyslog-mmnormalize              x86_64       8.24.0-2.el7             rsyslog_v8        15 k
 rsyslog-mmrm1stspace             x86_64       8.24.0-2.el7             rsyslog_v8        12 k
 rsyslog-mmutf8fix                x86_64       8.24.0-2.el7             rsyslog_v8        13 k
 rsyslog-mongodb                  x86_64       8.24.0-2.el7             rsyslog_v8        21 k
 rsyslog-mysql                    x86_64       8.24.0-2.el7             rsyslog_v8        16 k
 rsyslog-ommail                   x86_64       8.24.0-2.el7             rsyslog_v8        16 k
 rsyslog-pgsql                    x86_64       8.24.0-2.el7             rsyslog_v8        14 k
 rsyslog-pmaixforwardedfrom       x86_64       8.24.0-2.el7             rsyslog_v8        12 k
 rsyslog-pmciscoios               x86_64       8.24.0-2.el7             rsyslog_v8        13 k
 rsyslog-relp                     x86_64       8.24.0-2.el7             rsyslog_v8        22 k
 rsyslog-rsgtutil                 x86_64       8.24.0-2.el7             rsyslog_v8        50 k
 rsyslog-snmp                     x86_64       8.24.0-2.el7             rsyslog_v8        16 k
 rsyslog-udpspoof                 x86_64       8.24.0-2.el7             rsyslog_v8        16 k
更新します:
 rsyslog                          x86_64       8.24.0-2.el7             rsyslog_v8       640 k
依存性関連でのインストールをします:
 libdbi                           x86_64       0.8.4-6.el7              base              42 k
 libfastjson4                     x86_64       0.99.4-1.el7             rsyslog_v8        53 k
 libgt                            x86_64       0.3.11-1.el7             rsyslog_v8        58 k
 libksi1                          x86_64       3.4.0.7-1.el7            rsyslog_v8       108 k
 liblognorm5                      x86_64       2.0.2-1.el7              rsyslog_v8        72 k
 libmongo-client                  x86_64       0.1.8-1.el7              epel              46 k
 libnet                           x86_64       1.1.6-7.el7              base              59 k
 librdkafka                       x86_64       0.9.3-1.el7.remi         remi-safe        223 k
 librelp                          x86_64       1.2.12-1.el7             rsyslog_v8        59 k
 net-snmp-libs                    x86_64       1:5.7.2-24.el7_2.1       base             747 k
 postgresql-libs                  x86_64       9.2.18-1.el7             base             232 k
飛ばしました (依存性の問題):
 rsyslog-crypto                   x86_64       7.4.7-16.el7             base              42 k
 rsyslog-gssapi                   x86_64       7.4.7-16.el7             base              41 k
 rsyslog-mmaudit                  x86_64       7.4.7-16.el7             base              29 k
 rsyslog-mmsnmptrapd              x86_64       7.4.7-16.el7             base              31 k
 rsyslog-utils                    x86_64       8.14.0-5.el7             rsyslog_v8        45 k

トランザクションの要約
===============================================================================================
インストール                 23 パッケージ (+11 個の依存関係のパッケージ)
更新                          1 パッケージ
飛ばしました (依存性の問題)   5 パッケージ

総ダウンロード容量: 6.1 M
Is this ok [y/d/N]:

 

rsyslog 実践ログ管理入門 rsyslog 実践ログ管理入門

CentOS 7にfluntedをインストールしてrsyslogでログを転送する

$
0
0

KafkaでSyslogを受け取らせようとしてるのだが、CentOS 7からKafkaにログを送る際、rsyslogのバージョンが7系なのでそのまま送るのはちょっと厳しい(rsyslog 8.x系だったらomkafkaモジュールが使える)。
さすがにそんな気軽にほいほいrsyslogのバージョン変更するのもアレなので、定番であるfluentdをあいだに入れてやることにする。

一応、fluentdではsyslogでログを受け付けることができるのだが、udpしか受け付けられないのでログの暗号化ができない。このため、localhostのrsyslogからログを受け付けてやるようにする。
イメージ的には、以下のような感じ。kafkaと同居させて、rsyslogサーバで受け付けたログをkafkaに渡してやるようにする。rsyslogで受け付けたログをファイルに書き出して、それを読み込むことでも実現可能なのだが、ログフォーマットが一定である必要があるため、inputでtype syslogを使ってlocalhost内でログを送信させる。
(ASCII Flow Infinity便利だわやっぱ)

                  +-----------------------------------------------------------------+
                  |--------------------+ +-------------------+ +--------------------|
                  ||                   | |                   | |                   ||
+-----------+     || +---------------+ | | +---------------+ | | +---------------+ ||
|  rsyslog  | --> || |    rsyslog    | | | |    rsyslog    | | | |    rsyslog    | ||
+-----------+     || +-------+-------+ | | +-------+-------+ | | +-------+-------+ ||
                  ||         |         | |         |         | |         |         ||
                  ||         v         | |         v         | |         v         ||
                  || +-------+-------+ | | +-------+-------+ | | +-------+-------+ ||
                  || |    fluentd    | | | |    fluentd    | | | |    fluentd    | ||
                  || +-------+-------+ | | +-------+-------+ | | +-------+-------+ ||
                  ||         |         | |         |         | |         |         ||
                  ||         v         | |         v         | |         v         ||
                  || +-------+-------+ | | +-------+-------+ | | +-------+-------+ ||
                  || |     kafka     | | | |     kafka     | | | |     kafka     | ||
                  || +---------------+ | | +---------------+ | | +---------------+ ||
                  ||                   | |                   | |                   ||
                  |--------------------+ +-------------------+ +--------------------|
                  +-----------------------------------------------------------------+

 

1.fluentdのインストール・設定

fluentdのインストールは簡単で、インストールスクリプトがあるからそれをキックするだけで入れられる。
この段階で、インストール後に必要となるプラグインについても入れてしまおう。

curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
yum install -y gcc
/opt/td-agent/embedded/bin/gem install fluent-plugin-kafka
/opt/td-agent/embedded/bin/gem install zookeeper

 

td-agentという名称でインストールされているので注意。/opt配下にもいろいろファイルが配置されるが、設定ファイルはcat /etc/td-agent/td-agent.confになる。
こちらを編集して設定してやる。

今回の場合、syslogで受け付けてkafkaで渡してやるので、以下記述を追記してやろう。
rsyslog側でログファイルに出力するので、そのファイルを読み込む設定とする。

<source>
  @type syslog
  port 5140
  bind 127.0.0.1
  tag syslog
</source>

<match syslog>
  @type kafka
  zookeeper localhost:2181
  default_topic syslog
</match>

 

設定ファイル編集後、サービスを起動する。

systemctl start td-agent
systemctl enable td-agent

2.rsyslogの設定

fluentdのインストールをしたら、rsyslogの設定を変更してrsyslogサーバとして動作、およびlocalhostのfluentdのinputに飛ばすようにする。
(今回は、後で暗号化もできるようにtcpで受信するようにする)。

以下、設定例。

●/etc/rsyslog.conf

# Provides TCP syslog reception
$ModLoad imtcp # コメントアウト解除
$InputTCPServerRun 514 # コメントアウト解除

~ 略 ~

# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
$ActionQueueFileName fwdRule1 # unique name prefix for spool files        # コメントアウト解除
$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible) # コメントアウト解除
$ActionQueueSaveOnShutdown on # save messages to disk on shutdown         # コメントアウト解除
$ActionQueueType LinkedList   # run asynchronously                        # コメントアウト解除
$ActionResumeRetryCount -1    # infinite retries if host is down          # コメントアウト解除
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
*.* @localhost:5140 # コメントアウト解除・向き先変更
# ### end of the forwarding rule ###

 

設定ファイル編集後、rsyslogを再起動する。

systemctl restart rsyslog

 

3.ログの受信を確認する

さて、これでrsyslogサーバにsyslogを送ることで、同居しているKafkaクラスタにログが保管されるようになった。
試しにkafkacatで取得した値がこちら(BS-PUB-CENT7-01ってのが)。

{"host":"BS-PUB-CENT7-01","ident":"root","message":"test12"}
{"host":"BS-PUB-CLUSTERTEST01","ident":"kafka-server-start.sh","message":"[2017-01-28 12:11:21,363] INFO [Group Metadata Manager on Broker 1]: Removed 0 expired offsets in 1 milliseconds. (kafka.coordinator.GroupMetadataManager)"}
{"host":"BS-PUB-CLUSTERTEST01","ident":"kafka-server-start.sh","message":"[2017-01-28 12:21:21,363] INFO [Group Metadata Manager on Broker 1]: Removed 0 expired offsets in 1 milliseconds. (kafka.coordinator.GroupMetadataManager)"}
{"host":"BS-PUB-CENT7-01","ident":"root","message":"test123"}

 

このように、JSON形式で保存されている。
タイムスタンプは保持されてないので、Kafkaの次工程のシステム(Graylogとか)が取得したタイミングになるのかな?
あと、大量(1000件くらい)のログを一気に送ってみたところ、どうもrsyslogまでは受け取れてるのだが、td-agent→Kafkaとそれぞれの過程でいくつか取りこぼしが発生していた。rsyslog→td-agentについては、普通にtailでファイルを読み込んであげたほうがいいかもしれない。

 

DevOps導入指南 Infrastructure as Codeでチーム開発・サービス運用を効率化する (DEV Engineer’s Books) DevOps導入指南 Infrastructure as Codeでチーム開発・サービス運用を効率化する (DEV Engineer’s Books)

rsyslogでomkafkaを使用して直接Kafkaにログを転送する

$
0
0

rsyslogには、バージョン8.7からはデフォルトでKafkaに連携するモジュール「omkafka」というものが用意されている。
今回は、これを使ってrsyslogから直接Kafkaにログを転送する。

なお、CentOS 7の場合だとrsyslogは7系が使われているので、別途8系をインストールしてやる必要があるようだ(まぁ、当たり前だがやる前にちゃんと事前にテストをするように…)。
rsyslogのバージョン8.7以降をインストールしたら、設定ファイル「/etc/rsyslog.conf」に以下の内容を記述してやる(brokerは複数指定可能)。

●/etc/rsyslog.conf

#### MODULES ####
module(load="imuxsock")
module(load="imklog")
module(load="imfile")
module(load="omkafka")

#### GLOBAL DIRECTIVES ####

# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on

# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf


#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  /var/log/maillog


# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log


### omkafka setting ####

input(type="imfile"
  File="/var/log/message"
  Tag="syslog"
)

template(name="json_lines" type="list" option.json="on") {
  constant(value="{")
  constant(value="\"timestamp\":\"")
  property(name="timereported" dateFormat="rfc3339")
  constant(value="\",\"message\":\"")
  property(name="msg")
  constant(value="\",\"host\":\"")
  property(name="hostname")
  constant(value="\",\"severity\":\"")
  property(name="syslogseverity-text")
  constant(value="\",\"facility\":\"")
  property(name="syslogfacility-text")
  constant(value="\",\"syslog-tag\":\"")
  property(name="syslogtag")
  constant(value="\"}")
}

main_queue(
  queue.workerthreads="1"      # threads to work on the queue
  queue.dequeueBatchSize="100" # max number of messages to process at once
  queue.size="10000"           # max queue size
)

action(
  broker=["BS-PUB-CLUSTERTEST01.BLACKNON.LOCAL:9092","BS-PUB-CLUSTERTEST02.BLACKNON.LOCAL:9092","BS-PUB-CLUSTERTEST03.BLACKNON.LOCAL:9092"]
  type="omkafka"
  topic="syslog"
  template="json_lines"
)

 

なお、SELinuxが有効になっているとうまく動かないので、事前に無効化しておくこと。

setenforce 0
sed -i '/^SELINUX=/s/enforcing/disabled/g' /etc/selinux/config

 

設定完了後、サービスを再起動する。

systemctl restart rsyslog

 

これで、無事rsyslogから直接Kafkaにログが飛ぶようになった。

 

rsyslog 実践ログ管理入門 rsyslog 実践ログ管理入門

manコマンドを補完するコミュニティベースのチートシート的なコマンド『tldr』

$
0
0

manコマンドについて調べてたところ、manコマンドほどに記述があるわけではないが、簡単な使い方や事例をgithub上で記述してコマンドやWebページで見れるようにする『tldr』なるものを見かけた。
コミュニティドリブンというだけあってか、コマンドの利用方法・使い方についてはgithub上のファイルを編集することで変更ができるようだ。

Webページ上から利用できるが、コマンドでも利用できる様子。
rubyやPython版もあるが、NodeJS版が基本のようだ。なので今回はnpmコマンドでインストールする。
以下、CentOSの場合。

yum install -y epel-release
yum install -y nodejs npm
npm install -g tldr

 

tldrコマンドは、以下のように引数としてコマンド名を入れてやればいい。

tldr コマンド名

以下、実行結果。

[root@BS-PUB-CENT7-01 ~]# tldr grep

  grep

  Matches patterns in input text.
  Supports simple patterns and regular expressions.

  - Search for an exact string:
    grep search_string path/to/file

  - Search in case-insensitive mode:
    grep -i search_string path/to/file

  - Search recursively (ignoring non-text files) in current directory for an exact string:
    |

  - Use extended regular expressions (supporting ?, +, {}, () and |):
    grep -E ^regex$ path/to/file

  - Print 3 lines of [C]ontext around, [B]efore, or [A]fter each match:
    grep -C|B|A 3 search_string path/to/file

  - Print the count of matches instead of the matching text:
    grep -c search_string path/to/file

  - Print line number for each match:
    grep -n search_string path/to/file

  - Print file names with matches:
    grep -l search_string path/to/file

  - Use the standard input instead of a file:
    cat path/to/file | grep search_string

  - Invert match for excluding specific strings:
    grep -v search_string


[root@BS-PUB-CENT7-01 ~]# tldr sed

  sed

  Run replacements based on regular expressions.

  - Replace the first occurrence of a string in a file, and print the result:
    sed 's/find/replace/' filename

  - Replace all occurrences of an extended regular expression in a file:
    sed -r 's/regex/replace/g' filename

  - Replace all occurrences of a string in a file, overwriting the file (i.e. in-place):
    sed -i 's/find/replace/g' filename

  - Replace only on lines matching the line pattern:
    sed '/line_pattern/s/find/replace/' filename

  - Apply multiple find-replace expressions to a file:
    sed -e 's/find/replace/' -e 's/find/replace/' filename

  - Replace separator / by any other character not used in the find or replace patterns, e.g., #:
    sed 's#find#replace#' filename

 

簡単な使い方、使用例なら使えそうだ。
サーバではなく、クライアントとして使用しているMacとかLinuxに使うほうが多そう。
書かれてる内容的にも、manの置き換えではなくてあくまでも補完って感じだ。

 

Linuxカーネル「ソースコード」を読み解く (I・O BOOKS) Linuxカーネル「ソースコード」を読み解く (I・O BOOKS)

Proxmox VE 4.2上にGentoo Linuxをインストールしてみる

$
0
0

先日#ssmjp 2017/01に行ってきたのだが、そこでGentooについて特集されていた。
有名なディストリだし、名前は知っていたのだが…やっぱりイメージ的になんか辛そうというのがあって今まで敬遠していた。
あと、正直なところ趣味で利用されるディストリというイメージがあったのだが、意外とサーバとしても利用されてるらしい。Papper君とかがGentooベースで動いてるとは知らなかった…。

で、一部企業ではサーバとしても動いてるらしいので、試しにProxmox VE 4.2上でインストールしてみることにした。
KVMなので、まぁ動かないってことはないだろ。他のディストリと違ってインストーラーという感じではなく、自分でディスクフォーマットとかが必要にはなるので、ちょい面倒かもしれないが。

手順については、Gentoo Wikiを参照に進めている。
基本的にやってることはそのまんまなので、↓の内容を参照すれば普通にインストールできる。正直、噂ほど難しいとは思わなかった(面倒臭かったけど)。

 

1.DiscBootさせる

まず、インストール用のISOファイルから取ってくる。
とりあえず、amd64のMinimal Installation CDにしとこう。適当にVMを作成して、ISOファイルを読み込ませて起動。
起動後、以下のような画面が表示されるのでそのままEnterでbootさせる。

 

Boot後、最初にKeymapの設定が入るので、英字キーボードであればそのままEnter。

 

LiveCDなので、操作用のコンソールが表示される。
DHCPのないネットワークで起動したので、IPアドレスが振られてない状態。適当にipコマンドで一時的なアドレス振っておこう。
(なお、systemdなのでデフォルトではeth0とかじゃなくて、enp0s18とかが割り振られているはず)

ip addr add IPアドレス/サブネット dev ネットワークデバイス名
ip route add default via Gatewayのアドレス
echo 'nameserver 8.8.8.8' >> /etc/resolv.conf

 

また、とりあえずsshで操作できるよう、rootユーザに適当なパスワードを付与してsshdを起動しておこう。

echo root:P@ssw0rd | chpasswd
/etc/init.d/sshd start

 

2.ディスクの準備

一時利用のネットワーク設定が終わって疎通確認ができたら、ディスクをフォーマット(今回は仮想ディスク新品なのでやらない)してパーティションを区切ってやろう。
partedでちゃちゃっとやってしまおう。

parted -s -a optimal /dev/sda mklabel gpt
parted -s -a optimal /dev/sda mkpart primary 1 3
parted -s -a optimal /dev/sda name 1 grub
parted -s -a optimal /dev/sda set 1 bios_grub on
parted -s -a optimal /dev/sda mkpart primary 3 131
parted -s -a optimal /dev/sda name 2 boot
parted -s -a optimal /dev/sda mkpart primary 131 643
parted -s -a optimal /dev/sda name 3 swap
parted -s -a optimal /dev/sda 'mkpart primary 643 -1'
parted -s -a optimal /dev/sda name 4 rootfs

 

実行後の状態がこちら。

livecd ~ # parted -l /dev/sda
Model: ATA QEMU HARDDISK (scsi)
Disk /dev/sda: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name    Flags
 1      1049kB  3146kB  2097kB               grub    bios_grub
 2      3146kB  131MB   128MB                boot
 3      131MB   643MB   512MB                swap
 4      643MB   53.7GB  53.0GB               rootfs

 

3.ファイルシステムの作成・マウント

次に、作成したディスクのパーティションにファイルシステムを作成する。
とりあえず、btrfsを使ってみるかな。ブートパーティションはxfsにしとこう。

mkfs.xfs /dev/sda2
mkfs.btrfs /dev/sda4

 

また、SWAP領域についても有効にしておこう。

mkswap /dev/sda3
swapon /dev/sda3

 

次に、できたファイルシステムを操作するためにマウントする。

mount /dev/sda4 /mnt/gentoo
mkdir /mnt/gentoo/boot
mount /dev/sda2 /mnt/gentoo/boot

 

4.stage tarballをダウンロードして展開する

ファイルシステムが出来上がったら、そこにGentooをインストールする。
links(テキストブラウザ)を使用して、適当なミラーを選択してイメージをダウンロードしてくる(面倒なのでミラーサイト直接指定してる)。

cd /mnt/gentoo
links http://ftp.jaist.ac.jp/pub/Linux/Gentoo/releases/amd64/autobuilds

 

とりあえず、Stage3のsystemdのイメージをとってくる。
dキーでダウンロードできるので、中のtar.bz2ファイルを選択してダウンロードする。

無事ダウンロードできたら、qキーでブラウザを終了してファイルの展開を行う。

tar xvjpf stage3-*.tar.bz2 --xattrs

 

ファイルの展開が終わったら、環境に合わせてコンパイルオプションの設定をする。設定ファイル「/mnt/gentoo/etc/portage/make.conf」でコンパイルオプションを指定できる。
詳細についてはWikiを見てもらうとして、とりあえず今回はこのままにしておこう。

次に、インストール時に必要となるデータを取ってくるためのミラーサーバを指定する。
Wikiにあるように、とりあえず日本のミラーサーバを選択してリダイレクトで追記してしまおう。

mirrorselect -i -o >> /mnt/gentoo/etc/portage/make.conf

 

portageで使うためのリポジトリファイルの配置をする。

mkdir /mnt/gentoo/etc/portage/repos.conf
cp /mnt/gentoo/usr/share/portage/config/repos.conf /mnt/gentoo/etc/portage/repos.conf/gentoo.conf

 

chrootを行う前に、DNSの設定ファイルや既存PATHのマウントを行う。

cp -L /etc/resolv.conf /mnt/gentoo/etc/
mount -t proc proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev

 

chrootを行う。

chroot /mnt/gentoo /bin/bash
source /etc/profile
export PS1="(chroot_now) $PS1"

5.Portageの設定を行う

次に、Portageの設定を行う。
どんなツールがインストールできるか確認するため、おすすめされている「emerge-webrsync」を実行してみる。
(結構長い)

emerge-webrsync
(chroot_now) livecd / # emerge-webrsync
Fetching most recent snapshot ...
Trying to retrieve 20170128 snapshot from ftp://ftp.iij.ad.jp/pub/linux/gentoo ...
Fetching file portage-20170128.tar.xz.md5sum ...
Fetching file portage-20170128.tar.xz.gpgsig ...
Fetching file portage-20170128.tar.xz ...
Checking digest ...
Getting snapshot timestamp ...
Syncing local tree ...

Number of files: 206,223 (reg: 178,616, dir: 27,607)
Number of created files: 1,319 (reg: 1,244, dir: 75)
Number of deleted files: 0
Number of regular files transferred: 1,244
Total file size: 415.18M bytes
Total transferred file size: 2.10M bytes
Literal data: 2.10M bytes
Matched data: 0 bytes
File list size: 131.05K
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 6.38M
Total bytes received: 52.48K

sent 6.38M bytes  received 52.48K bytes  104.62K bytes/sec
total size is 415.18M  speedup is 64.53
Cleaning up ...

Performing Global Updates
(Could take a couple of minutes if you have a lot of binary packages.)


 * IMPORTANT: 12 news items need reading for repository 'gentoo'.
 * Use eselect news read to view new items.

 

とりあえず、profileはそのままにする。
リストもアップデートしないでいいので省略。

 

タイムゾーン・ロケールの設定をする。

echo "Asia/Tokyo" > /etc/timezone
echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
(chroot_now) livecd / # eselect locale list
Available targets for the LANG variable:
  [1]   C
  [2]   POSIX
  [3]   ja_JP.utf8
  [ ]   (free form)
(chroot_now) livecd / # eselect locale set 3
Setting LANG to ja_JP.utf8 ...

 

最後に、再度環境をリロードする。

env-update && source /etc/profile && export PS1="(chroot_now) $PS1"

 

6.カーネルのインストールをする

次はLinuxカーネルのインストールをする。
amd64の場合だと「sys-kernel/gentoo-sources」が推奨されてるようなので、以下のコマンドで、カーネルのインストールをする。

emerge --ask sys-kernel/gentoo-sources

 

後の諸々の設定はWikiを参考に実施。
環境に合わせて必要なオプション有効にしていく。

emerge --ask sys-apps/pciutils
cd /usr/src/linux
make menuconfig

 

menuconfigが終わったら、コンパイルおよびインストールを行う。

make && make modules_install
make install

 

7.その他設定

作業前に、vimだけインストールしておく。

emerge --ask app-editors/vim

 

とりあえず、fstabにブート時のマウントについて設定を記述する。

cat <<EOF >> /etc/fstab
/dev/sda2   /boot        ext2    defaults,noatime     0 2
/dev/sda3   none         swap    sw                   0 0
/dev/sda4   /            ext4    noatime              0 1
EOF

 

ホスト名とドメイン名の設定。

sed -i '/^hostname/chostname="gentoo"' /etc/conf.d/hostname
echo 'dns_domain_lo="blacknon.local"' > /etc/conf.d/net

 

ネットワーク周りの設定。
まさかここでまたインストールが必要になるとは…。

emerge --ask --noreplace net-misc/netifrc
cat << "EOF" >> /etc/conf.d/net
config_enp0s18="IPアドレス netmask サブネットマスク brd ネットワークアドレス"
routes_enp0s18="default via Gatewayアドレス"
EOF
cd /etc/init.d
ln -s net.lo net.enp0s18
rc-update add net.enp0s18 default

 

パスワードの設定をする。

passwd

 

その他、cronやらsyslogやらをインストールしていく。
今回は、とりあえずrsyslogを選ぶことにした。

emerge --ask app-admin/rsyslog app-admin/logrotate sys-process/cronie sys-fs/e2fsprogs sys-fs/xfsprogs sys-fs/btrfs-progs
rc-update add rsyslog default
rc-update add cronie default
rc-update add sshd default

 

ブートローダーをインストールする。
GRUB2でいいよね。

emerge --ask --verbose sys-boot/grub:2
grub-install /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg

 

インストール完了後、chrootを終了して再起動する。

exit
reboot

 

これで、あとは再起動後のコンソールにログインするだけだ。
なお、インストール後に気付いたのだが、デフォルトではsshdのrootログインが鍵認証のみ許可されている状態なので、ログイン用のユーザ作るなり、PermitRootLoginをyesにするなりするといいだろう(ちゃんと運用するならrootでログインさせるべきではないが)。

 

Gentoo、よくインストールは難しいと言われてたが、情報もそろってるし難易度がそこまで高いという感じではない。
ただ、面倒くさいというのはすごい感じた…。

ちゃちゃっとサーバ作って上になんか乗っけるという感じではないと思う。
少し調べたけど、RHELでいうKickStart的なものもbashスクリプトで記述してやるようだ。一応、ISOやネットワークブートでのOSのデプロイ自体はできるみたいだけど、Kickstartの構成ファイル記述するのとスクリプト書くの、どっちが楽かなぁ…(´・ω・`)

ただまぁ確かに応用は効くので、大規模なシステムとかで使われてるってのはなんとなく納得がいった。
構成も自動的にインストールするように事前に作っておけばいいだけだし。

小規模なシステム(VM含め、サーバ10台とか)だと、構成頑張るだけのメリットはそんなにないように感じた。

 

Articles on Source-Based Linux Distributions, Including: Sorcerer (Operating System), Source Mage Gnu/Linux, Gentoo Linux, Linux from Scratch, Gobolin Articles on Source-Based Linux Distributions, Including: Sorcerer (Operating System), Source Mage Gnu/Linux, Gentoo Linux, Linux from Scratch, Gobolin

日付や時刻、タイムスタンプでファイルをgrep(範囲指定可)する『dategrep』コマンド

$
0
0

ログなどで日付や時刻、その範囲を抽出する際だとgrepやawkなどを使って頑張ることが多いのだが、なんか他いいコマンドないかなと調べていたところ、Perlで記述された『dategrep』というコマンドがあるようだ。名前そのままに、日付でファイルやログをgrepできるツールのようだ。

以下のようにコマンドを実行してインストールする。
(cpanからもインストールできるが、うまく動作しなかった)

git clone https://github.com/mdom/dategrep
cd dategrep/
sudo sh -c 'perl Makefile.PL && make && make install'
sudo cpan Moo.pm Date::Manip::Delta Config::Tiny

インストールできたら、実際にログを抽出してみよう。
以下のようにコマンドを実行することで、指定した範囲の時刻を抽出可能なようだ。

dategrep --format "%b %d %H:%M:%S" --start "23:00" --end "23:10" /var/log/messages
[root@BS-PUB-CENT7-02 ~]# dategrep --format "%b %d %H:%M:%S" --start "23:00" --end "23:10" /var/log/messages
Jan 30 23:01:01 BS-PUB-CENT7-02 systemd: Started Session 2 of user root.
Jan 30 23:01:01 BS-PUB-CENT7-02 systemd: Starting Session 2 of user root.
Jan 30 23:08:23 BS-PUB-CENT7-02 systemd: Starting Cleanup of Temporary Directories...
Jan 30 23:08:23 BS-PUB-CENT7-02 systemd: Started Cleanup of Temporary Directories.

 

確かに、対象の時間帯のみを抽出することができた。
その他の実行例についてはこちらを参照するといいだろう。

テストでログの順番をバラバラにしてみたところ、一部行は抽出されなかったのでawkやsedによる処理と同様に指定された範囲を抽出しているようだ。
awkやsedに慣れてるようならばそちらを使ったほうがいいだろう。

日付のフォーマットを指定できるのは結構いいと思うので、CUIが不慣れな人はこれを使うのも有りかも。

 

ちょっとだけLinuxにさわってみたい人のための Bash on Ubuntu on Windows入門 ちょっとだけLinuxにさわってみたい人のための Bash on Ubuntu on Windows入門

ファイル改ざん検知ツール『AFICK』をCentOS 7にインストールする

$
0
0

ファイル改ざん検知というと、TripWireAIDEOSSECなんかを触ったことがあるのだが、今回は『AFICK』というツールをCentOS 7にインストールしてみる。
Perlで書かれているようで、inotifyなどを利用してないみたいで、オンアクセスでの検知は難しいようだけど、cronで定期的にスキャンをかけることである程度検知をするようにしてるらしい。Perlで書かれてるため、Windowsでも動くらしい。
ファイルの状態をAFICK用のDBに登録して、都度スキャン時にそのDBと現在のファイルの状態を照らし合わせて改ざんを検知する、といった仕組みのようだ。

 

1.インストール

インストールは簡単で、SourceForgeにパッケージが置いてある。
(最新版はこちらで都度確認すること)

yum install -y https://downloads.sourceforge.net/project/afick/afick/3.5.2/afick-3.5.2-1.noarch.rpm

 

これでインストールができた。

2.設定ファイルの変更

デフォルトで基本的なフォルダは監視対象になっているが、追加や除外をしたいといった場合は「/etc/afick.conf」に設定ファイルがあるので、それを編集するとよいだろう。
「#」でコメントアウト、行頭に「!」で対象のディレクトリを除外できる。

また、この時点で定期的なスキャンを行うためにcronに設定が追加されているので、スキャンの実行間隔を変更する場合はそこを編集してやるといいだろう。

今回は検証なので、設定等は変えずにそのまま進む。

 

3.データベースの初期化

仕組み上、改ざんを検知するにはデータベースにファイルの状態が記録されている必要があるので、それの初期化+更新を行う。
まず、以下のコマンドで初期化を行う。

afick -i
[root@BS-PUB-CENT7-02 ~]# afick -i
WARNING: (create) init on an already existing database : changes will be lost
# Afick (3.5.2) init at 2017/01/31 07:36:04 with options (/etc/afick.conf):
# archive:=/var/lib/afick/archive
# database:=/var/lib/afick/afick
# exclude_suffix:=log LOG html htm HTM txt TXT xml hlp pod chm tmp old bak fon ttf TTF bmp BMP jpg JPG gif png ico wav WAV mp3 avi
# history:=/var/lib/afick/history
# max_checksum_size:=10000000
# running_files:=1
# timing:=1
# dbm:=Storable

# Hash database created successfully. 40229 files entered.
# #################################################################
# MD5 hash of /var/lib/afick/afick => UAquHYzjiosmcguO7ROSVA
# user time : 15.43; system time : 3.61; real time : 19

 

これで、データベースへのファイルの登録が完了した。
なお、ファイルを編集してデータベースの内容をアップデートしたい場合は、以下のコマンドを実行する。

afick -u

 

4.スキャンの実施

データベースの準備ができたら、実際にスキャンを行ってみよう。
以下のコマンドでスキャンを実行できる。

afick -k

 

何も変更がない場合・改ざんがあった場合での実行結果は以下。

■変更がない場合

[root@BS-PUB-CENT7-02 ~]# afick -k
# Afick (3.5.2) compare at 2017/01/31 07:43:43 with options (/etc/afick.conf):
# archive:=/var/lib/afick/archive
# database:=/var/lib/afick/afick
# exclude_suffix:=log LOG html htm HTM txt TXT xml hlp pod chm tmp old bak fon ttf TTF bmp BMP jpg JPG gif png ico wav WAV mp3 avi
# history:=/var/lib/afick/history
# max_checksum_size:=10000000
# running_files:=1
# timing:=1
# dbm:=Storable
# last run on 2017/01/31 07:36:04 with afick version 3.5.2
# summary changes

# detailed changes

# Hash database : 40229 files scanned, 0 changed (new : 0; delete : 0; changed : 0; dangling : 18; exclude_suffix : 311; exclude_prefix : 0; exclude_re : 0; degraded : 11)
# #################################################################
# MD5 hash of /var/lib/afick/afick => UAquHYzjiosmcguO7ROSVA
# user time : 18.2; system time : 3.66; real time : 22

 

■改ざんがあった場合

[root@BS-PUB-CENT7-02 ~]# echo test >> /etc/test
[root@BS-PUB-CENT7-02 ~]# echo "8.8.8.8 googlens" >> /etc/hosts
[root@BS-PUB-CENT7-02 ~]# afick -k
# Afick (3.5.2) compare at 2017/01/31 07:47:44 with options (/etc/afick.conf):
# archive:=/var/lib/afick/archive
# database:=/var/lib/afick/afick
# exclude_suffix:=log LOG html htm HTM txt TXT xml hlp pod chm tmp old bak fon ttf TTF bmp BMP jpg JPG gif png ico wav WAV mp3 avi
# history:=/var/lib/afick/history
# max_checksum_size:=10000000
# running_files:=1
# timing:=1
# dbm:=Storable
# last run on 2017/01/31 07:36:04 with afick version 3.5.2
# summary changes
new file : /etc/test
changed file : /etc/hosts

# detailed changes
new file : /etc/test
        inode_date               : Tue Jan 31 07:45:53 2017
changed file : /etc/hosts
        md5                      : 54fb6627dbaa37721048e4549db3224d     19b328c14e95d1fc12458d77ae533cb4
        filesize                 : 158  175

# Hash database : 40230 files scanned, 2 changed (new : 1; delete : 0; changed : 1; dangling : 18; exclude_suffix : 311; exclude_prefix : 0; exclude_re : 0; degraded : 11)
# #################################################################
# MD5 hash of /var/lib/afick/afick => UAquHYzjiosmcguO7ROSVA
# user time : 18.19; system time : 3.6; real time : 22

 

無事、改ざんを検知することができた。
オンアクセスでのスキャンができないのはちょっと残念だが、まぁそれなりにスキャン速度は速いので、1時間ごとにスキャンさせるようにすればそこまで問題にはならないかもしれない。

 

■参考

 

サイバー攻撃の足跡を分析するハニーポット観察記録 サイバー攻撃の足跡を分析するハニーポット観察記録

fluentdでKafkaからログのデータをConumerとしてPullしてくる

$
0
0

Kafkaからデータを取得する方法はいろいろとあるようだが、今回はfluentdでKafkaからデータをPullさせてみる。
基本的にはPushのときと変わらず、fluent-plugin-kafkaを用いる。一応、td-agentおよび必要となるプラグインのインストールコマンドは以下(CentOS 7)。

curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
yum install -y gcc
/opt/td-agent/embedded/bin/gem install fluent-plugin-kafka
/opt/td-agent/embedded/bin/gem install zookeeper

Kafkaをsourceとした設定ファイルの記述方法は、以下のように記述する。
(ここでは、とりあえずmatch後の処理はファイルへ書き出しさせている)

●/etc/td-agent/td-agent.conf

<source>
  @type kafka

  brokers broker1:port,broker2:port,..
  topics syslog
  format json
</source>

<match *.**>
  @type file
  path /var/log/fluent/myapp
  time_slice_format %Y%m%d
  time_slice_wait 10m
  time_format %Y/%m/%d %H:%M:%S.%z
  compress gzip
  utc
</match>

 

あとは、td-agentの再起動を行う。

systemctl restart td-agent

 

指定したPATHにログがちゃんと出力されていればOK。

[root@BS-PUB-CENT7-02 ~]# tail -F /var/log/fluent/myapp.20170131.b5476b8059d69dc91
2017/01/31 22:49:39.+0000       syslog  {"host":"BS-PUB-CLUSTERTEST03","ident":"zookeeper-server-start.sh","message":"[2017-02-01 07:49:00,000] INFO Expiring session 0x159d12390070117, timeout of 6000ms exceeded (org.apache.zookeeper.server.ZooKeeperServer)"}
2017/01/31 22:49:39.+0000       syslog  {"host":"BS-PUB-CLUSTERTEST03","ident":"zookeeper-server-start.sh","message":"[2017-02-01 07:49:00,001] INFO Processed session termination for sessionid: 0x159d12390070118 (org.apache.zookeeper.server.PrepRequestProcessor)"}
2017/01/31 22:49:39.+0000       syslog  {"host":"BS-PUB-CLUSTERTEST03","ident":"zookeeper-server-start.sh","message":"[2017-02-01 07:49:00,001] INFO Processed session termination for sessionid: 0x159d12390070117 (org.apache.zookeeper.server.PrepRequestProcessor)"}
2017/01/31 22:49:39.+0000       syslog  {"host":"BS-PUB-CLUSTERTEST03","ident":"kafka-server-start.sh","message":"[2017-02-01 07:49:00,181] INFO Result of znode creation is: OK (kafka.utils.ZKCheckedEphemeral)"}
2017/01/31 22:49:39.+0000       syslog  {"host":"BS-PUB-CLUSTERTEST03","ident":"kafka-server-start.sh","message":"[2017-02-01 07:49:00,182] INFO Registered broker 3 at path /brokers/ids/3 with addresses: PLAINTEXT -> EndPoint(BS-PUB-CLUSTERTEST03.BLACKNON.LOCAL,9092,PLAINTEXT) (kafka.utils.ZkUtils)"}
2017/01/31 22:49:39.+0000       syslog  {"host":"BS-PUB-CLUSTERTEST03","ident":"kafka-server-start.sh","message":"[2017-02-01 07:49:00,182] INFO done re-registering broker (kafka.server.KafkaHealthcheck$SessionExpireListener)"}
2017/01/31 22:49:39.+0000       syslog  {"host":"BS-PUB-CLUSTERTEST03","ident":"kafka-server-start.sh","message":"[2017-02-01 07:49:00,183] INFO Subscribing to /brokers/topics path to watch for new topics (kafka.server.KafkaHealthcheck$SessionExpireListener)"}
2017/01/31 22:49:39.+0000       syslog  {"host":"BS-PUB-CLUSTERTEST03","ident":"kafka-server-start.sh","message":"[2017-02-01 07:49:00,265] INFO New leader is 3 (kafka.server.ZookeeperLeaderElector$LeaderChangeListener)"}
2017/01/31 22:49:45.+0000       syslog  {"host":"BS-PUB-CLUSTERTEST02","ident":"zookeeper-server-start.sh","message":"[2017-02-01 07:48:54,000] INFO Expiring session 0x159d12179d60013, timeout of 6000ms exceeded (org.apache.zookeeper.server.ZooKeeperServer)"}
2017/01/31 22:49:45.+0000       syslog  {"host":"BS-PUB-CLUSTERTEST02","ident":"zookeeper-server-start.sh","message":"[2017-02-01 07:48:54,001] INFO Processed session termination for sessionid: 0x159d12179d60013 (org.apache.zookeeper.server.PrepRequestProcessor)"}

 

Kafka: The Definitive Guide: Real-time Data and Stream Processing at Scale Kafka: The Definitive Guide: Real-time Data and Stream Processing at Scale
Viewing all 743 articles
Browse latest View live