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

Graylogで「Graylog Collector sidecar」を用いてログの転送を行わせる(Linux)

$
0
0

Graylogでは、Syslogのほかに「Graylog Collector Sidecar」というエージェントを使ってのログ収集方法がある。
この方式の場合、GELFというGraylogの独自フォーマットでのログ入力フォーマットを使えるため、Syslogに比べて詳細な情報を記録しておくことが可能になる。

今回は、この「Graylog Collector Sidecar」を用いてGELFでのログをGraylogに連携させる。このとき、エージェントからGraylogへのデータ転送にはFilebeat、Winlogbeat、NXLogが使えるのだが、今回はNXLogを利用する。手順については公式の手順が用意されているので、それを参考に行う。
なお、すでにGraylog Server側でGELFのインプットは作成済の状態とする(TCP)。

1.Graylog Collector Sidecarのインストール

まずはGraylog Collector Sidecarのパッケージのインストールから。
こちらから対象のディストリビューションに対応したパッケージをダウンロードして、以下のコマンドでインストールを行う。

sudo rpm -ihv https://github.com/Graylog2/collector-sidecar/releases/download/0.0.9/collector-sidecar-0.0.9-1.x86_64.rpm # CentOSなどRHEL系の場合
wget --quiet https://github.com/Graylog2/collector-sidecar/releases/download/0.0.9/collector-sidecar_0.0.9-1_amd64.deb && sudo dpkg -i collector-sidecar_0.0.9-1_amd64.deb && rm collector-sidecar_0.0.9-1_amd64.deb # Debian/Ubuntu系

 

2.NXLogのインストール

次に、Graylog Collector SidecarからGraylog Serverへログを転送させるために用いるNXLogのインストールを行う。
こちらのページからパッケージをダウンロードしてインストールする。

CentOS 7の場合

yum install https://nxlog.co/system/files/products/files/1/nxlog-ce-2.9.1716-1_rhel7.x86_64.rpm
sudo service nxlog stop
sudo chkconfig --del nxlog
sudo gpasswd -a nxlog root
sudo chown -R nxlog.nxlog /var/spool/collector-sidecar/nxlog

 

Ubuntu Server 16.04の場合

sudo apt-get install libapr1 libdbi1
wget --quiet https://nxlog.co/system/files/products/files/1/nxlog-ce_2.9.1716_ubuntu_1604_amd64.deb && sudo dpkg -i nxlog-ce_2.9.1716_ubuntu_1604_amd64.deb && rm nxlog-ce_2.9.1716_ubuntu_1604_amd64.deb
sudo /etc/init.d/nxlog stop
sudo update-rc.d -f nxlog remove
sudo gpasswd -a nxlog adm
sudo chown -R nxlog.nxlog /var/spool/collector-sidecar/nxlog

 

インストール完了後、以下のコマンドでGraylog Collector Sidecarのサービスを稼働させる。

sudo graylog-collector-sidecar -service install
sudo systemctl start collector-sidecar

 

3.設定ファイルの編集

最後に、Graylog Collector Sidecarの設定ファイルを編集してやる。
(とりあえずここではタグを「linux」にしているが、できればCentOSやUbuntuで分けて書いてやったほうがいいと思う。)

●/etc/graylog/collector-sidecar/collector_sidecar.yml

server_url: http://GraylogServerのホスト名orIPアドレス:12900
update_interval: 30
tls_skip_verify: true
send_status: true
list_log_files:
  - /var/log
node_id: エージェントのノード名(重複すると正常動作しないので注意)
collector_id: file:/etc/graylog/collector-sidecar/collector-id
log_path: /var/log/graylog/collector-sidecar
log_rotation_time: 86400
log_max_age: 604800
tags:
  - linux
backends:
    - name: nxlog
      enabled: true
      binary_path: /usr/bin/nxlog
      configuration_path: /etc/graylog/collector-sidecar/generated/nxlog.conf

 

最後に、Graylog Collector Sidecarを再起動する。

systemctl restart collector-sidecar

4.GraylogServerの管理画面からエージェントの設定を行う

Graylog Collector Sidecarの設定が終わったら、続きはGraylog Server側の管理画面で行う。
Graylog Serverのトップページから[System] > [Collector]を開き、先ほど設定したエージェントが表示されていることを確認する。

20160921_130958000000

 

右上にある「Manage Configuration」をクリックして、「Create Configuration」から新しいコンフィグを作成する。
(ここでは、とりあえず「Linux」というコンフィグを作っている)

20160921_131245000000

 

コンフィグの作成後、コンフィグ名をクリックして内容を編集する。
基本的には、以下の設定だけやってやればよい。

  • Tagの追加(Graylog Collector Sidecarで指定したタグ)
  • Configure Collector Outputsの設定(Graylog Collector SidecarからGraylog Serverへログを転送する際の設定)
  • Configure Collector Inputsの設定(Graylog Collector Sidecarで収集するログの設定)

20160921_140359000000

なお、このときにDebian系とRHEL系で同居させる場合は、「Define Snippets」のnxlog-defaultsを以下のように編集する必要がある。

{{if .Linux}}
User nxlog
Group nxlog
{{if eq .LinuxPlatform "debian"}}
Moduledir /usr/lib/nxlog/modules
{{end}}
{{if eq .LinuxPlatform "redhat"}}
Moduledir /usr/libexec/nxlog/modules
{{end}}
CacheDir /var/spool/collector-sidecar/nxlog
PidFile /var/run/graylog/collector-sidecar/nxlog.pid
define LOGFILE /var/log/graylog/collector-sidecar/nxlog.log
LogFile %LOGFILE%
LogLevel INFO

<Extension logrotate>
    Module  xm_fileop
    <Schedule>
        When    @daily
        Exec    file_cycle('%LOGFILE%', 7);
     </Schedule>
</Extension>
{{end}}
{{if .Windows}}
Moduledir %ROOT%\modules
CacheDir %ROOT%\data
Pidfile %ROOT%\data\nxlog.pid
SpoolDir %ROOT%\data
LogFile %ROOT%\data\nxlog.log
LogLevel INFO

<Extension logrotate>
    Module  xm_fileop
    <Schedule>
        When    @daily
        Exec    file_cycle('%ROOT%\data\nxlog.log', 7);
     </Schedule>
</Extension>
{{end}}

 

これで、Graylog Collector Sidecarでのログ転送が行えるようになった。

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

sshdのauthorized_keysでできること

$
0
0

OpenSSHでは、デフォルトだと.ssh/authorized_keysというファイルに公開鍵を置いておく(別のファイルを指定することも可能)のだが、このファイルに設定を記述することで、その公開鍵の挙動を制限することができる。有名どころとしてはcommandとfromなのだが、そのほかにもいろいろと設定できるので便利そうなのをいくつかまとめておくことにする。
ここを見る限り、以下の項目について設定ができるようだ。

  • agent-forwarding
  • cert-authority
  • command=”command”
  • environment=”NAME=value”
  • no-agent-forwarding
  • no-port-forwarding
  • no-pty
  • no-user-rc
  • no-X11-forwarding
  • permitopen=”host:port”
  • port-forwarding
  • principals=”principals”
  • pty
  • restrict
  • tunnel=”n”
  • user-rc
  • X11-forwarding

 

1.ssh接続時に特定のコマンドが実行されるようにする

前にここでも書いたのだが、ssh接続と同時に指定したコマンドが実行されるようにするには、authorized_keysで以下のように記述すればよい。

command="コマンドPATH" ssh-rsa ..

 

例えば、authorized_keysに以下のように記述していたとする。

command="pwd;cat .ssh/auth*;ls -la" ssh-rsa AAAAB...

 

その場合、その鍵ファイルでログインすると以下のようにコマンドの実行結果が返され、処理終了と同時に接続が切断される。

[root@BS-PUB-CENT7-02 ~]# ssh test@BS-PUB-CENT7-01
command="cat .ssh/auth*;pwd;ls -la" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8CB356HRtiXR5RXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+4BXUzTPf417jyUL3ktSJsmdVPAyyUFxpdrBpAKkG3pj4Tfhj3mYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYB3XWhllb5CyI7EcVM4dP7TTpBARzQBQpeaLsVp2gsbb4V8UuwdZyPbXahps90GadQgrDjR5647EGArOCIWRNuP+5ALK4tFFNEraG76cRRAs3lDLD462ZAcPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX//9zszOtlDlr4GcgYJhX6px4Qtv1v/fjRn1 root@BS-PUB-CENT7-02.blacknon.local
/home/test
合計 16
drwx------. 3 test test  90  9月 21 23:48 .
drwxr-xr-x. 3 root root  17  9月 21 23:46 ..
-rw-------. 1 test test  25  9月 21 23:46 .bash_history
-rw-r--r--. 1 test test  18  8月  3 01:00 .bash_logout
-rw-r--r--. 1 test test 193  8月  3 01:00 .bash_profile
-rw-r--r--. 1 test test 231  8月  3 01:00 .bashrc
drwx------. 2 test test  28  9月 21 23:53 .ssh
Connection to bs-pub-cent7-01 closed.

 

このとき、環境変数として$SSH_ORIGINAL_COMMANDを用いることでsshコマンドの引数を実行コマンドに利用することも可能だ。
例えば、authorized_keysに以下のように記述していたとする。

command="echo $SSH_ORIGINAL_COMMAND;ls -la $SSH_ORIGINAL_COMMAND" ssh-rsa AAAAB...

 

その場合、接続時に引数を与えると以下のように結果が返ってくる。

[root@BS-PUB-CENT7-02 ~]# ssh test@BS-PUB-CENT7-01 .ssh/auth*
.ssh/authorized_keys
-rw-------. 1 test test 483  9月 22 00:02 .ssh/authorized_keys

 

なお、一応いろいろといじってみた限りでは指定されたコマンド以外は実行できないようになっている(引数でエスケープさせて任意のコマンドを実行させられない)ようだが、できればラッパーコマンドを別途用意しておくといいだろう。

[root@BS-PUB-CENT7-02 ~]# ssh test@BS-PUB-CENT7-01 '/tmp && echo aaa'
/tmp && echo aaa
/tmp:
合計 4
drwxrwxrwt.  7 root root   88  9月 21 21:34 .
dr-xr-xr-x. 17 root root 4096  1月  1  2016 ..
drwxrwxrwt.  2 root root    6  1月  1  2016 .ICE-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .Test-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .X11-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .XIM-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .font-unix
ls: && にアクセスできません: そのようなファイルやディレクトリはありません
ls: echo にアクセスできません: そのようなファイルやディレクトリはありません
ls: aaa にアクセスできません: そのようなファイルやディレクトリはありません
[root@BS-PUB-CENT7-02 ~]# ssh test@BS-PUB-CENT7-01 '/tmp || echo aaa'
/tmp || echo aaa
/tmp:
合計 4
drwxrwxrwt.  7 root root   88  9月 21 21:34 .
dr-xr-xr-x. 17 root root 4096  1月  1  2016 ..
drwxrwxrwt.  2 root root    6  1月  1  2016 .ICE-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .Test-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .X11-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .XIM-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .font-unix
ls: || にアクセスできません: そのようなファイルやディレクトリはありません
ls: echo にアクセスできません: そのようなファイルやディレクトリはありません
ls: aaa にアクセスできません: そのようなファイルやディレクトリはありません
[root@BS-PUB-CENT7-02 ~]# ssh test@BS-PUB-CENT7-01 "echo $(hostname)"
echo BS-PUB-CENT7-02.blacknon.local
ls: echo にアクセスできません: そのようなファイルやディレクトリはありません
ls: BS-PUB-CENT7-02.blacknon.local にアクセスできません: そのようなファイルやディレクトリはありません
[root@BS-PUB-CENT7-02 ~]# ssh test@BS-PUB-CENT7-01 "echo `hostname`"
echo BS-PUB-CENT7-02.blacknon.local
ls: echo にアクセスできません: そのようなファイルやディレクトリはありません
ls: BS-PUB-CENT7-02.blacknon.local にアクセスできません: そのようなファイルやディレクトリはありません

 

2.特定のIPアドレスからのみ接続を許可する

公開鍵で特定のIPアドレスやネットワークからの接続のみを許可する場合は、以下のように記述する。

from="ネットワークアドレス/CIDR or IPアドレス" ssh-rsa ...
from="ネットワークアドレス/CIDR or IPアドレス1,ネットワークアドレス/CIDR or IPアドレス2,..." ssh-rsa ... # 複数指定する場合はカンマで区切る

3.ポートフォワーディングやエージェントフォワーディングなどを無効にする

ポートフォワーディングやエージェントフォワーディングといった機能を使えないように設定することもできる。
以下、無効関係の設定の一覧。

  • no-agent-forwarding … エージェントフォワーディングを無効にする
  • no-port-forwarding … ポートフォワーディングを無効にする
  • no-pty … PTYを無効にする(対話形式の処理をできないようにする)
  • no-user-rc … ~/.ssh/rcの実行を無効にする
  • no-X11-forwarding … X11フォワーディングを無効にする

 

なお、これらに限らずだがそれぞれの設定はカンマ区切りにすることで複数指定することが可能だ。

