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

『csvkit』のin2csvコマンドでLinux上でExcelファイル(xls・xlsx)からcsvに変換してやる

$
0
0

ちょっと調べものをしてたところ、『csvkit』というCSVに関する処理を行えるコマンドツールパッケージを見かけた。
で、その中にin2csvコマンドなるものがあるのだが、これを使うことでxlsやxlsxといったExcel形式のファイルをcsvフォーマットに変換して出力してくれるようだ。

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

pip install csvkit

 

インストールができたら、in2csvを使ってみよう。
普通にExcelファイルを指定すると、標準出力でCSV形式に出力してくれる。

[root@BS-PUB-CENT7-01 ~]# in2csv Book2.xlsx
,,
,test,1234
,,
,tertete,gdgrhg

 

これは使えそうだ。
そのほか、sqlでcsvを扱ったりするようなツールがあったり、かなり便利そう。
今度本格的に触ってみよう。

 

シェルスクリプトマガジン vol.43 シェルスクリプトマガジン vol.43

Linuxで特定のフォルダ配下で中身が重複したファイルを確認・削除する

$
0
0

複数人でファイルサーバなどを利用していると、時折同じファイルなのだけど名前変えて違うフォルダにファイルをコピーしたり、ISOファイルなどを気づかずに同じファイルを別名でおいてしまったりといった、中身が同じファイルを複数置いてしまうことがある。
ディスクサイズは有限なので、容量がいっぱいになってきたら当然重複したファイルや容量の大きいファイルは削除する必要がある。
そんな時、重複して中身がおなじファイルを見つけるときに便利なのがfdupesコマンドだ。

1.インストール

fdupesコマンドのインストール方法は以下。

yum install -y --enablerepo=epel fdupes
apt install fdupes

 

これでfdupesコマンドがインストールできる。

2.使い方

fdupesは、以下のように対象のPATHを指定してやることでそのPATH配下で重複したファイルをリストアップしてくれる。
このとき、「-r」オプションを付与しないと再帰的に検索してくれないので注意。

fdupes -r 対象PATH

 

コマンドを実行すると、以下のようにプログレスを表示させて検索してくれる。
ファイル数が多いとその分時間がかかるので注意。

[root@BS-PUB-CENT7-01 ~]# fdupes -r /tmp/
Progress [1/15] 6% -

 

実行後、重複ファイルが見つかったら以下のように改行区切りで重複ファイルを表示してくれる。

[root@BS-PUB-CENT7-01 ~]# fdupes -r /tmp/
/tmp/aaa/clonezilla-live-1.2.12-67-i686-pae.iso
/tmp/clonezilla-live-1.2.12-67-i686-pae.iso
/tmp/bbb

/tmp/test1.txt
/tmp/test2.txt
/tmp/test3.txt
/tmp/test4.txt
/tmp/test5.txt
/tmp/test6.txt
/tmp/test7.txt
/tmp/aaa/test2.txt
/tmp/aaa/test11.txt
/tmp/aaa/test133.txt

 

2-1.統計情報を表示させる

「-m」オプションを付与することで、統計情報を得ることができる。

fdupes -mr PATH
[root@BS-PUB-CENT7-01 ~]# fdupes -mr /tmp/
11 duplicate files (in 2 sets), occupying 234.9 megabytes

 

2-2.重複ファイルを削除する

重複したファイルを削除する場合は、「-r」オプションで対話形式での削除が行える。
1個のファイルを残して問答無用で削除する場合は、「-f」オプション(最初に検索されたファイルは除外する)と「-N」(対話形式のプロンプトを表示させずすべて削除する)オプションを組み合わせることで、それ以外の重複ファイルを削除してくれる。

fdupes -rd PATH #対話形式での削除
fdupes -frdN PATH # 1個目に検索されたファイル以外をすべて削除

 

まぁ、実際に業務などで使うにはちょっと危険なので、一度リストをファイルに書き出してから人の判断を挟んだほうがいいだろう。

 

 

 

Excelファイル(~.xls/~.xlsx)をLinuxコンソール上でCSV方式に変換する方法

$
0
0

よくある、利用される問題だからなのか、LinuxやMac OS XでExcelファイル(.xlsや.xlsxファイル)をコンソール上でCSV方式に変換するためのコマンドは数多く用意されている。
で、今回はその中でも使えそうなものを2つほど抜粋してみようと思う(エクシェル芸な勉強会近いし)。

1.xlsx2csv

こういった用途では一番多く使われているだろう、xlsx2csvコマンドを用いての変換。
xlsx2csvコマンド自体は以下でインストールができる。

pip install xlsx2csv

 

CSV形式への変換は以下のコマンドで行える。
オプションでどのシートを変換するかについても選べるので、複数シートがある場合でも問題ないだろう。

xlsx2csv ExcelファイルPATH [CSVファイルPATH]
[root@BS-PUB-CENT7-01 ~]# xlsx2csv Book2.xlsx
,test,1234,2222,3456,
,tertete,gdgrhg,3333,gdgrhg3333,

2.in2csv(csvkit)

こちらでも触れたのだが、『csvkit』というツールの変換コマンドである「in2csv」を使うことで変換する。
『csvkit』のインストール方法は以下。

pip install csvkit

 

ExcelからCSV形式に変換する「in2csv」の実行方法は以下。

in2csv ExcelファイルPATH
[root@BS-PUB-CENT7-01 ~]# in2csv Book2.xlsx
,,,,
,test,1234,2222,3456
,,,,
,tertete,gdgrhg,3333,gdgrhg3333

 

実行結果をxlsx2csvと見比べると、どうも数式が入ってると余計な行を挟んでくるようだ。
とりあえず、CSVに変換するだけであればxlsx2csvがあればどうにかなりそうだ。

Microsoft Excel 2016 (最新)|オンラインコード版 Microsoft Excel 2016 (最新)|オンラインコード版

複数台のホストにパラレルでコマンドを実行させる『orgalorg』

$
0
0

複数台のホストに対し、同時にコマンドを実行させるGolang製のツール『orgalorg』なるものを見かけたので、Ubuntu Server 16.04に入れてみることにした。Golangについては面倒なのでaptからインストールしている。このツールはGolangで書かれているので、インストールも簡単に行える(事前にGOを入れてちゃんとGOPATHとか設定してる必要はあるが)。

go get github.com/reconquest/orgalorg

 

で、インストールできたら以下のように「-o」オプションで複数ホストを指定してコマンドを実行する。
「-p」でパスワード認証に対応しているので、鍵認証じゃなくても安心だ(同じパスワードを指定してる必要はあるようだが)。

orgalorg -o ホスト1 -o ホスト2 ... -p -C コマンド
blacknon@BS-PUB-UBUNTU-01:~$ orgalorg -o root@BS-PUB-CENT7-01 -o root@BS-PUB-CENT7-02 -p -C uptime
Password:
BS-PUB-CENT7-02  16:53:18 up 20 days, 22:26,  1 user,  load average: 0.00, 0.01, 0.05
BS-PUB-CENT7-01  16:13:45 up 22 days, 12:32,  1 user,  load average: 0.08, 0.04, 0.05

 

その他いろいろとオプションがあるようだが、いろいろと役に立ちそうなツールだ。

みんなのGo言語【現場で使える実践テクニック】 みんなのGo言語【現場で使える実践テクニック】

Linuxでmanを少しカラフルで見やすくする

$
0
0

UbuntuやCentOSなどでmanを見る際、「most」をPagerにすることで少し見やすくすることができる。
まず、以下のコマンドでmostをインストールしておく。

sudo apt install most # Debian/Ubuntuの場合
sudo yum install ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/utilities/CentOS_6/x86_64/most-5.0.0a-3.1.x86_64.rpm # RHEL系の場合

 

次に、以下のコマンドを実行しデフォルトのPagerをmostコマンドにする。

echo 'export PAGER="most"' >> .bash_profile
source .bash_profile

これで、man実行時にmostが使われるようになった。
実際にmanの出力を見てみよう。わかりやすく、文字色を白地にしている。

●デフォルト

 

●mostコマンドでの表示

 

オプションにも色がついたので、少し見やすくなった気がする。

入門者のLinux 素朴な疑問を解消しながら学ぶ (ブルーバックス) 入門者のLinux 素朴な疑問を解消しながら学ぶ (ブルーバックス)

Webベースのオンラインパスワードマネージャ「CLIPPERZ」

$
0
0

パスワードマネージャについて調べてたところ、OSSのWebベースパスワードマネージャの『CLIPPERZ』というものがあるようだったので、試しに入れてみることにした。
今までにグループでのパスワードマネージャは触れていたのだが、今回の『CLIPPERZ』は個人向けのデータを扱う。とりあえずインストール先にはCentOS 7を用いる。

1.前提パッケージの導入

LAMP環境が必要になるので、こちらを参考に導入しておく。

yum install -y httpd mariadb-server mariadb mariadb-devel php php-devel php-pdo php-mysql git python-pip php-bcmath
pip install gitpython

 

自動起動設定をする。

systemctl enable httpd mariadb
systemctl start httpd mariadb

 

「mysql_secure_installation」の実行。

mysql_secure_installation

 

最後に、firewalldでポート開放を行う。

firewall-cmd --permanent --add-service={http,https}
firewall-cmd --reload

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

前提となるパッケージの導入が完了したら、CLIPPERZのインストールを行う。
まず、以下のコマンドを実行してソースのダウンロード等を行う。

git clone git://github.com/clipperz/password-manager.git
cd password-manager
./scripts/build install --backends php --frontends beta

 

次に、httpdで公開するディレクトリにソースのコピーを行う。

