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

WordPressにGoogle Authenticatorを使ってワンタイムパスワードによる2要素認証設定を行う

$
0
0

WordPressの管理画面のセキュリティを強くする方法はいろいろあるけど、以前にsshでの認証で触れたGoogle Authenticatorを使ってワンタイムパスワードによる2要素認証設定を行えるようなので、導入してみることにした。

1.iPhone/AndroidでGoogle Authenticatorのアプリをインストールする

まず、手元のiPhoneやAndroidで、iTunesStoreやGooglePlayからGoogle Authenticatorをインストールしておく。
まぁ、普通に検索したら出てくるのでこの辺は割愛。

 

2.WordPressへ「Google Authenticator」プラグインを導入する

次に、WordPressの[プラグイン] > [新規追加]から、「Google Authenticator」をインストールする。

20160815_225239000000_

 

インストール完了後、まだ有効化はせずに[ユーザ] > [あなたのプロフィール]を開く。
Google Authenticatorの設定項目が表示されているので、「Show/Hide QR code」を開きQRコードを表示させる。

20160815_225416000000_

 

あとは、iPhone/AndroidにインストールしたGoogle AuthenticatorでそのQRコードを読み取って追加してやったら、Activeにチェックを入れてプロフィールを更新するだけだ。

3.管理画面へアクセス

Google Authenticatorを有効化したら、一度ログアウトして再度ログイン画面にアクセスしてみよう。
今までだとID/PWの入力項目しかなかったはずだが、新しく「Google Authenticator code」という項目が追加されているはずだ。

20160815_225918000000_

 

あとは、今までと同じようにユーザ名、パスワードを入力して、Google Authenticatorのワンタイムパスワードを入力してやることでログインできるようになる。

[正規販売代理店品]YubiKey 4 Nano [正規販売代理店品]YubiKey 4 Nano

Mac/LinuxのコンソールからコマンドでGoogle Authenticatorのワンタイムパスワードを確認する

$
0
0

sshやWordPressへのログインにワンタイムパスワードを利用できるようにするGoogle Authenticatorだが、少し残念なことにパスワードを確認するためのアプリケーションがiPhone/Androidにしか用意されていない。できればLinuxの特定のサーバだったり、手元のMacBookなどでも確認できるようならばいいのに…と思ったので、そういったことができないか少し調べてみた。

で、どうも「oath-toolkit」コマンドを利用することでワンタイムパスワードを取得できるようなので、試してみることにした。
まずは、以下のコマンドでインストール。

sudo yum install oathtool # RHEL系
sudo apt-get install oathtool # Debian/Ubuntu系
brew install oath-toolkit # Mac OS X

oathtoolコマンドがインストールできたら、あとは以下のコマンドでワンタイムパスワードを取得可能だ。

oathtool --totp -b シークレットキー

 

Ubuntu 16.04 LTSでpsadによるポートスキャン検知・ログ出力

$
0
0

自身にポートスキャンが行われた際に検知させたり、ログに出力させたりしたいと思ったので、何かいい方法ないかなぁ…と調べていたところ、psadというツールがあるようなので、ちょっと試してみることにした。で、インストールにはUbuntuを利用するのが楽そうなので、まずはUbuntu 16.04 LTSで試してみることにする。

1.psadのインストール

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

sudo apt-get install psad

 

インストール中、Postfixのメールサーバ形式について選択する画面が表示されるので、適当に選択、設定する。

20160818_001504000000

 

2.psad・iptablesの設定

psadを利用するにあたり、iptablesでログを出力するような設定を行う。

sudo iptables -A INPUT -j LOG
sudo iptables -A FORWARD -j LOG
sudo iptables -L
blacknon@BS-PUB-UBUNTU-01:~$ sudo iptables -A INPUT -j LOG
blacknon@BS-PUB-UBUNTU-01:~$ sudo iptables -A FORWARD -j LOG
blacknon@BS-PUB-UBUNTU-01:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level warning

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level warning

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

 

rsyslogdの設定ファイルを編集しサービスを再起動してやる。

sudo sh -c 'echo "kern.info\t|/var/lib/psad/psadfifo" >> /etc/rsyslog.conf'
sudo /etc/init.d/rsyslog restart

 

次に、psadの設定ファイルである「/etc/psad/psad.conf」を編集する。
とりあえず、以下に記述した項目名と値を定義してやればいいだろう。

EMAIL_ADDRESSES   メールアドレス;      # アラートメールを飛ばすアドレス
HOSTNAME          ホスト名;                 # ホスト名
HOME_NET          192.168.XXX.0/24         # 一つしかインターフェイスがない場合は「NOT_USED」でよい。
EXTERNAL_NET      any;
SYSLOG_DAEMON     rsyslogd;                # rsyslogdに書き換え
IPT_SYSLOG_FILE   /var/log/syslog;         # Ubuntuのメインのログに書き換え
ENABLE_AUTO_IDS Y;                         # デフォルトでは無効化されている
AUTO_IDS_DANGER_LEVEL 1;                   # デフォルトでは5(テストのため、とりあえず1にしてる)

 

設定完了後、psadサービスを起動させる。

sudo /etc/init.d/psad restart
sudo psad --sig-update

3.ポートスキャンを実行する

psadの設定が完了したら、別のマシンからポートスキャンを実行する。
おそらく、結果を取得できないはずだ。

nmap 対象サーバ
[root@BS-PUB-CENT7-01 ~]# nmap XXX.XXX.XXX.XXX