no-agent-forwarding,no-port-forwarding,no-pty ssh-rsa ...

 

4.公開鍵に紐づいて環境変数を定義する

sshdで「PermitUserEnvironment」が有効になっている場合のみ、以下のように記述することで公開鍵に紐づき環境変数を定義することができる。

environment="環境変数=値" ssh-rsa ...

 

例えば、「NAME」という環境変数に「Value」という値を入れた場合。

[root@BS-PUB-CENT7-01 ~]# cat /home/test/.ssh/authorized_keys
environment="NAME=Value",command="echo $NAME" ssh-rsa ...

--------

[root@BS-PUB-CENT7-02 ~]# ssh test@BS-PUB-CENT7-01
Value
Connection to bs-pub-cent7-01 closed.

 

そのほか、sshトンネル(tunnel)やポートフォワード(permitopen)、証明書の信頼性について別リストから検証させるようにする(principals)など、いろいろと設定できるようだ。

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

rbashで一部のユーザが実行できるコマンドを制限する(特定コマンドしか実行できないようにする)

$
0
0

一部のユーザで、特定のコマンドのみを利用できるようにして、そのほかのコマンドは実行できないようにしたい。
そんなときは、対象のユーザのログインシェルをrbashというシンボリックリンクにしてやることで実現可能だ。

まず、bashのシンボリックリンクとしてrbashを「/opt/bin」配下に作成する。

mkdir /opt/bin
ln -s /bin/bash /opt/bin/rbash

 

次に、rbash用のユーザを作成する。

useradd rbash_test -s /opt/bin/rbash
passwd rbash_test

 

rbash用のユーザが利用できるコマンド(シンボリックリンク)のみを格納したディレクトリを作成する。
ここでは、ping、lsのみを許可してみる。

mkdir /opt/bin/rbash_test/
ln -s $(which ping | grep bin) /opt/bin/rbash_test/
ln -s $(which ls | grep bin) /opt/bin/rbash_test/

 

最後に、.bash_profileを書き換えてPATHに先ほど作成したディレクトリのみを指定する。

chown root:root /home/rbash_test/.bash_profile
chmod 755 /home/rbash_test/.bash_profile
sed -i '/^PATH=/cPATH=/opt/bin/rbash_test/' /home/rbash_test/.bash_profile

あとはログインするだけだ。
対象のユーザでログインしてみよう。

20160925_092015000000

Last login: Sun Sep 25 09:19:23 2016 from XXX.XXX.XXX.XXX
[rbash_test@BS-PUB-CENT7-02 ~]$ ls -la
合計 16
drwx------. 2 rbash_test rbash_test  79  9月 25 09:18 .
drwxr-xr-x. 3 root       root        23  9月 25 09:16 ..
-rw-------. 1 rbash_test rbash_test 128  9月 25 09:19 .bash_history
-rw-r--r--. 1 rbash_test rbash_test  18  8月  3 01:00 .bash_logout
-rwxr-xr-x. 1 root       root       181  9月 25 09:18 .bash_profile
-rw-r--r--. 1 rbash_test rbash_test 231  8月  3 01:00 .bashrc
[rbash_test@BS-PUB-CENT7-02 ~]$ ls -la /opt/
合計 4
drwxr-xr-x.  3 root root   16  9月 25 09:16 .
dr-xr-xr-x. 17 root root 4096  1月  2  2016 ..
drwxr-xr-x.  3 root root   35  9月 25 09:17 bin
[rbash_test@BS-PUB-CENT7-02 ~]$ cd
-rbash: cd: 制限されています
[rbash_test@BS-PUB-CENT7-02 ~]$ ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=58 time=117 ms

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 117.210/117.210/117.210/0.000 ms

 

確かにcdはできないし、制限はできてるようだ。
ただまぁ、chrootを行っているわけではないので、/homeより上は見えるようだ。ということはPATHを書き換えたり、「/bin」配下のコマンドを直接実行できるのか?というと