cp -R target/php/* /var/www/html/
chown -R apache. /var/www/html/

 

DB・接続ユーザの作成を行う。

mysql -p -e 'create database clipperz;
             grant all privileges on clipperz.* to "clipperz"@"localhost" identified by "clipperz";
             flush privileges;'

 

最後に、DBの接続情報について設定ファイル(/var/www/html/configuration.php)に記述する。
(今回はデフォルトの設定値を使ったので変更は不要ではあるが)。

●/var/www/html/configuration.php

$configuration['db'] = 'clipperz'; // database name
$configuration['host'] = 'localhost'; // database host
$configuration['user'] = 'clipperz'; // database user
$configuration['pass'] = 'clipperz'; // database password
$configuration['port'] = '3306'; // database port

 

DB接続設定までできたら、ブラウザからアクセスしてテーブル作成などを行わせる。
「http://IPアドレスorホスト名/setup/index.php」にアクセスし、「POG me up!」をクリックする。

 

特にエラー等出てなければ、「Proceed」をクリック。

 

「Manage Plugins」タブを開き、「INSTALL」をクリック。

 

インストールが無事完了した。

 

上記画面まで行ったら、以下のコマンドで設定ファイル(/var/www/html/configuration.php)を編集する。

sed -i "/'db_encoding'/s/0/1/g" /var/www/html/configuration.php

 

最後に、「/var/www/html/beta」をRootDirectory直下にコピーしてそのまま利用できるようにする。

cp -Rp /var/www/html{/beta/*,}

 

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

 

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

インストールが完了したので、ブラウザからアクセスしてみよう。
「http://IPアドレスorホスト名」で接続できるようになっている。

 

とりあえず、これでインストールは完了。
あとは実際に使ってみるだけだ。

うーん…
ちょいと古臭い感じがするんだが…一応、2015ってなってるから、メンテナンスは続いてるのかな?
実運用ではSSLは必須なので、そこは環境に合わせてhttpdの設定を直していこう。

 

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

Linuxでssh接続ユーザが実行できるコマンドを制限する

$
0
0

Linuxをサーバとして複数人で利用する際、ssh接続するアカウント事に使用できるコマンドを制限したいことがある。
そのような場合には、以下のような手法が用意されている。

1.ログインシェルをrbashにする

前にここでも触れているのだが、rbashというbashのシンボリックリンクを作成して、それをログインシェルにすることで、特定のコマンドのみを実行可能なユーザを作成できる。
bashのシンボリックリンクなので、別にコマンドのバイナリを用意したりとかしなくてもいい。また、PATHを直接指定してのコマンド実行も行えないようになっているのもよい。

おそらく、一番手軽な設定方法ではないだろうか。

 

2.chrootでルートディレクトリを変更する

chrootでルートディレクトリを変更することで、コマンドのPATHなどを参照できなくさせて実現する方法。
この方法であれば、そもそもchrootで設定・定義したディレクトリより上は見ることもできない。

ただ、厄介なのが”そもそも見れない”せいで、chrootより上を参照するシンボリックリンクは機能しないという点。
このため、コマンドのバイナリなどを別にコピーして配置したり、ディレクトリをマウントさせてやったりする必要がある。その後のメンテナンスを考えるとちょっと面倒くさい。

3.authorized_keysで制限する

実行させたいコマンドが1個しかないならば、sshのauthorized_keysにコマンドを指定することでssh接続と同時にコマンドを実行させることが可能だ。
接続と同時にコマンドが実行され、コマンド実行後(コマンドの失敗・キャンセル含む)はリモートシェルには接続できずそのままssh接続も切れる。authorized_keysで公開鍵ごとにコマンドを指定できるので、別途特定のユーザを作成しなくても実現できるのもポイントだろうか。

ただ、ssh接続と同時にコマンドが実行されてしまう、基本的に1個しかコマンドが実行できない(ラッパースクリプトを用意して実行できるコマンドを選択させるとかすれば別だが)ので、使いどころが難しい気がする。

 

【番外】(sudo実行コマンドを)/etc/sudoersで制限する

一般的な内容だし、ここに書かんでもいいかな感はあるのだが、実行可能コマンドつながりで残しておく。
sudoの実行コマンドを制限する場合は、「/etc/sudoers」でカンマ区切りで指定してやればよい。

ユーザ名    ALL=(ALL)       コマンド1,コマンド2...

 

コマンドで覚えるLinux コマンドで覚えるLinux

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

$
0
0

今回は、CentOS 7にファイルの改ざん検知を行う『AIDE』を導入する。
改ざん検知というと、『Tripwire』あたりが一番よく使われている(かなり頑張ってやればInotifyも使えなくはないのだが…応用効くし)のだが、yumでインストールする場合はEPELリポジトリが必要になる。AIDEの方はデフォルトのリポジトリでそのままインストールできて、かつ設定も簡単に行えるようだ。

1.インストール

先ほど記述したように、インストールはデフォルトのリポジトリからそのままインストールできる。

yum install -y aide

 

これでOK。

 

2.設定

次に、AIDEの設定を行う。
設定ファイルは「/etc/aide.conf」というファイルになり、デフォルトのままでも一般的なファイル・ディレクトリについて設定されているので、そのままでも問題なく利用可能になっている。設定を追加する場合は、このファイルに以下のように監視対象とするファイルやディレクトリのPATHを追記してやればよい。

●/etc/aide.conf

/PATH CONTENT_EX # 監視対象とする
!/PATH # 監視対象から除外する

 

細かい設定方法については、こちらのマニュアルを参照。
「/var/log」のように頻繁に追記がされるディレクトリや、「/proc」とかのシステムで動的に変化するディレクトリについては除外してやるといいだろう(いちいちログの変更までは見てられないので)。
設定ファイルの編集が完了したら、以下のコマンドで現在のディレクトリやファイルの状態を保持するDBファイルを生成、参照先のPATHに移動させる。

aide -i
mv  /var/lib/aide/aide.db{.new,}.gz
[root@BS-PUB-CENT7-01 ~]# aide -i

AIDE, version 0.15.1

### AIDE database at /var/lib/aide/aide.db.new.gz initialized.

[root@BS-PUB-CENT7-01 ~]# mv /var/lib/aide/aide.db{.new,}.gz

 

これで、改ざん検知が行えるようになった。

3.改ざん検知をする

AIDEでは、都度コマンドを実行して改ざん検知を行う。
以下のコマンドで、DBの内容に変更を加えずにファイル内容の変更確認をする。

aide -C
[root@BS-PUB-CENT7-01 ~]# # 何も変更がない場合
[root@BS-PUB-CENT7-01 ~]# aide -C
/root/Book2.xlsx mtime in future

AIDE, version 0.15.1

### All files match AIDE database. Looks okay!

[root@BS-PUB-CENT7-01 ~]# # ちょっと変更した場合
[root@BS-PUB-CENT7-01 ~]# rm /root/Book2.xlsx
rm: 通常ファイル `/root/Book2.xlsx' を削除しますか? y
[root@BS-PUB-CENT7-01 ~]# touch /root/test{1..20}
[root@BS-PUB-CENT7-01 ~]# aide -C
AIDE 0.15.1 found differences between database and filesystem!!
Start timestamp: 2016-12-08 08:07:22

Summary:
  Total number of files:        89477
  Added files:                  20
  Removed files:                1
  Changed files:                0


---------------------------------------------------
Added files:
---------------------------------------------------

added: /root/test1
added: /root/test10
added: /root/test11
added: /root/test12
added: /root/test13
added: /root/test14
added: /root/test15
added: /root/test16
added: /root/test17
added: /root/test18
added: /root/test19
added: /root/test2
added: /root/test20
added: /root/test3
added: /root/test4
added: /root/test5
added: /root/test6
added: /root/test7
added: /root/test8
added: /root/test9

---------------------------------------------------
Removed files:
---------------------------------------------------

removed: /root/Book2.xlsx

 

改ざんを検知しつつ、DBの更新も行う場合は以下のコマンドになる。
AIDEでは、更新DBのPATHと参照DBのPATHは別々に記述する必要がある(参照先は「database」、更新・作成先は「database_out」で定義されている)。このため、更新後にファイルを移動する処理が必要になる。

aide -u;mv -f /var/lib/aide/aide.db{.new,}.gz
[root@BS-PUB-CENT7-01 ~]# aide -u ; mv -f /var/lib/aide/aide.db{.new,}.gz
AIDE 0.15.1 found differences between database and filesystem!!
Start timestamp: 2016-12-08 08:44:27

Summary:
  Total number of files:        89496
  Added files:                  20
  Removed files:                0
  Changed files:                0


---------------------------------------------------
Added files:
---------------------------------------------------

added: /root/test101
added: /root/test102
added: /root/test103
added: /root/test104
added: /root/test105
added: /root/test106
added: /root/test107
added: /root/test108
added: /root/test109
added: /root/test110
added: /root/test111
added: /root/test112
added: /root/test113
added: /root/test114
added: /root/test115
added: /root/test116
added: /root/test117
added: /root/test118
added: /root/test119
added: /root/test120
[root@BS-PUB-CENT7-01 ~]# aide -u ; mv -f /var/lib/aide/aide.db{.new,}.gz

AIDE, version 0.15.1

### All files match AIDE database. Looks okay!

### New AIDE database written to /var/lib/aide/aide.db.new.gz

 

チェック結果は「/var/log/aide/aide.log」というファイルに記述されるのだが、都度上書きされる。
cronなどで定期実行させてその都度の結果を残したい場合は、実行の都度どこかに退避させるか、メールなどで通知させるといいだろう。

aide -u | mailx -s 'AIDE Check' root;mv -f /var/lib/aide/aide.db{.new,}.gz

 

【参考】

 

改訂新版 情報セキュリティ内部監査の教科書 (NextPublishing) 改訂新版 情報セキュリティ内部監査の教科書 (NextPublishing)

CentOS 7にClam AntiVirusをデーモンでインストールする(EPELリポジトリ使用Ver)

$
0
0

前にClam AntiVirus(以下、ClamAV)をCentOS 7へインストールしたことがあったが、Repoforgeが利用できなくなったので、Epelからインストールしてデーモンとして動かすようにする。
まず、以下のコマンドでEpelとClamAVをインストールする。

yum install -y epel-release
yum install -y clamav-server clamav-data clamav-update clamav-filesystem clamav clamav-scanner clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd

 

次に、ClamAVの設定を書き換える。

cp /etc/clamd.d/scan.conf{,$(date +%Y%m%d)}
cp /etc/freshclam.conf{,$(date +%Y%m%d)}
sed -e 's/^Example/#Example/g' \
    -e '/^#LogFile /s/^#//g' \
    -e '/^#LogFileMaxSize /s/^#//g' \
    -e '/^#LogTime /s/^#//g' \
    -e '/^#LogRotate /s/^#//g' \
    -e '/^#LocalSocket /s/^#//g' \
    -e '/^#PidFile /s/^#//g' \
    -e '/^#FixStaleSocket /s/^#//g' \
    -e 's/^User clamscan/User root/g' \
    -i  /etc/clamd.d/scan.conf
sed -e 's/^Example/#Example/g' \
    -e '/^#UpdateLogFile /s/^#//g' \
    -e '/^#LogFileMaxSize /s/^#//g' \
    -e '/^#LogTime /s/^#//g' \
    -e '/^#LogRotate /s/^#//g' \
    -e '/^#DatabaseMirror /s/^#//g' \
    -e '/^#NotifyClamd /cNotifyClamd /etc/clamd.d/scan.conf' \
    -i /etc/freshclam.conf
ln -s /etc/clamd.d/scan.conf /etc/clamd.conf

設定ファイル編集後、デーモンを起動させる。

systemctl start clamd@scan
systemctl enable clamd@scan
[root@BS-PUB-CENT7-01 ~]# systemctl status clamd@scan
● clamd@scan.service - Generic clamav scanner daemon
   Loaded: loaded (/usr/lib/systemd/system/clamd@scan.service; enabled; vendor preset: disabled)
   Active: active (running) since 土 2016-12-10 13:53:37 JST; 10s ago
 Main PID: 22494 (clamd)
   CGroup: /system.slice/system-clamd.slice/clamd@scan.service
           mq22494 /usr/sbin/clamd -c /etc/clamd.d/scan.conf --foreground=yes

12月 10 13:53:37 BS-PUB-CENT7-01.blacknon.local clamd[22494]: clamd daemon 0.99.2 (OS: linux-gnu, ARCH: x86_64, CPU: x86_64)
12月 10 13:53:37 BS-PUB-CENT7-01.blacknon.local clamd[22494]: Running as user root (UID 0, GID 0)
12月 10 13:53:37 BS-PUB-CENT7-01.blacknon.local clamd[22494]: Log file size limited to 2097152 bytes.
12月 10 13:53:37 BS-PUB-CENT7-01.blacknon.local clamd[22494]: Reading databases from /var/lib/clamav
12月 10 13:53:37 BS-PUB-CENT7-01.blacknon.local clamd[22494]: Not loading PUA signatures.
12月 10 13:53:37 BS-PUB-CENT7-01.blacknon.local clamd[22494]: Bytecode: Security mode set to "TrustSigned".
12月 10 13:53:38 BS-PUB-CENT7-01.blacknon.local clamd[22494]: LibClamAV Warning: **************************************************
12月 10 13:53:38 BS-PUB-CENT7-01.blacknon.local clamd[22494]: LibClamAV Warning: ***  The virus database is older than 7 days!  ***
12月 10 13:53:38 BS-PUB-CENT7-01.blacknon.local clamd[22494]: LibClamAV Warning: ***   Please update it as soon as possible.    ***
12月 10 13:53:38 BS-PUB-CENT7-01.blacknon.local clamd[22494]: LibClamAV Warning: **************************************************

 

無事起動ができたら、Virusの定義ファイルを更新して新しくする。

freshclam
[root@BS-PUB-CENT7-01 ~]# freshclam
ClamAV update process started at Sat Dec 10 13:55:04 2016
main.cvd is up to date (version: 57, sigs: 4218790, f-level: 60, builder: amishhammer)
WARNING: getfile: daily-21724.cdiff not found on database.clamav.net (IP: 198.148.78.4)
WARNING: getpatch: Can't download daily-21724.cdiff from database.clamav.net
Trying host database.clamav.net (172.110.204.67)...
nonblock_recv: recv timing out (30 secs)
WARNING: getfile: Error while reading database from database.clamav.net (IP: 172.110.204.67): Operation now in progress
WARNING: getpatch: Can't download daily-21724.cdiff from database.clamav.net
nonblock_recv: recv timing out (30 secs)
WARNING: getfile: Error while reading database from database.clamav.net (IP: 172.110.204.67): Operation now in progress
WARNING: getpatch: Can't download daily-21724.cdiff from database.clamav.net
WARNING: Incremental update failed, trying to download daily.cvd
Downloading daily.cvd [100%]
daily.cvd updated (version: 22760, sigs: 1139889, f-level: 63, builder: neo)
Downloading bytecode-279.cdiff [100%]
Downloading bytecode-280.cdiff [100%]
Downloading bytecode-281.cdiff [100%]
Downloading bytecode-282.cdiff [100%]
Downloading bytecode-283.cdiff [100%]
Downloading bytecode-284.cdiff [100%]
Downloading bytecode-285.cdiff [100%]
bytecode.cld updated (version: 285, sigs: 57, f-level: 63, builder: bbaker)
[LibClamAV] ******************************************************
[LibClamAV] ***      Virus database timestamp in the future!   ***
[LibClamAV] ***  Please check the timezone and clock settings  ***
[LibClamAV] ******************************************************
Database updated (5358736 signatures) from database.clamav.net (IP: 130.59.113.36)

 

上記コマンドについては、定期的に実行してやるようにcronなどに記述してやるといいだろう。
最後に、ウィルスチェックを実際に行って動作テストをする。

cd /opt
wget https://www.eicar.org/download/eicar.com
clamdscan /opt # --removeオプションを付与してないので削除はされない
[root@BS-PUB-CENT7-01 tmp]# cd /opt/
[root@BS-PUB-CENT7-01 opt]# wget https://www.eicar.org/download/eicar.com
--2016-12-10 14:21:02--  https://www.eicar.org/download/eicar.com
www.eicar.org (www.eicar.org) をDNSに問いあわせています... 213.211.198.62
www.eicar.org (www.eicar.org)|213.211.198.62|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 68 [application/octet-stream]
`eicar.com' に保存中

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

2016-12-10 14:21:03 (2.49 MB/s) - `eicar.com' へ保存完了 [68/68]

[root@BS-PUB-CENT7-01 opt]# clamdscan /opt
/opt/eicar.com: Eicar-Test-Signature FOUND

----------- SCAN SUMMARY -----------
Infected files: 1
Time: 0.003 sec (0 m 0 s)
[root@BS-PUB-CENT7-01 opt]# ls -la /opt/
合計 8
drwxr-xr-x.  2 root root   22 12月 10 14:21 .
dr-xr-xr-x. 18 root root 4096 12月  6 04:43 ..
-rw-r--r--.  1 root root   68 12月 10 14:21 eicar.com

 

これで、無事ClamAVのインストールができた。
あとは、スクリプトなりを作ってcronなどで定期実行してやるといいだろう。

 

【参考】

 

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

CentOS 7でClamAVのリアルタイムスキャン(オンアクセススキャン)の設定をする

$
0
0

Linuxでよく利用されるOSSのウィルスチェックソフトであるClamAVでは、他のウィルスチェックソフトと同様にリアルタイムスキャン(オンアクセススキャン)を行うように設定できる。
設定方法は簡単で、ClamAVの設定ファイルである「/etc/clamd.d/scan.conf(/etc/clamd.conf)」にて、以下の内容を追記するだけだ。
(前提として、すでにClamAVのデーモンでのインストール・設定ができているものとする)

●/etc/clamd.d/scan.conf

ScanOnAccess yes
OnAccessIncludePath /オンアクセススキャンをするPATH1
OnAccessIncludePath /オンアクセススキャンをするPATH2
...

デフォルトではDDDが有効になっているはずなので、再帰的にスキャンを行ってくれるはずだ(ただ、「/」を指定するのはできない様子)。
上記設定追記後、ClamAVのサービスを再起動してやる(と同時に、SELinuxのポリシーも定義しておく)。

setsebool -P antivirus_can_scan_system 1
systemctl restart clamd@scan

 

あとは、ウィルス発見後は都度ログを出力してくれるようになる。
(削除はしてくれない様子)

Fri Dec 23 16:05:18 2016 -> ScanOnAccess: /opt/eicar.com: Eicar-Test-Signature FOUND
Fri Dec 23 16:05:18 2016 -> ScanOnAccess: /opt/test/eicar.com: Eicar-Test-Signature FOUND

 

SyslogサーバとしてGraylogなどを導入していれば、とりあえずログからSlackにアラートを発報させることもできるので、まぁ削除されなくても問題ないだろう。

 

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

『googler』でコンソール上からGoogle検索を行う

$
0
0

LinuxやMacのコンソール上からGoogle検索を行える『googler』というコマンドを見かけたので、少し入れてみることにする。
前にもコンソール上から利用できるWebブラウザについて記述したことがあったが、これはそのままGoogle検索を行ってくれるようだ。

今回は、とりあえずUbuntu Server 16.04 LTSにこのツールを導入して触ってみることにする。

1.インストール

ソースからインストールする場合は、以下のコマンドでインストール可能だ。

git clone https://github.com/jarun/googler/
cd googler
sudo make install

 

aptからインストールする場合は、以下のコマンドでインストールできる。

sudo add-apt-repository ppa:twodopeshaggy/jarun
sudo apt-get update
sudo apt-get install googler

2.使ってみる

インストールが終わったら、実際に検索をしてみよう。
単純な検索であれば、以下のコマンドで行える。

googler '検索キーワード'

 

検索画面のページを進む場合はn、戻る場合はpキーで移動できるようだ。
そのほか、コマンド実行時に以下のようなオプションが指定できるようだ。

  • -n N … 検索結果の件数をN個に変更する(デフォルトでは10個)
  • -N … ニュースセクションから検索を行う
  • -l LANG … 検索言語を指定する(jpで日本語、enで英語)
  • -t dN … 検索する期間を指定する(hNでN時間前、dNでN日前、mNでNか月前、yNでN年前といった指定が可能)
  • -x … もしかして検索を無効化する
  • -w SITE … サイト内検索を行う
  • –json … JSON形式で出力する

 

…あれ?これってもしかして被リンク調査に使えるんじゃ…?
JSONで返ってくるし、期間も限定できるし…あまり頻繁にやりすぎるとreCAPTCHA出されちゃうかもだけど。

 

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

コンソール上でWebサーバと対話式に通信を行える『htty』

$
0
0

コンソール上からWebサーバに対し、対話的に通信を行えるツール『htty』というものを見かけたので、ちょっと触ってみる。
Rubyで書かれているらしく、gemを用いてインストールが行えるようだ。

gem install htty

 

インストールができたら、以下のようにコマンドを実行することでWebサーバとの対話型インターフェイスが動く。

htty ドメイン名

 

上の画像のように、keyを渡してgetやputをしてやったり、転送される場合はfollowで移動したりする。Cookiesを使った処理についても行えるようだ。
細かい使い方については公式ページを見るといいだろう。

…これ、結構便利なのではないだろうか?スクレイピングスクリプトのデバッグとかでも使えるような気がする。

 

Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門 (Software Design plus) Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門 (Software Design plus)

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

$
0
0

2016年12月25日、一応世間ではクリスマスなのだが、新宿でシェル芸勉強会があったので行ってきた。
で、その復習。

今回はエクシェル芸…というより、Excelに限らずMSオフィスのファイルをbash上でいろいろといじるという内容。
問題及び模範解答はこちら。最初に、問題に利用するファイルをgitで落としておくといいだろう。

git clone https://github.com/ryuichiueda/ShellGeiData.git

 

Q1.

.xlsxや.docx、.pptxはzipファイルになっており、xlsなどのようにバイナリ形式のデータにはなっていない。
このため、unzipで展開してから再度zip化してやることで、また開けることを確認しようという問題。問題というか、ファイルの構造を理解するのが主となっている。

とりあえず、xlsxファイルについて展開してみよう。
大体、こんな感じの構造になっている。ファイル名から、どのファイルがSheetに当たるのかは推測が立つだろう。 Excelの各シートはxmlで定義されているという事がわかる。

blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ unzip -od hanshin hanshin.xlsx
Archive:  hanshin.xlsx
  inflating: hanshin/[Content_Types].xml
  inflating: hanshin/_rels/.rels
  inflating: hanshin/xl/_rels/workbook.xml.rels
  inflating: hanshin/xl/workbook.xml
  inflating: hanshin/xl/sharedStrings.xml
  inflating: hanshin/xl/theme/theme1.xml
  inflating: hanshin/xl/styles.xml
  inflating: hanshin/xl/worksheets/sheet1.xml
 extracting: hanshin/docProps/thumbnail.jpeg
  inflating: hanshin/docProps/core.xml
  inflating: hanshin/docProps/app.xml
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ tree hanshin
hanshin
├── [Content_Types].xml
├── _rels
├── docProps
│   ├── app.xml
│   ├── core.xml
│   └── thumbnail.jpeg
└── xl
    ├── _rels
    │   └── workbook.xml.rels
    ├── sharedStrings.xml
    ├── styles.xml
    ├── theme
    │   └── theme1.xml
    ├── workbook.xml
    └── worksheets
        └── sheet1.xml

6 directories, 10 files

 

同様に、docx・pptxファイルについても展開してみる。

20141019OSC_LT.pptx  certificate.docx     graph.xlsx           hanshin/             hanshin.xlsx         template.pptx
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ unzip -od certificate{,.docx}
Archive:  certificate.docx
  inflating: certificate/[Content_Types].xml
  inflating: certificate/_rels/.rels
  inflating: certificate/word/_rels/document.xml.rels
  inflating: certificate/word/document.xml
  inflating: certificate/word/footnotes.xml
  inflating: certificate/word/endnotes.xml
  inflating: certificate/word/header1.xml
  inflating: certificate/word/_rels/header1.xml.rels
  inflating: certificate/word/theme/theme1.xml
 extracting: certificate/docProps/thumbnail.jpeg
 extracting: certificate/word/media/image1.png
  inflating: certificate/word/_rels/settings.xml.rels
  inflating: certificate/word/settings.xml
  inflating: certificate/word/stylesWithEffects.xml
  inflating: certificate/word/webSettings.xml
  inflating: certificate/word/styles.xml
  inflating: certificate/docProps/app.xml
  inflating: certificate/docProps/core.xml
  inflating: certificate/word/fontTable.xml
  inflating: certificate/docProps/custom.xml
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ tree certificate
certificate
├── [Content_Types].xml
├── _rels
├── docProps
│   ├── app.xml
│   ├── core.xml
│   ├── custom.xml
│   └── thumbnail.jpeg
└── word
    ├── _rels
    │   ├── document.xml.rels
    │   ├── header1.xml.rels
    │   └── settings.xml.rels
    ├── document.xml
    ├── endnotes.xml
    ├── fontTable.xml
    ├── footnotes.xml
    ├── header1.xml
    ├── media
    │   └── image1.png
    ├── settings.xml
    ├── styles.xml
    ├── stylesWithEffects.xml
    ├── theme
    │   └── theme1.xml
    └── webSettings.xml

6 directories, 19 files
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ unzip -od 20141019OSC_LT{,.pptx}
Archive:  20141019OSC_LT.pptx
  inflating: 20141019OSC_LT/[Content_Types].xml
  inflating: 20141019OSC_LT/_rels/.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide10.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide11.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide12.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide14.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide9.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide15.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide16.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide13.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide8.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide7.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide1.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide2.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide3.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide4.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide5.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide6.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide17.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide18.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide19.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide29.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide30.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide31.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide32.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide33.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide34.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide28.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide27.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide26.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide20.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide21.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide22.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide23.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide24.xml.rels
  inflating: 20141019OSC_LT/ppt/slides/_rels/slide25.xml.rels
  inflating: 20141019OSC_LT/ppt/_rels/presentation.xml.rels
  inflating: 20141019OSC_LT/ppt/presentation.xml
  inflating: 20141019OSC_LT/ppt/slides/slide25.xml
  inflating: 20141019OSC_LT/ppt/slides/slide21.xml
  inflating: 20141019OSC_LT/ppt/slides/slide20.xml
  inflating: 20141019OSC_LT/ppt/slides/slide19.xml
  inflating: 20141019OSC_LT/ppt/slides/slide18.xml
  inflating: 20141019OSC_LT/ppt/slides/slide17.xml
  inflating: 20141019OSC_LT/ppt/slides/slide16.xml
  inflating: 20141019OSC_LT/ppt/slides/slide15.xml
  inflating: 20141019OSC_LT/ppt/slides/slide14.xml
  inflating: 20141019OSC_LT/ppt/slides/slide13.xml
  inflating: 20141019OSC_LT/ppt/slides/slide22.xml
  inflating: 20141019OSC_LT/ppt/slides/slide23.xml
  inflating: 20141019OSC_LT/ppt/slides/slide34.xml
  inflating: 20141019OSC_LT/ppt/slides/slide26.xml
  inflating: 20141019OSC_LT/ppt/slides/slide27.xml
  inflating: 20141019OSC_LT/ppt/slides/slide28.xml
  inflating: 20141019OSC_LT/ppt/slides/slide29.xml
  inflating: 20141019OSC_LT/ppt/slides/slide30.xml
  inflating: 20141019OSC_LT/ppt/slides/slide31.xml
  inflating: 20141019OSC_LT/ppt/slides/slide32.xml
  inflating: 20141019OSC_LT/ppt/slides/slide33.xml
  inflating: 20141019OSC_LT/ppt/slides/slide12.xml
  inflating: 20141019OSC_LT/ppt/slides/slide11.xml
  inflating: 20141019OSC_LT/ppt/slides/slide10.xml
  inflating: 20141019OSC_LT/ppt/slides/slide1.xml
  inflating: 20141019OSC_LT/ppt/slides/slide2.xml
  inflating: 20141019OSC_LT/ppt/slides/slide3.xml
  inflating: 20141019OSC_LT/ppt/slides/slide4.xml
  inflating: 20141019OSC_LT/ppt/slides/slide24.xml
  inflating: 20141019OSC_LT/ppt/slides/slide6.xml
  inflating: 20141019OSC_LT/ppt/slides/slide9.xml
  inflating: 20141019OSC_LT/ppt/slides/slide5.xml
  inflating: 20141019OSC_LT/ppt/slides/slide7.xml
  inflating: 20141019OSC_LT/ppt/slides/slide8.xml
  inflating: 20141019OSC_LT/ppt/slideLayouts/_rels/slideLayout2.xml.rels
  inflating: 20141019OSC_LT/ppt/slideLayouts/_rels/slideLayout9.xml.rels
  inflating: 20141019OSC_LT/ppt/slideLayouts/_rels/slideLayout10.xml.rels
  inflating: 20141019OSC_LT/ppt/slideLayouts/_rels/slideLayout11.xml.rels
  inflating: 20141019OSC_LT/ppt/notesSlides/_rels/notesSlide1.xml.rels
  inflating: 20141019OSC_LT/ppt/slideLayouts/_rels/slideLayout8.xml.rels
  inflating: 20141019OSC_LT/ppt/slideLayouts/_rels/slideLayout7.xml.rels
  inflating: 20141019OSC_LT/ppt/slideLayouts/_rels/slideLayout6.xml.rels
  inflating: 20141019OSC_LT/ppt/slideLayouts/_rels/slideLayout5.xml.rels
  inflating: 20141019OSC_LT/ppt/slideLayouts/_rels/slideLayout4.xml.rels
  inflating: 20141019OSC_LT/ppt/slideLayouts/_rels/slideLayout3.xml.rels
  inflating: 20141019OSC_LT/ppt/slideLayouts/_rels/slideLayout1.xml.rels
  inflating: 20141019OSC_LT/ppt/slideMasters/slideMaster1.xml
  inflating: 20141019OSC_LT/ppt/slideLayouts/slideLayout1.xml
  inflating: 20141019OSC_LT/ppt/slideLayouts/slideLayout8.xml
  inflating: 20141019OSC_LT/ppt/slideLayouts/slideLayout9.xml
  inflating: 20141019OSC_LT/ppt/slideLayouts/slideLayout10.xml
  inflating: 20141019OSC_LT/ppt/slideMasters/_rels/slideMaster1.xml.rels
  inflating: 20141019OSC_LT/ppt/slideLayouts/slideLayout7.xml
  inflating: 20141019OSC_LT/ppt/slideLayouts/slideLayout6.xml
  inflating: 20141019OSC_LT/ppt/slideLayouts/slideLayout5.xml
  inflating: 20141019OSC_LT/ppt/slideLayouts/slideLayout4.xml
  inflating: 20141019OSC_LT/ppt/slideLayouts/slideLayout3.xml
  inflating: 20141019OSC_LT/ppt/slideLayouts/slideLayout2.xml
  inflating: 20141019OSC_LT/ppt/notesSlides/notesSlide1.xml
  inflating: 20141019OSC_LT/ppt/slideLayouts/slideLayout11.xml
 extracting: 20141019OSC_LT/ppt/media/image2.gif
  inflating: 20141019OSC_LT/ppt/handoutMasters/_rels/handoutMaster1.xml.rels
 extracting: 20141019OSC_LT/ppt/media/image3.png
 extracting: 20141019OSC_LT/ppt/media/image10.jpg
 extracting: 20141019OSC_LT/docProps/thumbnail.jpeg
  inflating: 20141019OSC_LT/ppt/handoutMasters/handoutMaster1.xml
  inflating: 20141019OSC_LT/ppt/notesMasters/notesMaster1.xml
  inflating: 20141019OSC_LT/ppt/theme/theme1.xml
  inflating: 20141019OSC_LT/ppt/notesMasters/_rels/notesMaster1.xml.rels
 extracting: 20141019OSC_LT/ppt/media/image9.jpg
 extracting: 20141019OSC_LT/ppt/media/image7.png
 extracting: 20141019OSC_LT/ppt/media/image1.png
 extracting: 20141019OSC_LT/ppt/media/image4.png
 extracting: 20141019OSC_LT/ppt/media/image8.jpg
  inflating: 20141019OSC_LT/ppt/theme/theme3.xml
  inflating: 20141019OSC_LT/ppt/theme/theme2.xml
 extracting: 20141019OSC_LT/ppt/media/image5.png
 extracting: 20141019OSC_LT/ppt/media/image6.gif
  inflating: 20141019OSC_LT/ppt/viewProps.xml
  inflating: 20141019OSC_LT/ppt/tableStyles.xml
  inflating: 20141019OSC_LT/ppt/presProps.xml
  inflating: 20141019OSC_LT/docProps/app.xml
  inflating: 20141019OSC_LT/docProps/core.xml
  inflating: 20141019OSC_LT/ppt/printerSettings/printerSettings1.bin
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ tree 20141019OSC_LT
20141019OSC_LT
├── [Content_Types].xml
├── _rels
├── docProps
│   ├── app.xml
│   ├── core.xml
│   └── thumbnail.jpeg
└── ppt
    ├── _rels
    │   └── presentation.xml.rels
    ├── handoutMasters
    │   ├── _rels
    │   │   └── handoutMaster1.xml.rels
    │   └── handoutMaster1.xml
    ├── media
    │   ├── image1.png
    │   ├── image10.jpg
    │   ├── image2.gif
    │   ├── image3.png
    │   ├── image4.png
    │   ├── image5.png
    │   ├── image6.gif
    │   ├── image7.png
    │   ├── image8.jpg
    │   └── image9.jpg
    ├── notesMasters
    │   ├── _rels
    │   │   └── notesMaster1.xml.rels
    │   └── notesMaster1.xml
    ├── notesSlides
    │   ├── _rels
    │   │   └── notesSlide1.xml.rels
    │   └── notesSlide1.xml
    ├── presProps.xml
    ├── presentation.xml
    ├── printerSettings
    │   └── printerSettings1.bin
    ├── slideLayouts
    │   ├── _rels
    │   │   ├── slideLayout1.xml.rels
    │   │   ├── slideLayout10.xml.rels
    │   │   ├── slideLayout11.xml.rels
    │   │   ├── slideLayout2.xml.rels
    │   │   ├── slideLayout3.xml.rels
    │   │   ├── slideLayout4.xml.rels
    │   │   ├── slideLayout5.xml.rels
    │   │   ├── slideLayout6.xml.rels
    │   │   ├── slideLayout7.xml.rels
    │   │   ├── slideLayout8.xml.rels
    │   │   └── slideLayout9.xml.rels
    │   ├── slideLayout1.xml
    │   ├── slideLayout10.xml
    │   ├── slideLayout11.xml
    │   ├── slideLayout2.xml
    │   ├── slideLayout3.xml
    │   ├── slideLayout4.xml
    │   ├── slideLayout5.xml
    │   ├── slideLayout6.xml
    │   ├── slideLayout7.xml
    │   ├── slideLayout8.xml
    │   └── slideLayout9.xml
    ├── slideMasters
    │   ├── _rels
    │   │   └── slideMaster1.xml.rels
    │   └── slideMaster1.xml
    ├── slides
    │   ├── _rels
    │   │   ├── slide1.xml.rels
    │   │   ├── slide10.xml.rels
    │   │   ├── slide11.xml.rels
    │   │   ├── slide12.xml.rels
    │   │   ├── slide13.xml.rels
    │   │   ├── slide14.xml.rels
    │   │   ├── slide15.xml.rels
    │   │   ├── slide16.xml.rels
    │   │   ├── slide17.xml.rels
    │   │   ├── slide18.xml.rels
    │   │   ├── slide19.xml.rels
    │   │   ├── slide2.xml.rels
    │   │   ├── slide20.xml.rels
    │   │   ├── slide21.xml.rels
    │   │   ├── slide22.xml.rels
    │   │   ├── slide23.xml.rels
    │   │   ├── slide24.xml.rels
    │   │   ├── slide25.xml.rels
    │   │   ├── slide26.xml.rels
    │   │   ├── slide27.xml.rels
    │   │   ├── slide28.xml.rels
    │   │   ├── slide29.xml.rels
    │   │   ├── slide3.xml.rels
    │   │   ├── slide30.xml.rels
    │   │   ├── slide31.xml.rels
    │   │   ├── slide32.xml.rels
    │   │   ├── slide33.xml.rels
    │   │   ├── slide34.xml.rels
    │   │   ├── slide4.xml.rels
    │   │   ├── slide5.xml.rels
    │   │   ├── slide6.xml.rels
    │   │   ├── slide7.xml.rels
    │   │   ├── slide8.xml.rels
    │   │   └── slide9.xml.rels
    │   ├── slide1.xml
    │   ├── slide10.xml
    │   ├── slide11.xml
    │   ├── slide12.xml
    │   ├── slide13.xml
    │   ├── slide14.xml
    │   ├── slide15.xml
    │   ├── slide16.xml
    │   ├── slide17.xml
    │   ├── slide18.xml
    │   ├── slide19.xml
    │   ├── slide2.xml
    │   ├── slide20.xml
    │   ├── slide21.xml
    │   ├── slide22.xml
    │   ├── slide23.xml
    │   ├── slide24.xml
    │   ├── slide25.xml
    │   ├── slide26.xml
    │   ├── slide27.xml
    │   ├── slide28.xml
    │   ├── slide29.xml
    │   ├── slide3.xml
    │   ├── slide30.xml
    │   ├── slide31.xml
    │   ├── slide32.xml
    │   ├── slide33.xml
    │   ├── slide34.xml
    │   ├── slide4.xml
    │   ├── slide5.xml
    │   ├── slide6.xml
    │   ├── slide7.xml
    │   ├── slide8.xml
    │   └── slide9.xml
    ├── tableStyles.xml
    ├── theme
    │   ├── theme1.xml
    │   ├── theme2.xml
    │   └── theme3.xml
    └── viewProps.xml

19 directories, 121 files

あとは、またzip化して開けることを確認してやれば良い。
この一連の処理をワンラインで記述する場合、以下のようになる。

ls -1 *x | awk -F. '{cmd="unzip -d "$1" "$0 ";(cd "$1";zip -r ../"$1"_2."$2" ./)";system(cmd)}'

Q2.

「20141019OSC_LT.pptx」ファイルで、何度「危険」というキーワードが出てくるかを計算する。
とりあえず、以下の内容で回答した。


unzip -p 20141019OSC_LT.pptx ppt/slides/slide*.xml | grep -o 危険 | wc -l

 

一応、補足説明を入れておくと、unzipでは以下のようにzipファイル内で展開するファイルを指定することができる(ワイルドカード指定可能。(複数指定できるので)ブレース展開での指定可能)。
で、PowerPointの各スライドの内容だけを取得することが目的なので、「ppt/slides/」配下にあるslideXX.xmlファイルのみを取得している。
また、「-p」オプションで展開した内容を標準出力で出力できるので、それをそのままgrepに渡してやり数を数えている。このとき、-cでカウントすると同じ行に複数目当ての単語がある場合1個としてカウントされてしまうので注意。

ちなみに、unzipでは「-l」でzipファイルの中身を確認できるので、先にそれで展開するファイルの推測を立てるといいだろう。

unzip -l zipファイル

blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ unzip -l certificate.docx
Archive:  certificate.docx
  Length      Date    Time    Name
---------  ---------- -----   ----
     2041  1980-01-01 00:00   [Content_Types].xml
      882  1980-01-01 00:00   _rels/.rels
     1345  1980-01-01 00:00   word/_rels/document.xml.rels
    43370  1980-01-01 00:00   word/document.xml
     1635  1980-01-01 00:00   word/footnotes.xml
     1629  1980-01-01 00:00   word/endnotes.xml
     4729  1980-01-01 00:00   word/header1.xml
      289  1980-01-01 00:00   word/_rels/header1.xml.rels
     7643  1980-01-01 00:00   word/theme/theme1.xml
    45844  1980-01-01 00:00   docProps/thumbnail.jpeg
   149691  1980-01-01 00:00   word/media/image1.png
      460  1980-01-01 00:00   word/_rels/settings.xml.rels
     3811  1980-01-01 00:00   word/settings.xml
     9472  1980-01-01 00:00   word/stylesWithEffects.xml
      431  1980-01-01 00:00   word/webSettings.xml
     8606  1980-01-01 00:00   word/styles.xml
     1043  1980-01-01 00:00   docProps/app.xml
      754  1980-01-01 00:00   docProps/core.xml
     1742  1980-01-01 00:00   word/fontTable.xml
      353  1980-01-01 00:00   docProps/custom.xml
---------                     -------
   285770                     20 files

 

Q3.

「20141019OSC_LT.pptx」ファイルにある画像ファイルのみを抽出し別ディレクトリに移動、zip化してやろうという問題。
以下の内容で回答している。

unzip -d ./pic 20141019OSC_LT.pptx *{png,gif,jpeg,jpg};zip -r pic.zip ./pic
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ unzip -od ./pic 20141019OSC_LT.pptx *{png,gif,jpeg,jpg};zip -r pic.zip ./pic
Archive:  20141019OSC_LT.pptx
 extracting: ./pic/ppt/media/image2.gif
 extracting: ./pic/ppt/media/image3.png
 extracting: ./pic/ppt/media/image10.jpg
 extracting: ./pic/docProps/thumbnail.jpeg
 extracting: ./pic/ppt/media/image9.jpg
 extracting: ./pic/ppt/media/image7.png
 extracting: ./pic/ppt/media/image1.png
 extracting: ./pic/ppt/media/image4.png
 extracting: ./pic/ppt/media/image8.jpg
 extracting: ./pic/ppt/media/image5.png
 extracting: ./pic/ppt/media/image6.gif
updating: pic/ (stored 0%)
updating: pic/docProps/ (stored 0%)
updating: pic/docProps/thumbnail.jpeg (deflated 22%)
updating: pic/ppt/ (stored 0%)
updating: pic/ppt/media/ (stored 0%)
updating: pic/ppt/media/image6.gif (deflated 0%)
updating: pic/ppt/media/image8.jpg (deflated 7%)
updating: pic/ppt/media/image3.png (deflated 1%)
updating: pic/ppt/media/image7.png (deflated 10%)
updating: pic/ppt/media/image2.gif (deflated 1%)
updating: pic/ppt/media/image9.jpg (deflated 12%)
updating: pic/ppt/media/image5.png (deflated 13%)
updating: pic/ppt/media/image4.png (deflated 4%)
updating: pic/ppt/media/image10.jpg (deflated 6%)
updating: pic/ppt/media/image1.png (deflated 4%)
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ unzip -l pic.zip
Archive:  pic.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2016-12-26 12:05   pic/
        0  2016-12-26 12:07   pic/docProps/
    11732  1980-01-01 00:00   pic/docProps/thumbnail.jpeg
        0  2016-12-26 12:05   pic/ppt/
        0  2016-12-26 12:07   pic/ppt/media/
    67739  1980-01-01 00:00   pic/ppt/media/image6.gif
    95304  1980-01-01 00:00   pic/ppt/media/image8.jpg
    13744  1980-01-01 00:00   pic/ppt/media/image3.png
   159302  1980-01-01 00:00   pic/ppt/media/image7.png
    99260  1980-01-01 00:00   pic/ppt/media/image2.gif
   379635  1980-01-01 00:00   pic/ppt/media/image9.jpg
    70496  1980-01-01 00:00   pic/ppt/media/image5.png
   186174  1980-01-01 00:00   pic/ppt/media/image4.png
   111613  1980-01-01 00:00   pic/ppt/media/image10.jpg
   426687  1980-01-01 00:00   pic/ppt/media/image1.png
---------                     -------
  1621686                     15 files

 

ただ、基本的にメディアファイルはすべて「ppt/media/」配下にあるのでそこだけ指定してやってもよかったかも。
「docProps/thumbnail.jpeg」ってサムネイルだしいらないと思われる。

 

Q4.

「20141019OSC_LT.pptx」のスライド7ページ目のテキストをスクレイピングする、という問題。
これについては、時間内に解くことができなかった。

で、@ebanさんの回答がやっぱりすごかったので、それ+@grethlenQ4の回答を参考にしたのが以下。
(ほとんど丸パクリのような気もしなくも…?)

unzip -p 20141019OSC_LT.pptx *slide7.xml | grep -oP '(?<=<a:p>).*?(?=</a:p>)' | sed 's/<[^>]*>//g' | awk NF
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ # スライド7枚目の情報だけ出力する
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ unzip -p 20141019OSC_LT.pptx *slide7.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="タイトル 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>戦果(? )</a:t></a:r><a:endParaRPr kumimoji="1" lang="ja-JP" altLang="en-US" dirty="0"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="コンテンツ プレースホルダー 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="1599083"/><a:ext cx="8229600" cy="4708525"/></a:xfrm></p:spPr><p:txBody><a:bodyPr><a:normAutofit fontScale="92500" lnSpcReduction="10000"/></a:bodyPr><a:lstStyle/><a:p><a:r><a:rPr kumimoji="1" lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>初日だけで見知らぬ方の</a:t></a:r><a:r><a:rPr lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>マシン</a:t></a:r><a:r><a:rPr lang="en-US" altLang="ja-JP" dirty="0"/><a:t>3</a:t></a:r><a:r><a:rPr lang="ja-JP" altLang="en-US" dirty="0"/><a:t>台轟沈</a:t></a:r><a:endParaRPr kumimoji="1" lang="en-US" altLang="ja-JP" dirty="0" smtClean="0"/></a:p><a:p><a:endParaRPr lang="en-US" altLang="ja-JP" dirty="0"/></a:p><a:p><a:r><a:rPr kumimoji="1" lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>その他自爆者多数</a:t></a:r><a:endParaRPr kumimoji="1" lang="en-US" altLang="ja-JP" dirty="0" smtClean="0"/></a:p><a:p><a:endParaRPr kumimoji="1" lang="en-US" altLang="ja-JP" dirty="0" smtClean="0"/></a:p><a:p><a:r><a:rPr kumimoji="1" lang="en-US" altLang="ja-JP" dirty="0" err="1" smtClean="0"/><a:t>Docker</a:t></a:r><a:r><a:rPr kumimoji="1" lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>上で試したらホストマシン沈黙の報告</a:t></a:r><a:endParaRPr kumimoji="1" lang="en-US" altLang="ja-JP" dirty="0" smtClean="0"/></a:p><a:p><a:endParaRPr lang="en-US" altLang="ja-JP" dirty="0"/></a:p><a:p><a:r><a:rPr lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>自分の本がサイト経由で</a:t></a:r><a:r><a:rPr lang="en-US" altLang="ja-JP" dirty="0" smtClean="0"/><a:t>1</a:t></a:r><a:r><a:rPr lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>冊だけ売れた</a:t></a:r><a:endParaRPr lang="en-US" altLang="ja-JP" dirty="0" smtClean="0"/></a:p><a:p><a:endParaRPr kumimoji="1" lang="en-US" altLang="ja-JP" dirty="0"/></a:p><a:p><a:r><a:rPr lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>フォロワーが</a:t></a:r><a:r><a:rPr lang="en-US" altLang="ja-JP" dirty="0" smtClean="0"/><a:t>1</a:t></a:r><a:r><a:rPr lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>人減った</a:t></a:r><a:endParaRPr kumimoji="1" lang="ja-JP" altLang="en-US" dirty="0"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="日付プレースホルダー 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr kumimoji="1" lang="en-US" altLang="ja-JP" smtClean="0"/><a:t>2014/10/19</a:t></a:r><a:endParaRPr kumimoji="1" lang="ja-JP" altLang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="フッター プレースホルダー 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr kumimoji="1" lang="en-US" altLang="ja-JP" smtClean="0"/><a:t>OSC Tokyo/Fall 2014</a:t></a:r><a:endParaRPr kumimoji="1" lang="ja-JP" altLang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="スライド番号プレースホルダー 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{14601655-C245-0940-ADDB-4E06ABBCA83C}" type="slidenum"><a:rPr kumimoji="1" lang="ja-JP" altLang="en-US" smtClean="0"/><a:t>7</a:t></a:fld><a:endParaRPr kumimoji="1" lang="ja-JP" altLang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3384791587"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr><p:timing><p:tnLst><p:par><p:cTn id="1" dur="indefinite" restart="never" nodeType="tmRoot" xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main"/></p:par></p:tnLst></p:timing></p:sld>
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ # grepでPerlの肯定先読み正規表現を用いて、「<a:p>~</a:p>(1行)」ごとに抽出する
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ unzip -p 20141019OSC_LT.pptx *slide7.xml | grep -oP '(?<=<a:p>).*?(?=</a:p>)'
<a:r><a:rPr lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>戦果(?)</a:t></a:r><a:endParaRPr kumimoji="1" lang="ja-JP" altLang="en-US" dirty="0"/>
<a:r><a:rPr kumimoji="1" lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>初日だけで見知らぬ方の</a:t></a:r><a:r><a:rPr lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>マシン</a:t></a:r><a:r><a:rPr lang="en-US" altLang="ja-JP" dirty="0"/><a:t>3</a:t></a:r><a:r><a:rPr lang="ja-JP" altLang="en-US" dirty="0"/><a:t>台轟沈</a:t></a:r><a:endParaRPr kumimoji="1" lang="en-US" altLang="ja-JP" dirty="0" smtClean="0"/>
<a:endParaRPr lang="en-US" altLang="ja-JP" dirty="0"/>
<a:r><a:rPr kumimoji="1" lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>その他自爆者多数</a:t></a:r><a:endParaRPr kumimoji="1" lang="en-US" altLang="ja-JP" dirty="0" smtClean="0"/>
<a:endParaRPr kumimoji="1" lang="en-US" altLang="ja-JP" dirty="0" smtClean="0"/>
<a:r><a:rPr kumimoji="1" lang="en-US" altLang="ja-JP" dirty="0" err="1" smtClean="0"/><a:t>Docker</a:t></a:r><a:r><a:rPr kumimoji="1" lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>上で試したらホストマシン沈黙の報告</a:t></a:r><a:endParaRPr kumimoji="1" lang="en-US" altLang="ja-JP" dirty="0" smtClean="0"/>
<a:endParaRPr lang="en-US" altLang="ja-JP" dirty="0"/>
<a:r><a:rPr lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>自分の本がサイト経由で</a:t></a:r><a:r><a:rPr lang="en-US" altLang="ja-JP" dirty="0" smtClean="0"/><a:t>1</a:t></a:r><a:r><a:rPr lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>冊だけ売れた</a:t></a:r><a:endParaRPr lang="en-US" altLang="ja-JP" dirty="0" smtClean="0"/>
<a:endParaRPr kumimoji="1" lang="en-US" altLang="ja-JP" dirty="0"/>
<a:r><a:rPr lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>フォロワーが</a:t></a:r><a:r><a:rPr lang="en-US" altLang="ja-JP" dirty="0" smtClean="0"/><a:t>1</a:t></a:r><a:r><a:rPr lang="ja-JP" altLang="en-US" dirty="0" smtClean="0"/><a:t>人減った</a:t></a:r><a:endParaRPr kumimoji="1" lang="ja-JP" altLang="en-US" dirty="0"/>
<a:r><a:rPr kumimoji="1" lang="en-US" altLang="ja-JP" smtClean="0"/><a:t>2014/10/19</a:t></a:r><a:endParaRPr kumimoji="1" lang="ja-JP" altLang="en-US"/>
<a:r><a:rPr kumimoji="1" lang="en-US" altLang="ja-JP" smtClean="0"/><a:t>OSC Tokyo/Fall 2014</a:t></a:r><a:endParaRPr kumimoji="1" lang="ja-JP" altLang="en-US"/>
<a:fld id="{14601655-C245-0940-ADDB-4E06ABBCA83C}" type="slidenum"><a:rPr kumimoji="1" lang="ja-JP" altLang="en-US" smtClean="0"/><a:t>7</a:t></a:fld><a:endParaRPr kumimoji="1" lang="ja-JP" altLang="en-US"/>
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ # sedでタグ関係をすべて削除する
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ unzip -p 20141019OSC_LT.pptx *slide7.xml | grep -oP '(?<=<a:p>).*?(?=</a:p>)' | sed 's/<[^>]*>//g'
戦果(?)
初日だけで見知らぬ方のマシン3台轟沈

その他自爆者多数

Docker上で試したらホストマシン沈黙の報告

自分の本がサイト経由で1冊だけ売れた

フォロワーが1人減った
2014/10/19
OSC Tokyo/Fall 2014
7
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ # 空白行を削除する
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ unzip -p 20141019OSC_LT.pptx *slide7.xml | grep -oP '(?<=<a:p>).*?(?=</a:p>)' | sed 's/<[^>]*>//g' | awk NF
戦果(?)
初日だけで見知らぬ方のマシン3台轟沈
その他自爆者多数
Docker上で試したらホストマシン沈黙の報告
自分の本がサイト経由で1冊だけ売れた
フォロワーが1人減った
2014/10/19
OSC Tokyo/Fall 2014
7

 

Q5.

「graph.xlsx」の内容を、SSV(スペース区切り)の形式で取得するという内容。
とりあえず、最も楽なxlsx2csvで回答した。

 

xlsx2csv -d' ' graph.xlsx
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ xlsx2csv -d' ' graph.xlsx
0 -5
0.5 -7.375
1 -14
1.5 -24.125
2 -37
2.5 -51.875
3 -68
3.5 -84.625
4 -101
4.5 -116.375
5 -130
5.5 -141.125
6 -149
6.5 -152.875
7 -152
7.5 -145.625
8 -133
8.5 -113.375
9 -86
9.5 -50.125
10 -5
10.5 50.125
11 116

 

xlsx2csvを使わない場合は、@grethlenこちらの回答が参考になる。

 

Q6.

「hanshin.xlsx」について、Q5と同様にSSV形式にするという問題。
こちらも、地味にxlsx2csvを使えばいい感じにやってくれはする。

xlsx2csv -d' ' hanshin.xlsx
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ xlsx2csv -d' ' hanshin.xlsx
 42522 42561
1 真弓 真弓
2 弘田 北村
3 バース バース
4 掛布 掛布
5 岡田 佐野
6 佐野 木戸
7 平田 平田
8 木戸 永尾
9 ゲイル 池田

 

とはいえ、それだと芸が無いので日付をUNIXTIMEに変換して加工、「YYYY年MM月DD日」形式で表示させてみる。
(ちょっと長い)

xlsx2csv -d' ' hanshin.xlsx | awk 'NR==1{for(i=1;i<NF;i++){cmd="date -d @$(echo $((("$i" - 25569) * 86400))) +%Y年%m月%d日";cmd|getline t;s=s" "t;close(cmd);}print s}NR!=1{print}'
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ xlsx2csv -d' ' hanshin.xlsx | awk 'NR==1{for(i=1;i<NF;i++){cmd="date -d @$(echo $((("$i" - 25569) * 86400))) +%Y年%m月%d日";cmd|getline t;s=s" "t;close(cmd);}print s}NR!=1{print}'
 2016年06月01日 2016年07月10日
1 真弓 真弓
2 弘田 北村
3 バース バース
4 掛布 掛布
5 岡田 佐野
6 佐野 木戸
7 平田 平田
8 木戸 永尾
9 ゲイル 池田

 

で、xlsx2csvを使わないで回答する方法について。
Excelでは、Stringファイルについては「xl/sharedStrings.xml」に格納されているので、ここの内容をSheetのデータである「xl/worksheets/sheet1.xml」と組み合わせてやればよい。

Excelの「xl/worksheets/sheet1.xml」から「xl/sharedStrings.xml」の値の参照はデータの順番(というか、0から始まるので配列のようなイメージ。なんだそりゃ…)になっている。
xlsx2csvを使わない方法で解くとなると、模範解答のように2ファイルに分けて対応するのが一般的だと思う。

 

Q7&Q8

Q7とQ8はほぼほぼセットになっている。
Wordの特定の文字列を置換して、list.txtにある3名分の表彰状を作成するというもの。
(Wordの場合、確か差し込み印刷ってなかったっけ…?とも思ったが、印刷じゃないので気にしない)

とりあえず、以下の内容で回答した。

cat list.txt | xargs -n 1 -I@ sh -c 'unzip -d @ certificate.docx;sed -i s/WINNER/@/g @/word/document.xml;(cd @;zip -r ../@.docx ./)'

 

これで、「シェル芸おじさん.docx」などのファイルができているはずだ。
作業用のディレクトリ削除については行ってないので、ホントだったら消しといたほうがいいかも?

Perlの肯定正規表現については知らなかったので、あとで調べておきたい。

 

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

ssh経由でファイル・フォルダを自動同期させる『sshync』

$
0
0

ssh経由でファイルやフォルダを自動同期させる『sshync』というものがあるようなので、触ってみることにした。
Lsyncdと同じようなことができるようで、Starの数は多く評判はよさそう。Node.jsで書かれているようなので、npmを用いてインストールができるようだ。
中身としてはrsyncとfs.watch()を使っているとのことなので、ファイルの変更を検知したら同期処理が走るようだ。

1.インストール

先ほども記述したように、Node.jsで書かれているのでnpmでインストールができる。

npm install sshync -g
blacknon@BS-PUB-UBUNTU-01:~$ sudo npm install sshync -g
[sudo] blacknon のパスワード:
/usr/local/bin/sshync -> /usr/local/lib/node_modules/sshync/sshync.js
/usr/local/lib
mqw sshync@1.1.1
  tqw chalk@1.1.3
  x tqq ansi-styles@2.2.1
  x tqq escape-string-regexp@1.0.5
  x tqw has-ansi@2.0.0
  x x mqq ansi-regex@2.0.0
  x tqq strip-ansi@3.0.1
  x mqq supports-color@2.0.0
  mqq rsync@0.4.0

2.実際に使ってみる

インストールができたら、事前準備としてsshの鍵認証設定を行っておこう。
ssh-copy-idなどで鍵をコピーしてやるのが早いだろう。

鍵認証の設定後、以下のコマンドを実行することで同期処理を行える。

sshync ソースPATH ユーザ名@サーバ名:/リモートPATH

 

サービスとして動かすというより、ちょっとした作業の時にディレクトリの内容をリアルタイムで同期させたいといったときに便利な感じかな。

 

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

xml2/csv2でXML・CSVを平文フォーマットに変換する

$
0
0

先日行われた第26回シェル芸勉強会の復習中、よさげなツールがないか調べてたところXMLやCSVを平文フォーマットで「位置情報=値」といった形式に変換できるというxml2・csv2というツールを見かけた。インストールは以下のコマンドで行える。

yum install xml2 # RHEL系の場合
apt install xml2 # UbuntuなどDebian系の場合

 

インストール後、以下のように標準出力から受けとることでXMLやCSVを整形してくれる。

コマンド | xml2 # XMLの場合
コマンド | csv2 # CSVの場合

●XMLの場合

blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ unzip -p hanshin.xlsx xl/sharedStrings.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="18" uniqueCount="15"><si><t>真弓</t><rPh sb="0" eb="2"><t>マユミ</t></rPh><phoneticPr fontId="1" /></si><si><t>弘田</t><rPh sb="0" eb="2"><t>ヒロタ</t></rPh><phoneticPr fontId="1" /></si><si><t>バース</t><phoneticPr fontId="1" /></si><si><t>掛布</t><rPh sb="0" eb="2"><t>カケフ</t></rPh><phoneticPr fontId="1" /></si><si><t>岡田</t><rPh sb="0" eb="2"><t>オカd</t></rPh><phoneticPr fontId="1" /></si><si><t>佐野</t><rPh sb="0" eb="2"><t>サノ</t></rPh><phoneticPr fontId="1" /></si><si><t>平田</t><rPh sb="0" eb="2"><t>ヒラt</t></rPh><phoneticPr fontId="1" /></si><si><t>木戸</t><rPh sb="0" eb="2"><t>キド</t></rPh><phoneticPr fontId="1" /></si><si><t>ゲイル</t><phoneticPr fontId="1" /></si><si><t>北村</t><rPh sb="0" eb="2"><t>キタムr</t></rPh><phoneticPr fontId="1" /></si><si><t>掛布</t><rPh sb="0" eb="2"><t>カケf</t></rPh><phoneticPr fontId="1" /></si><si><t>佐野</t><rPh sb="0" eb="2"><t>サn</t></rPh><phoneticPr fontId="1" /></si><si><t>木戸</t><rPh sb="0" eb="2"><t>キd</t></rPh><phoneticPr fontId="1" /></si><si><t>永尾</t><rPh sb="0" eb="2"><t>ナガ</t></rPh><phoneticPr fontId="1" /></si><si><t>池 田</t><rPh sb="0" eb="2"><t>イケd</t></rPh><phoneticPr fontId="1" /></si></sst>blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ unzip -p hanshin.xlsx xl/sharedStrings.xml | xml2
/sst/@xmlns=http://schemas.openxmlformats.org/spreadsheetml/2006/main
/sst/@count=18
/sst/@uniqueCount=15
/sst/si/t=真弓
/sst/si/rPh/@sb=0
/sst/si/rPh/@eb=2
/sst/si/rPh/t=マユミ
/sst/si/phoneticPr/@fontId=1
/sst/si
/sst/si/t=弘田
/sst/si/rPh/@sb=0
/sst/si/rPh/@eb=2
/sst/si/rPh/t=ヒロタ
/sst/si/phoneticPr/@fontId=1
/sst/si
/sst/si/t=バース
/sst/si/phoneticPr/@fontId=1
/sst/si
/sst/si/t=掛布
/sst/si/rPh/@sb=0
/sst/si/rPh/@eb=2
/sst/si/rPh/t=カケフ
/sst/si/phoneticPr/@fontId=1
/sst/si
/sst/si/t=岡田
/sst/si/rPh/@sb=0
/sst/si/rPh/@eb=2
/sst/si/rPh/t=オカd
/sst/si/phoneticPr/@fontId=1
/sst/si
/sst/si/t=佐野
/sst/si/rPh/@sb=0
/sst/si/rPh/@eb=2
/sst/si/rPh/t=サノ
/sst/si/phoneticPr/@fontId=1
/sst/si
/sst/si/t=平田
/sst/si/rPh/@sb=0
/sst/si/rPh/@eb=2
/sst/si/rPh/t=ヒラt
/sst/si/phoneticPr/@fontId=1
/sst/si
/sst/si/t=木戸
/sst/si/rPh/@sb=0
/sst/si/rPh/@eb=2
/sst/si/rPh/t=キド
/sst/si/phoneticPr/@fontId=1
/sst/si
/sst/si/t=ゲイル
/sst/si/phoneticPr/@fontId=1
/sst/si
/sst/si/t=北村
/sst/si/rPh/@sb=0
/sst/si/rPh/@eb=2
/sst/si/rPh/t=キタムr
/sst/si/phoneticPr/@fontId=1
/sst/si
/sst/si/t=掛布
/sst/si/rPh/@sb=0
/sst/si/rPh/@eb=2
/sst/si/rPh/t=カケf
/sst/si/phoneticPr/@fontId=1
/sst/si
/sst/si/t=佐野
/sst/si/rPh/@sb=0
/sst/si/rPh/@eb=2
/sst/si/rPh/t=サn
/sst/si/phoneticPr/@fontId=1
/sst/si
/sst/si/t=木戸
/sst/si/rPh/@sb=0
/sst/si/rPh/@eb=2
/sst/si/rPh/t=キd
/sst/si/phoneticPr/@fontId=1
/sst/si
/sst/si/t=永尾
/sst/si/rPh/@sb=0
/sst/si/rPh/@eb=2
/sst/si/rPh/t=ナガ
/sst/si/phoneticPr/@fontId=1
/sst/si
/sst/si/t=池田
/sst/si/rPh/@sb=0
/sst/si/rPh/@eb=2
/sst/si/rPh/t=イケd
/sst/si/phoneticPr/@fontId=1

 

●CSVの場合

blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ xlsx2csv graph.xlsx
0,-5
0.5,-7.375
1,-14
1.5,-24.125
2,-37
2.5,-51.875
3,-68
3.5,-84.625
4,-101
4.5,-116.375
5,-130
5.5,-141.125
6,-149
6.5,-152.875
7,-152
7.5,-145.625
8,-133
8.5,-113.375
9,-86
9.5,-50.125
10,-5
10.5,50.125
11,116
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.26_work$ xlsx2csv graph.xlsx | csv2
/file/record
/file/record/@num=0
/file/record/field0=0
/file/record/field1=-5
/file/record
/file/record/@num=1
/file/record/field0=0.5
/file/record/field1=-7.375
/file/record
/file/record/@num=2
/file/record/field0=1
/file/record/field1=-14
/file/record
/file/record/@num=3
/file/record/field0=1.5
/file/record/field1=-24.125
/file/record
/file/record/@num=4
/file/record/field0=2
/file/record/field1=-37
/file/record
/file/record/@num=5
/file/record/field0=2.5
/file/record/field1=-51.875
/file/record
/file/record/@num=6
/file/record/field0=3
/file/record/field1=-68
/file/record
/file/record/@num=7
/file/record/field0=3.5
/file/record/field1=-84.625
/file/record
/file/record/@num=8
/file/record/field0=4
/file/record/field1=-101
/file/record
/file/record/@num=9
/file/record/field0=4.5
/file/record/field1=-116.375
/file/record
/file/record/@num=10
/file/record/field0=5
/file/record/field1=-130
/file/record
/file/record/@num=11
/file/record/field0=5.5
/file/record/field1=-141.125
/file/record
/file/record/@num=12
/file/record/field0=6
/file/record/field1=-149
/file/record
/file/record/@num=13
/file/record/field0=6.5
/file/record/field1=-152.875
/file/record
/file/record/@num=14
/file/record/field0=7
/file/record/field1=-152
/file/record
/file/record/@num=15
/file/record/field0=7.5
/file/record/field1=-145.625
/file/record
/file/record/@num=16
/file/record/field0=8
/file/record/field1=-133
/file/record
/file/record/@num=17
/file/record/field0=8.5
/file/record/field1=-113.375
/file/record
/file/record/@num=18
/file/record/field0=9
/file/record/field1=-86
/file/record
/file/record/@num=19
/file/record/field0=9.5
/file/record/field1=-50.125
/file/record
/file/record/@num=20
/file/record/field0=10
/file/record/field1=-5
/file/record
/file/record/@num=21
/file/record/field0=10.5
/file/record/field1=50.125
/file/record
/file/record/@num=22
/file/record/field0=11
/file/record/field1=116

 

なお、これらの逆についても変換できるようなので、一度変換した後に編集して再度元に戻したりといった使い方もできるようだ。

XML Hacks ―エキスパートのためのデータ処理テクニック XML Hacks ―エキスパートのためのデータ処理テクニック

Nmapをrootユーザ以外(sudoも無し)で実行できるようにする

$
0
0

Nmapを利用する際、root権限を渡したくないので一般ユーザでsudoもなしで実行できるようにしたいことがある。
そんなときは、まず以下のようにnmapのバイナリのグループと権限を変更する。

chgrp adm /usr/bin/nmap
chmod 750 /usr/bin/nmap

 

次に、setcapコマンドを実行するためにパッケージをインストールする。

sudo yum install libcap # RHEL系の場合
sudo apt-get install libcap2-bin # Debian/Ubuntu系の場合

パッケージインストール後、以下のコマンドを実行して一般ユーザが実行できるよう権限を付与する。

sudo setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip /usr/bin/nmap

 

最後に、nmapを実行させるユーザをサブグループに登録してやる。

usermod -aG adm ユーザID

 

以上。
ポートスキャナーなので、基本は一般ユーザに渡すのはどうかと思うのだが、root権限丸ごと渡すよりはマシなパターンの方が多いだろう。
状況に合わせて設定していきたい。

 

NMap Network Scanning: Official NMap Project Guide to Network Discovery and Security Scanning NMap Network Scanning: Official NMap Project Guide to Network Discovery and Security Scanning

YubikeyでLinuxサーバへの二要素認証sshログインを行う

$
0
0

Yubikeyというデバイスをご存じだろうか?
簡単に説明すると、鍵ファイルを中に保管しておくハードウェアトークンで、中央にある円をタップするとパスワード(基本はワンタイムパスワードだが、静的なパスワードも設定可能)が自動入力される。鍵ファイルは直接読み込めず、パスワードで保護されている。ハードウェアによる二要素認証に利用できる便利なツールだ。ワンタイムパスワードカードの自動入力版と考えると分かりやすいかもしれない。

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

 

詳細については、以下の記事が良くまとまっているのでそちらを参照するとよいだろう。

 

で、今回はLinuxへのsshログインにおいて、二要素認証の一つとしてこのYubikeyによる認証を設定する。
環境として、クライアントおよびYubikeyの設定はWindows 10、サーバ側はCentOS 7およびUbuntu Server 16.04 LTSを用いる。また、YubikeyはミドルエンドのYubikey4を用い、接続にはTeratermを用いる。二要素認証の方法としてはpamでのOATH OTP(Yubico OTPというものもあるのだが、オンライン状態じゃないとログインできなくなるので割愛)と通常のパスワード認証の2つを用いるものとする。

 

1.Yubikeyの設定

まずはYubikeyの設定を行う。
YubiKeyの諸々の設定を行うには、『Yubikey パーソナライゼーションツール』というものが必要になるので、これのWindows版をインストールしておく。
インストールについては.exeを実行するだけなので省略。

インストールが完了したら、スタートメニューから「YubiKey Personalization Tool」を起動する。
以下のように認証方式の一覧が表示されるので、「OATH HOTP Mode」を選択する。

 

作成Modeについては「Quick」を選択する。

 

この時点で、すでにシークレットキーなどはランダムに作成されているので、必要な個所だけ変更(OAHT Token Identifierのチェックを外してConfiguration SlotやHOTP Lengthの変更など)して「Write Configuration」をクリックし設定を書き込む。

 

 

CSVファイルでシークレットキーなどは出力されるので、それらは後程利用する。

 

2.sshサーバ側の設定

sshサーバ側では、まず以下のコマンドを実行しpamでOATHを利用できるようパッケージをインストールする。

sudo yum install -y epel-release;sudo yum install -y pam_oath oathtool policycoreutils-python # RHEL系の場合
sudo apt install -y libpam-oath oathtool # Debian/Ubuntu系の場合

 

パッケージインストール後、「/etc/pam.d/sshd」に以下の内容を追記し、sshログイン時に「pam_oath.so」を読み込むよう設定する。

auth required pam_oath.so usersfile=/etc/users.oath window=30 digits=8

 

CentOSなどの場合、SELinuxの権限回避のため「/etc/liboath」配下に設置するほうがいいだろう(SELinux無効化してるなら/etc直下でも問題なし)。

auth required pam_oath.so usersfile=/etc/liboath/users.oath window=30 digits=8
[root@BS-PUB-CENT7-01 ~]# cat /etc/pam.d/sshd
#%PAM-1.0
auth       required     pam_sepermit.so
auth       substack     password-auth
auth       required     pam_oath.so usersfile=/etc/liboath/users.oath window=30 digits=8
auth       include      postlogin
# Used with polkit to reauthorize users in remote sessions
-auth      optional     pam_reauthorize.so prepare
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth
session    include      postlogin
# Used with polkit to reauthorize users in remote sessions
-session   optional     pam_reauthorize.so prepare

次に、「/etc/users.oath」ファイルを新規で作成する。

●/etc/users.oath

#type   username        pin     start seed
HOTP <ユーザ名> <OATH Token Identifier(なければ「-」)> <シークレットキー>
[root@BS-PUB-CENT7-01 ~]# cat /etc/liboath/users.oath # CentOSなので/etc/liboath配下に設置
#type   username        pin     start seed
HOTP    root    -       a4fe20a4b209f6bc9ec9aa1a473d69f1bcabd039

 

ファイル作成後、パーミッションを600、所有者・グループともにrootにする。
CentOS の場合はさらにSELinux関係の権限についても設定を行う。

chmod 600 /etc/liboath/users.oath
semanage fcontext -a -t systemd_passwd_var_run_t '/etc/liboath(/.*)?' # SELinux対応
restorecon -rv /etc/liboath/ # SELinux対応

 

sshdの設定を変更し、以下の項目について変更する。

PasswordAuthentication no
ChallengeResponseAuthentication yes

 

設定変更完了後、sshdを再起動する。

systemctl restart sshd

 

3.ログインの実行

さて、設定が完了したら、実際にログインしてみよう。
クライアントにTeratermを使っている場合は接続時の方式としてチャレンジレスポンスを用いる。

 

最初にユーザのパスワードを求められる(/etc/pam.d/sshdでの記述の順番による)ので、入力する。

 

 

次にワンタイムパスワードを求められるので、Yubikeyをタッチしてワンタイムパスワードを入力してやる。

 

で、無事問題なければログイン完了。

 

ちなみに、sudo実行時にワンタイムパスワードを要求する場合は、「/etc/pam.d/sudo」の一番上に、以下の内容を記述してやることで設定できそうだ。

auth sufficient pam_oath.so usersfile=/etc/users.oath window=30 digits=8

 

YubiKey NEO YubiKey NEO

CentOS 7にホスト型IDS『OSSEC』をサーバ・エージェント方式で導入する

$
0
0

『OSSEC』はログ監視やファイルの改ざん検知、Rootkitの検出などが行える、WindowsやLinuxで利用できるホスト型IDSだ。
今回は、この『OSSEC』をCentOS 7にサーバ・エージェント方式で導入し、エージェントを導入したサーバへの侵入検知を行う。OSSECには公式のWebコンソールも一応用意されているのだが、あまりコミットされてないし2016年12月時点では脆弱性もそのままっぽいので今回は利用しない。

なお、OSSECのサーバ⇔クライアント間通信ではUDPの1514ポートを利用するので、間にファイアウォールなどがあるようであれば事前に開放しておくこと。

 

1.OSSEC サーバ・エージェントのインストール

1-1.OSSEC サーバのインストール

まず事前対応として、firewalldが動作しているようであれば、以下のコマンドを実行して1514ポートを開放する。

firewall-cmd --permanent --zone=public --add-port=1514/udp
firewall-cmd --reload

 

次に、サーバ側で以下のコマンドを実行しリポジトリを追加、OSSECのパッケージを導入する。

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

Atomic Free Unsupported Archive installer, version 3.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] [[Enter]]

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]: [[Enter]]


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

 

Serverとして動作させるためのパッケージを導入、サービスを起動する。

yum install -y ossec-hids ossec-hids-server
/etc/init.d/ossec-hids start

 

1-2.OSSEC エージェントのインストール

次に、監視対象となるノードにOSSEC エージェントをインストールする。
OSSEC サーバと同様に、リポジトリの追加を行う。

wget -q -O - http://www.atomicorp.com/installers/atomic | sh

 

エージェントパッケージを導入する。

yum install -y ossec-hids ossec-hids-client

 

エージェントの設定ファイルを変更し、OSSEC サーバに関する情報を記述してやる。

●/var/ossec/etc/ossec.conf

<!-- OSSEC example config -->

<ossec_config>
  <client>
    <server-ip>OSSEC サーバのIPアドレス</server-ip>
  </client>

  <syscheck>
    <!-- Frequency that syscheck is executed -- default every 2 hours -->
    <frequency>7200</frequency>

    <!-- Directories to check (perform all possible verifications) -->
    <directories check_all="yes">/etc,/usr/bin,/usr/sbin</directories>
    <directories check_all="yes">/bin,/sbin</directories>

    <!-- Files/directories to ignore -->
    <ignore>/etc/mtab</ignore>
    <ignore>/etc/mnttab</ignore>
    <ignore>/etc/hosts.deny</ignore>
    <ignore>/etc/mail/statistics</ignore>
    <ignore>/etc/random-seed</ignore>
    <ignore>/etc/adjtime</ignore>
    <ignore>/etc/httpd/logs</ignore>
    <ignore>/etc/utmpx</ignore>
    <ignore>/etc/wtmpx</ignore>
    <ignore>/etc/cups/certs</ignore>
  </syscheck>

  <rootcheck>
    <rootkit_files>/var/ossec/etc/shared/rootkit_files.txt</rootkit_files>
    <rootkit_trojans>/var/ossec/etc/shared/rootkit_trojans.txt</rootkit_trojans>
  </rootcheck>

  <localfile>
    <log_format>syslog</log_format>
    <location>/var/log/messages</location>
  </localfile>

  <localfile>
    <log_format>syslog</log_format>
    <location>/var/log/secure</location>
  </localfile>

  <localfile>
    <log_format>syslog</log_format>
    <location>/var/log/maillog</location>
  </localfile>

  <localfile>
    <log_format>apache</log_format>
    <location>/var/log/httpd/error_log</location>
  </localfile>

  <localfile>
    <log_format>apache</log_format>
    <location>/var/log/httpd/access_log</location>
  </localfile>

</ossec_config>

2.OSSECのサーバ・エージェント間の連携を行う

OSSECサーバ側でエージェントの登録とエージェント側に設定する鍵ファイルを発行する。
以下のコマンドを実行して対話式に設定を行っていく。

/var/ossec/bin/manage_agents
[root@BS-PUB-SEC ~]# /var/ossec/bin/manage_agents


****************************************
* OSSEC HIDS v2.8.3 Agent manager.     *
* The following options are available: *
****************************************
   (A)dd an agent (A).
   (E)xtract key for an agent (E).
   (L)ist already added agents (L).
   (R)emove an agent (R).
   (Q)uit.
Choose your action: A,E,L,R or Q: A #(エージェントの登録)

- Adding a new agent (use '\q' to return to the main menu).
  Please provide the following:
   * A name for the new agent: BS-PUB-CENT7-01
   * The IP Address of the new agent: 192.168.100.XXX
   * An ID for the new agent[001]: [[Enter]]
Agent information:
   ID:001
   Name:BS-PUB-CENT7-01
   IP Address:172.20.100.118

Confirm adding it?(y/n): y
Agent added.


****************************************
* OSSEC HIDS v2.8.3 Agent manager.     *
* The following options are available: *
****************************************
   (A)dd an agent (A).
   (E)xtract key for an agent (E).
   (L)ist already added agents (L).
   (R)emove an agent (R).
   (Q)uit.
Choose your action: A,E,L,R or Q: E #(鍵ファイルの発行)

Available agents:
   ID: 001, Name: BS-PUB-CENT7-01, IP: 192.168.100.XXX
Provide the ID of the agent to extract the key (or '\q' to quit): 001

Agent key information for '001' is:
MDAxIEJTLVBVQi1DRU5UNy0wMSAxNzIuMjAuMTAwLjExOCA2NGU4NTk1OGI4N2I1NjI2MmI1M2I3OTU5NGRiMTU5Njg2MmE0NWZjNmFlMDhjYjM5ZGZhMDk1YzFmZDBiNDRi

** Press ENTER to return to the main menu.



****************************************
* OSSEC HIDS v2.8.3 Agent manager.     *
* The following options are available: *
****************************************
   (A)dd an agent (A).
   (E)xtract key for an agent (E).
   (L)ist already added agents (L).
   (R)emove an agent (R).
   (Q)uit.
Choose your action: A,E,L,R or Q: Q

** You must restart OSSEC for your changes to take effect.

manage_agents: Exiting ..

 

OSSECサーバ側でエージェント登録・鍵の発行が完了したら、OSSEC エージェント側で鍵のインポート(といっても、鍵文字列を張り付けるだけだが…)およびエージェントサービスの起動を行う。
まず、以下のコマンドで鍵のインポートを行う。

/var/ossec/bin/manage_client
[root@BS-PUB-CENT7-01 ~]# /var/ossec/bin/manage_client


****************************************
* OSSEC HIDS v2.8.3 Agent manager.     *
* The following options are available: *
****************************************
   (I)mport key from the server (I).
   (Q)uit.
Choose your action: I or Q: I

* Provide the Key generated by the server.
* The best approach is to cut and paste it.
*** OBS: Do not include spaces or new lines.

Paste it here (or '\q' to quit): MDAxIEJTLVBVQi1DRU5UNy0wMSAxNzIuMjAuMTAwLjExOCA2NGU4NTk1OGI4N2I1NjI2MmI1M2I3OTU5NGRiMTU5Njg2MmE0NWZjNmFlMDhjYjM5ZGZhMDk1YzFmZDBiNDRi

Agent information:
   ID:001
   Name:BS-PUB-CENT7-01
   IP Address:192.168.100.XXX

Confirm adding it?(y/n): y
Added.
** Press ENTER to return to the main menu.



****************************************
* OSSEC HIDS v2.8.3 Agent manager.     *
* The following options are available: *
****************************************
   (I)mport key from the server (I).
   (Q)uit.
Choose your action: I or Q: Q

** You must restart OSSEC for your changes to take effect.

manage_agents: Exiting ..

 

最後にサーバ・エージェントともにサービス再起動を行う。

/etc/init.d/ossec-hids start

 

これで、サーバ・エージェントの設定は完了。
この時点でサーバ側がちゃんとエージェントを認識しているのか確認してみよう。
以下のコマンドで、ちゃんとサーバ側でエージェントを認識しているかどうか確認できる。StatusがActiveになっていれば問題ない。

/var/ossec/bin/agent_control -i エージェントID
[root@BS-PUB-SEC ~]# /var/ossec/bin/agent_control -i 001

OSSEC HIDS agent_control. Agent information:
   Agent ID:   001
   Agent Name: BS-PUB-CENT7-01
   IP address: 192.168.100.XXX
   Status:     Active

   Operating system:    Linux BS-PUB-CENT7-01.blacknon.local 3.10.0-327.28.2..
   Client version:      OSSEC HIDS v2.8.3 / 6322ee12ea9a05951f97923a8341a01a
   Last keep alive:     Thu Dec 29 00:37:41 2016

   Syscheck last started  at: Unknown
   Rootcheck last started at: Unknown

 

これで、ひとまずOSSECのサーバ・エージェントのインストールと設定は完了。
今の段階だとデフォルトの監視設定しかできていないので、次回以降にいろいろと設定をいじってみることにする。

 

【参考】

 

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

Linuxコンソール上で秘密鍵を分割しておいてsshコマンド実行時に複合化+ログインを行う

$
0
0

ふと、秘密鍵を分割して別々のとこに置いておき、それをsshコマンド実行時だけ結合させて利用できないかと思ったのでやってみた。
まず、事前に秘密鍵を以下のようなコマンドで暗号化、分割しておく(ここでは、秘密鍵ファイル「testkey」を「testkey.aa」~「testkey.ac」に分割している)。

cat testkey | openssl enc -aes-128-cbc -e -base64 -pass pass:パスワード | split -l 12 - testkey.
[root@BS-PUB-CENT7-01 ~]# cat testkey | openssl enc -aes-128-cbc -e -base64 -pass pass:P@ssw0rd | split -l 12 - testkey.
[root@BS-PUB-CENT7-01 ~]# ls -la testkey.a*
-rw-r--r--. 1 root root 780 12月 29 08:58 testkey.aa
-rw-r--r--. 1 root root 780 12月 29 08:58 testkey.ab
-rw-r--r--. 1 root root 740 12月 29 08:58 testkey.ac

で、接続時に以下のようにsshコマンドを実行してみる。

[root@BS-PUB-CENT7-01 ~]# ssh -i <(cat testkey.a* | openssl enc -d -aes-128-cbc -base64 -pass pass:P@ssw0rd) root@BS-PUB-CENT7-02
Warning: Identity file /dev/fd/63 not accessible: No such file or directory.
root@bs-pub-cent7-02's password:

 

…ありゃ。
sshコマンドでは、プロセス置換では鍵ファイルは渡せないみたいだ。
であれば、「/dev/stdin」を指定してやればいけるかな?

[root@BS-PUB-CENT7-01 ~]# cat testkey.a* | openssl enc -d -aes-128-cbc -base64 -pass pass:P@ssw0rd | ssh -i /dev/stdin root@BS-PUB-CENT7-02
Pseudo-terminal will not be allocated because stdin is not a terminal.
Enter passphrase for key '/dev/stdin':

 

これもだめかー…。
そもそも、ここを見てるとsshコマンドでは鍵ファイルを複数回開いてるみたいだ。
つまり、一回こっきりしか利用できない標準出力での取得やプロセス置換では、2回目以降の鍵取得でこけてしまうためうまくいかないということか。

ではどうするか。
かなりムリヤリだけど、mktempでパーミッション700の一時ファイルを作成して、作業終了後にそれを削除させるという方法ならうまくいった。
(これ、ワンライナーって言えんのかなぁ…)

sh -c 'TEMP=$(mktemp);cat testkey.a* | openssl enc -d -aes-128-cbc -base64 -pass pass:P@ssw0rd > $TEMP;trap "{ rm -rf $TEMP }" 1 2 3 15;bash -c "ssh -i $TEMP root@対象サーバ";rm -rf $TEMP'

 

うーん…
鍵ファイルを複数回読み込みさえなければプロセス置換でいけたのだけど、こればかりはしょうがないかな…

 

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

SQLでOSの状態を確認できる『osquery』

$
0
0

調べものしてたところ、OSの状態をSQLで取得できる『osquery』というFacebookの作ったツールを見かけた。
LinuxのほかMac、Windowsにも対応しているようだ。さすがにFacebookが作ってるだけあってか、ドキュメントも充実している様子。

今回は、CentOS 7でこのツールをインストールしてみる。

1.インストール

osqueryをCentOSにインストールする場合(他のプラットフォームも同様だが)、こちらの情報を参考に進めるといいだろう。
以下のコマンドでリポジトリを追加してyumからインストールを行う。

sudo rpm -ivh https://osquery-packages.s3.amazonaws.com/centos7/noarch/osquery-s3-centos7-repo-1-0.0.noarch.rpm
sudo yum -y install osquery

 

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

2.実際に使ってみる

さて、インストールが終わったら実際に使用してみよう。
osqueryのコンソールを開いてそこで操作する方法とコマンドからSQLを実行する方法、2パターンの手法があるようだ。

osqueryi # コンソールを開く
osqueryi 'SQL' # SQLを実行する
[root@BS-PUB-CENT7-02 ~]# osqueryi 'SELECT uid, name FROM listening_ports l, processes p WHERE l.pid=p.pid;'
+-----+----------------+
| uid | name           |
+-----+----------------+
| 0   | rserver        |
| 0   | sshd           |
| 0   | master         |
| 0   | sshd           |
| 0   | master         |
| 0   | NetworkManager |
| 0   | master         |
+-----+----------------+
[root@BS-PUB-CENT7-02 ~]# osqueryi 'SELECT address, mac, id.interface FROM interface_details AS id, interface_addresses AS ia WHERE id.interface = ia.interface;'
+-----------------+-------------------+-----------+
| address         | mac               | interface |
+-----------------+-------------------+-----------+
| 127.0.0.1       | 00:00:00:00:00:00 | lo        |
| 172.XXX.XXX.XXX | 32:64:35:36:37:38 | eth0      |
| 172.XXX.XXX.XXX | 66:36:65:39:61:37 | eth1      |
+-----------------+-------------------+-----------+

 

OSの設定とかを取得するのに便利そうだ。

 

プログラマのためのSQL 第4版 プログラマのためのSQL 第4版
Viewing all 498 articles
Browse latest View live