Starting Nmap 6.40 ( http://nmap.org ) at 2016-08-18 08:50 JST
Nmap scan report for XXX.XXX.XXX.XXX
Host is up (0.00049s latency).
All 1000 scanned ports on XXX.XXX.XXX.XXX are filtered
MAC Address: 62:35:64:XX:XX:XX (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 27.62 seconds

 

別マシンからのnmap実行後、psadをインストールしたマシンで以下のコマンドを実行すると、検知したスキャンのレポートが出力される。

sudo psad -S
blacknon@BS-PUB-UBUNTU-01:~$ sudo psad -S
[-] psad: pid file /var/run/psad/psadwatchd.pid does not exist for psadwatchd on BS-PUB-UBUNTU-01.BLACKNON.LOCAL
[+] psad (pid: 22868)  %CPU: 0.1  %MEM: 1.0
    Running since: Thu Aug 18 08:45:13 2016
    Command line arguments: [none specified]
    Alert email address(es): root@localhost

[+] Version: psad v2.2.3

[+] Top 50 signature matches:
      "MISC xfs communication attempt" (tcp),  Count: 2,  Unique sources: 1,  Sid: 1987
      "MISC MS Terminal Server communication attempt" (tcp),  Count: 2,  Unique sources: 1,  Sid: 100077
      "MISC VNC communication attempt" (tcp),  Count: 2,  Unique sources: 1,  Sid: 100202
      "BACKDOOR netbus Connection Cttempt" (tcp),  Count: 2,  Unique sources: 1,  Sid: 100028
      "DOS DB2 dos communication attempt" (tcp),  Count: 2,  Unique sources: 1,  Sid: 1641
      "DOS iParty DOS attempt" (tcp),  Count: 2,  Unique sources: 1,  Sid: 1605
      "BACKDOOR Doly 2.0 Connection attempt" (tcp),  Count: 2,  Unique sources: 1,  Sid: 119
      "POLICY vncviewer Java applet communication attempt" (tcp),  Count: 2,  Unique sources: 1,  Sid: 1846
      "MISC Radmin Default install options attempt" (tcp),  Count: 2,  Unique sources: 1,  Sid: 100204
      "P2P napster communication attempt" (tcp),  Count: 2,  Unique sources: 1,  Sid: 100090
      "POLICY HP JetDirect LCD communication attempt" (tcp),  Count: 2,  Unique sources: 1,  Sid: 510
      "P2P BitTorrent communication attempt" (tcp),  Count: 2,  Unique sources: 1,  Sid: 2181
      "MISC Microsoft PPTP communication attempt" (tcp),  Count: 2,  Unique sources: 1,  Sid: 100082
      "BACKDOOR DoomJuice file upload attempt" (tcp),  Count: 1,  Unique sources: 1,  Sid: 2375
      "P2P eDonkey transfer attempt" (tcp),  Count: 1,  Unique sources: 1,  Sid: 2586

[+] Top 25 attackers:
      172.28.XXX.YYY    DL: 3, Packets: 576, Sig count: 28
      172.28.XXX.ZZZ    DL: 1, Packets: 8, Sig count: 0

[+] Top 20 scanned ports:
      tcp 2068  2 packets
      tcp 1721  2 packets
      tcp 139   2 packets
      tcp 1043  2 packets
      tcp 20221 2 packets
      tcp 1049  2 packets
      tcp 51493 2 packets
      tcp 10621 2 packets
      tcp 6     2 packets
      tcp 4003  2 packets
      tcp 2605  2 packets
      tcp 1187  2 packets
      tcp 5900  2 packets
      tcp 7999  2 packets
      tcp 2045  2 packets
      tcp 19315 2 packets
      tcp 711   2 packets
      tcp 65000 2 packets
      tcp 32778 2 packets
      tcp 8087  2 packets

      udp 67    297 packets
      udp 138   4 packets
      udp 47269 2 packets
      udp 43368 2 packets
      udp 50860 2 packets
      udp 44927 1 packets
      udp 34611 1 packets

[+] iptables log prefix counters:
        [NONE]

    iptables auto-blocked IPs:
      172.28.XXX.YYY (3050 seconds remaining)
      172.28.XXX.ZZZ (3107 seconds remaining)

    Total protocol packet counters:
         tcp: 576 pkts
         udp: 309 pkts

[+] IP Status Detail:

SRC:  172.28.XXX.YYY, DL: 3, Dsts: 1, Pkts: 576, Total protocols: 1, Unique sigs: 8, Email alerts: 2, Local IP

    DST: 172.28.XXX.XXX, Local IP
        Scanned ports: TCP 3-65389, Pkts: 576, Chain: INPUT, Intf: eth0
        Total scanned IP protocols: 1, Chain: INPUT, Intf: eth0
        Signature match: "BACKDOOR Doly 2.0 Connection attempt"
            TCP, Chain: INPUT, Count: 2, DP: 6789, SYN, Sid: 119
        Signature match: "POLICY vncviewer Java applet communication attempt"
            TCP, Chain: INPUT, Count: 2, DP: 5801, SYN, Sid: 1846
        Signature match: "P2P eDonkey transfer attempt"
            TCP, Chain: INPUT, Count: 1, DP: 4242, SYN, Sid: 2586
        Signature match: "MISC Radmin Default install options attempt"
            TCP, Chain: INPUT, Count: 2, DP: 4899, SYN, Sid: 100204
        Signature match: "BACKDOOR DoomJuice file upload attempt"
            TCP, Chain: INPUT, Count: 1, DP: 3128, SYN, Sid: 2375
        Signature match: "MISC xfs communication attempt"
            TCP, Chain: INPUT, Count: 2, DP: 7100, SYN, Sid: 1987
        Signature match: "DOS iParty DOS attempt"
            TCP, Chain: INPUT, Count: 2, DP: 6004, SYN, Sid: 1605
        Signature match: "DOS DB2 dos communication attempt"
            TCP, Chain: INPUT, Count: 2, DP: 6789, SYN, Sid: 1641

SRC:  172.28.XXX.ZZZ, DL: 1, Dsts: 1, Pkts: 8, Total protocols: 1, Unique sigs: 0, Email alerts: 2, Local IP

    DST: 172.28.XXX.XXX, Local IP
        Scanned ports: UDP 34611-50860, Pkts: 8, Chain: INPUT, Intf: eth0
        Total scanned IP protocols: 1, Chain: INPUT, Intf: eth0

    Total scan sources: 2
    Total scan destinations: 1

[+] These results are available in: /var/log/psad/status.out

 

細かい設定もできるようなので、色々と試してみるのもよさそうだ。

CentOS 7に「killall」コマンドをインストールする

$
0
0

気づかなかったのだが、CentOS 7にはkillallコマンドがバンドルインストールされてないらしい。
なので、以下のコマンドでインストールしてやる必要がある。

yum install psmisc

 

これで、killallコマンドが使えるようになる。

Webベースのネットワークフォレンジックツール『Xplico』を使ってみる

$
0
0

ちょっと調べものをしていたところ、Webブラウザで管理できるネットワークフォレンジックツール『Xplico』なるものを見かけたので、試しに使ってみることにした。
フォレンジックツールといってもあまり伝わらないと思うので補足すると、何かしらのセキュリティインシデントが発生した際に後から追跡できるよう、証拠となるデータ(通信パケットやログ、その他のデータなど)を補完し、分析する機能を持ったツールのことだと考えてもらえればよいだろう。

今回は、この『Xplico』をインストールが簡単らしいUbuntu 14.04 LTSに導入する。

1.インストール

書かれていた通り、確かにUbuntuへのインストールは簡単で、以下のコマンドを実行すればよい。

sudo bash -c 'echo "deb http://repo.xplico.org/ $(lsb_release -s -c) main" >> /etc/apt/sources.list'
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 791C25CE
sudo apt-get update
sudo apt-get install xplico

 

これでインストールが完了した。
サービスも自動的に立ち上がっているはずなので、ブラウザを立ち上げて「http://サーバのIPアドレス:9876」へアクセスする。
ID/PWは管理者は「admin/xplico」、一般ユーザは「xplico/xplico」となっている。

20160821_054743000000

 

adminでログイン後の画面がこちら。
(機械翻訳なのか、ところどころ日本語が怪しいような…)

20160821_054951000000

 

xplicoユーザでのログイン後の画面がこちら。
以後はこちらで作業を進める。

20160821_061254000000

 

2.通信を記録させる

さて、実際にどの程度通信を記録できるのか、ちょっと試してみよう。
とりあえずお試しなので、ミラーポートの設定はせずローカルの通信で試してみる。

まずxplicoユーザでログインし「New Case」から新しいケースを作成する。
今回は、「Live acquisition(リアルタイムでの解析)」を選択する。

20160821_063603000000

 

作成したケースを選択し、「New Session」から新しいセッションを作成する。

20160821_063806000000

 

あとは、利用するインターフェイスを選択して解析を開始するだけだ。

20160821_063912000000

 

解析し始めてからしばらく経つと情報が記録されていくので、あとは左メニューからそれらの情報を確認するだけだ。

20160821_064511000000

 

確かに、いろいろな情報を記録してくれるようだ。
ストレージ容量だったり、ミラーポートを設定したりといった対応は必要だけど、試しに導入してみるには有りなのではなかろうか。

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

bashのヒアドキュメント(cat

$
0
0

bashでヒアドキュメントを使ってファイルに書き出す際、変数をそのまま記述すると現在の環境変数を元に展開されてしまう。

blacknon@BS-PUB-UBUNTU-01:~$ env | grep SHELL
SHELL=/bin/bash
blacknon@BS-PUB-UBUNTU-01:~$ cat << EOF > ./test
> SHELL=99999
> TEST=1234
> VAL=$SHELL
> AAA=$TEST
> EOF
blacknon@BS-PUB-UBUNTU-01:~$ cat ./test
SHELL=99999
TEST=1234
VAL=/bin/bash
AAA=

これを展開させないようにするには、catでヒアドキュメントとして指定している文字列(今回の例の場合だとEOF)をダブルクォーテーションかシングルクォーテーションで囲ってやればよい。

blacknon@BS-PUB-UBUNTU-01:~$ cat << "EOF" > ./test
> SHELL=99999
> TEST=1234
> VAL=$SHELL
> AAA=$TEST
> EOF
blacknon@BS-PUB-UBUNTU-01:~$ cat ./test
SHELL=99999
TEST=1234
VAL=$SHELL
AAA=$TEST

 

sudoで書き出しをする際は、囲む際にエスケープするか違うクォーテーションを使ってやろう。

blacknon@BS-PUB-UBUNTU-01:~$ sudo sh -c 'cat << "EOF" > /test
SHELL=99999
TEST=1234
VAL=$SHELL
AAA=$TEST
EOF'
blacknon@BS-PUB-UBUNTU-01:~$ ls -la /test
-rw-r--r-- 1 root root 43  8月 21 10:56 /test
blacknon@BS-PUB-UBUNTU-01:~$ cat /test
SHELL=99999
TEST=1234
VAL=$SHELL
AAA=$TEST
シェルスクリプトマガジン vol.41 シェルスクリプトマガジン vol.41

Webベースのリアルタイムパフォーマンスモニタリングツール『Netdata』

$
0
0

少し調べものをしていたところ、Webベースのリアルタイムにパフォーマンスをモニタできるツール『Netdata』というものを見かけたので、少し試してみることにする。

1.インストール

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

sudo apt-get install zlib1g-dev gcc make git autoconf autogen automake pkg-config uuid-dev # Debian/Ubuntu系の場合
yum install zlib-devel gcc make git autoconf autogen automake pkgconfig psmisc libuuid-devel # CentOSなどRHEL系の場合

 

前提パッケージを導入したら、以下のコマンドでNetdataをインストール、起動する。

git clone https://github.com/firehol/netdata.git --depth=1
cd netdata
sudo ./netdata-installer.sh
[root@BS-PUB-WEBTOOL-TEST01 netdata]# sudo ./netdata-installer.sh

Welcome to netdata!
The real-time performance monitoring system.

You are about to build and install netdata to your system.

It will be installed at these locations:

  - the daemon    at /usr/sbin/netdata
  - config files  at /etc/netdata
  - web files     at /usr/share/netdata
  - plugins       at /usr/libexec/netdata
  - cache files   at /var/cache/netdata
  - db files      at /var/lib/netdata
  - log files     at /var/log/netdata
  - pid file      at /var/run

This installer allows you to change the installation path.
Press Control-C and run the same command with --help for help.

Press ENTER to build and install netdata to your system >

:-----------------------------------------------------------------------------
Running command:

./autogen.sh
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext

...


-------------------------------------------------------------------------------

OK. NetData is installed and it is running.

-------------------------------------------------------------------------------

By default netdata listens on all IPs on port 19999,
so you can access it with:

http://this.machine.ip:19999/

To stop netdata, just kill it, with:

  killall netdata

To start it, just run it:

  /usr/sbin/netdata


Enjoy!

Uninstall script generated: ./netdata-uninstaller.sh

 

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

2.Webブラウザからアクセス

さて、それではブラウザからアクセスしてみよう。
デフォルトのポートは19999なので、「http://IPアドレス:19999」へアクセスする。

netdata

 

おおー、きれい…
これはいいね。できれば、このUIで複数台のノードを一括でモニタリングできるといいけど、まぁあまり贅沢を言ってもしょうがない。

ソフトウェアエンジニアのための ITインフラ監視[実践]入門 (Software Design plus) ソフトウェアエンジニアのための ITインフラ監視[実践]入門 (Software Design plus)

CentOS 7にLinuxのCVE脆弱性検知ツール「Vuls」をインストールする

$
0
0

会社の先輩(というかリーダー)から、sshなどでリモートのLinuxにアクセスし、CVEの脆弱性確認して検知したら自動的にSlackなどで通知してくれるツール「Vuls」というものがあると教えてもらったので、会社の環境に導入する前に自宅環境に入れてみることにした。
Vulsは日本人が作成したツールらしいので、日本語の情報もたんまりとあるのが素晴らしい。
詳細な情報については、以下の記事を見るとわかるだろう。

 

sshでのアクセスが必要とのことなので、鍵認証が前提になるので注意(パスワード認証はサポート外らしい)。
また、ソフトウェアアップデートは自動的には行ってくれないので、検知して重要度の高い脆弱性であれば、すぐに対応する必要があるだろう。

1.インストール・設定

さて、それでは実際にインストールを行ってみよう。
今回はCentOS 7にインストールを行う。まず、以下のコマンドを実行しインストール前の準備を行う。

sudo yum -y install sqlite git gc wget gcc
wget https://storage.googleapis.com/golang/go1.6.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.6.linux-amd64.tar.gz
mkdir $HOME/go
sudo sh -c 'cat << "EOF" > /etc/profile.d/goenv.sh
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
EOF'
source /etc/profile.d/goenv.sh

 

事前準備が終わったら、以下のコマンドでvulsをインストールする。

sudo mkdir /var/log/vuls
sudo useradd
sudo chown $(whoami) /var/log/vuls
sudo chmod 700 /var/log/vuls
go get github.com/kotakanbe/go-cve-dictionary

 

脆弱性データベースのダウンロードを行う。
(10~20分くらいかかる)

for i in {2002..2016}; do go-cve-dictionary fetchnvd -years $i; done

 

データベースのダウンロード後、以下のコマンドでVulsをダウンロードしてくる。

go get github.com/future-architect/vuls

 

Vulsのダウンロード完了後、設定ファイル(config.toml)を作成する。
デフォルトの設置場所はユーザのホームディレクトリ直下になるので、新規作成する。

●$HOME/config.toml

[servers]
[servers.サーバ名]
host = "ホスト名・IPアドレス"
port = "22"
user = "ユーザ名"
keyPath = "鍵ファイルのPATH"

 

複数台指定する場合は、以下のようにする。

[servers]
[servers.サーバ名1]
host = "ホスト名・IPアドレス"
port = "22"
user = "ユーザ名"
keyPath = "鍵ファイルのPATH"

[servers.サーバ名2]
host = "ホスト名・IPアドレス"
port = "22"
user = "ユーザ名"
keyPath = "鍵ファイルのPATH"

 

最後に、以下のコマンドでコンフィグテストとスキャン対象サーバに必要なパッケージの導入を行う。

vuls configtest # コンフィグテスト
vuls prepare # パッケージ導入
[root@BS-PUB-CENT7-01 ~]# vuls configtest
[Aug 21 12:32:36]  INFO [localhost] Validating Config...
[Aug 21 12:32:36]  INFO [localhost] Detecting Server/Contianer OS...
[Aug 21 12:32:36]  INFO [localhost] Detecting OS of servers...
[Aug 21 12:32:36]  INFO [localhost] (1/3) Detected: BS-PUB-CENT7-02: centos 7.2.1511
[Aug 21 12:32:37]  INFO [localhost] (2/3) Detected: BS-PUB-UBUNTU-02: ubuntu 16.04
[Aug 21 12:32:40]  INFO [localhost] (3/3) Detected: BS-PUB-UBUNTU-01: ubuntu 14.04
[Aug 21 12:32:40]  INFO [localhost] Detecting OS of containers...
[Aug 21 12:32:40]  INFO [localhost] Checking sudo configuration...
[Aug 21 12:32:40]  INFO [BS-PUB-UBUNTU-01] sudo ... OK
[Aug 21 12:32:40]  INFO [BS-PUB-CENT7-02] sudo ... OK
[Aug 21 12:32:40]  INFO [BS-PUB-UBUNTU-02] sudo ... OK
[Aug 21 12:32:40]  INFO [localhost] SSH-able servers are below...
BS-PUB-CENT7-02 BS-PUB-UBUNTU-02 BS-PUB-UBUNTU-01
[root@BS-PUB-CENT7-01 ~]# vuls prepare
INFO[0000] Start Preparing (config: /root/config.toml)
[Aug 21 12:32:53]  INFO [localhost] Detecting OS...
[Aug 21 12:32:53]  INFO [localhost] Detecting OS of servers...
[Aug 21 12:32:54]  INFO [localhost] (1/3) Detected: BS-PUB-UBUNTU-01: ubuntu 14.04
[Aug 21 12:32:54]  INFO [localhost] (2/3) Detected: BS-PUB-CENT7-02: centos 7.2.1511
[Aug 21 12:32:54]  INFO [localhost] (3/3) Detected: BS-PUB-UBUNTU-02: ubuntu 16.04
[Aug 21 12:32:54]  INFO [localhost] Detecting OS of containers...
[Aug 21 12:32:54]  INFO [localhost] Installing...
[Aug 21 12:32:54]  INFO [BS-PUB-UBUNTU-02] apt-get update...
[Aug 21 12:32:54]  INFO [BS-PUB-UBUNTU-01] apt-get update...
[Aug 21 12:32:55]  INFO [BS-PUB-CENT7-02] Installing yum-plugin-security...
[Aug 21 12:32:56]  INFO [BS-PUB-CENT7-02] Ignored: yum-plugin-changelog already installed
[Aug 21 12:33:24]  INFO [localhost] Success

 

これでインストールと初期設定は完了。
なお、このときログインするのが一般ユーザの場合、タイムアウトエラーが発生することがある。
これは、apt-getやyumを実行する際にパスワードを求められた場合に対応できないためだ。そのため、/etc/sudoersでvulsのログインユーザではapt-getやyumの際にはパスワードを求めないように以下の内容を追記してやる必要がある。

ログインユーザ ALL=(root) NOPASSWD: /usr/bin/yum, /bin/echo # CentOS, RHEL, Amazon Linuxの場合
ログインユーザ ALL=(root) NOPASSWD: /usr/bin/apt-get, /usr/bin/apt-cache # Ubuntu, Debianの場合

 

追記後、またコンフィグテストとパッケージの導入コマンドを実行してやればよい。

2.スキャンの実施

さて、これで事前の準備が終わったので、実際にVulsを導入したサーバから脆弱性の検知をするため、以下のコマンドを実行する。

vuls scan -cve-dictionary-dbpath=$PWD/cve.sqlite3
[root@BS-PUB-CENT7-01 ~]# vuls scan -cve-dictionary-dbpath=$PWD/cve.sqlite3
INFO[0000] Start scanning
INFO[0000] config: /root/config.toml
INFO[0000] cve-dictionary: /root/cve.sqlite3
[Aug 21 12:40:15]  INFO [localhost] Validating Config...
[Aug 21 12:40:15]  INFO [localhost] Detecting Server/Contianer OS...
[Aug 21 12:40:15]  INFO [localhost] Detecting OS of servers...
[Aug 21 12:40:16]  INFO [localhost] (1/3) Detected: BS-PUB-UBUNTU-01: ubuntu 14.04
[Aug 21 12:40:16]  INFO [localhost] (2/3) Detected: BS-PUB-CENT7-02: centos 7.2.1511
[Aug 21 12:40:17]  INFO [localhost] (3/3) Detected: BS-PUB-UBUNTU-02: ubuntu 16.04
[Aug 21 12:40:17]  INFO [localhost] Detecting OS of containers...
[Aug 21 12:40:17]  INFO [localhost] Checking sudo configuration...
[Aug 21 12:40:17]  INFO [BS-PUB-CENT7-02] sudo ... OK
[Aug 21 12:40:17]  INFO [BS-PUB-UBUNTU-01] sudo ... OK
[Aug 21 12:40:18]  INFO [BS-PUB-UBUNTU-02] sudo ... OK
[Aug 21 12:40:18]  INFO [localhost] Detecting Platforms...
[Aug 21 12:40:30]  INFO [localhost] (1/3) BS-PUB-UBUNTU-01 is running on other
[Aug 21 12:40:30]  INFO [localhost] (2/3) BS-PUB-CENT7-02 is running on other
[Aug 21 12:40:30]  INFO [localhost] (3/3) BS-PUB-UBUNTU-02 is running on other
[Aug 21 12:40:30]  INFO [localhost] Scanning vulnerabilities...
[Aug 21 12:40:30]  INFO [localhost] Check required packages for scanning...
[Aug 21 12:40:31]  INFO [localhost] Scanning vulnerable OS packages...
[Aug 21 12:40:42]  INFO [BS-PUB-UBUNTU-02] (1/7) Upgradable: gnupg-1.4.20-1ubuntu3 -> 1.4.20-1ubuntu3.1
.....

20160821_124548000000

 

終了後、検知された脆弱性がズラッと出力される。
そのままだと読みにくいので、以下のコマンドで検知された脆弱性を確認する。

vuls tui

20160821_124845000000

20160821_124852000000

 

コンソール上から、各ホスト別に検知された脆弱性を確認できる。
選択は上下キーで移動することで選べ、操作するウィンドウを変える場合はTabキーを押下すればよい。

うーん…結構Ubuntu 14.04 LTSだと脆弱性が検知されてるなぁ…

 

3.Slack・メールでアラートを通知させる

さて、このようにコマンドでCVEに登録されている脆弱性を確認することができるのだけど、Vulsはただコンソール上で確認するだけではなくSlackやメールに通知を出させることができる。
まず、最初にSlackでWebHookの設定を行う。こちらのリンクからアラートを通知させるチャンネルを選択してhookURLに入力するためのURLを生成する。

URL設定後、設定ファイル(config.toml)に以下の内容を追記してやればよい。

[slack]
hookURL = "https://hooks.slack.com/services/abc123/defghijklmnopqrstuvwxyz"
channel = "#channel-name"
#channel = "${servername}"
iconEmoji = ":ghost:"
authUser = "username"
notifyUsers = ["@username"]

[mail]
smtpAddr = "smtp.gmail.com"
smtpPort = "465"
user = "username"
password = "password"
from = "from@address.com"
to = ["to@address.com"]
cc = ["cc@address.com"]
subjectPrefix = "[vuls]"

 

あとはscan時にslackに通知をさせるよう、「-report-slack(メールは-report-mail)」オプションを追加するだけだ。

vuls scan -cve-dictionary-dbpath=$PWD/cve.sqlite3 -report-slack

20160821_132953000000_

 

あまりにも脆弱性の数が多すぎると通知が飛ばせなくなるので、こまめに対応するようにしよう。
それにしても、勝手にアップデートされたりするわけではないので、これは便利そうだ。社内環境に導入しよう。

すべてわかるセキュリティ大全2017 (日経BPムック) すべてわかるセキュリティ大全2017 (日経BPムック)

Authyでsshのログイン時にワンタイムパスワードによる二要素認証の設定

$
0
0

以前Google Authenticatorによるsshログイン時のワンタイムパスワード認証(Ubuntuはこっち)について記述したが、似たようなツールでAuthyというアプリ(というかサービス)を利用することで同様のことができるので、CentOS 7でsshログイン時に二要素認証が行われるように設定してみることにした。
事前にiPhone/AndroidでAuthyのインストール・設定をしておく。これについては簡単なので、こちらを参考に進めておけばよいだろう。

1.Authyの設定・APIキーの取得

まず最初にAuthyの設定およびAPIキーの取得だ。
こちらからAuthyのアカウント作成その他もろもろを行う(twilioのページに飛ばされるが、これはそういう仕様)。

アカウント作成時には、Authyアプリで設定したメールアドレス等を指定するとよいだろう。
Dashboardの作成後、アプリの追加時にAPIキーの生成を行える。

 

2.インストール・ワンタイムパスワード設定

APIキーを取得したら、OS側の設定に移る。
まずはOSへ、ssh時にAuthyを利用するためのパッケージ「authy-ssh」を導入する。

curl -O 'https://raw.githubusercontent.com/authy/authy-ssh/master/authy-ssh'
sudo bash authy-ssh install /usr/local/bin
[test@BS-PUB-CENT7-02 ~]$ curl -O 'https://raw.githubusercontent.com/authy/authy-ssh/master/authy-ssh'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 18676  100 18676    0     0  57125      0 --:--:-- --:--:-- --:--:-- 57288
[test@BS-PUB-CENT7-02 ~]$ sudo bash authy-ssh install /usr/local/bin
[sudo] password for test:
Copying authy-ssh to /usr/local/bin/authy-ssh...
Setting up permissions...
Enter the Authy API key: APIキー
Default action when api.authy.com cannot be contacted:

  1. Disable two factor authentication until api.authy.com is back
  2. Don't allow logins until api.authy.com is back

type 1 or 2 to select the option: 2
Generating initial config on /usr/local/bin/authy-ssh.conf...
Adding 'ForceCommand /usr/local/bin/authy-ssh login' to /etc/ssh/sshd_config

Checking the validity of /etc/ssh/sshd_config file...
    MAKE SURE YOU DO NOT MOVE/REMOVE /usr/local/bin/authy-ssh BEFORE UNINSTALLING AUTHY SSH

To enable two-factor authentication on your account type the following command:

   sudo /usr/local/bin/authy-ssh enable test
   Example: sudo authy-ssh enable test myuser@example.com 1 401-390-9987

To enable two-factor authentication on user account type:

   sudo /usr/local/bin/authy-ssh enable

To uninstall Authy SSH type:

   sudo /usr/local/bin/authy-ssh uninstall

      Restart the SSH server to apply changes

次に、以下のコマンドで2要素認証の設定を有効化する。
Authyで設定したメールアドレス、国コード、電話番号を引数として指定する。

sudo /usr/local/bin/authy-ssh enable `whoami` <your-email> <your-country-code> <your-cellphone>
[test@BS-PUB-CENT7-02 ~]$ sudo /usr/local/bin/authy-ssh enable `whoami` test@XXX.jp 81 070XXXXXXXX
[sudo] password for test:


    Username:   test
    Cellphone:  (+81) 070XXXXXXXX
    Email:      test@XXX.jp


Do you want to enable this user? (y/n) y
User was registered

 

最後に、sshサービスを再起動する。

sudo systemctl restart sshd

 

3.ワンタイムパスワードでログイン

さて、もろもろの設定ができたので、sshでログインをする。

blacknon@BS-PUB-UBUNTU-01:~$ ssh test@BS-PUB-CENT7-02
test@BS-PUB-CENT7-02's password:
Authy Token (type 'sms' to request a SMS token): 6312723
Good job! You've securely logged in with Authy.
[test@BS-PUB-CENT7-02 ~]$

 

無事、ログインができた。鍵認証なし(パスワード認証のみ)でも普通にログインできるので、環境によっては重宝するかもしれない。
なお、ワンタイムパスワード入力時にsmsを指定することで、smsあてに送られてきたキーを使ってログインすることもできる。

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

awkの正規表現でIPアドレスを含む行のみ処理させる

$
0
0

awkで、正規表現を使ってIPアドレスを含む行のみ処理をさせるには、以下のようにコマンドを実行すればよい。

awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) {処理内容}'

blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt
wqrg eth0
192.168.0.11
00:0d:b9:35:b2:d1 192.168.0.1
00:15:17:bd:d6:3e 192.168.0.10
bc:5f:f4:1a:6e:6c 192.168.0.12
36:62:38:64:38:63 192.168.0.20
38:ea:a7:a4:a5:10 192.168.0.30
62:66:39:65:63:39 192.168.0.51
62:38:66:39:34:39 192.168.0.52
32:36:34:63:63:61 192.168.0.53
36:38:33:33:63:36 192.168.0.54
32:32:64:37:39:64 192.168.0.55
32:66:34:61:34:65 192.168.0.57
aaaaaa
66:32:64:38:66:37 192.168.0.58
62:31:30:31:39:64 192.168.0.102
32:33:61:62:39:61 192.168.0.103
66:62:30:61:35:35 192.168.0.114
ffffff
32:65:37:36:64:61 192.168.0.117
62:34:30:62:31:62 192.168.0.118
32:64:35:36:37:38 192.168.0.119
36:33:62:65:63:36 192.168.0.121
62:64:62:31:63:62 192.168.0.145
36:35:64:66:35:61 192.168.0.169
62:66:33:31:64:34 192.168.0.170
32:33:35:31:37:33 192.168.0.171
32:36:63:39:36:37 192.168.0.175
66:63:32:30:35:65 192.168.0.176
62:30:34:62:63:32 192.168.0.177
32:34:33:65:35:32 192.168.0.178
32:34:33:65:25:32 192.168.0.178
66:66:63:65:34:36 192.168.0.190
62:30:34:62:63:32 192.168.0.231
sasasa
blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt | awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) {print $2,$1}'
 192.168.0.11
192.168.0.1 00:0d:b9:35:b2:d1
192.168.0.10 00:15:17:bd:d6:3e
192.168.0.12 bc:5f:f4:1a:6e:6c
192.168.0.20 36:62:38:64:38:63
192.168.0.30 38:ea:a7:a4:a5:10
192.168.0.51 62:66:39:65:63:39
192.168.0.52 62:38:66:39:34:39
192.168.0.53 32:36:34:63:63:61
192.168.0.54 36:38:33:33:63:36
192.168.0.55 32:32:64:37:39:64
192.168.0.57 32:66:34:61:34:65
192.168.0.58 66:32:64:38:66:37
192.168.0.102 62:31:30:31:39:64
192.168.0.103 32:33:61:62:39:61
192.168.0.114 66:62:30:61:35:35
192.168.0.117 32:65:37:36:64:61
192.168.0.118 62:34:30:62:31:62
192.168.0.119 32:64:35:36:37:38
192.168.0.121 36:33:62:65:63:36
192.168.0.145 62:64:62:31:63:62
192.168.0.169 36:35:64:66:35:61
192.168.0.170 62:66:33:31:64:34
192.168.0.171 32:33:35:31:37:33
192.168.0.175 32:36:63:39:36:37
192.168.0.176 66:63:32:30:35:65
192.168.0.177 62:30:34:62:63:32
192.168.0.178 32:34:33:65:35:32
192.168.0.178 32:34:33:65:25:32
192.168.0.190 66:66:63:65:34:36
192.168.0.231 62:30:34:62:63:32
AWK実践入門 (Software Design plus) AWK実践入門 (Software Design plus)

ProxmoxVE 4.2のログインにワンタイムパスワードによる二要素認証を設定する

$
0
0

ここのとこワンタイムパスワードについていろいろ設定してるのだけど、どうやらProxmox VEでもOTPによる二要素認証が設定ができるようだ。
というわけで、試しに設定してみることにした。

設定方法は簡単。
[データセンター]から[認証]タブを選択し、ワンタイムパスワードを定義する認証方法(今回はpam)の設定画面を開く。
で、[TFA]の設定値を「OATH」と指定する。

20160822_110435000000

 

次に、Proxmox VEのコンソール画面で以下のコマンドを実行し、ワンタイムパスワードのキーを生成する。

oathkeygen
root@BS-PHY-MICROSERVER-01:~# oathkeygen
ORQOZ7ZBEOPWDXAY

Proxmoxの管理画面を再度開き、[データセンター] > [ユーザ]タブからワンタイムパスワード認証をさせるユーザを選択し、生成したキーを[Key IDs]に入力する。

20160822_110953000000

 

あとは、再度ログインする際に今までのID/PWとワンタイムパスワードの入力をするだけだ。

20160822_112417000000

 

ワンタイムパスワードは、以下のようにコンソール上でコマンドを実行することで求めることが可能だ。

oathtool --totp -b シークレットキー

 

iPhoneやAndroidなどでいいツールがあればいいが、今のところiPhoneではよさげなアプリが見つからず、自分の環境ではoathtoolコマンド以外見つからなかった。
何であれ、これでワンタイムパスワードログインができるようになった。

YubiKey NEO YubiKey NEO

CentOS 7にメモリダンプから情報を取得するためのメモリフォレンジックツール「Volatility tool」をインストールする

$
0
0

メモリダンプからいろいろと情報を取得するフォレンジックツール「Volatility tool」というものがあるようなので、CentOS 7に試しにインストールしてみる。
メモリダンプを解析できるOSは結構種類があるようで、LinuxだけではなくWindows、Mac OS Xも解析可能なようだ。

1.インストール

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

yum install git

 

以下のコマンドでVolatility toolをインストールする。

git clone https://github.com/volatilityfoundation/volatility.git
cd volatility/
python ./setup.py install

 

2.メモリダンプの解析

インストールが完了したら、実際にメモリダンプの解析をしてみよう。
こちらに各OSのサンプルがあるので、適当に好きなファイルをダウンロードしてこよう。

vol.py imageinfo -f メモリダンプPATH
[root@BS-PUB-WEBTOOL-TEST01 volatility]# wget http://amnesia.gtisc.gatech.edu/~moyix/ds_fuzz_hidden_proc.img.bz2
--2016-08-22 18:26:11--  http://amnesia.gtisc.gatech.edu/~moyix/ds_fuzz_hidden_proc.img.bz2
amnesia.gtisc.gatech.edu (amnesia.gtisc.gatech.edu) をDNSに問いあわせています... 143.215.130.152
amnesia.gtisc.gatech.edu (amnesia.gtisc.gatech.edu)|143.215.130.152|:80 に接続しています... 接 続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 60878947 (58M) [application/x-bzip2]
`ds_fuzz_hidden_proc.img.bz2' に保存中

100%[=====================================================>] 60,878,947  3.35MB/s 時間 23s

2016-08-22 18:26:35 (2.52 MB/s) - `ds_fuzz_hidden_proc.img.bz2' へ保存完了 [60878947/60878947]

[root@BS-PUB-WEBTOOL-TEST01 volatility]# bzip2 -dc ds_fuzz_hidden_proc.img.bz2 > ds_fuzz_hidden_proc.img
[root@BS-PUB-WEBTOOL-TEST01 volatility]# vol.py imageinfo -f ds_fuzz_hidden_proc.img
Volatility Foundation Volatility Framework 2.5
*** Failed to import volatility.plugins.registry.shutdown (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.getservicesids (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.timeliner (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.malware.apihooks (NameError: name 'distorm3' is not defined)
*** Failed to import volatility.plugins.malware.servicediff (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.registry.userassist (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.getsids (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.registry.shellbags (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.evtlogs (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.tcaudit (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.registry.dumpregistry (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.registry.lsadump (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.malware.threads (NameError: name 'distorm3' is not defined)
*** Failed to import volatility.plugins.mac.apihooks_kernel (ImportError: No module named distorm3)
*** Failed to import volatility.plugins.registry.amcache (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.mac.check_syscall_shadow (ImportError: No module named distorm3)
*** Failed to import volatility.plugins.malware.svcscan (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.registry.auditpol (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.ssdt (NameError: name 'distorm3' is not defined)
*** Failed to import volatility.plugins.registry.registryapi (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.mac.apihooks (ImportError: No module named distorm3)
*** Failed to import volatility.plugins.envars (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.registry.shimcache (ImportError: No module named Crypto.Hash)
INFO    : volatility.debug    : Determining profile based on KDBG search...
          Suggested Profile(s) : WinXPSP2x86, WinXPSP3x86 (Instantiated with WinXPSP2x86)
                     AS Layer1 : IA32PagedMemoryPae (Kernel AS)
                     AS Layer2 : FileAddressSpace (/root/volatility/ds_fuzz_hidden_proc.img)
                      PAE type : PAE
                           DTB : 0x319000L
                          KDBG : 0x80545b60L
          Number of Processors : 1
     Image Type (Service Pack) : 3
                KPCR for CPU 0 : 0xffdff000L
             KUSER_SHARED_DATA : 0xffdf0000L
           Image date and time : 2008-11-26 07:46:02 UTC+0000
     Image local date and time : 2008-11-26 02:46:02 -0500

上のコマンドで、メモリダンプからOSの種類とCPUの数などが読み取れる。
ここで分かったOSの種類を指定して、動作していたプロセスなどを確認する。

vol.py --profile=OS種類 pslist -f メモリダンプPATH
[root@BS-PUB-WEBTOOL-TEST01 volatility]# vol.py --profile=WinXPSP3x86 pslist -f ds_fuzz_hidden_proc.img
Volatility Foundation Volatility Framework 2.5
*** Failed to import volatility.plugins.registry.shutdown (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.getservicesids (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.timeliner (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.malware.apihooks (NameError: name 'distorm3' is not defined)
*** Failed to import volatility.plugins.malware.servicediff (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.registry.userassist (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.getsids (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.registry.shellbags (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.evtlogs (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.tcaudit (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.registry.dumpregistry (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.registry.lsadump (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.malware.threads (NameError: name 'distorm3' is not defined)
*** Failed to import volatility.plugins.mac.apihooks_kernel (ImportError: No module named distorm3)
*** Failed to import volatility.plugins.registry.amcache (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.mac.check_syscall_shadow (ImportError: No module named distorm3)
*** Failed to import volatility.plugins.malware.svcscan (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.registry.auditpol (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.ssdt (NameError: name 'distorm3' is not defined)
*** Failed to import volatility.plugins.registry.registryapi (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.mac.apihooks (ImportError: No module named distorm3)
*** Failed to import volatility.plugins.envars (ImportError: No module named Crypto.Hash)
*** Failed to import volatility.plugins.registry.shimcache (ImportError: No module named Crypto.Hash)
Offset(V)  Name                    PID   PPID   Thds     Hnds   Sess  Wow64 Start                          Exit
---------- -------------------- ------ ------ ------ -------- ------ ------ ------------------------------ ------------------------------
0x819cc830 System                    4      0     51      254 ------      0
0x817e4670 smss.exe                360      4      3       19 ------      0 2008-11-26 07:38:11 UTC+0000
0x8181bd78 csrss.exe               596    360     10      322      0      0 2008-11-26 07:38:13 UTC+0000
0x8182b100 winlogon.exe            620    360     16      503      0      0 2008-11-26 07:38:14 UTC+0000
0x8183ba78 services.exe            672    620     15      245      0      0 2008-11-26 07:38:15 UTC+0000
0x817dbc30 lsass.exe               684    620     21      347      0      0 2008-11-26 07:38:15 UTC+0000
0x81859d70 svchost.exe             844    672     19      198      0      0 2008-11-26 07:38:18 UTC+0000
0x8183d360 svchost.exe             932    672     10      229      0      0 2008-11-26 07:38:18 UTC+0000
0x818a2300 svchost.exe            1064    672     63     1308      0      0 2008-11-26 07:38:20 UTC+0000
0x817f7da0 svchost.exe            1164    672      5       77      0      0 2008-11-26 07:38:23 UTC+0000
0x8180e6f0 svchost.exe            1264    672     14      209      0      0 2008-11-26 07:38:25 UTC+0000
0x817ca478 explorer.exe           1516   1452     12      362      0      0 2008-11-26 07:38:27 UTC+0000
0x816e75e8 spoolsv.exe            1648    672     12      112      0      0 2008-11-26 07:38:28 UTC+0000
0x816af860 VMwareTray.exe         1896   1516      1       26      0      0 2008-11-26 07:38:31 UTC+0000
0x816af448 VMwareUser.exe         1904   1516      1       28      0      0 2008-11-26 07:38:31 UTC+0000
0x816a13c0 VMwareService.e        1756    672      3       45      0      0 2008-11-26 07:38:45 UTC+0000
0x816557e0 alg.exe                 512    672      6      105      0      0 2008-11-26 07:38:53 UTC+0000
0x81643b28 wuauclt.exe            1372   1064      8      225      0      0 2008-11-26 07:39:38 UTC+0000
0x8164e3a8 wscntfy.exe             560   1064      1       31      0      0 2008-11-26 07:44:57 UTC+0000

 

…VMwareとか動かしてたのかな?
そのほか、pstree(プロセスツリー)、connscan(netstatに相当する情報)、connections(プロセスの接続情報)などを指定して情報が得られる。

[root@BS-PUB-WEBTOOL-TEST01 volatility]# vol.py --profile=WinXPSP3x86 pstree -f ds_fuzz_hidden_proc.img | grep -v Failed
Volatility Foundation Volatility Framework 2.5
Name                                                  Pid   PPid   Thds   Hnds Time
-------------------------------------------------- ------ ------ ------ ------ ----
 0x819cc830:System                                      4      0     51    254 1970-01-01 00:00:00 UTC+0000
. 0x817e4670:smss.exe                                 360      4      3     19 2008-11-26 07:38:11 UTC+0000
.. 0x8182b100:winlogon.exe                            620    360     16    503 2008-11-26 07:38:14 UTC+0000
... 0x8183ba78:services.exe                           672    620     15    245 2008-11-26 07:38:15 UTC+0000
.... 0x816e75e8:spoolsv.exe                          1648    672     12    112 2008-11-26 07:38:28 UTC+0000
.... 0x81859d70:svchost.exe                           844    672     19    198 2008-11-26 07:38:18 UTC+0000
.... 0x8180e6f0:svchost.exe                          1264    672     14    209 2008-11-26 07:38:25 UTC+0000
.... 0x818a2300:svchost.exe                          1064    672     63   1308 2008-11-26 07:38:20 UTC+0000
..... 0x8164e3a8:wscntfy.exe                          560   1064      1     31 2008-11-26 07:44:57 UTC+0000
..... 0x81643b28:wuauclt.exe                         1372   1064      8    225 2008-11-26 07:39:38 UTC+0000
.... 0x817f7da0:svchost.exe                          1164    672      5     77 2008-11-26 07:38:23 UTC+0000
.... 0x816557e0:alg.exe                               512    672      6    105 2008-11-26 07:38:53 UTC+0000
.... 0x8183d360:svchost.exe                           932    672     10    229 2008-11-26 07:38:18 UTC+0000
.... 0x816a13c0:VMwareService.e                      1756    672      3     45 2008-11-26 07:38:45 UTC+0000
... 0x817dbc30:lsass.exe                              684    620     21    347 2008-11-26 07:38:15 UTC+0000
.. 0x8181bd78:csrss.exe                               596    360     10    322 2008-11-26 07:38:13 UTC+0000
 0x817ca478:explorer.exe                             1516   1452     12    362 2008-11-26 07:38:27 UTC+0000
. 0x816af448:VMwareUser.exe                          1904   1516      1     28 2008-11-26 07:38:31 UTC+0000
. 0x816af860:VMwareTray.exe                          1896   1516      1     26 2008-11-26 07:38:31 UTC+0000
[root@BS-PUB-WEBTOOL-TEST01 volatility]# vol.py --profile=WinXPSP3x86 connscan -f ds_fuzz_hidden_proc.img | grep -v Failed
Volatility Foundation Volatility Framework 2.5
Offset(P)  Local Address             Remote Address            Pid
---------- ------------------------- ------------------------- ---
0x019cfbf0 192.168.101.128:1035      192.168.101.1:445         4
0x01a4abd0 192.168.101.128:1040      192.168.101.1:139         4
0x01a52b38 192.168.101.128:31337     192.168.101.1:1158        1696
[root@BS-PUB-WEBTOOL-TEST01 volatility]# vol.py --profile=WinXPSP3x86 connections -f ds_fuzz_hidden_proc.img | grep -v Failed
Volatility Foundation Volatility Framework 2.5
Offset(V)  Local Address             Remote Address            Pid
---------- ------------------------- ------------------------- ---
0x81852b38 192.168.101.128:31337     192.168.101.1:1158        1696
0x817cfbf0 192.168.101.128:1035      192.168.101.1:445         4

 

問題の発生した際にメモリダンプを取るような運用が必要にはなるけど、いろいろなOSに対応しててこれだけ見れるなら中々よさそう。

Windows/Linuxのトラブル追跡実践ノウハウ エンジニア必携 Windows/Linuxのトラブル追跡実践ノウハウ エンジニア必携

Proxmox VE 4.2でOVS(Open vSwitch)を使ってタグVLANの設定をする

$
0
0

Proxmox VE 4.2で、接続するLANケーブル1本でトランクポートにして、Proxmox側でそれぞれのVMに応じてアンタグさせる必要があったので、OVS(Open vSwitch)を設定してVLAN設定をしてみた。
とりあえず、今回は検証なので以下のような構成で考えている(検証なので、裏の管理コンソールは別にLAN刺してる)。トランクポートに設定した以外のスイッチで各VLANのアンタグをさせて、そこにクライアント刺すことでテストをする。

  • VLAN101 … 192.168.101.0/24
  • VLAN102 … 192.168.102.0/24
  • VLAN103 … 192.168.103.0/24

proxmox_vlan

 

とりあえずスイッチの設定は終わってるものとして、まず管理コンソールからシェルを起動させて、以下のコマンドを実行する。

echo "# PVE pve-no-subscription repository provided by proxmox.com, NOT recommended for production use" >> /etc/apt/sources.list
echo "deb http://download.proxmox.com/debian jessie pve-no-subscription" >> /etc/apt/sources.list
sed -i '/^deb/s/^/# /' /etc/apt/sources.list.d/pve-enterprise.list
apt-get update
apt-get install openvswitch-switch

次に、[ネットワーク] > [作成] > [OVS Bridges]を選択。

20160822_211856000000

 

IPアドレス等は入力せず、紐づく物理ポートのみ指定してBridgeを作成する。

20160822_213303000000

 

[ネットワーク] > [作成] > [OVS IntPort]を選択し、管理用のインターフェイスを作成する。

20160822_223154000000

 

これでOVSで管理インターフェイスでVLANタグをアンタグさせる設定ができた。
再起動しないと設定が反映されないので、一度Proxmoxを再起動させる。

再起動後にpingを実行すると、同一のVLAN(今回の場合は101)からならばpingが通るが、それ以外のVLANを設定されているポートからだと通信が飛ばないことが確認できる。
想定通りの動作が確認できた。

ちなみに、VMのインターフェイスでポートVLANのタグを指定する場合は対象となるVMの[ハードウェア] > [ネットワークデバイス]から指定できるので、ここでいじってやればよい。

20160822_233130000000

[増補改訂版]クラウド時代のネットワーク技術 OpenFlow実践入門 (Software Design plus) [増補改訂版]クラウド時代のネットワーク技術 OpenFlow実践入門 (Software Design plus)

第24回シェル芸勉強会に参加してきました(復習)

$
0
0

第24回シェル芸勉強会に参加してきたので、その復習。
今回はLLOTと同日開催のためか、少し人数が少なめ?だった様子。ベテラン勢が少し少数になってた…のかな?
まぁ、いつも通り復習。模範解答と問題はこちら

Q1.

各行に2種類の文字列(卵、玉子)があるので、それの数を算出する。
awkのみで回答するのがキレイな解き方なんだけど、あんまりawkに自信ないので以前やった行の内容をソートさせる方法にちょい手を加えて回答した。

cat Q1 | while read line; do echo $line | sed 's/ /\n/g' | sort | uniq -c | awk '{line=line " " $0} END {print line}' ; done
[root@BS-PUB-CENT7-01 vol.24]# cat Q1
玉子 卵 玉子 玉子 玉子 玉子
玉子 玉子 卵 卵 卵 玉子
卵 玉子 卵 玉子 玉子 玉子
卵 玉子 卵 卵 卵 卵
玉子 卵 玉子
[root@BS-PUB-CENT7-01 vol.24]# cat Q1 | while read line; do echo $line | sed 's/ /\n/g' | sort | uniq -c | awk '{line=line " " $0} END {print line}' ; done
       5 玉子       1 卵
       3 玉子       3 卵
       4 玉子       2 卵
       1 玉子       5 卵
       2 玉子       1 卵

が、こちらの@ebanさんのツイートのように書くことでawk単体でシンプルに対応することができるようだ。 やはりawk大事。もうちょい勉強しないと…

awk '{for(i=1;i<=NF;i++)a[$i]++;for(k in a)printf "%s ", k":"a[k];delete(a);print ""}' Q1
[root@BS-PUB-CENT7-01 vol.24]# cat Q1
玉子 卵 玉子 玉子 玉子 玉子
玉子 玉子 卵 卵 卵 玉子
卵 玉子 卵 玉子 玉子 玉子
卵 玉子 卵 卵 卵 卵
玉子 卵 玉子
[root@BS-PUB-CENT7-01 vol.24]# # ※わかりやすくするために、改行処理をちゃんと入れるまではxargsで無理やり改行させてる。
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # 連想配列に突っ込んでprintfで変数と連想配列の値をくっつけていく
[root@BS-PUB-CENT7-01 vol.24]# awk '{for(i=1;i<=NF;i++)a[$i]++;for(k in a)printf "%s ", k":"a[k]}' Q1 | xargs
玉子:5 卵:1 玉子:8 卵:4 玉子:12 卵:6 玉子:13 卵:11 玉子:15 卵:12
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # 変数がどんどん足されていくので、行の最後に変数の値をクリアする(「delete(a)」のとこ)
[root@BS-PUB-CENT7-01 vol.24]# awk '{for(i=1;i<=NF;i++)a[$i]++;for(k in a)printf "%s ", k":"a[k];delete(a)}' Q1 | xargs
玉子:5 卵:1 玉子:3 卵:3 玉子:4 卵:2 玉子:1 卵:5 玉子:2 卵:1
[root@BS-PUB-CENT7-01 vol.24]# # 各行で処理が終わったら改行させる(「print ""」のとこ)
[root@BS-PUB-CENT7-01 vol.24]# awk '{for(i=1;i<=NF;i++)a[$i]++;for(k in a)printf "%s ", k":"a[k];delete(a);print ""}' Q1
玉子:5 卵:1
玉子:3 卵:3
玉子:4 卵:2
玉子:1 卵:5
玉子:2 卵:1

 

Q2.

同じ文字が2つ以上出てきた場合、最初の文字以外は表示させないようにする。 (「あいあうい」なら「あいう」へ、問題の「へのへのもへじ」なら「へのもじ」へ変換する) これは結構簡単な方だったかも。 uniqコマンドを使うとソートさせないといけないので、awkで対応する。

cat Q2 | grep -o . | awk '!a[$0]++' | tr -d '\n' | xargs
[root@BS-PUB-CENT7-01 vol.24]# cat Q2
へのへのもへじ
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # 「grep -o .」でヒットする文字列(「.」のみで任意のすべての1文字)の場合は改行して出力させる処理を追加
[root@BS-PUB-CENT7-01 vol.24]# cat Q2 | grep -o .
へ
の
へ
の
も
へ
じ
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # awkで2個目以降の文字列はすべて出力させない処理を追加
[root@BS-PUB-CENT7-01 vol.24]# cat Q2 | grep -o . | awk '!a[$0]++'
へ
の
も
じ
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # 改行を削除
[root@BS-PUB-CENT7-01 vol.24]# cat Q2 | grep -o . | awk '!a[$0]++' | tr -d '\n' | xargs
へのもじ

 

これについても、@ebanさんの回答のように「paste -sd ”」を使うことで、改行を削除して、かつ最後の出力の改行はちゃんと出してくれるようになる。

grep -o . Q2 | awk '!a[$0]++' | paste -sd ''
grep -o . Q2 | awk '!a[$0]++{printf $1}END{print""}' # paste部分もawkだけでやった場合
[root@BS-PUB-CENT7-01 vol.24]# grep -o . Q2 | awk '!a[$0]++' | paste -sd ''
へのもじ
[root@BS-PUB-CENT7-01 vol.24]# grep -o . Q2 | awk '!a[$0]++{printf $1}END{print""}' # paste部分もawkだけでやった場合
へのもじ

 

Q3.

ファイルをソートして、1列目の内容に応じて「%%」を挿入してグループ分けするよ、という問題。
awkでやると簡単にできるようだけど、いかんせんまだawk力が高くないので、模範解答から。

sort Q3 | awk '{if($1!=a){print "%%";print;a=$1}else{print}}END{print "%%"}'
[root@BS-PUB-CENT7-01 vol.24]# cat Q3
金 日成
キム ワイプ
金 正日
キム タオル
金 正男
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # まずはソート
[root@BS-PUB-CENT7-01 vol.24]# sort Q3
キム タオル
キム ワイプ
金 正男
金 正日
金 日成
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # もし$1の値が直前と違った場合は、「%%」出力後に値をprintする(if($1!=a){print "%%";print;a=$1})
[root@BS-PUB-CENT7-01 vol.24]# # それ以外はそのままprint(else{print})
[root@BS-PUB-CENT7-01 vol.24]# sort Q3 | awk '{if($1!=a){print "%%";print;a=$1}else{print}}'
%%
キム タオル
キム ワイプ
%%
金 正男
金 正日
金 日成
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # 最後に「%%」を付け足す(END{print "%%"})
[root@BS-PUB-CENT7-01 vol.24]# sort Q3 | awk '{if($1!=a){print "%%";print;a=$1}else{print}}END{print "%%"}'
%%
キム タオル
キム ワイプ
%%
金 正男
金 正日
金 日成
%%

 

そのほか、@ebanさんや@kunst1080さん、あと@mutz0623さんの解答がよかったので分解して理解しとく。

●@ebanさん

[root@BS-PUB-CENT7-01 vol.24]# # 変数aが$1でない場合、%%をプリントして変数aに$1を代入する
[root@BS-PUB-CENT7-01 vol.24]# sort Q3 | awk 'a!=$1{print "%%";a=$1}'
%%
%%
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # もちろん、代入しただけじゃ何も出ないので変数aをプリントさせる
[root@BS-PUB-CENT7-01 vol.24]# sort Q3 | awk 'a!=$1{print "%%";a=$1};1'
%%
キム タオル
キム ワイプ
%%
金 正男
金 正日
金 日成
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # 最後に「echo %%」で%%を出力して終わり。(「END{print "%%"}」で もいけるけど、そっちのほうが長くなるようだ)
[root@BS-PUB-CENT7-01 vol.24]# sort Q3 | awk 'a!=$1{print "%%";a=$1};1';echo %%
%%
キム タオル
キム ワイプ
%%
金 正男
金 正日
金 日成
%%
[root@BS-PUB-CENT7-01 vol.24]# sort Q3 | awk 'l!=$1{print "%%";l=$1};1;END{print "%%"}'
%%
キム タオル
キム ワイプ
%%
金 正男
金 正日
金 日成
%%

 

●@kunst1080さん

[root@BS-PUB-CENT7-01 vol.24]# # 変数aが前の行と同じでない場合、%%を出力する
[root@BS-PUB-CENT7-01 vol.24]# sort Q3 | awk '!a[$1]++{print "%%"}'
%%
%%
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # そうでない場合、行を出力する処理を追加
[root@BS-PUB-CENT7-01 vol.24]# sort Q3 | awk '!a[$1]++{print "%%"}{print}'
%%
キム タオル
キム ワイプ
%%
金 正男
金 正日
金 日成
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # 最後に%%を出力
[root@BS-PUB-CENT7-01 vol.24]# sort Q3 | awk '!a[$1]++{print "%%"}{print}END{print "%%"}'
%%
キム タオル
キム ワイプ
%%
金 正男
金 正日
金 日成
%%

 

●@mutz0623さん

[root@BS-PUB-CENT7-01 vol.24]# # グルーピングして、各列の一列名を別途echoする。
[root@BS-PUB-CENT7-01 vol.24]# (cat Q3 ;echo "キム";echo "金")
金 日成
キム ワイプ
金 正日
キム タオル
金 正男
キム
金
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # sortする
[root@BS-PUB-CENT7-01 vol.24]# (cat Q3 ;echo "キム";echo "金") | sort
キム
キム タオル
キム ワイプ
金
金 正男
金 正日
金 日成
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # 「キム」「金」のみの行を置換する
[root@BS-PUB-CENT7-01 vol.24]# (cat Q3 ;echo "キム";echo "金") | sort | sed -r "s/^( キム|金)$/%%/"
キム
キム タオル
キム ワイプ
%%
金 正男
金 正日
金 日成
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # 最後に「%%」を出力
[root@BS-PUB-CENT7-01 vol.24]# (cat Q3 ;echo "キム";echo "金") | sort | sed -r "s/^( キム|金)$/%%/";echo %%
キム
キム タオル
キム ワイプ
%%
金 正男
金 正日
金 日成
%%

 

Q4.

xlsxファイルの中身を見て、セルA1の値を取得するというもの。
とりあえずxlsx2csvコマンドがあったので、それで取得した。(推奨はxlsxが圧縮されたファイルだから、そこを踏まえての対応を求められている)

[root@BS-PUB-CENT7-01 vol.24]# xlsx2csv Q4/Q4.xlsx
114514,シェル芸バイブ
危険シェル芸,ドラゴン曲線
キュアエンジニア,素数
エクシェル芸,変態シェル芸
[root@BS-PUB-CENT7-01 vol.24]# xlsx2csv Q4/Q4.xlsx | awk -F, 'NR==1{print $1}'
114514
[root@BS-PUB-CENT7-01 vol.24]# xlsx2csv Q4/Q4.xlsx | awk -F, 'NR==1{print $2}'
シェル芸バイブ

Q5.

ファイルに記述されている数式を、値を代入して計算させる問題。 echoで値を渡す場合はxargsをうまく使うといいようだ。bcについては、「-l」オプションを付与して浮動小数点計算をさせないといけないので注意。

sed 's/x/3/g' Q5 | bc -l
[root@BS-PUB-CENT7-01 vol.24]# cat Q5
x + x^2
x + 1/x
x*x*x
[root@BS-PUB-CENT7-01 vol.24]# sed 's/x/3/g' Q5
3 + 3^2
3 + 1/3
3*3*3
[root@BS-PUB-CENT7-01 vol.24]# sed 's/x/3/g' Q5 | bc -l
12
3.33333333333333333333
27

  echoで値を渡す場合は以下。

echo 3 | xargs -I{} sh -c "sed 's/x/{}/g' Q5 | bc -l"
[root@BS-PUB-CENT7-01 vol.24]# echo 3
3
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # xargsを使って、パイプから得た値を元にsedで置換する
[root@BS-PUB-CENT7-01 vol.24]# echo 3 | xargs -I{} sed 's/x/{}/g' Q5
3 + 3^2
3 + 1/3
3*3*3
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # xargsで実行させるコマンドでパイプを利用する場合はshコマンドで"(ダブルクォーテーション)で囲ったコマンドを指定してやればよいので、それでbcを実行させる
[root@BS-PUB-CENT7-01 vol.24]# echo 3 | xargs -I{} sh -c "sed 's/x/{}/g' Q5 | bc -l"
12
3.33333333333333333333
27

 

Q6.

ファイルの中で一行になってる文字列から、”卵”と”玉子”に分けて数が少ない方を削除して、多いほうに置換する(卵が2、玉子が5なら、変換して玉子が7個並ぶようにすればいい)。
なので、まずは”卵”と”玉子”の数をそれぞれ数えてやるところから始めればいい。

 

grep -Eo "卵|玉子" Q6 | sort | uniq -c | sort -k1nr | awk 'NR==1{print $2}' | xargs -I{} sed -r 's/玉子|卵/{}/g' Q6
[root@BS-PUB-CENT7-01 vol.24]# # 卵と玉子を分割する
[root@BS-PUB-CENT7-01 vol.24]# grep -Eo "卵|玉子" Q6
卵
卵
玉子
玉子
玉子
玉子
玉子
卵
卵
卵
玉子
玉子
卵
玉子
玉子
玉子
玉子
卵
卵
玉子
卵
玉子
卵
卵
玉子
卵
玉子
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # ソートして数をカウントする()
[root@BS-PUB-CENT7-01 vol.24]# grep -Eo "卵|玉子" Q6 | sort | uniq -c | sort -k1nr
     15 玉子
     12 卵
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # 数の多い方だけ取得する
[root@BS-PUB-CENT7-01 vol.24]# grep -Eo "卵|玉子" Q6 | sort | uniq -c | sort -k1nr | awk 'NR==1{print $2}'
玉子
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # xargsで、数の多いほうですべて置換をさせる
[root@BS-PUB-CENT7-01 vol.24]# grep -Eo "卵|玉子" Q6 | sort | uniq -c | sort -k1nr | awk 'NR==1{print $2}' | xargs -I{} sed -r 's/玉子|卵/{}/g' Q6
玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉 子玉子玉子玉子
[root@BS-PUB-CENT7-01 vol.24]#

 

Q7.

5桁の数字を出して、それぞれを構成する数字が同じものを除外する(11122と22111は1が3つ、2が2つなので重複とみなす)。 数字の構成要素をすべて分割して、行レベルでソート、ユニークな行のみを残すことで対応できる。   なお、回答考えてるときに使ってたのが2桁だったのだけど、Twitterに挙げたのだと5桁は処理重すぎて計算できなかった。 残念…

 

で、じゃあどうすればいいのかというと、模範解答のようにawkのasortを用いる方法があるらしい。
(知らなかった…)

[root@BS-PUB-CENT7-01 vol.24]# # ※長いから頭の10行のみ出力させている
[root@BS-PUB-CENT7-01 vol.24]# seq -w 00000 99999 | head -10
00000
00001
00002
00003
00004
00005
00006
00007
00008
00009
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # まず、行の要素をすべて空白で分割する
[root@BS-PUB-CENT7-01 vol.24]# seq -w 00000 99999 | sed 's/./& /g' | head -10
0 0 0 0 0
0 0 0 0 1
0 0 0 0 2
0 0 0 0 3
0 0 0 0 4
0 0 0 0 5
0 0 0 0 6
0 0 0 0 7
0 0 0 0 8
0 0 0 0 9
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # awkで、すべての行の要素をソートさせる
[root@BS-PUB-CENT7-01 vol.24]# seq -w 00000 99999 | sed 's/./& /g' | awk '{for(i=1;i<=NF;i++)a[i]=$i;asort(a);for(k in a){printf a[k]}print ""}' | head -10
00000
01000
02000
03000
04000
05000
06000
07000
08000
09000
[root@BS-PUB-CENT7-01 vol.24]#
[root@BS-PUB-CENT7-01 vol.24]# # 各行をソート・ユニークなもののみを出力させる
[root@BS-PUB-CENT7-01 vol.24]# seq -w 00000 99999 | sed 's/./& /g' | awk '{for(i=1;i<=NF;i++)a[i]=$i;asort(a);for(k in a){printf a[k]}print ""}' | sort -u | head -10
00000
01000
02000
03000
04000
05000
06000
07000
08000
09000

 

@ebanさんのような解き方もある。
これは、最初から各桁で同じorより小さい値のみを出力させる方法(例えば199は出るけど、911とか191は最初から表示させないようにする)だ。
問題が出てから数分で回答されたのがこれという。すごい…
なお、処理速度も上のものより早かった。

seq -w 0 99999 | awk -F "" '$1<=$2&&$2<=$3&&$3<=$4&&$4<=$5'

 

Q8.

数学オリンピックの問題をカスタマイズした問題。
最初に、”1~7までの数字をすべて含む7桁の数字”を抽出し、相異なる7以下の正の整数a,b,c,d,e,f,gを用いて「a*b*c*d + e*f*g」という計算を行って求められる素数の数を求める。
地味に最初のとこでちゃんと問題を読解できずに変な方向に突っ走ってしまった…反省

まず、”1~7までの数字をすべて含む7桁の数字”を抽出させる。
これについては、grepやawkでのアンド検索が必要となる。

seq -w 0000000 9999999 | grep 1 | grep 2 | grep 3 | grep 4 | grep 5 | grep 6 | grep 7 # grepでやる場合
seq -w 0000000 9999999 | awk '/1/ && /2/ && /3/ && /4/ && /5/ && /6/ && /7/' # awkでやる場合

 

次に、相異なる7以下の~の箇所については、以下のように対応した。

cat tmp | sed 's/./& /g' | awk '{print $1*$2*$3*$4"+"$5*$6*$7}' | bc | factor | sed 's/://g' | awk '$1==$2' | wc -l
[root@BS-PUB-CENT7-01 vol.24]# seq -w 0000000 9999999 | awk '/1/ && /2/ && /3/ && /4/ && /5/ && /6/ && /7/' | sed 's/./& /g' | awk '{print $1*$2*$3*$4"+"$5*$6*$7}' | bc | factor | sed 's/://g' | awk '$1==$2' | wc -l
144

 

Q8、結構難しかった気が…

 

LTとか

LTでは、uniqコマンドのバージョンの違いによって「–group」オプションの有無が違ってたりとか、薬を作成する実験には大量の実験が必要で大変だという話を聞けた。
知らない内容だったりしたので大変勉強になったのだが、最後に行われた某図書館のオープンデータにいろいろなものがあることを知れたので良かった。

今までに出版された多くの図書データについての情報(出版社や著者など)のほか、国会の議事録なんかもあるらしい。
例えば、以下のコマンドで国会の議事録からヤジの内容を得ることができるようだ。
(「と呼ぶ声あり」は途中までで、途中から「と呼ぶ者あり」になったらしい。どういう違いが…?)

curl -s <span class="pl-s"><span class="pl-pds">"</span>http://kokkai.ndl.go.jp/api/1.0/speech?<span class="pl-s"><span class="pl-pds">$(</span><span class="pl-c1">echo</span> <span class="pl-s"><span class="pl-pds">"</span>maximumRecords=100&any=と呼ぶ声あり<span class="pl-pds">"</span></span> <span class="pl-k">|</span> nkf -MQ <span class="pl-k">|</span> tr -d <span class="pl-s"><span class="pl-pds">'</span>\n<span class="pl-pds">'</span></span> <span class="pl-k">|</span> gsed <span class="pl-s"><span class="pl-pds">'</span>s/=\+/%/g<span class="pl-pds">'</span></span><span class="pl-pds">)</span></span><span class="pl-pds">"</span></span> <span class="pl-k">|</span> grep -o <span class="pl-s"><span class="pl-pds">"</span>「.*」<span class="pl-pds">"</span></span>
[root@BS-PUB-CENT7-01 vol.24]# curl -s "http://kokkai.ndl.go.jp/api/1.0/speech?$(echo "maximumRecords=100&any=と呼ぶ声あり" | nkf -MQ | tr -d '\n' | sed 's/=\+/%/g')" | grep -o "「.*」" | sort | uniq -c
      1 「いるぞ」
      1 「じようだん言うなよ。朝鮮事変以後だよ」
      1 「そんなことないよ」と呼ぶ者あり)そんなことないと言ったって、政策を発表するビラのほう は制限してしまって、政治資金は幾らでも自由に入るということになれば、政策で対決できないというこ とになれば、残るのは、(「政策以外のところに使うんだよ、そこが肝心なところだ」と呼ぶ者あり)そ れは政策以外のところに金を使うことになるんじゃないですか。結局今度の法案は、金のかからないのは 政策発表のビラにはかからないけれども、買収のほうへ金を回すためにこういう法案を出すのだ、そうい うことになるんじゃないですか。そうでないなら、財界から金の入る道を閉ざすような政治資金規正法を きちっと通す、そのことのほうが重要じゃないですか。そうでなければ、三回しかビラが出せない、そう してお互いに各選挙区で政策的な対決のビラを出すことができないということになれば、もう情実か金か 、そういうものしか選挙運動がなくなってしまうじゃないですか。三種類のビラが出た、ビラはもうこれ で終わりだということになってしまう。だからかえって金がかかって、金で対決する選挙になるんじゃな いですか。(「使わなければいいんだよ」と呼ぶ者あり)使わなければいいといったって、使うのだから しようがない。それで、先ほどの愛媛のあの例のように、たとえばシンボル・マークで応募した方には一 万円金をやるとか、お礼を上げますとか、こうやっているじゃないですか。現に皆さんのほうではそうな りませんか。政治資金規正法を出してその根源をとめてしまえば、そのビラにかかる金なんてたいしたこ とはありませんよ。また、それにかかる金なら本来選挙の正しいあり方なんですから……。政策の対決点 を明らかにする、これは参議院の公職選挙特別委員会が京都へ行って調べたら、京都の府民の人たちが言 っていることなんですが、選挙の政策のビラをたくさん出していただいたおかげで対決点がはっきりした 、それから中傷と政策というものの違いもはっきりしたと言っているのですから、こっちへ金のかかるこ とは、これは本来選挙民自身も望んでいることであるし、そうしてそんなに金がかかるはずがない。こっ ちのほうをとめてしまえば、行く道というのは、もう買収か汚職かそっちしかないことになるじゃないで すか。(「公害と同じだよ、発生源と同じだよ」
      1 「だれが」
     17 「異議なし」
      1 「偽りその他不正の行為により酒類の製造免許を受けた場合」
      1 「行政管理庁だ」
      1 「国会はどうだ」
      1 「財政部長じゃない」
      1 「三倍じゃだめだ」

 

議事録も、これだけ情報がそろってれば遊べるものになるんだなー
やはり、awkをもっと勉強しないといけないと思った勉強会だった。

シェルプログラミング実用テクニック シェルプログラミング実用テクニック

xargsで実行させるコマンドにパイプを用いる

$
0
0

xargsで実行させるコマンドにパイプを利用したい場合は、「sh -c」で実行させればよい。

コマンド | xargs -I{} sh -c "コマンド {} | コマンド ..."

[root@BS-PUB-CENT7-01 ~]# find ./ -maxdepth 1 -name "test1*"
./test1
./test10
./test11
./test12
./test13
./test14
./test15
./test16
./test17
./test18
./test19
[root@BS-PUB-CENT7-01 ~]# find ./ -maxdepth 1 -name "test1*" | xargs -I {} -n 1 sh -c "echo {} | mv {} {}.bk"
[root@BS-PUB-CENT7-01 ~]# find ./ -maxdepth 1 -name "test1*"
./test10.bk
./test12.bk
./test14.bk
./test16.bk
./test18.bk
./test1.bk
./test11.bk
./test13.bk
./test15.bk
./test17.bk
./test19.bk
シェルプログラミング実用テクニック シェルプログラミング実用テクニック

Linuxでネットワーク内に重複、衝突しているIPアドレス(競合IPアドレス)を調べる方法

$
0
0

人間なので、時折IPアドレスの設定時に誤って重複したアドレスを振ってしまう、設定してしまうこともある(DHCPサーバの範囲内のアドレスで固定IP設定しちゃったりとか)。
そんな時すぐに気づければいいのだが、結構気づかずにそのままにしてしまって対象のホストのネットワークが不安定になった段階でようやく気付くこともあるだろう。

そんなときは、以下のいずれかの方法で重複したIPアドレスを調べて修復してやるといいだろう。

1.arpingで調べる

重複しているであろうIPアドレスに当たりがついている状態であれば、apringコマンドで確認ができる。
そのIPアドレスが重複している場合、返ってくるMACアドレスが交互に出てくるので、そこで判断する。

sudo arping -I eth0 -c 2 重複しているであろうIPアドレス
blacknon@BS-PUB-UBUNTU-01:~$ sudo arping -I eth0 -c 2 192.168.0.121
ARPING 192.168.0.121
60 bytes from 36:33:62:65:63:36 (192.168.0.121): index=0 time=10.202 msec
60 bytes from 66:66:63:65:34:36 (192.168.0.121): index=1 time=10.742 msec
60 bytes from 36:33:62:65:63:36 (192.168.0.121): index=2 time=3.603 msec
60 bytes from 66:66:63:65:34:36 (192.168.0.121): index=3 time=4.433 msec

--- 192.168.0.121 statistics ---
2 packets transmitted, 4 packets received,   0% unanswered (2 extra)
rtt min/avg/max/std-dev = 3.603/7.245/10.742/3.246 ms

ただ、前にWindowsと混合してて、かつWindowsファイアウォールが動いてるとpingが返ってこないことがあった。
その場合は、次の方法で調べるといいだろう。

2.arp-scanで調べる

前にこちらでも触れていた、指定したインターフェイスの所属するネットワークからすべてのIPアドレスを抽出するarp-scanコマンドを利用することで、重複しているIPアドレスを調べることができる。
以下のコマンドを実行することで、重複しているIPアドレスとMACアドレスのみを抽出する。

sudo arp-scan -I eth0 -l | awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) {print $2,$1}' | uniq -D -f 1
blacknon@BS-PUB-UBUNTU-01:~$ sudo arp-scan -I eth0 -l | awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) {print $2,$1}' | uniq -D -f 1
36:33:62:65:63:36 192.168.0.121
66:66:63:65:34:36 192.168.0.121

 

とりあえず、この2通りの方法を把握していれば対応はできるだろう。
なお、一応LinuxにもIPwatchDというIPアドレスの衝突を検知するデーモンが作られているようなのだけど、どうもクライアント用みたいでログに出せなかった(Ubuntu Server 16.04検証)。

インフラエンジニアの教科書2 スキルアップに効く技術と知識 インフラエンジニアの教科書2 スキルアップに効く技術と知識

CentOS 7にOracleJDKをインストールする(wgetでダウンロード)

$
0
0

OracleJDKをCentOS 7にインストールする場合、yumなどではなく、こちらからOracleJDKのrpmパッケージをダウンロードしてインストールしてやる必要があるのだが、これをwgetでダウンロードしてくる方法がある。具体的には、以下のようにwgetコマンドを実行、インストールしてやればよい。

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
Deep Learning Javaプログラミング 深層学習の理論と実装 (impress top gear) Deep Learning Javaプログラミング 深層学習の理論と実装 (impress top gear)

CentOS 7に脆弱性スキャンツール「OpenVAS」をインストールする

$
0
0

リモートから脆弱性をスキャンする方法はいろいろあるが、その中でも比較的有名なのがOpenVASだ。
コマンドや管理画面から指定したホストに対しホストの外部・内部からスキャンを実施することで脆弱性をスキャン、検知させることが可能だ。
細かくはこちらの記事が非常に詳しく書かれているので、一読するとよいだろう。

今回は、このOpenVASをCentOS 7にインストールする。

1.インストール

まずは、以下のコマンドを実行してリポジトリを追加する。

wget -q -O - http://www.atomicorp.com/installers/atomic |sh
[root@BS-PUB-WEBTOOL-TEST01 ~]# wget -q -O - http://www.atomicorp.com/installers/atomic |sh

Atomic Free Unsupported Archive installer, version 3.0.1

BY INSTALLING THIS SOFTWARE AND BY USING ANY AND ALL SOFTWARE
PROVIDED BY ATOMICORP LIMITED YOU ACKNOWLEDGE AND AGREE:

THIS SOFTWARE AND ALL SOFTWARE PROVIDED IN THIS REPOSITORY IS
PROVIDED BY ATOMICORP LIMITED AS IS, IS UNSUPPORTED AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ATOMICORP LIMITED, THE
COPYRIGHT OWNER OR ANY CONTRIBUTOR TO ANY AND ALL SOFTWARE PROVIDED
BY OR PUBLISHED IN THIS REPOSITORY BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY OF SUCH DAMAGE.

For supported software packages please contact us at:

  sales@atomicorp.com

Do you agree to these terms? (yes/no) [Default: yes] yes

Configuring the [atomic] repo archive for this system

Installing the Atomic GPG keys: OK

Downloading atomic-release-1.0-21.el7.art.noarch.rpm: Preparing...                             ################################# [100%]
Updating / installing...
   1:atomic-release-1.0-21.el7.art    ################################# [100%]
OK

Enable repo by default? (yes/no) [Default: yes]: yes


The Atomic repo has now been installed and configured for your system
The following channels are available:
  atomic          - [ACTIVATED] - contains the stable tree of ART packages
  atomic-testing  - [DISABLED]  - contains the testing tree of ART packages
  atomic-bleeding - [DISABLED]  - contains the development tree of ART packages

 

リポジトリ導入後、以下のコマンドでOpenVASをインストールする。

yum -y install openvas

 

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

 

2.設定

インストールが完了したら、以下のコマンドでOpenVASの初期セットアップを実施する。
なお、bzip2が必要なので事前にインストールしている。入力を求められる箇所については、すべてデフォルトで進めていく。

yum -y install bzip2
openvas-setup
[root@BS-PUB-WEBTOOL-TEST01 ~]# openvas-setup

Openvas Setup, Version: 1.0


Step 1: Update NVT, CERT, and SCAP data
Please note this step could take some time.
Once completed, this will be updated automatically every 24 hours

Select download method
* wget (NVT download only)
* curl (NVT download only)
* rsync

  Note: If rsync requires a proxy, you should define that before this step.
Downloader [Default: rsync]
Updating NVTs....
[i] This script synchronizes an NVT collection with the 'OpenVAS NVT Feed'.
[i] The 'OpenVAS NVT Feed' is provided by 'The OpenVAS Project'.
[i] Online information about this feed: 'http://www.openvas.org/openvas-nvt-feed.html'.
[i] NVT dir: /var/lib/openvas/plugins
[w] Could not determine feed version.
[i] rsync is not recommended for the initial sync. Falling back on http.
[i] Will use wget

.....

Updating OpenVAS Manager database....
Pausing while openvas-scanner loads NVTs...Done

Step 2: Configure GSAD
The Greenbone Security Assistant is a Web Based front end
for managing scans. By default it is configured to only allow
connections from localhost.

Allow connections from any IP? [Default: yes]
Redirecting to /bin/systemctl restart  gsad.service

Step 3: Choose the GSAD admin users password.
The admin user is used to configure accounts,
Update NVT's manually, and manage roles.

Enter administrator username [Default: admin] :
Enter Administrator Password:
Verify Administrator Password:

Redirecting to /bin/systemctl start  redis.service

Setup complete, you can now access GSAD at:
  https://<IP>:9392

Created symlink from /etc/systemd/system/multi-user.target.wants/openvas-scanner.service to /usr/lib/systemd/system/openvas-scanner.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/openvas-manager.service to /usr/lib/systemd/system/openvas-manager.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/gsad.service to /usr/lib/systemd/system/gsad.service.

 

これで、初期セットアップが完了した。
念のため、Firewalld、SELinuxを停止しておく。

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i.bak "/SELINUX/s/enforcing/disabled/g" /etc/selinux/config

 

SSL用の証明書を作成する。

openvas-mkcert-client -n om -i
[root@BS-PUB-WEBTOOL-TEST01 ~]# openvas-mkcert-client -n om -i
Generating RSA private key, 4096 bit long modulus
..................................................................++
.......................................................++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [DE]:State or Province Name (full name) [Some-State]:Locality Name (eg, city) []:Organization Name (eg, company) [Internet Widgits Pty Ltd]:Organizational Unit Name (eg, section) []:Common Name (eg, your name or your server's hostname) []:Email Address []:Using configuration from /tmp/openvas-mkcert-client.8221/stdC.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'DE'
localityName          :PRINTABLE:'Berlin'
commonName            :PRINTABLE:'om'
Certificate is to be certified until Aug 25 00:29:42 2017 GMT (365 days)

Write out database with 1 new entries
Data Base Updated
Your client certificates are in /tmp/openvas-mkcert-client.8221 .

You will have to copy them by hand.

 

最後に、OpenVASのデータベースファイルをリビルドしてOpenVAS Managerを起動させる。
念のため、Redisも再起動しておく。

openvasmd --rebuild
openvasmd
/bin/systemctl restart redis.service

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

インストール・初期設定が完了したら、Webブラウザから「https://IPアドレス:9392」へアクセスする。
ログインID/PWは「openvas-setup」コマンドで設定したものを利用する。

20160825_095456000000

 

ログイン後の画面がこちら。

20160826_080038000000

 

3.対象のホストにクイックスキャンをかける

さて、OpenVASにはいろいろな機能があるが、とりあえず指定したホストに対してクイックスキャンをかけてみよう。
画面右側にある「Quick Start」のとこで対象ホストのIPアドレスを入力し、「Start Scan」ボタンを押下する。

20160826_081700000000

 

クイックスキャンが実行される。
終了したらレポートが見れるようになるので、スキャン終了まで待つ。

 

20160826_083217000000

20160826_084232000000

 

レポートを見ると、OSのコマンド検証用として内部でのみ使ってるサーバ(sshくらいしか動いてない)でも脆弱性が確認できる。

20160826_084508000000

20160826_084515000000

 

 

定期スキャンもできるので、定期的にスキャンを行わせて脆弱性があったらすぐに対応できるようにしたい。
…まぁ、第三者のサーバとかにかけると思いっきり攻撃になるので、自分のサーバ限定で。

金融機関のためのサイバーセキュリティとBCPの実務 金融機関のためのサイバーセキュリティとBCPの実務

WebからLinux OSを管理しコンソール操作もできる「Cockpit」

$
0
0

WebブラウザからLinuxを管理・操作できるツールで「Cockpit」というものがあるので、今回はそれをインストールしてみる。
なお、コマンドの検証はRHEL系はCentOS 7、Debian/Ubuntu系はUbuntu 16.04 LTSを使って確認しているので、他のバージョンだと少し異なる場合があるので注意。

1.インストール

RHEL系、Debian/Ubuntu系それぞれでのインストールコマンドは以下。

●CentOSなどのRHEL系

yum -y install cockpit

 

●Debian/Ubuntu系

sudo add-apt-repository ppa:cockpit-project/cockpit
sudo apt-get update
sudo apt-get -y install cockpit

 

インストール完了後、サービスを起動させる。

sudo systemctl start cockpit
sudo systemctl enable cockpit

2.ブラウザでアクセスする

さて、インストールおよびサービスの起動が完了したら、実際にブラウザにアクセスする。
デフォルトのポートは9090なので、https://IPアドレス:9090にアクセスする。
(ログインID/PWはOSのユーザアカウントのものと同一)

20160823_075836000000

 

ログイン後の画面がこちら。

20160823_075931000000

 

その他、左メニューから抜粋。
Services

20160823_080408000000

 

Logs

20160823_080433000000

 

あと、[Tools] > [Terminal]からブラウザ上でターミナルを操作可能だ。
sshのポートを開けなくてもここから操作できると考えるとちょっといいかも。

20160823_080456000000

 

改訂3版 Linuxエンジニア養成読本 (Software Design plus) 改訂3版 Linuxエンジニア養成読本 (Software Design plus)

Linuxコンソール上で特定の列の値を元に区切り文字を入れてグループ分けする

$
0
0

先日行ってきた第24回シェル芸勉強会で、タイトルのような特定の列の値を元に、区切り文字を入れてグループ分けするという処理があったので、忘れないように残しておく。
例えば、以下のようなファイルがあったとする。

[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.txt
CCCC 23
AAAA 123
BBBB 244
BBBB 2233
AAAA 444
BBBB 2435
AAAA 244
DDDD 888
CCCC 53534
AAAA 4456

 

このファイルについて、1列目の値に応じてソートしなおし、それぞれの間に区切り文字を入れるには、以下のようにawkコマンドを実行する。

awk '{if($1!=a){print "--";print;a=$1}else{print}}END{print "--"}'
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.txt
CCCC 23
AAAA 123
BBBB 244
BBBB 2233
AAAA 444
BBBB 2435
AAAA 244
DDDD 888
CCCC 53534
AAAA 4456
[root@BS-PUB-CENT7-01 ~]# sort /tmp/test.txt | awk '{if($1!=a){print "--";print;a=$1}else{print}}END{print "--"}'
--
AAAA 123
AAAA 244
AAAA 444
AAAA 4456
--
BBBB 2233
BBBB 2435
BBBB 244
--
CCCC 23
CCCC 53534
--
DDDD 888
--
AWK実践入門 (Software Design plus) AWK実践入門 (Software Design plus)
Viewing all 1028 articles
Browse latest View live