[rbash_test@BS-PUB-CENT7-02 ~]$ PATH=$PATH:/bin
-rbash: PATH: 読み取り専用の変数です
[rbash_test@BS-PUB-CENT7-02 ~]$ /bin/touch aaa
-rbash: /bin/touch: 制限されています:  `/' をコマンド名の中に指定できません

 

ちゃんと実行できないようになっているようだ。

[改訂新版]プロのためのLinuxシステム構築・運用技術 (Software Design plus) [改訂新版]プロのためのLinuxシステム構築・運用技術 (Software Design plus)

LinuxのCUIで管理するパスワードマネージャ「gpgpwd」コマンド

$
0
0

先日、いくつかチームでのパスワード管理マネージャについて紹介したが、今回は個人向けのパスワードマネージャ。
で、GUIで管理するタイプではなく、コンソールから利用できるタイプの「gpgpwd」というものを見かけたので、これについて紹介する。

1.インストール

まずはインストールの前に、前提となるパッケージを導入する。

apt-get install libjson-perl libtry-tiny-perl gnupg xclip git gnupg-agent # Debian/Ubuntu系の場合
yum install perl-JSON perl-Try-Tiny gnupg xclip git # CentOSなどRHEL系の場合

 

次に、以下のコマンドでgpgpwdをインストールする。

git clone https://github.com/zerodogg/gpgpwd
cd gpgpwd
sudo make install

 

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

 

2.使ってみる

2-1.GPG鍵ファイルの作成

さて、それでは実際に使ってみよう。
まず、gpgpwdで保持するパスワードを暗号化するため、GnuPG鍵を作成する。

[root@BS-PUB-CENT7-01 ~]# gpg --gen-key
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

ご希望の鍵の種類を選択してください:
   (1) RSA と RSA (デフォルト)
   (2) DSA と Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
あなたの選択は? [Enter]
RSA 鍵は 1024 から 4096 ビットの長さで可能です。
鍵長は? (2048) [Enter]
要求された鍵長は2048ビット
鍵の有効期限を指定してください。
         0 = 鍵は無期限
        = 鍵は n 日間で期限切れ
      w = 鍵は n 週間で期限切れ
      m = 鍵は n か月間で期限切れ
      y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0) [Enter]
(null)は無期限です
これで正しいですか? (y/N) y

GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: TestID
電子メール・アドレス:
コメント:
次のユーザIDを選択しました:
    "TestID"

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O

 

その後、パスフレーズやランダムバイトの生成が行われるので、コンソールに表示されているメッセージに従って処理を行う。
(結構時間がかかる)

たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動かす、
ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生成器に
十分なエントロピーを供給する機会を与えることができます。
gpg: 鍵961B1619を絶対的に信用するよう記録しました
公開鍵と秘密鍵を作成し、署名しました。

gpg: 信用データベースの検査
gpg: 「ギリギリの信用」3、「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/961B1619 2016-09-21
   フィンガー・プリント = 2326 B78D 1278 DD34 0398  A082 7273 6E70 961B 1619
uid                  TestID
sub   2048R/07CBBA98 2016-09-21

2-2.パスワードの登録・確認

次に、実際にパスワードの登録をしてみよう。
以下のコマンドでパスワード登録が行える。なお確認時は指定されたパスワード名で部分一致で検索をかける。
それぞれのコマンドの実行前後にはGnuPG鍵のパスフレーズを求められる。

gpgpwd set パスワード名 # パスワードのセット
gpgpwd get パスワード名 # パスワードの確認(パスワード名で検索)

20160922_091227000000

[root@BS-PUB-CENT7-01 ~]# gpgpwd set TestPassword
Adding an entry for TestPassword

Random password: FqzZRLccV?3&bPx
  Enter /help for help.
  Enter a password to use a custom password.
  Just press enter to use the random password.
Password> TestPassword

  Enter a username for this entry.
  Just press enter to not store any username.
Username> root
[root@BS-PUB-CENT7-01 ~]# gpgpwd set PasswordTest
Adding an entry for PasswordTest

Random password: 06c5k_AX8q=2Va#
  Enter /help for help.
  Enter a password to use a custom password.
  Just press enter to use the random password.
Password> TeST

  Enter a username for this entry.
  Just press enter to not store any username.
Username> test
[root@BS-PUB-CENT7-01 ~]# gpgpwd get Password
Name                  Password                           Username
----                  --------                           --------
PasswordTest        : TeST                               test
TestPassword        : TestPassword                       root

 

うーん…個人利用であれば悪くなさそうな気がする。

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

標準出力・標準エラー出力の内容をターミナルとSyslogに出力する

$
0
0

標準出力・標準エラー出力の内容をターミナルとSyslog、どちらにも出力したいときには、以下のようにコマンドを実行すればよい。

コマンド 2>&1 | tee >(logger -i -t "タグ")

[root@BS-PUB-CENT7-01 ~]# echo "ABCDEFG" | tee >(logger -i -t "test")
ABCDEFG
[root@BS-PUB-CENT7-01 ~]# tail -3 /var/log/messages
Sep 24 14:15:55 BS-PUB-CENT7-01 systemd-logind: New session 281 of user root.
Sep 24 14:15:55 BS-PUB-CENT7-01 systemd: Starting Session 281 of user root.
Sep 24 14:30:11 BS-PUB-CENT7-01 test[7608]: ABCDEFG
rsyslog 実践ログ管理入門 rsyslog 実践ログ管理入門

Linux/Macのターミナルで使えるパスワードマネージャ「pass」

$
0
0

Linux/Macのターミナルで利用できるパスワードマネージャということで、インストールが簡単に行える「pass」というものを見かけたので紹介。
管理するパスワードをフォルダのように階層で管理できるので、CUIながらパスワード管理しやすそうだ。一応、gitでの管理も行えるようだ。

1.インストール

インストールは簡単で、以下のコマンドで行える。

sudo yum install pass # CentOSなどRHEL系
sudo apt-get install pass # Debian/Ubuntu系

 

Macの場合は以下のコマンドでインストールする。

brew install pass
echo "source /usr/local/etc/bash_completion.d/password-store" >> ~/.bashrc

2.使ってみる

さて、それでは実際にパスワードを登録してみよう。
まず、以下のコマンドでpassで管理するパスワードを暗号化するためのGPGキー名を入力する。
ここでは、GPGキーは前に紹介したgpgpwdで作成したものを指定する

pass init 暗号化キー名

 

2-1.パスワードの登録

次に、パスワードの登録を行う。
以下のコマンドで登録ができる。

pass insert 階層名/パスワード名

20160924_141055000000

 

パスワードを変更する場合は、再度同じコマンドを実行することで上書きできる。

 

2-2.パスワードの確認

登録したパスワードは、以下のコマンドで確認できる。

pass 階層名/パスワード

20160924_141831000000

 

なお、以下のコマンドでクリップボードに渡すこともできる。

pass -c 階層名/パスワード

 

と、こんな感じなのだが、CUIに慣れてる人なら結構便利かもしれない。

小さな会社のIT担当者のためのセキュリティの常識 小さな会社のIT担当者のためのセキュリティの常識

CentOS 7にOSSのWebベースAnsible操作・管理ツール「Ansible Semaphore」をインストールする

$
0
0

AnsibleのWebベースでの操作・管理ツールといえばAnsible Towerが有名だが、10ホスト以上になると有償となってしまうため、あまり気軽に入れられないところがある。
で、他に何かないかと探していたところ、「Ansible Semaphore」というものがあったので、すこし触ってみることにする。一応Dockerもあるようだが、今後のことも考えてCentOS 7に入れてみることにする。
OSS Alternative Ansible Towerと言っているので、なかなか期待できそうだ。

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

まずは前提となるパッケージのインストールから。
以下のコマンドを実行する。

sudo yum -y install epel-release
sudo yum -y install ansible mariadb mariadb-server

 

MariaDBのサービス起動設定と、最低限のセキュリティ設定を行っておく。

systemctl start mariadb
systemctl enable mariadb
mysql_secure_installation

 

データベースとそこにアクセスするユーザを作成する。

mysql -u root -p -e "
CREATE DATABASE semaphore;
CREATE USER 'semaphore'@'localhost' IDENTIFIED BY 'パスワード';
GRANT ALL PRIVILEGES ON semaphore.* TO 'semaphore'@'localhost' WITH GRANT OPTION;"

 

Playbookの配置先として、opt配下にディレクトリを作成しておく。

mkdir /opt/semaphore

 

2.Semaphoreのインストール

次に、Semaphoreのインストールを行う。
コンパイル済みのバイナリがあるので、ダウンロードしてセットアップさせる。

cd /usr/bin
wget https://github.com/ansible-semaphore/semaphore/releases/download/v2.0.4/semaphore_linux_amd64
mv semaphore_linux_amd64 semaphore
chmod a+x semaphore
semaphore -setup
[root@BS-PUB-CENT7-01 bin]# semaphore -setup

 Hello! You will now be guided through a setup to:

 1. Set up configuration for a MySQL/MariaDB database
 2. Set up a path for your playbooks (auto-created)
 3. Run database Migrations
 4. Set up initial seamphore user & password

 > DB Hostname (default 127.0.0.1:3306):
 > DB User (default root): semaphore
 > DB Password: P@ssw0rd
 > DB Name (default semaphore): semaphore
 > Playbook path: /opt/semaphore

 Generated configuration:
 {
        "mysql": {
                "host": "127.0.0.1:3306",
                "user": "semaphore",
                "pass": "P@ssw0rd",
                "name": "semaphore"
        },
        "port": "",
        "bugsnag_key": "",
        "tmp_path": "/opt/semaphore",
        "cookie_hash": "pi2crua6ZVIrUvbLAj8BLldw1uANvJwRWaS7pFCWmRw=",
        "cookie_encryption": "Sj1f/Z2XT592b/jeHue3K3pVBd9icJeubh1ixh58+yQ="
 }

 > Is this correct? (yes/no): yes
 Running: mkdir -p /opt/semaphore..
 Configuration written to /opt/semaphore/semaphore_config.json..
 Pinging database..

 Running DB Migrations..
Creating migrations table
Executing migration v0.0.0 (at 2016-09-25 00:09:01.221793369 +0900 JST)...
 [11/11]
Executing migration v1.0.0 (at 2016-09-25 00:09:01.53705146 +0900 JST)...
 [7/7]
Executing migration v1.1.0 (at 2016-09-25 00:09:01.858125307 +0900 JST)...
 [1/1]
Executing migration v1.2.0 (at 2016-09-25 00:09:01.930146649 +0900 JST)...
 [1/1]
Executing migration v1.3.0 (at 2016-09-25 00:09:01.963162965 +0900 JST)...
 [3/3]
Executing migration v1.4.0 (at 2016-09-25 00:09:02.123194544 +0900 JST)...
 [2/2]
Executing migration v1.5.0 (at 2016-09-25 00:09:02.238933666 +0900 JST)...
 [1/1]
Executing migration v0.1.0 (at 2016-09-25 00:09:02.268897766 +0900 JST)...
 [6/6]
Executing migration v1.6.0 (at 2016-09-25 00:09:02.410236064 +0900 JST)...
 [4/4]
Executing migration v1.7.0 (at 2016-09-25 00:09:02.601744445 +0900 JST)...
 [1/1]


 > Username: semaphore
 > Email:
 > Your name: semaphore
 > Password: P@ssw0rd

 You are all setup semaphore!
 Re-launch this program pointing to the configuration file

./semaphore -config /opt/semaphore/semaphore_config.json

 To run as daemon:

nohup ./semaphore -config /opt/semaphore/semaphore_config.json &

 You can login with  or semaphore.

 

最後に、以下のコマンドでsemaphoreを起動する。

nohup ./semaphore -config /opt/semaphore/semaphore_config.json &

3.ブラウザからアクセスする

無事インストールが完了したら、「http://IPアドレス:3000」へブラウザからアクセスする。
ログインには、先ほど設定したIDorメールアドレスとパスワードを用いる。

20160925_001401000000

 

ログイン直後の画面。まだ何もない状態。
まずは右上の「Projects」からプロジェクトを作成する。

20160925_001538000000

 

プロジェクト作成後、対象のプロジェクトを選択して「Key Store」からキーの登録をする。
このキーは、Ansibleでのデプロイでもそうだが、git cloneでも使用されるようだ。

20160925_002113000000

 

Playbookを登録しているgitリポジトリがあれば、左メニューの「Playbook Repositories」から登録できる。
ここで指定した場所にあるPlaybookを指定してタスクをキックすることになる。

 

20160925_004959000000

 

Inventoryを登録する。
このインベントリでAnsible hostsの役割も兼ねているようだ。右側にある「edit inventory contents」を編集し、グループとホストの情報を入力する。

 

20160925_012627000000

20160925_012704000000

 

最後に、Task Templeteからタスクを作成する。
このとき、実行したいPlaybookを指定してやる。

20160925_013201000000

 

あとは、対象のタスクをrunするだけだ。

 

20160925_013732000000

 

無事、Playbookを適用できた。
対象サーバもGUIで手軽に設定できるし、Playbookもgitで手軽に取得できる。
ユーザごとの権限管理を気を付ければ手軽にチームでも使えるだろうし、かなりいいと思う。

 

Linuxのコマンドラインでパスワード管理ができるCUIのパスワードマネージャ「mdp」

$
0
0

CUIでパスワード管理ができるツールをいくつか見つけたので何個か紹介していたが、今回は「mdp」というパスワードマネージャを紹介する。

1.インストール

まずは、前提となるパッケージのインストールから。
以下のコマンドを実行する。

yum install ncurses-devel ncurses gnupg git gcc # CentOSなどRHEL系の場合
apt-get install libncursesw5-dev libncursesw5 gnupg git gcc # Debian/Ubuntu系の場合

 

次に、mdpのインストールを行う。

git clone https://github.com/tamentis/mdp/
cd mdp
./configure
make
sudo make install

 

これでインストールが完了した。

2.使ってみる

mdpのインストール完了後、まず以下のコマンドで初期設定を行う。
なお、GPGのカギについては、以前に似たツールとして「gpgpwd」というものを紹介したのだが、そちらにて作成したものを使いまわしている。

mkdir ~/.mdp
chmod 600 ~/.mdp/
cat <<EOF > ~/.mdp/config
set gpg_key_id "GPG鍵"
set editor "/usr/bin/vim"
EOF
source ~/.mdp/config

 

次に、mdpコマンドで鍵の登録を行う。

mdp add キーワード

 

追加すると、4つほどの候補としてランダムなパスワードを提示してくるので、使うか変更するかエディタで編集する。

20160924_145805000000

 

追加後は以下のコマンドでパスワードを確認できる。

mdp get キーワード

20160924_151114000000

 

うーん、ちょっと使いづらい気もするけど…
これではただの暗号化したテキストファイルをいじってるだけなのでは…

サイバーセキュリティテスト完全ガイド ~Kali Linuxによるペネトレーションテスト~ サイバーセキュリティテスト完全ガイド ~Kali Linuxによるペネトレーションテスト~

CentOS 7にNW機器のコンフィグバックアップ自動化ツール「rancid」をインストールする

$
0
0

NW機器のコンフィグ自動バックアップ方法について調べていたところ、「rancid」というツールが良さそうだったので少し触ってみることにした。
比較的いろんなベンダーのNW機器に対応しており、CVSを用いての世代管理もできるようで、情報も豊富にありそうだ。一応、ViewVCを入れることでWebからコンフィグを管理させることも可能なようだ。というわけで、今回はCentOS7にこのrancid + ViewVCをインストールしてみる。こちらを見る限り、yumやapt-getでもインストールできそうだが、今回はソースをダウンロードしてインストールを行うことにした。手順については、こちらを参考に進めている。

なお、事前に以下のコマンドでSELinuxの無効化、firewalldで必要となるポートの開放を行っている。

setenforce 0
sed -i.bak "/SELINUX/s/enforcing/disabled/g" /etc/selinux/config
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

 

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

まずは、以下のコマンドで前提となるパッケージ類の導入をする。

yum -y update
yum -y install vim wget ftp telnet mariadb-server mariadb perl tcl expect gcc cvs rcs httpd autoconf php-common php-gd php-pear php-pecl-memcache php-mysql php-xml mod_ssl MySQL-python

 

ViewVCを利用するために入れたhttpdのサービス起動設定をする。

systemctl enable httpd
systemctl start httpd

 

次に、グループおよびユーザの作成をする。

groupadd netadm
useradd -g netadm -c "Networking Backups User" -d /home/rancid rancid

 

2.rancidのインストール・初期設定を行う

次に、rancidのインストールを行う。
まず、以下のコマンドでソースのダウンロードを行う。
なお、最新版のパッケージについてはこちらからURLを確認しておくこと。

mkdir /home/rancid/tar
cd !$
wget ftp://ftp.shrubbery.net/pub/rancid/rancid-3.5.1.tar.gz

 

ダウンロード完了後、以下のコマンドでコンパイルしインストールを行う。

tar xzvf rancid-*.tar.gz
cd rancid-*/
./configure --prefix=/usr/local/rancid
make && make install

 

これで、rancidのインストールが完了した。
次に、バックアップ対象の機器情報やrancidのコンフィグについて、テンプレートなどをコピーしてファイルの作成を行う。

cp cloginrc.sample /home/rancid/.cloginrc
chmod 0600 /home/rancid/.cloginrc
chown -R rancid:netadm /home/rancid/.cloginrc
chown -R rancid:netadm /usr/local/rancid/
chmod 775 /usr/local/rancid/

 

設定ファイルを編集して、任意のグループ名を設定する。

sed -i.bk '/# list of rancid groups/,/^#LIST_OF_GROUPS/cLIST_OF_GROUPS="任意のグループ名(今回は「NetworkDevice」にしている)"' /usr/local/rancid/etc/rancid.conf

 

rancidユーザに切り替えてCVSの設定を行う。

su - rancid
/usr/local/rancid/bin/rancid-cvs
[root@BS-PUB-WEBTOOL-TEST01 rancid-3.5.1]# su - rancid
[rancid@BS-PUB-WEBTOOL-TEST01 ~]$ /usr/local/rancid/bin/rancid-cvs

No conflicts created by this import

cvs checkout: Updating Router
Directory /usr/local/rancid/var/CVS/Router/configs added to the repository
cvs commit: Examining configs
cvs add: scheduling file `router.db' for addition
cvs add: use 'cvs commit' to add this file permanently
RCS file: /usr/local/rancid/var/CVS/Router/router.db,v
done
Checking in router.db;
/usr/local/rancid/var/CVS/Router/router.db,v <-- router.db
initial revision: 1.1
done

No conflicts created by this import

cvs checkout: Updating And
Directory /usr/local/rancid/var/CVS/And/configs added to the repository
cvs commit: Examining configs
cvs add: scheduling file `router.db' for addition
cvs add: use 'cvs commit' to add this file permanently
RCS file: /usr/local/rancid/var/CVS/And/router.db,v
done
Checking in router.db;
/usr/local/rancid/var/CVS/And/router.db,v <-- router.db
initial revision: 1.1
done

No conflicts created by this import

cvs checkout: Updating Switches
Directory /usr/local/rancid/var/CVS/Switches/configs added to the repository
cvs commit: Examining configs
cvs add: scheduling file `router.db' for addition
cvs add: use 'cvs commit' to add this file permanently
RCS file: /usr/local/rancid/var/CVS/Switches/router.db,v
done
Checking in router.db;
/usr/local/rancid/var/CVS/Switches/router.db,v <-- router.db
initial revision: 1.1
done

3.ViewVCのインストール・初期設定を行う

3-1.ViewVCのインストール

次に、Webでコンフィグファイルを管理できるよう、ViewVCのインストールを行う。
ViewVCの最新版については、こちらからバージョンを確認してURLを適宜書き換えてもらいたい。

cd /home/rancid/tar/
wget http://viewvc.org/downloads/viewvc-1.1.25.tar.gz
tar xzvf viewvc-*.tar.gz
cd viewvc-*/
./viewvc-install
[root@BS-PUB-WEBTOOL-TEST01 viewvc-1.1.25]# ./viewvc-install
This is the ViewVC 1.1.25 installer.

It will allow you to choose the install path for ViewVC.  You will now
be asked some installation questions.  Defaults are given in square brackets.
Just hit [Enter] if a default is okay.

Installation path [/usr/local/viewvc-1.1.25]:

DESTDIR path (generally only used by package maintainers) []:

Installing ViewVC to /usr/local/viewvc-1.1.25:
   created   /usr/local/viewvc-1.1.25/bin/cgi/
   installed /usr/local/viewvc-1.1.25/bin/cgi/viewvc.cgi
   ....

 

これで、ViewVCのインストールが完了した。
次に、設定ファイルを編集してrancidのCVSを参照するように定義する。

sed -e '/^#root_parents =/croot_parents = /usr/local/rancid/var/CVS : cvs' \
    -e '/^#rcs_dir/crcs_dir = /usr/local/bin' \
    -e '/^#use_rcsparse/cuse_rcsparse = 1' \
    -i.bk /usr/local/viewvc-*/viewvc.conf

 

3-2.httpdまわりの設定を変更する

次に、以下のコマンドでcgiファイルをコピーする。

cp /usr/local/viewvc-*/bin/cgi/*.cgi /var/www/cgi-bin
chmod +x /var/www/cgi-bin/*.cgi
chown apache:apache /var/www/cgi-bin/*.cgi

 

httpdの設定ファイルを編集する。

cat <<EOF >> /etc/httpd/conf.d/rancid.conf
<VirtualHost *:80>
        DocumentRoot /var/www
        ScriptAlias /cgi-bin/ "/var/www/cgi-bin"
        ScriptAlias /viewvc /var/www/cgi-bin/viewvc.cgi
        ScriptAlias /query /var/www/cgi-bin/query.cgi
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>
</VirtualHost>
EOF

 

3-3.MariaDBまわりの設定を変更する

ViewVCで利用するMariaDBに関する設定を行う。
まず、以下のコマンドでサービスの起動設定と最低限のセキュリティ設定を行う。

systemctl enable mariadb
systemctl start mariadb
mysql_secure_installation

 

次に、以下のコマンドでViewVCで利用するためのユーザ(「VIEWVC」およびリードのみの権限を持つ「VIEWVCRO」ユーザ)の作成を行う。

mysql -u root -p -e "CREATE USER 'VIEWVC'@'localhost' IDENTIFIED BY 'パスワード';
GRANT ALL PRIVILEGES ON *.* TO 'VIEWVC'@'localhost' WITH GRANT OPTION;
CREATE USER 'VIEWVCRO'@'localhost' IDENTIFIED BY 'パスワード';
GRANT SELECT ON ViewVC.* TO 'VIEWVCRO'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
quit"

 

データベースの作成スクリプトを実行する。

/usr/local/viewvc-*/bin/make-database
[root@BS-PUB-WEBTOOL-TEST01 viewvc-1.1.25]# /usr/local/viewvc-*/bin/make-database
MySQL Hostname (leave blank for default):
MySQL Port (leave blank for default):
MySQL User: VIEWVC
MySQL Password: P@ssw0rd
ViewVC Database Name [default: ViewVC]:

Database created successfully.  Don't forget to configure the
[cvsdb] section of your viewvc.conf file.

 

ViewVCの設定ファイルを編集し、DBへの接続設定を行う。

sed -e '/^#host/chost = localhost' \
    -e '/^#port/cport = 3306' \
    -e '/^#database_name/cdatabase_name = ViewVC' \
    -e '/^#user/cuser = VIEWVC' \
    -e '/^#passwd/cpasswd = パスワード' \
    -i.bk /usr/local/viewvc-*/viewvc.conf

 

最後に、以下のコマンドを実行してデータベースをビルド、Apacheを再起動する。

/usr/local/viewvc-*/bin/cvsdbadmin rebuild /usr/local/rancid/var/CVS/CVSROOT/
systemctl restart httpd

 

あとは、ブラウザから「http://サーバのIPアドレス/viewvc」にアクセスすればよい。

20160924_193227000000

 

これで、ViewVCの設定が完了した。

 

4.各機器の設定・バックアップの実行

4-1.接続情報の設定ファイルを編集

接続情報について設定されているファイル「/home/rancid/.cloginrc」に、各NW機器の接続情報についてを記述する。
接続する各機器のIDやパスワードはワイルドカードでの指定もできる(ホスト名の部分一致で同じユーザIDやパスワードを指定できる)。

telnetおよびsshで、以下のように設定をする。
なお、事前にバックアップをとっておき、もともと入っていた設定については削除をすること。

●telnet

add password IPアドレスorホスト名(ワイルドカードあり) ログインパスワード Enableパスワード

 

●ssh

add user IPアドレスorホスト名(ワイルドカードあり) ユーザ名
add method IPアドレスorホスト名(ワイルドカードあり) ssh
add password IPアドレスorホスト名(ワイルドカードあり) ログインパスワード Enableパスワード

 

4-2.機器リストの設定

次に、各機器のリストを設定する。
リストは、「/usr/local/rancid/var/」配下にある「Router」および「Switches」フォルダにあるrouter.dbがそれに当たる。

機器の種類に応じて、それぞれのファイルに追加する。設定できるデバイスタイプについては、こちらを参照するとよいだろう。
(:(コロン)ではなく;(セミコロン)である)

ホスト名;デバイスタイプ(ベンダー);up

 

4-3.接続テストを行う

実際に、接続テストを行ってみよう。
以下のコマンドを実行する。

sudo -u rancid /usr/local/rancid/bin/clogin 対象ホスト
[root@BS-PUB-WEBTOOL-TEST01 viewvc-1.1.25]# sudo -u rancid /usr/local/rancid/bin/clogin 172.2X.XXX.XXX
172.2X.XXX.XXX
spawn telnet 172.2X.XXX.XXX
Trying 172.2X.XXX.XXX...
Connected to 172.2X.XXX.XXX.
Escape character is '^]'.


User Access Verification

Password:
BN-L2-T01>enable
Password:
BN-L2-T01#

 

無事ログインできるようであれば接続設定はちゃんとできている。

 

4-4.バックアップを取得してみる

ログインが無事行えたら、ちゃんとバックアップが行えるか確認をする。
以下のコマンドを実行する。

sudo -u rancid /usr/local/rancid/bin/rancid-run

 

無事に行えた場合は、ログに正常終了として残っている。
ログは、「/usr/local/rancid/var/logs」配下に出力されている。
“All routers sucessfully completed.”の一文があれば正常に終了している。

バックアップしたコンフィグファイルについては、「/usr/local/rancid/var/カテゴリ名/configs/」配下に配置されている。
ViewVCからも見れるので、そちらでも確認可能だ。

20160924_225713000000

 

定期的にバックアップを取得する場合は、先ほど実行したコマンドをcronで回してやるとよいだろう。

インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門 インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門

仮想マシン(CentOS 7)でディスク拡張を行ったときのLVM拡張対応(PV領域の拡張)

$
0
0

仮想マシン(今回の場合CentOS 7)でディスクの拡張を行った際、特にISOブートとかさせることもなくLVM領域の拡張を行う必要があったので、備忘として残しておく。
(特に目新しいことをしたわけではなく、普通にやることやっただけなのだけど…よく忘れるので)

1.ディスクの拡張

まず、対象の仮想マシンのディスクを拡張する。ここについては各仮想基盤ごとに違うと思う。
ちなみに個人的にProxmoxVEを使っているので、対象の仮想マシンを選択して[ハードウェア]タブを開き、対象のハードディスクを選択して[Resize Disk]、ディスクに追加する容量を入力するだけだ。

20160927_070552000000

 

ディスクの拡張後、一度OSを再起動させる。

2.パーティションの拡張

次に、fdiskを使ってパーティションの拡張を行う。
やってることは簡単で、一度既存のパーティションを削除し、その次に各パーティションを作り直しさせているだけだ。

[root@BS-PUB-WEBTOOL-TEST01 ~]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root    36G  1.4G   35G    4% /
devtmpfs                  1.9G     0  1.9G    0% /dev
tmpfs                     1.9G     0  1.9G    0% /dev/shm
tmpfs                     1.9G  8.4M  1.9G    1% /run
tmpfs                     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                 497M  167M  330M   34% /boot
tmpfs                     380M     0  380M    0% /run/user/0
[root@BS-PUB-WEBTOOL-TEST01 ~]# fdisk /dev/sda
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


コマンド (m でヘルプ): p

Disk /dev/sda: 64.4 GB, 64424509440 bytes, 125829120 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x000cf688

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    83886079    41430016   8e  Linux LVM

コマンド (m でヘルプ): d
パーティション番号 (1,2, default 2): 2
Partition 2 is deleted

コマンド (m でヘルプ): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
パーティション番号 (2-4, default 2):
最初 sector (1026048-125829119, 初期値 1026048):
初期値 1026048 を使います
Last sector, +sectors or +size{K,M,G} (1026048-125829119, 初期値 125829119):
初期値 125829119 を使います
Partition 2 of type Linux and of size 59.5 GiB is set

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。

WARNING: Re-reading the partition table failed with error 16: デバイスもしくはリソースがビジー 状態です.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
ディスクを同期しています。

 

これで、パーティションの変更処理が行えた。
といっても現時点ではマウントしている領域なので、一度再起動してから反映されることになる。
OSを再起動しよう。

 

3.LVM領域の拡張をする

再起動完了後、LVM領域の拡張をさせる。
まず、pvresizeコマンドでPhysical volumeの領域を変更する。

pvresize /dev/sda2
[root@BS-PUB-WEBTOOL-TEST01 ~]# pvresize /dev/sda2
  Physical volume "/dev/sda2" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

 

今回の場合、Phycial Volumeをそのまま拡張したので、Volume Groupもそのまま拡張されている。
続いて、以下のコマンドで拡張されたVolume Groupの領域をすべてLogical Volumeに割り当てる。

lvextend -l +100%FREE /dev/centos/root
[root@BS-PUB-WEBTOOL-TEST01 ~]# lvextend -l +100%FREE /dev/centos/root
  Size of logical volume centos/root changed from 35.59 GiB (9111 extents) to 55.63 GiB (14242 extents).
  Logical volume root successfully resized.

 

最後に、ファイルシステムのリサイズをさせる。
CentOS 7の場合、「resize2fs」ではなく「xfs_growfs」を使う。

xfs_growfs /dev/centos/root
[root@BS-PUB-WEBTOOL-TEST01 ~]# # resize2fsだと以下のようなエラーがでる
[root@BS-PUB-WEBTOOL-TEST01 ~]# resize2fs /dev/centos/root
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block while trying to open /dev/centos/root
Couldn't find valid filesystem superblock.
[root@BS-PUB-WEBTOOL-TEST01 ~]#
[root@BS-PUB-WEBTOOL-TEST01 ~]# xfs_growfs /dev/centos/root
meta-data=/dev/mapper/centos-root isize=256    agcount=4, agsize=2332416 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=9329664, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=4555, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 9329664 to 14583808
[root@BS-PUB-WEBTOOL-TEST01 ~]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root    56G  1.4G   55G    3% /
devtmpfs                  1.9G     0  1.9G    0% /dev
tmpfs                     1.9G     0  1.9G    0% /dev/shm
tmpfs                     1.9G  8.3M  1.9G    1% /run
tmpfs                     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                 497M  167M  330M   34% /boot
tmpfs                     380M     0  380M    0% /run/user/0

 

これで処理は完了。

[改訂新版]プロのためのLinuxシステム構築・運用技術 (Software Design plus) [改訂新版]プロのためのLinuxシステム構築・運用技術 (Software Design plus)

sipcalcコマンドによるIPアドレスの計算

$
0
0

以前、コンソール上でのIPアドレスの計算方法について書いたけど、(名前からして)その際に紹介したipcalcの強化版?的なsipcalcというコマンドを見かけたので紹介する。

1.インストール

インストールだが、以下のコマンドで行える。

yum install -y epel-release;yum install sipcalc # CentOSなどRHEL系(CentOS 7にはまだパッケージが無い?)
sudo apt install sipcalc # Debian/Ubuntu系
brew install sipcalc # MacOS X

 

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

2.コマンドを実行する

sipcalcは、基本的には以下のように実行して使用する。

sipcalc IPアドレス
blacknon@BS-PUB-UBUNTU-01:~$ sipcalc 192.168.0.100/26
-[ipv4 : 192.168.0.100/26] - 0

[CIDR]
Host address            - 192.168.0.100
Host address (decimal)  - 3232235620
Host address (hex)      - C0A80064
Network address         - 192.168.0.64
Network mask            - 255.255.255.192
Network mask (bits)     - 26
Network mask (hex)      - FFFFFFC0
Broadcast address       - 192.168.0.127
Cisco wildcard          - 0.0.0.63
Addresses in network    - 64
Network range           - 192.168.0.64 - 192.168.0.127
Usable range            - 192.168.0.65 - 192.168.0.126

-
blacknon@BS-PUB-UBUNTU-01:~$ sipcalc 192.168.0.100 255.255.255.240
-[ipv4 : 192.168.0.100 255.255.255.240] - 0

[CIDR]
Host address            - 192.168.0.100
Host address (decimal)  - 3232235620
Host address (hex)      - C0A80064
Network address         - 192.168.0.96
Network mask            - 255.255.255.240
Network mask (bits)     - 28
Network mask (hex)      - FFFFFFF0
Broadcast address       - 192.168.0.111
Cisco wildcard          - 0.0.0.15
Addresses in network    - 16
Network range           - 192.168.0.96 - 192.168.0.111
Usable range            - 192.168.0.97 - 192.168.0.110

-

 

インターフェイスを指定して、そこからIPアドレスの計算をさせることも可能だ。

sipcalc インターフェイス名
blacknon@BS-PUB-UBUNTU-01:~$ sipcalc eth0
-[int-ipv4 : eth0] - 0

[CIDR]
Host address            - 172.XXX.XXX.120
Host address (decimal)  - 2887516280
Host address (hex)      - AC1C0078
Network address         - 172.XXX.XXX.0
Network mask            - 255.255.255.0
Network mask (bits)     - 24
Network mask (hex)      - FFFFFF00
Broadcast address       - 172.28.0.255
Cisco wildcard          - 0.0.0.255
Addresses in network    - 256
Network range           - 172.XXX.XXX.0 - 172.XXX.XXX.255
Usable range            - 172.XXX.XXX.1 - 172.XXX.XXX.254

-

 

マスタリングTCP/IP 入門編 第5版 マスタリングTCP/IP 入門編 第5版

パイプで繋いでコマンドの標準出力の内容をSlackに通知する『slackcat』

$
0
0

時折、Slackにコマンドから通知を出したいことがある。
面倒だし、標準出力から渡せたらなぁ…と思って調べたところ、まさにそれを行える『slackcat』というコマンドがあるようだ。
これは使えそうということで、早速試してみる。

1.インストール

インストールはかなり簡単なようで、以下のコマンドで実行できる。

●Linuxの場合

wget https://github.com/vektorlab/slackcat/releases/download/v1.1/slackcat-1.1-linux-amd64 -O slackcat
sudo mv slackcat /usr/local/bin/
sudo chmod +x /usr/local/bin/slackcat

 

●Mac OS Xの場合

brew install slackcat

2.設定

次に、通知するSlackの設定を行う。
以下のコマンドを実行し、URLを表示させる。

slackcat --configure
blacknon@BS-PUB-UBUNTU-01:~$ slackcat --configure
slackcat Creating token request for Slackcat
slackcat Use the below URL to authorize slackcat if browser fails to launch
slackcat http://slackcat.chat/configure

 

出力されたURLにアクセスすると、ブラウザからSlackとslackcatを連携するかどうか聞かれる。
許可をすると、以下のような画面が表示されるので、出力されているコマンドを実行してやる。

20160930_091149000000

 

これで設定は終わり。

 

3.コマンドを実行する

さて、それでは実際にコマンドを実行してみよう。

コマンド | slackcat --channel チャンネル名
コマンド | slackcat --tee --channel チャンネル名 # コンソール上にも表示させる場合

20160930_091532000000

blacknon@BS-PUB-UBUNTU-01:~$ echo ABC | slackcat --channel general
slackcat connected to blacknon as blacknon
slackcat file 1475194489 uploaded to general (0.395s)
blacknon@BS-PUB-UBUNTU-01:~$ echo AAA | slackcat --tee --channel general
slackcat connected to blacknon as blacknon
AAA
slackcat file 1475194500 uploaded to general (0.335s)

 

で、Slackの画面がこちら。

20160930_091622000000

 

確かに、標準出力で渡した内容がSlack側に通知されている。
手軽だし、設定も簡単なので良さそう。

ただ、サーバ側でcronで回すと行った使い方なら、ちゃんとWebHookを使ったスクリプト書いたほうが良いだろう。

はじめてみようSlack 使いこなすための31のヒント はじめてみようSlack 使いこなすための31のヒント

CentOS 7にワークフローをいじって設定できるPython製のジョブスケジューラー『Dagobah』をインストールする

$
0
0

ジョブスケジューラーを導入しようと色々調べていたところ、ワークフローとかが使えるPython製のジョブスケジューラー『Dagobah』というものを見かけたので、ちょっと触ってみる事にする。
なお、インストール先としてはCentOS 7を用いる。

1.インストール

『Dagobah』はpip経由でインストールできるようなので、以下のコマンドでインストールする。

yum -y install python-pip gcc libxml2-devel libxslt-devel python-devel
pip install dagobah
pip install pymongo

 

これでインストールが完了。
簡単だ。

 

2.『Dagobah』のサービス起動

次に、インストールした『Dagobah』のサービスを起動する。
とりあえず、まず設定ファイルを作成する。

mkdir -p ~/dagobah/daemon/
cd ~/dagobah/daemon/
wget https://raw.githubusercontent.com/thieman/dagobah/master/dagobah/daemon/dagobahd.yml
sed -i 's/127.0.0.1/0.0.0.0/g' dagobahd.yml
cd

 

ホームディレクトリに移動後、以下のコマンドを実行するとサービスが起動する。

dagobah
[root@BS-PUB-CENT7-01 ~]# dagobahd
Creating new config file in home directory
Defaulting missing config key Logging.enabled to False
WARNING:root:Defaulting missing config key Logging.enabled to False
WARNING:root:Email.auth_required is True but Email.user is None. Emailing of reports will be disabled.
WARNING:root:SSH config doesn't exist, no remote hosts will be listed
Starting app on 127.0.0.1:9000

 

以後は、~/.dagobahd.ymlというファイルが設定ファイルになる。

3.ブラウザからアクセスする

とりあえず、ブラウザからアクセスしてみよう。初期パスワードは「dagobah」になる。

20161001_222756000000

 

ログイン直後の画面。
新しいジョブを作れとの事。

20161001_223454000000

 

適当に「test」というジョブを作ってみた。

20161001_223626000000

 

[View]を開いたところ。まだ何もタスクを追加してないので、特に何も表示されてない。

20161001_223736000000

 

ページ下にある「Add New Task」から適当にタスクを作ってつなげて見たところ。
マウスで普通につなげる事ができる。

20161001_224124000000

 

[Start Job from Beginning]からジョブを開始した結果。
普通にジョブが正常終了したとのこと。

20161001_224324000000

 

最初のタスクを意図的に失敗するようにした結果。
2個めのタスクが実行されていない事がわかる。

20161001_224418000000

 

確かに、マウスでワークフローをいじってジョブを処理させることができるようだ。
結構お手軽かつわかりやすい感じ。

 

4.リモートサーバに対してタスクを実行させる

さて、今時点ではリモートサーバの設定をしてないので、ローカルサーバに対するタスクしか実行できていない。
じゃあ、リモートサーバに対しタスクを実行するにはどんな設定をすればいいのか。

どうやら、「.ssh/config」に接続先の情報を記述することでリモートサーバとして指定できるようになるみたいだ。
とりあえず、以下のようにファイルを作成する。

Host サーバ名
     HostName ホスト名orIPアドレス
     User ユーザ名
     IdentityFile ~/.ssh/id_rsa(鍵ファイルPATH)

 

ファイル作成後、サーバの再起動をしなくてもリモート先の選択肢に出てくるようになる。

20161001_225640000000

 

各タスクの返り値に応じて処理を分岐させたり、返り値を次のタスクに渡すような処理はできないみたいだけど、単純なジョブならこれで設定できそう。
小規模、かつ単純なタスクのみをジョブにするなら結構ありかも。トリガーとかが必要になる環境では使えないかな。。。

 

新しいLinuxの教科書 新しいLinuxの教科書

コンソールから利用できるネットワークモニタリングツール『Mylg』

$
0
0

別件の調べものをしてたところ、コンソールで利用できるネットワークモニタリングツール『Mylg』というものを見かけたので、少し触ってみることにした(Githubはこちら)。
とりあえず、イメージをつかむなら公式サイトの動画を見るとよさそう。で、見る限り結構便利そうな印象だ。専用コンソールに入って操作するようだけど、かなり扱いやすそうな感じ。

見ててなんとなく予想がついたかもしれないが、Golangで記述されたツールのようだ。
一応、Mac用のパッケージもCentOSなど用のrpmファイルも提供されているようなのだが、今回はUbuntu Server 16.04 LTSにこのツールをインストールして使ってみる。

1.インストール

まず、以下のコマンドでインストールする。

sudo apt-get install libpcap-dev golang
curl -O http://mylg.io/dl/linux/mylg.amd64.deb && sudo dpkg -i mylg.amd64.deb

 

これでインストールが完了した。

 

2.使ってみる

インストールが完了したので、さっそく使ってみよう。
ユーザガイドを見る限り、結構機能があるようなのでいくつか抜粋して使ってみる。

基本的には、まず以下のコマンドでmylgのコンソールに入り、その中でコマンドを実行していく使い方になるようだ。

mylg

20161012_213527000000

 

2-1.tracerouteをしてみる

コマンド「trace」を実行することで、対象のホストへのtracerouteを行うことができる。

local> trace orebibou.com
trace route to orebibou.com (157.112.152.17), 30 hops max
Get https://stat.ripe.net/data/prefix-overview/data.json?max_related=50&resource=172.28.0.1: net/http: TLS handshake timeout
1  XXX.XXX.XXX.1 0.664 ms 0.801 ms 0.784 ms
2  XXX.XXX.XXX.1 1.077 ms 1.026 ms 1.019 ms
3  r641.tokynt01.ap.so-net.ne.jp. (202.223.117.182) [ASN 2527/SO-NET] 5.503 ms 5.576 ms 6.062 ms
4  maru-02Gi2-9.net.so-net.ne.jp. (202.223.117.181) [ASN 2527/SO-NET] 4.690 ms 4.601 ms 5.344 ms
5  ote-gw7Ae7.net.so-net.ne.jp. (202.213.193.33) [ASN 2527/SO-NET] 5.199 ms 4.791 ms 5.692 ms
6  202.213.193.35 [ASN 2527/SO-NET] 11.180 ms 12.899 ms 13.514 ms
7  tkort2-as2527-10g.bb.sakura.ad.jp. (157.17.131.17) 13.757 ms 15.680 ms 16.418 ms
8  tkwrt1s-ort2.bb.sakura.ad.jp. (157.17.130.26) 8.959 ms 13.193 ms 12.924 ms
9  tkwrt3-wrt1s.bb.sakura.ad.jp. (59.106.247.118) 13.231 ms 9.872 ms 8.734 ms
10 157.17.131.246 16.936 ms 20.237 ms 16.301 ms
11 osnrt1s-nrt3-2.bb.sakura.ad.jp. (157.17.146.162) 14.881 ms 16.747 ms 18.039 ms
12 osnrt1b-nrt1s.bb.sakura.ad.jp. (157.17.146.138) 14.099 ms 17.479 ms 21.093 ms
13 osnrt3c-nrt1b.bb.sakura.ad.jp. (157.17.147.2) 26.285 ms 23.220 ms 20.478 ms
14 210.188.211.188 [ASN 9371/SAKURA-C] 13.934 ms 14.521 ms 13.187 ms
15 sv916.xserver.jp. (157.112.152.17) [ASN 9371/SAKURA-C] 12.231 ms 12.665 ms 12.197 ms

 

このとき、「-r」オプションを付与することでリアルタイムでの監視ができるようだ。
「1」「2」キーで表示を切り替えることができる。

20161012_213952000000

 

2-2.パケットキャプチャをしてみる

コマンド「dump」でパケットキャプチャを行える。
オプションはtcpdumpに似ているので、tcpdumpの使い方がわかってればすぐに使いこなせそうだ。

地味に便利な機能として、「-s」オプションで指定したキーワードを含むパケットのみを抽出できる。
以下は、「orebibou」というキーワードを持つパケットのみ監視した結果。

local> dump -i eth0 -x -s orebibou
Interface: eth0, capture size: 6144 bytes
21:43:39.396 IPv4/TCP BS-PUB-UBUNTU-01.BLACKNON.LOCAL.:47768 > sv916.xserver.jp.:80(http) [P.], win 229, len: 76
00000000 47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a |GET / HTTP/1.1..|
00000010 48 6f 73 74 3a 20 6f 72 65 62 69 62 6f 75 2e 63 |Host: orebibou.c|
00000020 6f 6d 0d 0a 55 73 65 72 2d 41 67 65 6e 74 3a 20 |om..User-Agent: |
00000030 63 75 72 6c 2f 37 2e 34 37 2e 30 0d 0a 41 63 63 |curl/7.47.0..Acc|
00000040 65 70 74 3a 20 2a 2f 2a 0d 0a 0d 0a             |ept: */*....    |

21:43:39.422 IPv4/TCP sv916.xserver.jp.:80(http) > BS-PUB-UBUNTU-01.BLACKNON.LOCAL.:47768 [P.], win 46, len: 504
00000000 48 54 54 50 2f 31 2e 31 20 33 30 31 20 4d 6f 76 |HTTP/1.1 301 Mov|
00000010 65 64 20 50 65 72 6d 61 6e 65 6e 74 6c 79 0d 0a |ed Permanently..|
00000020 44 61 74 65 3a 20 57 65 64 2c 20 31 32 20 4f 63 |Date: Wed, 12 Oc|
00000030 74 20 32 30 31 36 20 31 32 3a 34 33 3a 33 39 20 |t 2016 12:43:39 |
00000040 47 4d 54 0d 0a 53 65 72 76 65 72 3a 20 41 70 61 |GMT..Server: Apa|
00000050 63 68 65 0d 0a 4c 6f 63 61 74 69 6f 6e 3a 20 68 |che..Location: h|
00000060 74 74 70 73 3a 2f 2f 6f 72 65 62 69 62 6f 75 2e |ttps://orebibou.|
00000070 63 6f 6d 2f 0d 0a 43 61 63 68 65 2d 43 6f 6e 74 |com/..Cache-Cont|
00000080 72 6f 6c 3a 20 6d 61 78 2d 61 67 65 3d 31 0d 0a |rol: max-age=1..|
00000090 45 78 70 69 72 65 73 3a 20 57 65 64 2c 20 31 32 |Expires: Wed, 12|
000000a0 20 4f 63 74 20 32 30 31 36 20 31 32 3a 34 33 3a | Oct 2016 12:43:|
000000b0 34 30 20 47 4d 54 0d 0a 56 61 72 79 3a 20 41 63 |40 GMT..Vary: Ac|
000000c0 63 65 70 74 2d 45 6e 63 6f 64 69 6e 67 0d 0a 43 |cept-Encoding..C|
000000d0 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 32 |ontent-Length: 2|
000000e0 32 39 0d 0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 |29..Content-Type|
000000f0 3a 20 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 |: text/html; cha|
00000100 72 73 65 74 3d 69 73 6f 2d 38 38 35 39 2d 31 0d |rset=iso-8859-1.|
00000110 0a 0d 0a 3c 21 44 4f 43 54 59 50 45 20 48 54 4d |...<!DOCTYPE HTM|
00000120 4c 20 50 55 42 4c 49 43 20 22 2d 2f 2f 49 45 54 |L PUBLIC "-//IET|
00000130 46 2f 2f 44 54 44 20 48 54 4d 4c 20 32 2e 30 2f |F//DTD HTML 2.0/|
00000140 2f 45 4e 22 3e 0a 3c 68 74 6d 6c 3e 3c 68 65 61 |/EN">.<html><hea|
00000150 64 3e 0a 3c 74 69 74 6c 65 3e 33 30 31 20 4d 6f |d>.<title>301 Mo|
00000160 76 65 64 20 50 65 72 6d 61 6e 65 6e 74 6c 79 3c |ved Permanently<|
00000170 2f 74 69 74 6c 65 3e 0a 3c 2f 68 65 61 64 3e 3c |/title>.</head><|
00000180 62 6f 64 79 3e 0a 3c 68 31 3e 4d 6f 76 65 64 20 |body>.<h1>Moved |
00000190 50 65 72 6d 61 6e 65 6e 74 6c 79 3c 2f 68 31 3e |Permanently</h1>|
000001a0 0a 3c 70 3e 54 68 65 20 64 6f 63 75 6d 65 6e 74 |.<p>The document|
000001b0 20 68 61 73 20 6d 6f 76 65 64 20 3c 61 20 68 72 | has moved <a hr|
000001c0 65 66 3d 22 68 74 74 70 73 3a 2f 2f 6f 72 65 62 |ef="https://oreb|
000001d0 69 62 6f 75 2e 63 6f 6d 2f 22 3e 68 65 72 65 3c |ibou.com/">here<|
000001e0 2f 61 3e 2e 3c 2f 70 3e 0a 3c 2f 62 6f 64 79 3e |/a>.</p>.</body>|
000001f0 3c 2f 68 74 6d 6c 3e 0a                         |</html>.|

20161012_214738000000

 

このキーワードサーチだけでもかなり便利な気がする。

 

2-3.dig+traceをしてみる

digを行い、名前解決について確認する。
NSやMXレコードなど、デフォルトで一発出力してくれるらしい。

local> dig orebibou.com
Trying to query server: 172.28.0.1  your local dns server
;; opcode: QUERY, status: NOERROR, id: 41176
;; flags: qr rd ra;
orebibou.com.   21599   IN      NS      ns2.xserver.jp.
orebibou.com.   21599   IN      NS      ns1.xserver.jp.
orebibou.com.   21599   IN      SOA     ns1.xserver.jp. root.sv0.xserver.jp. 0 10800 3600 604800 3600
orebibou.com.   21599   IN      NS      ns3.xserver.jp.
orebibou.com.   21599   IN      A       157.112.152.17
orebibou.com.   21599   IN      NS      ns4.xserver.jp.
orebibou.com.   21599   IN      NS      ns5.xserver.jp.
orebibou.com.   21599   IN      MX      0 orebibou.com.
;; Query time: 112 ms

;; CHAOS CLASS BIND
version.bind.   0       CH      TXT     "dnsmasq-2.55"

ただ、それよりも注目したいのが「+trace」サブオプション。
どうも名前解決をtraceしてくれてるようだ。状況によっては地味に便利そうな機能だ。

local> dig orebibou.com +trace
.       6439    IN      NS      d.root-servers.net.
.       6439    IN      NS      m.root-servers.net.
.       6439    IN      NS      b.root-servers.net.
.       6439    IN      NS      e.root-servers.net.
.       6439    IN      NS      a.root-servers.net.
.       6439    IN      NS      f.root-servers.net.
.       6439    IN      NS      h.root-servers.net.
.       6439    IN      NS      j.root-servers.net.
.       6439    IN      NS      k.root-servers.net.
.       6439    IN      NS      g.root-servers.net.
.       6439    IN      NS      l.root-servers.net.
.       6439    IN      NS      c.root-servers.net.
.       6439    IN      NS      i.root-servers.net.
from: XXX.XXX.XXX.1#53 in 5 ms
com.    172800  IN      NS      a.gtld-servers.net.
com.    172800  IN      NS      j.gtld-servers.net.
com.    172800  IN      NS      g.gtld-servers.net.
com.    172800  IN      NS      k.gtld-servers.net.
com.    172800  IN      NS      f.gtld-servers.net.
com.    172800  IN      NS      c.gtld-servers.net.
com.    172800  IN      NS      i.gtld-servers.net.
com.    172800  IN      NS      d.gtld-servers.net.
com.    172800  IN      NS      l.gtld-servers.net.
com.    172800  IN      NS      m.gtld-servers.net.
com.    172800  IN      NS      e.gtld-servers.net.
com.    172800  IN      NS      b.gtld-servers.net.
com.    172800  IN      NS      h.gtld-servers.net.
from: d.root-servers.net.#53 in 85 ms
orebibou.com.   172800  IN      NS      ns1.xserver.jp.
orebibou.com.   172800  IN      NS      ns2.xserver.jp.
orebibou.com.   172800  IN      NS      ns3.xserver.jp.
orebibou.com.   172800  IN      NS      ns4.xserver.jp.
orebibou.com.   172800  IN      NS      ns5.xserver.jp.
from: a.gtld-servers.net.#53 in 114 ms
orebibou.com.   86400   IN      SOA     ns1.xserver.jp. root.sv0.xserver.jp. 0 10800 3600 604800 3600
orebibou.com.   86400   IN      MX      0 orebibou.com.
orebibou.com.   86400   IN      NS      ns1.xserver.jp.
orebibou.com.   86400   IN      NS      ns4.xserver.jp.
orebibou.com.   86400   IN      NS      ns3.xserver.jp.
orebibou.com.   86400   IN      A       157.112.152.17
orebibou.com.   86400   IN      NS      ns5.xserver.jp.
orebibou.com.   86400   IN      NS      ns2.xserver.jp.
from: ns1.xserver.jp.#53 in 13 ms

 

2-4.LAN内で使われているIPアドレスを調べる

前にこちらで、LAN内で利用されているIPアドレスの調査方法について記述したことがあるが、その機能も持っている。
コマンド「disc」で、使われているすべてのインターフェイスが接続しているネットワークのIPアドレスを抽出してくる。
こちらも、地味にキーワードサーチ機能がついているようだ(「disc キーワード」で検索できる)。

20161012_215804000000

 

2-5.ポートスキャン、IPアドレスの所有者確認を行う

「scan」コマンドで、対象ホストに対しポートスキャンを実施することができる。

local> scan BS-PUB-CENT7-01
+----------+------+--------+-------------+
| PROTOCOL | PORT | STATUS | DESCRIPTION |
+----------+------+--------+-------------+
| TCP      |   22 | Open   |             |
+----------+------+--------+-------------+
Scan done: 1 opened port(s) found in 2.051 seconds
local> scan google.co.jp
+----------+------+--------+-------------+
| PROTOCOL | PORT | STATUS | DESCRIPTION |
+----------+------+--------+-------------+
| TCP      |   80 | Open   |             |
| TCP      |  443 | Open   |             |
+----------+------+--------+-------------+
Scan done: 2 opened port(s) found in 2.039 seconds

 

IPアドレスの所有者を確認する場合は、「whois」コマンドを実行する。

local> whois 8.8.8.8
+------------+-------+--------------------------+
|   PREFIX   |  ASN  |          HOLDER          |
+------------+-------+--------------------------+
| 8.8.8.0/24 | 15169 | GOOGLE - Google Inc., US |
+------------+-------+--------------------------+

 

その他、hpingやnms、peeringなどいろいろなコマンドがそろっている。
これ一個で大体のことができると考えると、だいぶよさげなツールではなかろうか。
一応、「mylg」コマンドの後ろに内部コマンドを入れることでそのまま実行できるので、他のコマンドとパイプでつなげて実行するのにも困らない。

blacknon@BS-PUB-UBUNTU-01:~$ mylg dig orebibou.com
Trying to query server: 172.28.0.1  your local dns server
;; opcode: QUERY, status: NOERROR, id: 39603
;; flags: qr rd ra;
orebibou.com.   21599   IN      NS      ns3.xserver.jp.
orebibou.com.   21599   IN      SOA     ns1.xserver.jp. root.sv0.xserver.jp. 0 10800 3600 604800 3600
orebibou.com.   21599   IN      NS      ns5.xserver.jp.
orebibou.com.   21599   IN      MX      0 orebibou.com.
orebibou.com.   21599   IN      NS      ns4.xserver.jp.
orebibou.com.   21599   IN      A       157.112.152.17
orebibou.com.   21599   IN      NS      ns1.xserver.jp.
orebibou.com.   21599   IN      NS      ns2.xserver.jp.
;; Query time: 103 ms

;; CHAOS CLASS BIND
version.bind.   0       CH      TXT     "dnsmasq-2.55"

 

図解入門 よくわかる最新ネットワーク技術の基本と仕組み 図解入門 よくわかる最新ネットワーク技術の基本と仕組み

CentOS 7にいろいろなシステムと連携できるジョブスケジューラー『Rundeck』をインストールする

$
0
0

ジョブスケジューラーについていろいろと物色しているのだが、最近であればやはりRundeckは触っといたほうがいいだろうと思ったのでCentOS 7に入れていじってみることにする。
「Rundeck」は、Webベースのインターフェイスを持つ軽量なエージェントレス(ssh接続)のジョブスケジューラーだ。また、プラグインなどを用いて他のシステムと連携して、特定のログなどをトリガーにジョブをキックさせることもできる(この辺はStackStormのほうが対応数が多いっぽい。その他Apache NifiとかHugginとかのIFTTTに影響を受けたプロジェクトのほうが強いかも?)。
ジョブの記述もcronと同じように記述できるので手軽なようだ。一応、ジョブネットも作成可能らしい。

とりあえず、まずはインストールをしてみよう。
インストール先にはCentOS 7を用いる。なお、お試しなので冗長化はせず、FirewalldやSELinuxも無効化する。

1.インストール

RundeckはJavaで記述されているので、まずはJavaの実行環境から。
以下のコマンドでインストールする。

wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u101-b13/jdk-8u101-linux-x64.rpm
rpm -ihv jdk-8u101-linux-x64.rpm

 

次に、Rundeckをインストールする。

rpm -Uvh http://repo.rundeck.org/latest.rpm
yum install -y rundeck
systemctl start rundeckd

 

これで、Rundeckのインストールおよびサービス起動ができた。

 

2.初期設定

次に、Rundeckの設定ファイル(/etc/rundeck/rundeck-config.properties)を編集してブラウザから管理コンソールにアクセスできるようにする。

sed -i '/^grails/c grails.serverURL=http://[RundeckのIPアドレスorホスト]:4440' /etc/rundeck/rundeck-config.properties
systemctl restart rundeckd

 

3.ブラウザからアクセスする

さて、初期設定が完了したらブラウザからアクセスしてみよう。
「http://[RundeckのIPアドレスorホスト]:4440」にアクセスするとログイン画面が表示される。
初期ID/PWは「admin/admin」となっている。

20161009_115006000000

20161009_115141000000

 

ログイン後のトップページを見るとわかるが、Rundeckではプロジェクトがないとジョブを登録できないので、まずはプロジェクトを作成する。
[New Project]をクリックして、プロジェクトを作成する。
とりあえず、「Project Name」と「SSH Key File path」だけ設定しておけばいいだろう。そのままプロジェクトを作成する。

20161009_115746000000

 

これで、ジョブが作成できるようになった。

20161009_120208000000

 

4.Rundeckサーバ自身でのジョブ実行

まずはRundeckサーバ自身でジョブを実行させる。
「Create a new Job …」をクリックし、ジョブ作成画面に遷移する。

20161009_120845000000

 

ジョブ名およびその説明文について記述する。
オプションについては、今回は設定しない。

20161009_155002000000_

 

次に、ジョブで実行するステップ(コマンドとかスクリプトの流れ)を設定する。
「If a step fails」はジョブ失敗時の挙動(「Stop at the failed step.」は失敗したステップでジョブを停止する、「Run remaining steps before failing.」は失敗したステップをスキップして残りのステップを実行させる)、「Strategy」はジョブの実行時の挙動(「Node-oriented」はノード単位での実行、「Step-oriented」はステップ単位での実行)となる。とりあえず、デフォルトでは「失敗したステップでジョブを停止する」「ノード単位での実行」となる。

「Add a Step」でスクリプトやコマンドなど、実行させるステップについて定義できる。
とりあえず、ここではCommandを選択する。

20161009_162352000000_

 

実行するコマンドの入力画面に切り替わるので、(今回はテストなので適当に)入力する。
コマンドの説明についてもわかるように記述する。

20161009_164552000000_

 

今回はローカルなので、「Execute locally」を選択。

20161009_164831000000_

 

「Send Notification?」の箇所で、ジョブの実行結果の通知設定を行うことができる。
メールの送信にはSMTPサーバなどの設定が必要になるので、今回は設定しない。

20161009_172559000000_

 

ジョブの実行スケジュール設定。
時間等をそのまま指定する方法と、crontabと同じフォーマットで指定する方法がある。

20161009_172853000000_

20161009_172857000000_

 

とりあえず、以上でジョブの作成を完了にする。
トップページから「Run Job Now」を実行してジョブを実行してみよう。

20161009_165146000000

 

実行した結果がこちら。
無事ジョブの実行がされたことが分かる。

20161009_165416000000

20161009_165426000000

20161009_165434000000

20161009_165438000000

 

5.リモートサーバでのジョブ実行

さて、ローカルだけジョブを実行しててもあまり意味がないので、次にリモートサーバに対しジョブを実行してみよう。
Rundeckでリモートサーバに対して処理を行う場合は、sshログインできるようにする必要がある。プロジェクト作成時に鍵ファイルのPATHを指定している(デフォルトでは「/var/lib/rundeck/.ssh/id_rsa」にある)ので、その鍵ファイルをリモートサーバにコピーしてやろう。
ここでは、事前にリモートサーバ側でユーザ「rundeck」を作成、パスワードを設定しているものとする(鍵のコピー後は「passwd -d rundeck」でパスワードを削除する)。

ssh-copy-id -i /var/lib/rundeck/.ssh/id_rsa.pub rundeck@[リモートサーバ IPorホスト名]

 

次に、Rundeckにリモートサーバの情報を登録する。
Web管理画面からは登録できないようなので、コンソールから設定ファイルを編集する。
ノードの追加は、「/var/rundeck/projects/プロジェクト名/etc/resources.xml」に記述することで行える。
(以下の例では、イメージしやすいようosVersionなどはとりあえず入れてあるのだが、実際の環境に合わせて書き換えてもらいたい。)

sed '/^<\/project>/i\
  <node name="サーバ名" description="説明" tags="タグ" hostname="IPアドレスorホスト名" osArch="amd64" osFamily="unix" osName="Linux" osVersion="3.10.0-327.el7.x86_64" username="rundeck"/>' \
   -i.bk /var/rundeck/projects/*/etc/resources.xml

 

設定ファイルに追記したら、もう管理画面上からもリモートサーバを指定できるようになる。
今回は、とりあえず先ほどローカル向けに作成したジョブにノードを追加する。

「Nodes」のとこで「Dispatch to Nodes」を選択し、先ほど追記したノード名で検索する(このとき、部分一致で検索する場合は「.*」でちゃんと正規表現を書いてあげる必要がある)。

20161009_174735000000_

 

filterでの検索結果にジョブの実行対象となるノードが出ている状態で保存し、ジョブを実行してみよう。

20161009_175324000000

 

無事、ジョブの実行ができた。
ノードの追加のとこがちょっと面倒な気はするが、悪くなさそうだ。

いろいろなプラグインもあるので、少しづつ使ってみよう。

 

【参考】

 

新人IT担当者のための ネットワーク管理&運用がわかる本 新人IT担当者のための ネットワーク管理&運用がわかる本

ネットワーク機器のコンフィグバックアップツール『Oxidized』でNW機器のコンフィグをGitlab連携する

$
0
0

ネットワーク機器のコンフィグバックアップを自動化するツールといえば、前に紹介したrancidrConfigらへんがあるのだが、rancidに影響を受けたツールで『Oxidized』というツールを見かけたので、ちょっと触ってみることにした。
サポートしているNW機器のOSは結構多くて、CiscoのIOSやJuniperのJunOS・ScreenOSはもちろんのこと、VyattaとかRouterOS、FortiOSとかもあるようだ(NetGearェ…)。
Webクライアントもあり、かつ履歴管理はGitで行えるようなので結構便利そう。

今回は、このツールをCentOS 7に入れてみる。

1.インストール

まず、前提パッケージのインストールを行う。

yum install -y cmake sqlite-devel openssl-devel libssh2-devel ruby gcc ruby-devel git

 

Rubyのインストールができたら、gemでOxidizedのインストールを行う。

gem install oxidized --source http://rubygems.org
gem install oxidized-script oxidized-web --source http://rubygems.org

 

これでインストール完了。

2.『Oxidized』の設定

さて、それでは設定を行っていこう。
まず、プロセス実行ユーザとして「oxidized」ユーザを作成、スイッチしよう。

useradd oxidized -d /opt/oxidized
su - oxidized

 

次に、oxidizedコマンドを実行してやる。
コマンドを実行すると、デフォルトの設定ファイルとして「~/.config/oxidized/config」というテンプレートファイルが作成される。

oxidized
[oxidized@BS-PUB-CENT7-01 ~]$ oxidized
edit ~/.config/oxidized/config
/usr/local/share/gems/gems/oxidized-0.18.0/lib/oxidized/config.rb:53:in `load': edit ~/.config/oxidized/config (Oxidized::NoConfig)
        from /usr/local/share/gems/gems/oxidized-0.18.0/lib/oxidized/cli.rb:24:in `initialize'
        from /usr/local/share/gems/gems/oxidized-0.18.0/bin/oxidized:9:in `new'
        from /usr/local/share/gems/gems/oxidized-0.18.0/bin/oxidized:9:in `'
        from /usr/local/bin/oxidized:23:in `load'
        from /usr/local/bin/oxidized:23:in `'
[oxidized@BS-PUB-CENT7-01 ~]$ ls -la ~/.config/oxidized/config
-rw-rw-r--. 1 oxidized oxidized 418 10月 15 15:56 /opt/oxidized/.config/oxidized/config

 

設定ファイルのテンプレートができたら、一応バックアップだけ取って以下のように編集してしまおう。
今回は、各ノードのコンフィグはすべてgitで差分を管理し、かつその情報をローカルネットワーク内にいるGitlabに連携させるようにする。
なお、以下の例ではインターバル(コンフィグの確認間隔(interval:))を30秒にしているが、これは環境に合わせて適切な値を模索してもらいたい。
※事前にGitlabにはユーザの鍵設定をしておくこと。プロジェクトの鍵だとPUTできないので注意。

●/opt/oxidized/.config/oxidized/config

---
username: oxidized
password: oxidized
model: junos
interval: 30
use_syslog: false
log: "/opt/oxidized/.config/oxidized/logs/oxidized.log"
debug: true
threads: 30
timeout: 20
retries: 3
prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/
rest: Webインターフェイス用IPアドレスorホスト名:8888
vars: {}
groups: {}
input:
  default: ssh, telnet
  debug: false
  ssh:
    secure: false
output:
  default: git
  git:
    user: blacknon
    email: blacknon@XXX.com
    single_repo: true
    repo: /opt/oxidized/git/oxidized.git
hooks:
  push_to_remote:
    type: githubrepo
    events: [post_store]
    remote_repo: "git@GitLabサーバのIPアドレス:blacknon/NetworkConfiguration.git"
    publickey: /opt/oxidized/.ssh/id_rsa.pub
    privatekey: /opt/oxidized/.ssh/id_rsa
source:
  default: csv
  csv:
    file: "/opt/oxidized/router.db"
    delimiter: !ruby/regexp /:/
    map:
      name: 0
      model: 1
      username: 2
      password: 3
    vars_map:
      enable: 4
model_map:
  cisco: ios
  juniper: junos
  F5: tmos
  fortigate: fortios
  screenos: screenos
  vyos: vyatta

 

これで設定ファイルはOK。
次に、コンフィグを持ってくるノードのリストを作成する。
今回は、sourceのvar_mapでenableパスワードがある場合のみ、5列目に記述するように指定している。

●/opt/oxidized/router.db

対象ホスト名:ios:ユーザ名:パスワード:Enableパスワード
対象ホスト名:vyatta:ユーザ名:パスワード:Enableパスワード

 

設定ファイルを無事作成したら、最後に「oxidized」コマンドでプロセスを起動する。
(できれば、起動スクリプトを作ってやったほうがいいだろう)

oxidized
[oxidized@BS-PUB-CENT7-01 ~]$ oxidized
Puma 2.16.0 starting...
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://172.20.100.118:8888

 

起動したWeb管理画面がこちら。
今回はVyOSと手元にあったCatalystに対して実行している。

20161015_180608000000

 

最新のコンフィグの内容は各ノードの右端列の一番左のボタンで見れる。

20161015_180817000000

 

差分についてもdiffで確認することが可能だ。

20161015_180934000000

 

今回はHookでGitlabにもデータを連携しているので、そちらでも確認ができる。

20161015_181220000000

 

GitlabではなくGithubにもデータを連携できるし、インターバルに指定した間隔で自動的にコンフィグを確認、差分があったらちゃんと管理してGitlabやGithubに連携してくれるのでかなり便利だ。
対応しているNW機器が多いのも良い(個人的にVyattaとかpfSenseが対応しているのがポイント高い)。

家の環境のコンフィグバックアップにはこれを使おうかな。

 

図解入門 よくわかる最新ネットワーク技術の基本と仕組み 図解入門 よくわかる最新ネットワーク技術の基本と仕組み

CurlのWebサーバ応答時間の統計情報をわかりやすく表示してくれる『httpstat』

$
0
0

CurlコマンドではWebページアクセス時のレスポンスタイムを測定することができるのだが、それをより見やすくすることができる『httpstat』というものを見かけたので触ってみることにする。

1.インストール

Pythonで書かれており、pipを使えば簡単にインストールできる。

pip install httpstat

2.コマンド実行

インストールができたら、以下のようにコマンドを実行する。

httpstat http://対象のURL [Curlのオプション]

20161203_164405000000

 

Webページがうまく表示されないときの調査に便利そうだ。

 

Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう

CentOS 7でPostfix+DovecotによるIMAPサーバをActiveDirectory連携させる(LDAP認証)

$
0
0

今回は、Postfix+Dovecotで構築されたメールサーバで、ActiveDirectory連携についてを行う。
なお、当たり前だがメールサーバ側からADサーバと通信できる必要があるので、DMZ領域にいる場合でもそこの通信を開けないといけなかったり、クラウド上にメールサーバが建ってる場合はVPNで接続したりする必要がある。ネットワーク周りから考えないとならず、諸々面倒くさいことこの上ない。
小規模なグループで用いるメールサーバであれば、少人数なので普通にpamでローカルユーザで管理してID統合は行わないか、おとなしくGSuiteやOffice 365を使ったほうがいいだろう(これらにはローカルADと同期するツールが公式で提供されているので)。

前提として、すでにADおよびメールサーバ(Postfix+Dovecot)は構築済みであり、AD接続用のユーザなども作成済みとする(今回の例では「ldap」というユーザを使用)。
また、ユーザの認証情報についてはメールサーバ側で持たないものとし、メールデータはメールサーバ側に作成。ADユーザのディレクトリは自動的に作成するようにする。

 

1.Postfixの設定ファイルを編集する

もうすでにメールサーバ自体は構築済なので、Postfixの設定ファイル末尾に以下の内容を追記する。

●/etc/postfix/main.cf

virtual_transport = virtual
virtual_mailbox_domains = $mydomain

virtual_mailbox_base = /var/spool/virtual
virtual_alias_maps = ldap:/etc/postfix/ldap-alias.cf
virtual_mailbox_maps = ldap:/etc/postfix/ldap-mailbox.cf
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
local_recipient_maps = proxy:unix:passwd.byname $alias_maps $virtual_mailbox_maps

 

また、「/etc/postfix/main.cf」内で「mydestination」を定義している場合は、そのままだとエラーになるので以下のように空にする。

●/etc/postfix/main.cf

mydestination =

 

追記した内容にある「/etc/postfix/ldap-alias.cf」「/etc/postfix/ldap-mailbox.cf」ファイルをそれぞれ新規で作成する。

●/etc/postfix/ldap-alias.cf

server_host = ActiveDirectoryサーバのホスト名orIPアドレス(複数ある場合はカンマ区切り)
search_base = cn=Users,dc=adtest,dc=local
bind = yes
bind_dn = ldap@adtest.local
bind_pw = パスワード
scope = one
query_filter = (mail=%s)
result_attribute = mail

 

●/etc/postfix/ldap-mailbox.cf

server_host = ActiveDirectoryサーバのホスト名orIPアドレス(複数ある場合はカンマ区切り)
search_base = cn=Users,dc=adtest,dc=local
bind = yes
bind_dn = ldap@adtest.local
bind_pw = パスワード
scope = one
query_filter = (mail=%s)
result_attribute = mail
result_format = /home/%u/Maildir/

 

以下のコマンドを実行して無事AD認証が行えることを確認する。

postalias -q adtest@adtest.local ldap:/etc/postfix/ldap-mailbox.cf
postalias -q adtest@adtest.local ldap:/etc/postfix/ldap-alias.cf
[root@BS-PUB-POSTFIX-01 ~]# postalias -q adtest@adtest.local ldap:/etc/postfix/ldap-mailbox.cf
/home/adtest/Maildir/
[root@BS-PUB-POSTFIX-01 ~]# postalias -q adtest@adtest.local ldap:/etc/postfix/ldap-alias.cf
adtest@adtest.local

 

上記テストコマンドを実行して問題がなければ、Postfixを再起動し(設定ファイル中で定義した)ディレクトリを作成する。

systemctl restart postfix
mkdir -p /var/spool/virtual
chown 10000.10000 /var/spool/virtual/

 

この状態で、mailxコマンドでコンソールからActiveDirectoryユーザにメールを送信して、無事所定のディレクトリ(この場合、「/var/spool/virtual/」配下)に置かれることを確認する。

[root@BS-PUB-POSTFIX-01 ~]# mailx adtest2@adtest.local
Subject: test
test
.
EOT
[root@BS-PUB-POSTFIX-01 ~]# ls -al /var/spool/virtual/home/adtest2/Maildir/new/
合計 8
drwx------ 2 10000 10000   62 12月  4 23:28 .
drwx------ 5 10000 10000 4096 12月  4 23:26 ..
-rw------- 1 10000 10000  592 12月  4 23:28 1480861684.Vfd00Ic0b3568M934659.BS-PUB-POSTFIX-01

2.Dovecotの設定ファイルを編集する

次に、Dovecotの設定ファイルを編集する。
まず、「/etc/dovecot/conf.d/10-auth.conf」に以下のコマンドを実行し、「/etc/dovecot/conf.d/auth-ldap.conf.ext」ファイルの読み込みを行わせるようにする。

sed -i '/auth-ldap.conf.ext/s/^#//' /etc/dovecot/conf.d/10-auth.conf

 

「/etc/dovecot/conf.d/auth-ldap.conf.ext」ファイルで読み込まれている「/etc/dovecot/dovecot-ldap.conf.ext」ファイルを新規作成し、そこにActiveDirectoryへの接続情報を記載する。

●/etc/dovecot/dovecot-ldap.conf.ext

hosts = ActiveDirectoryサーバのホスト名orIPアドレス
base = cn=Users,dc=adtest,dc=local
ldap_version = 3
auth_bind = yes
auth_bind_userdn = adtest\%u
pass_filter = (&(objectclass=person)(uid=%u))

 

以下のコマンドで、IMAPサーバにログインできることを確認する。

[root@BS-PUB-POSTFIX-01 ~]# telnet localhost imap
Trying ::1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
. login adtest2 P@ssw0rd
. OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE BINARY MOVE] Logged in

 

ひとまずこれで、IMAPサーバとしてAD連携して動作するようになった。
SMTPサーバとしてもAD連携する場合はSMTP-Authについてsaslauthの設定を変えてやる必要があるのだが、今回はそこまでは行わないことにする。

 

【参考】

 

PostfixとMySQLで作るメールサーバ構築ガイド PostfixとMySQLで作るメールサーバ構築ガイド

CentOS 7でfail2banを用いてApacheへのDDoSなどのアタックを検知・対象のIPアドレスをブロックする

$
0
0

インターネット上にサーバを公開していると、sshやhttpdへDDoS攻撃やディレクトリトラサーバル攻撃を公開しているページすべてに行うようになツールを投げられたり、乗っ取りしようとして来たりといろいろと攻撃されることが多い。DDoSやらツールでの攻撃を受けると大量のパケットやリクエストが飛んできてサーバへの負荷が重く、サービスの継続にも支障が出たりする。そんな時は、攻撃してきているグローバルIPからの接続をファイアウォールなどでしばらく拒否してやるといった対応が必要になる。

そういったことをするためのツールがこのfail2banだ。結構有名なツールだし、LPIC(303かな?201と202でも出てくるかも…)でもよく出てくるので名前を聞いたことのある人も多いと思う。
各種ログを元に、定義されたフィルターに適合したアクセス元の接続を拒否するようiptables(firewalld)で設定をするツールだ。

今回は、このfail2banをCentOS 7にインストール・設定しログを監視、問題のあるアクセス元のIPアドレスをbanさせる。iptablesではなくfirewalldからファイアウォールの設定を行う必要があるので、iptablesを用いた方法と少し変える必要がある。また、当たり前ながらfirewalldを起動させる必要があるので注意。前提条件として、httpdおよびfirewalldはサービスとして起動済みで、80番ポートも解放されているものとする。

 

1.インストール

fail2banのインストールは簡単で、以下のようにepelリポジトリ経由でyumからインストールできる。

yum install -y epel-release
yum install fail2ban fail2ban-systemd

 

これでインストールは完了。

 

2.fail2banの設定

次に、fail2banの設定を行う。
fail2banは、主にそのアクセスが攻撃かどうかを判別するためのログについて記述したFilterと、Filter条件のログから攻撃者として検知する回数・さらに検知した後のBANの対処方法を定めるJailを設定、定義する。

2-1.fail2banのFilterを定義する

まずは、アクセスが攻撃かどうかを判別するFilterの定義ファイルを作成する。
すでにデフォルトの定義ファイルが「/etc/fail2ban/filter.d/」フォルダ以下にあるので、対象のサービス名のファイルを随時編集するか、新規でファイルを作成してやればよい。
今回は、DDoS(apache-ddos.conf)とディレクトリトラサーバル(apache-dirtra.conf)に対応した定義ファイルを作成する。

●/etc/fail2ban/filter.d/apache-ddos.conf

[Definition]
failregex = ^<HOST> -.*"(GET|POST).*
ignoreregex = \.(?i)(jpe?g|gif|png|bmp|pdf|js|css|woff|eot|ttf|ico|txt|xml|swf|xlsx?|docx?|pptx?)

 

●/etc/fail2ban/filter.d/apache-dirtra.conf

[Definition]
failregex = <HOST>.*] "GET /.*\.\./\.\./\.\./
ignoreregex =

 

上で設定している項目がだが、それぞれ

  • failregex … BAN対象とするログの正規表現
  • ignoreregex … failregexの中で除外するログの正規表現

 

2-2.fail2banのJailを定義する

次に、Jailの定義ファイルを設定する。
この設定でBANする基準やBAN後の挙動についてを定義する。

「/etc/fail2ban/jail.conf」というファイルがあるが、アップデートで変更される可能性もあるので「/etc/fail2ban/jail.d/jail.local」というファイルをコピーして新規に作成する。
DDoS(apache-ddos)、ディレクトリトラサーバル(apache-dirtra)の2つのルールを追記する。

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.d/jail.local

 

●/etc/fail2ban/jail.d/jail.local

[apache-ddos]
enabled = true
port = http,https
filter = apache-ddos
logpath = %(apache_access_log)s
maxretry = 10
findtime = 5
bantime = 86400
action = %(action_mwl)s
destemail = user@domain.com


[apache-dirtra]
enabled = true
port = http,https
filter = apache-dirtra
logpath = %(apache_access_log)s
maxretry = 10
findtime = 5
bantime = 86400
action = %(action_mwl)s
destemail = user@domain.com

 

それぞれの設定項目だが、

  • enabled … Jailルールの有効/無効
  • port … Jailルールを適用するポート
  • filter … Jailルールで利用するフィルター名(/etc/fail2ban/filter.d/(フィルター名).conf)
  • logpath … 監視対象とするログのPATH(変数での指定可)
  • maxretry … 攻撃として認識する回数(findtimeで指定された秒数基準)
  • findtime … アクセス回数(maxretry)を攻撃としてカウントする時間
  • bantime … BANしたIPアドレスのブロック時間(秒)
  • action … BANしたIPアドレスに対して行うアクション。「%(action_mwl)s」はログの内容やWHOIS情報についてアラートメールに記述してくれる。
  • destemail … アラートメールの送信先アドレス

 

2-3.サービス起動

諸々の設定が終わったら、fail2banのサービス起動を行う。

systemctl start fail2ban
systemctl enable fail2ban

3.アクセス・攻撃を行ってみる

さて、インストールが完了したら実際にブラウザからアクセスや攻撃を行ってみよう。
今回の場合は、DDoSで普通にF5アタックをすればいいだろう。

何度かアタックすると、「/var/log/fail2ban.log」にBanしたというログが出力されるはずだ。

2016-12-11 11:14:15,553 fail2ban.filter         [31812]: INFO    [apache-ddos] Found 172.XXX.XXX.XXX
2016-12-11 11:14:15,553 fail2ban.filter         [31812]: INFO    [apache-ddos] Found 172.XXX.XXX.XXX
2016-12-11 11:14:15,885 fail2ban.filter         [31812]: INFO    [apache-dirtra] Found 172.XXX.XXX.XXX
2016-12-11 11:14:15,885 fail2ban.filter         [31812]: INFO    [apache-dirtra] Found 172.XXX.XXX.XXX
2016-12-11 11:14:16,556 fail2ban.filter         [31812]: INFO    [apache-ddos] Found 172.XXX.XXX.XXX
2016-12-11 11:14:16,556 fail2ban.filter         [31812]: INFO    [apache-ddos] Found 172.XXX.XXX.XXX
2016-12-11 11:14:16,828 fail2ban.actions        [31812]: NOTICE  [apache-ddos] Ban 172.XXX.XXX.XXX

 

これで、あとは解除の時間がくるまで対象のIPアドレスはアクセスができないようになった。

 

3-1.現在BANされているIPアドレスを調べる

現在アクセス制限をしているIPアドレス(BANされたIPアドレス)を調べるには、以下のコマンドを実行する。

fail2ban-client status <Jailルール名>
[root@BS-PUB-WEBTOOL-TEST01 ~]# fail2ban-client status apache-ddos
Status for the jail: apache-ddos
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     90
|  `- File list:        /var/log/httpd/access_log
`- Actions
   |- Currently banned: 2
   |- Total banned:     2
   `- Banned IP list:   172.XXX.XXX.XXX 172.XXX.XXX.XXX

 

3-2.BANされたIPアドレスを解除する

BANされてしまったIPアドレスを手動で解除する場合は、以下のコマンドで解除を行う。

fail2ban-client set <Jail名> unbanip IPアドレス

 

これで、無事攻撃を受けた際にfail2banで対象のIPアドレスをBANできるようになった。
少々リソースを食うのが難点だが、インストールや設定も簡単なので外部公開しているサービスでは導入しておくといいだろう。

 

【参考】

 

サイバーセキュリティテスト完全ガイド Kali Linuxによるペネトレーションテスト サイバーセキュリティテスト完全ガイド Kali Linuxによるペネトレーションテスト

CentOS 7でApacheのWAF(Web Application Firewall)としてmod_securityを用いる

$
0
0

Webサイトを運営するうえで、Firewallはどこも利用していると思う。しかし、iptablesやfirewalldのようなFirewallの場合、防御してくれるのはされたポートやIPアドレスレベルでのフィルタリングであり、Webアプリケーションの脆弱性に対する攻撃を防御してくれるわけではない。
そういった攻撃を防ぐには、Webアプリケーションファイアウォール(WAF)が必要になるのだが、そんな時にApacheのモジュールとして動作するオープンソースなプロダクトが、今回導入するmod_securityだ。

今回は、このmod_securityをCentOS 7にインストールして不正アクセスを防御する。なお、すでにApacheはインストール済みとする。

1.mod_securityのインストール

mod_security自体のインストールは簡単で、以下のようにyumからインストールが可能だ。
今回はよく利用されている攻撃のルールファイルも取得するので、「mod_security_crs」も取得する。

yum install -y epel-release
yum --enablerepo=epel install -y mod_security mod_security_crs

 

これで、mod_securityのインストールは完了した。
この時点では、まだmod_securityを有効にしないためhttpdの再起動は行わない。

2.mod_securityの設定

次に、mod_securityの設定を行う。
最初に「mod_security_crs」を取得したことで一般的に行われる攻撃に関してはすでに対応しているが、テストのために簡単なセキュリティルールを追加する。

●/etc/httpd/modsecurity.d/activated_rules/modsecurity_01_orgrules.conf

SecDefaultAction "phase:2,deny,log,status:406"
SecRule REQUEST_URI "etc/passwd" "id:'500001'"
SecRule REQUEST_URI "\.\./" "id:'500002'"
SecRule ARGS "<[Ss][Cc][Rr][Ii][Pp][Tt]" "id:'500003'"
SecRule ARGS "[Ss][Ee][Ll][Ee][Cc][Tt][[:space:]]+[Ff][Rr][Oo][Mm]" "id:'500004'"

 

設定後、httpdの再起動を行う。

systemctl restart httpd

 

3.攻撃テストを行う

それでは、実際に攻撃テストしてみよう。
curlから、ルールに沿ったリクエストを投げてみよう。406エラーになるはずだ。

blacknon@BS-PUB-UBUNTU-01:~$ curl http://BS-PUB-WEBTOOL-TEST01/index.html?+select
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>406 Not Acceptable</title>
</head><body>
<h1>Not Acceptable</h1>
<p>An appropriate representation of the requested resource /index.html could not be found on this server.</p>
</body></html>
blacknon@BS-PUB-UBUNTU-01:~$ curl http://BS-PUB-WEBTOOL-TEST01/../../etc/passwd
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>406 Not Acceptable</title>
</head><body>
<h1>Not Acceptable</h1>
<p>An appropriate representation of the requested resource /etc/passwd could not be found on this server.</p>
</body></html>

 

これで、無事問題のあるリクエストは防御できるようになった。
もちろん、場合によっては正常なリクエストもエラーになる可能性があるので、ちゃんとチューニングは必要。
環境に合わせて設定をしてやろう。

 

【参考】

 

Hadoop Security Hadoop Security
Viewing all 498 articles
Browse latest View live