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

コンソール上で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 ―エキスパートのためのデータ処理テクニック

Ubuntu Server 16.04へペネトレーションテストのデータ管理システム『Kvasir』をインストールする

$
0
0

調べものをしてたところ、ペネトレーションテストのデータを管理するためのシステム『Kvasir』というものを見かけた。
確かに、ペネトレーションテストの実行データをファイルサーバなどで管理しているといろいろと面倒だし、ちゃんと連携できるかといわれると難しいかもしれない。こういったツールで管理するのもよさそうだ。NessusやNmapのデータも管理できるようなので、とりあえずUbuntu Server 16.04 LTSにインストールして触ってみることにする。

前提条件として、以下が挙げられている。

  • web2pyの最新版が動作していること
  • データベースとしてのPostgreSQL
  • nmapやNessusなどの脆弱性診断ツールの別途用意

 

どうやら、Kvasirはweb2pyで動作するように書かれているようだ。
ドキュメントは一通りそろっているようなので、インストールについてはこちらの情報を参考にすすめていく。

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

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

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

sudo apt install -y python-pip git-core python-lxml python-tornado python-beautifulsoup python-dev python-yaml postgresql python-psycopg2
pip install msgpack-python

 

1-2.Web2pyのインストール

次に、Web2pyのインストールを行う。
とりあえず/opt配下に設置する。

cd /opt
sudo git clone https://github.com/web2py/web2py.git web2py
cd web2py
sudo git submodule update --init --recursive
cd

 

1-3.PostgreSQLの設定

次にPostgreSQLの設定を行う。
まず、初期状態でKvasirで利用するためのDBユーザ・DB作成を行う。

sudo -u postgres createuser -SleEPRD kvasir
sudo -u postgres createdb kvasir -O kvasir
blacknon@BS-PUB-UBUNTU-01:/opt$ sudo -u postgres createuser -SleEPRD kvasir
[sudo] blacknon のパスワード:
Enter password for new role:
Enter it again:
CREATE ROLE kvasir ENCRYPTED PASSWORD 'md5e44811d331da4ed1bc3eaabf836eb313' NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;
blacknon@BS-PUB-UBUNTU-01:/opt$ sudo -u postgres createdb kvasir -O kvasir
blacknon@BS-PUB-UBUNTU-01:/opt$

次に以下のコマンドで「pg_hba.conf」の設定値を変更し、すべてのMETHODをmd5にする。

sudo sed -i '/^#/!s/peer/md5/g' /etc/postgresql/*/main/pg_hba.conf

 

さらに、ポートを6543に変更しサービスを再起動する。

sudo sed -e '/^port/s/5432/6543/g' \
         -i /etc/postgresql/*/main/postgresql.conf
sudo systemctl restart postgresql

 

1-4.SSL証明書の作成(オレオレ証明書)

次に、Web2py・PostgreSQLで利用するためのSSL証明書(オレオレ証明書)の作成をする。

sudo openssl genrsa -out server.key 2048
sudo openssl req -new -key server.key -out server.csr
sudo openssl x509 -req -days 1095 -in server.csr -signkey server.key -out server.crt
blacknon@BS-PUB-UBUNTU-01:/opt$ sudo openssl genrsa -out server.key 2048
Generating RSA private key, 2048 bit long modulus
.........................+++
.....+++
e is 65537 (0x10001)
blacknon@BS-PUB-UBUNTU-01:/opt$ sudo openssl req -new -key server.key -out server.csr
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) [AU]:JP
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 (e.g. server FQDN or YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
blacknon@BS-PUB-UBUNTU-01:/opt$ sudo openssl x509 -req -days 1095 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=JP/ST=Some-State/O=Internet Widgits Pty Ltd
Getting Private key

 

作成した証明書・鍵ファイルを所定の位置に移動する。

sudo mv server.key /etc/ssl/private/server.key
sudo mv server.crt /etc/ssl/certs/server.crt
sudo mv server.csr /etc/ssl/server.csr

 

最後に、所有グループを「ssl-cert」にしてやる。

sudo chgrp ssl-cert /etc/ssl/private/server.key
sudo chgrp ssl-cert /etc/ssl/certs/server.crt
sudo chgrp ssl-cert /etc/ssl/server.csr

1-5.Web2pyを起動する

今時点でWeb2pyを起動して、アクセスできることを確認する。
まず最初に、起動用のユーザとして「kvasir」ユーザを作成し、サブグループとして「ssl-cert」を追加してWeb2pyの各種ファイルへの権限を付与する。

sudo useradd kvasir
sudo usermod -aG ssl-cert kvasir
sudo chown -R kvasir. /opt/web2py

 

次に、実際にWeb2pyを起動してみる。

cd /opt/web2py
sudo -u kvasir python web2py.py -c /etc/ssl/certs/server.crt -k /etc/ssl/private/server.key -p 8443 -i 0.0.0.0 --minthreads=40 -a Password(最後に使用したパスワードを使うなら「<recycle>」)

 

ブラウザから「https://サーバのIPアドレス:8443」へアクセスし、Web2pyのページが表示されればOK。

 

2.Kvasirのインストール

2-1.Kvasirのソースのダウンロード・配置

前提となる設定が一通り終わったら、Kvasirのソースを取得する。

cd /opt
sudo git clone https://github.com/KvasirSecurity/Kvasir.git Kvasir
sudo chown -R kvasir. Kvasir/
sudo ln -s /opt/Kvasir /opt/web2py/applications/kvasir

 

2-2.Kvasirの設定ファイル配置・編集

次に、設定ファイルの配置を行う。
まず、以下のコマンドでサンプルファイルをコピーしてやる。

sudo -u kvasir cp /opt/Kvasir/kvasir.yaml{.sample,}

 

設定ファイルを配置したら、各種情報を編集する。
DBへの接続情報について、環境に合わせて編集する。

●/opt/Kvasir/kvasir.yaml

db:
  migrate: True           # if multiple web2py instances are used with 1 database, only 1 u    ser needs True
  fake_migrate: False     # only True if absolutely necessary
  lazy_tables: false      # set this to True after setup is complete for faster db access
  kvasir:
    # any web2py supported URI connection string is acceptable - additional libraries may b    e required
    # see http://web2py.com/books/default/chapter/29/06#Connection-strings
    uri: postgres://kvuser:kvpass@localhost:5432/kvasir
    pool_size: 10
  msf:
    # direct msf db support is not currently supported - future support planned
    uri: postgres://msfuser:msfpass@localhost:5432/msf
    pool_size: 10

 

Kvasirでは「database」ディレクトリが必要になるのだが、これは自動的に作成されない。
このため、以下のコマンドで手動作成する。また、ユーザテーブルについても同様なので手動作成をする。

sudo -u kvasir mkdir /opt/Kvasir/databases

 

ここまでできたら、Web2pyを起動させてブラウザから「https://サーバのIPアドレス:8443/kvasir」にアクセスしてみよう。
以下のようなログイン画面が表示されるはずだ。

 

なお、実際に運用に乗せる場合であれば、wikiにもあるようにパスワード等の情報を暗号化するための「security_key」の設定を変更する方がいいだろう。

 

3.Webコンソールへログインする

さて、Webログイン画面まで表示できたら、ユーザを追加してログインできるようにしよう。
ブラウザから「https://サーバのIPアドレス:8443/kvasir/appadmin/insert/db/auth_user」にアクセスすることで、ユーザの作成画面に移行できる。

 

とりあえず、以下についてだけ入力しておいてやればいいだろう。

  • First name:
  • Last name:
  • E-mail:
  • Username:
  • Password:
  • Host Detail Page:
  • Table Show Start:
  • First Tab on Host Detail:
  • Enable TableTools:
  • Default Background Tasks:

 

「Registration key」については、入力するといろいろ面倒そうなので今回は未入力。
無事ユーザの作成ができたら、Loginページからログインする。ログイン後、新しいユーザの作成画面が表示されるので、まだユーザを作成する場合はここで作ってしまうといいだろう。
特にユーザの作成が不要であれば、「profile」などから別画面に移動する。

 

Home画面がこちら。
今の段階では何もデータを登録していないのでグラフ等も真っ白だ。

 

ひとまず、これでインストールは完了した。
次回以降に脆弱性情報の登録等を行ってみる。

 

実践 Metasploit ―ペネトレーションテストによる脆弱性評価 実践 Metasploit ―ペネトレーションテストによる脆弱性評価

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によるペネトレーションテスト~

Ubuntu 16.04で秘密分散法を用いて文字列を分割させる『ssss』コマンドを触ってみる

$
0
0

シャミアの秘密分散法というのがあって、”ファイルを複数に分割して、一つのファイルが漏れても元のファイルを推測できないようにする”という考え方(+その数理)なのだが、それをコンソール上でコマンドとして利用できるようにした『ssss』コマンドというものを見かけたので、ちょっと触ってみることにする。
しばらくメンテナンスされてないようで、ver0.5のままのようだ。

Ubuntuでは、以下のコマンドでインストールができる。

sudo apt install ssss

 

1.文字列の分割

ファイルを分割する場合は、「ssss-split」コマンドを用いる。
以下のようにコマンドを実行することでファイルを分割することができる。

ssss-split -t 復元必要数 -n 分割ファイルの数
ssss-split -t 復元必要数 -n 分割ファイルの数 -w パスワード # パスワードを設定する場合

 

基本的には、以下のように標準出力をパイプで渡すなどして利用するようだ。

blacknon@BS-PUB-UBUNTU-01:~$ echo eiroh7cu2Xoosh5ofaeyo8Iemi9Ahz | ssss-split -t 3 -n 7
WARNING: couldn't get memory lock (ENOMEM, try to adjust RLIMIT_MEMLOCK!).
Generating shares using a (3,7) scheme with dynamic security level.
Enter the secret, at most 128 ASCII characters: Using a 240 bit security level.
1-8c696d90787ae185e68bacc6c477563cf8729dafa7f047d7598c21ed0c1c
2-30eb31faadbaaeea3cee19c635d08aefcd0906eecff9a1670969c922f63e
3-a3e6ab39387b6dfaf21209170ec2ad932ee5e48c1ba8d2792b55767336fa
4-6628b6b8c3b0131124c2e67a98485347f38a7a1258f9d1dd448295765052
5-f5252c7b5671d001ea3ef6aba35a743b106698708ca8a2c366be2a279084
6-49a7701183b19f6e305b43ab52fda8e8251d0331e4a14473365bc2e86a82
7-daaaead216705c7efea7537a69ef8f94c6f1e15330f0376d14677db9aa52

2.文字列を元に戻す

文字列をもとに戻す場合は、「ssss-combine」コマンドを用いる。

ssss-combine -t 復元必要数
blacknon@BS-PUB-UBUNTU-01:~$ ssss-combine -t 3
WARNING: couldn't get memory lock (ENOMEM, try to adjust RLIMIT_MEMLOCK!).
Enter 3 shares separated by newlines:
Share [1/3]: 2-30eb31faadbaaeea3cee19c635d08aefcd0906eecff9a1670969c922f63e
Share [2/3]: 4-6628b6b8c3b0131124c2e67a98485347f38a7a1258f9d1dd448295765052
Share [3/3]: 5-f5252c7b5671d001ea3ef6aba35a743b106698708ca8a2c366be2a279084
Resulting secret: eiroh7cu2Xoosh5ofaeyo8Iemi9Ahz

 

128文字までしか対応していないようだが、ちょっと面白い感じだ。
標準出力からシェアした文字列も渡せるので、こんな感じに処理も可能みたいだ。

blacknon@BS-PUB-UBUNTU-01:~$ cat test.txt
2-d80437171366d2a9b16280cd2b21c34763bd1e82133474
3-b7d7ed517266d6a9d4ac4b3c3e24cafa9126d79029cb39
4-65ea9b3c2717e9c6da5962a125d9862c7221a323fdbd1d
blacknon@BS-PUB-UBUNTU-01:~$ cat test.txt | ssss-combine -t 3 -q
WARNING: couldn't get memory lock (ENOMEM, try to adjust RLIMIT_MEMLOCK!).
Pen-Pineapple-Apple-Pen

 

ただ、ちょっと動きが不安定のような…?
メンテナンス止まってるのはちょっといただけない気がする。

 

【参考】

 

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

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版

OSSECでリアルタイムでのファイル改ざん検知を行う

$
0
0

ファイルの改ざん検知といえばTripwireやAIDEが有名だが、これらの場合リアルタイム(オンアクセス)での検知が行えない(厳密にはTripwireの場合Enterpriseプランなら可能)。
で、OSSECであればリアルタイムでの検知が行えるようなので、今回はその設定を行う。
OSSECについては、事前にこちらの内容でサーバ・エージェント方式でのインストールが完了している状態とする。

設定自体は簡単で、対象のOSSECサーバの設定ファイル(/var/ossec/etc/ossec.conf)で、「<syscheck><directories>」に以下のように「realtime=”yes”」を追記してやる。
対象ディレクトリを増やす場合は、「<directories>」にカンマ区切りで記述してやればよい。無視するファイルやディレクトリについては、「<ignore>」で指定してやる。

●/var/ossec/etc/ossec.conf

  <syscheck>
    <!-- Frequency that syscheck is executed -- default every 20 hours -->
    <frequency>72000</frequency>

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

    <!-- Files/directories to ignore -->
    <ignore>/etc/mtab</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>
  </syscheck>

変更完了後、OSSECの再起動を行う。

systemctl restart ossec-hids

 

OSSEC再起動後、ログ(/var/ossec/logs/ossec.log)に「ossec-syscheckd: INFO: Real time file monitoring started.」と表示されてからリアルタイムでのファイル監視が始まる。
プロセス起動時のスキャンが行われてからリアルタイムファイル監視が始まるので、ファイル数が多かったりすると相応に時間がかかるので注意。

ファイルの変更については、初期状態では「/var/ossec/logs/alerts/YYYY/Month/ossec-alerts-XX.log」に出力される。

[root@BS-PUB-SEC ~]# tail -F /var/ossec/logs/alerts/2017/Jan/ossec-alerts-05.log
New md5sum is : 'c772dbc4eac725769598bbaa8f9b9f28'
Old sha1sum was: '7335999eb54c15c67566186bdfc46f64e0d5a1aa'
New sha1sum is : '1f34db6d0eb6518134b71d465aaf6f8a8cdfc873'


** Alert 1483574667.361700: mail  - ossec,syscheck,
2017 Jan 05 09:04:27 BS-PUB-SEC->syscheck
Rule: 553 (level 7) -> 'File deleted. Unable to retrieve checksum.'
File '/etc/hosts' was deleted. Unable to retrieve checksum.

 

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

OSSECでSlackへのアラート通知を行わせる

$
0
0

OSSECでは、アラート発生と同時に任意のコマンドを実行させることが可能だ。
これを利用して、リアルタイムでのファイル改ざんを検知したらSlackに通知させるよう設定することもできる。この際、公式ですでにSlack用のスクリプトがすでに作成されているので、今回はこれを利用してやる。バージョンによっては配置されていないかもしれないので、その場合は事前にwgetなりで取得しておこう。
(+スクリプト内で直接WebHookのURLとかユーザを変数で指定してるので、その辺も設定しておく。「SITE」がWebHookのURL。)

wget https://raw.githubusercontent.com/ossec/ossec-hids/master/active-response/ossec-slack.sh -P /var/ossec/active-response/bin/ossec-slack.sh
chmod 750 /var/ossec/active-response/bin/ossec-slack.sh

OSSECの設定ファイル(/var/ossec/etc/ossec.conf)にて、「<command></command>」および「<active-response></active-response>」の設定を追記してやる。

<ossec_config>
....

  <command>
    <name>ossec-slack</name>
    <executable>ossec-slack.sh</executable>
    <expect></expect> <!-- no expect args required -->
    <timeout_allowed>no</timeout_allowed>
  </command>

....

  <active-response>
    <command>ossec-slack</command>
    <location>local</location>
    <level>3</level>
  </active-response>
....
</ossec_config>

 

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

/var/ossec/bin/ossec-control restart

 

ファイル改ざんのリアルタイム検知開始後、ファイルをいじった結果が以下。

 

プロセス再起動直後に結構ログが流れるので、その辺は注意したほうがいいかも?
個人的にはGraylogあたりにログを流して、そこでStreamの設定してSlackに通知させる方が好身なのだけど、単体のサーバでSlack通知をするのならこれでもいいだろう。
他の実装方法もあるようだけど、公式でスクリプトも用意されてたので、ひとまずはこれで。

 

あなたのセキュリティ対応間違っています あなたのセキュリティ対応間違っています

Ubuntu Server 16.04 LTSに脆弱性診断ツール『Nessus』をインストールして脆弱性スキャンを行う

$
0
0

今まであまり触ったことがなかったので、今回はNessusをUbuntu Server 16.04にインストールしてリモートサーバの脆弱性スキャンを行ってみる。
Nessusといえば脆弱性診断ツールとしてとても有名で無償版と有償版がある。業務で利用するなら有償版を使う必要があるのだが、今回は検証(それも個人)なので無償版をインストールして利用する。

1.Nessusのインストール

Nessusのインストールは簡単で、まずこちらのページからNessusのdebファイルを取得してくる。
ファイル取得後、以下のコマンドでdebファイルからインストールを行う。

sudo dpkg -i Nessus*.deb

 

blacknon@BS-PUB-UBUNTUSEC:~$ sudo dpkg -i Nessus*.deb
以前に未選択のパッケージ nessus を選択しています。
(データベースを読み込んでいます ... 現在 59697 個のファイルとディレクトリがインストールされています。)
Nessus-6.9.3-ubuntu1110_amd64.deb を展開する準備をしています ...
nessus (6.9.3) を展開しています...
nessus (6.9.3) を設定しています ...
Unpacking Nessus Core Components...
nessusd (Nessus) 6.9.3 [build M20076] for Linux
Copyright (C) 1998 - 2016 Tenable Network Security, Inc

Processing the Nessus plugins...
[##################################################]

All plugins loaded (1sec)

 - You can start Nessus by typing /etc/init.d/nessusd start
 - Then go to https://BS-PUB-UBUNTUSEC:8834/ to configure your scanner

ureadahead (0.100.0-19) のトリガを処理しています ...
systemd (229-4ubuntu4) のトリガを処理しています ...

 

これでインストールは完了。
以下のコマンドでサービスを起動する。

sudo /etc/init.d/nessusd start

2.ブラウザから初期設定を行う

さて、それではブラウザからNessusにアクセスしてみよう。
「https://IPアドレス:8443」でアクセスできる。

 

ログイン用のユーザ名・パスワード入力画面が表示されるので、適当に作成する。

 

ライセンスの入力画面が表示される。
今回はフリー版を用いるので、こちらにアクセスしてNessus Homeのアクティベーションキーを取得する。

 

上記までの作業が終わったら、必要なデータのダウンロードが行われるためしばらく待機時間。

 

ログインできるようになったら、先ほど設定したユーザ名・パスワードでログインする。

 

3.脆弱性スキャンを行う

Nessusのインストールは終わったので、簡単にスキャンを行ってみる。
今回はローカルネットワークのCentOS 7に対して行う。「New Scan」をクリックし、スキャンライブラリを選択する。今回は「Basic Network Scan」を行う。

 

 

ホストの情報作成後、再生ボタンで脆弱性スキャンを開始する。

 

 

スキャン完了後の画面。
こんな感じで脆弱性の有無を確認できるようだ。結果をExportする場合は、画面右上にある「Export」から取得すればよいだろう。

 

 

実践 Metasploit ―ペネトレーションテストによる脆弱性評価 実践 Metasploit ―ペネトレーションテストによる脆弱性評価

bashでパラメータ展開を用いて変数を利用する

$
0
0

bashでは、変数展開時にパラメータ展開を使用することで任意の箇所を抜き出すなど、いろいろなことができる。
(個人的には、あまりbashのスクリプトを書かずにシェル芸で対応してしまうことが多いのであまり恩恵を受けてない気もするが…)

結構柔軟に指定できるので、ちゃんとbashのスクリプトを書くときには使えるはずだ。
以下のような指定方法が利用できる。

 
パラメータ展開 機能
 ${#変数}  変数の文字数を取得する
 ${変数:-文字列}  変数がNULLの場合、指定した文字列を返す
 ${変数:+文字列}  変数がNULL以外の場合、指定した文字列を返す
 ${変数:=文字列}  変数がNULLの場合、変数に指定した文字列を代入する
 ${変数:?文字列}  変数がNULLの場合、指定した文字列を返しエラー終了する
 ${変数#文字列}  変数より、前方から最短一致した箇所を除外する(基本ワイルドカード組み合わせ要)
 ${変数##文字列}  変数より、前方から最長一致した箇所を除外する(基本ワイルドカード組み合わせ要)
 ${変数%文字列}  変数より、後方から最短一致した箇所を除外する(基本ワイルドカード組み合わせ要)
 ${変数%%文字列}  変数より、後方から最長一致した箇所を除外する(基本ワイルドカード組み合わせ要)
 ${変数:N}  変数より、N文字以降の文字のみ抽出する
 ${変数:N:X}  変数より、N文字目からX個の文字を抽出する
 ${変数: -N}  変数より、後ろからN文字のみ抽出する
 ${変数: -N:X}  変数より、後ろからN文字、X個の文字のみ抽出する
 ${変数::N}  変数より、頭からN文字のみ抽出する
 ${変数::-N}  変数より、後ろからN文字除外する
 ${変数/置換前/置換後}  変数の内容を、置換前文字列を置換後文字列に変換して返す
 ${変数^[文字列]}  変数の一文字目を大文字にする(文字列を指定してる場合はその文字列のみを対象にする)
 ${変数^^[文字列]}  変数全体を大文字にする(文字列を指定してる場合はその文字列のみを対象にする)
 ${変数,[文字列]}  変数の一文字目を小文字にする(文字列を指定してる場合はその文字列のみを対象にする)
 ${変数,,[文字列]}  変数全体を小文字にする(文字列を指定してる場合はその文字列のみを対象にする)
 ${!文字列*}  指定された文字列から始まる変数を取得する

 

以下、それぞれについて実際の実行例を記載しておく。

 

${#変数} : 変数の文字数を取得する

[root@BS-PUB-CENT7-01 ~]# TEST1=1234567890
[root@BS-PUB-CENT7-01 ~]# TEST2=ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${#TEST1}
10
[root@BS-PUB-CENT7-01 ~]# echo ${#TEST2}
14

${変数:-文字列} : 変数がNULLの場合、指定した文字列を返す

[root@BS-PUB-CENT7-01 ~]# echo $NULLTEST1

[root@BS-PUB-CENT7-01 ~]# echo ${NULLTEST1:-test}
test
[root@BS-PUB-CENT7-01 ~]# echo $NULLTEST1

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1:-test}
1234567890
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890

${変数:+文字列} : 変数がNULL以外の場合、指定した文字列を返す

[root@BS-PUB-CENT7-01 ~]# echo $NULLTEST1

[root@BS-PUB-CENT7-01 ~]# echo ${NULLTEST1:+test}

[root@BS-PUB-CENT7-01 ~]# echo $NULLTEST1

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1:+test}
test
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890

${変数:=文字列} : 変数がNULLの場合、変数に指定した文字列を代入する

[root@BS-PUB-CENT7-01 ~]# echo $NULLTEST1

[root@BS-PUB-CENT7-01 ~]# echo ${NULLTEST1:=test}
test
[root@BS-PUB-CENT7-01 ~]# echo $NULLTEST1
test
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1:=test}
1234567890
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890

${変数:?文字列} : 変数がNULLの場合、指定した文字列を返しエラー終了する

[root@BS-PUB-CENT7-01 ~]# echo $NULLTEST1

[root@BS-PUB-CENT7-01 ~]# echo ${NULLTEST1:?null}
-bash: NULLTEST1: null
[root@BS-PUB-CENT7-01 ~]# echo $?
1
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1:?null}
1234567890
[root@BS-PUB-CENT7-01 ~]# echo $?
0

${変数#文字列} : 変数より、前方から最短一致した箇所を除外する

[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2#*F}
GABVDEFG

${変数##文字列} : 変数より、前方から最長一致した箇所を除外する

[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2##*F}
G

${変数%文字列} : 変数より、後方から最短一致した箇所を除外する

[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2%F*}
ABCDEFGABVDE

${変数%%文字列} : 変数より、後方から最長一致した箇所を除外する

[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2%%F*}
ABCDE

${変数:N} : 変数より、N文字以降の文字のみ抽出する

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1:3}
4567890
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2:9}
VDEFG

${変数:N:X} : 変数より、N文字目からX個の文字を抽出する

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1:3:2}
45
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2:6:4}
GABV

${変数: -N} : 変数より、後ろからN文字のみ抽出する

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1: -3}
890
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2: -6}
BVDEFG

${変数: -N:X} : 変数より、後ろからN文字、X個の文字のみ抽出する

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1: -4}
7890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1: -4:2}
78

${変数::N} : 変数より、頭からN文字のみ抽出する

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1::5}
12345
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2::6}
ABCDEF

${変数::-N} : 変数より、後ろからN文字除外する

 

${変数/置換前/置換後} : 変数の内容を、置換前文字列を置換後文字列に変換して返す

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1::-5}
12345
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2::-9}
ABCDE

${変数^[文字列]} : 変数の一文字目を大文字にする

[root@BS-PUB-CENT7-01 ~]# test1=abcdefgabcdefg
[root@BS-PUB-CENT7-01 ~]# echo $test1
abcdefgabcdefg
[root@BS-PUB-CENT7-01 ~]# echo ${test1^}
Abcdefgabcdefg
[root@BS-PUB-CENT7-01 ~]# echo ${test1^a}
Abcdefgabcdefg
[root@BS-PUB-CENT7-01 ~]# echo ${test1^b}
abcdefgabcdefg

${変数^^[文字列]} : 変数全体を大文字にする

[root@BS-PUB-CENT7-01 ~]# echo $test1
abcdefgabcdefg[root@BS-PUB-CENT7-01 ~]# echo ${test1^^}
ABCDEFGABCDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${test1^^a}
AbcdefgAbcdefg
[root@BS-PUB-CENT7-01 ~]# echo ${test1^^b}
aBcdefgaBcdefg

${変数,[文字列]} : 変数の一文字目を小文字にする

[root@BS-PUB-CENT7-01 ~]# echo $test2
ABCDEFGABCDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${test2,}
aBCDEFGABCDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${test2,a}
ABCDEFGABCDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${test2,A}
aBCDEFGABCDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${test2,B}
ABCDEFGABCDEFG

${変数,,[文字列]} : 変数全体を小文字にする

[root@BS-PUB-CENT7-01 ~]# echo ${test1}
abcdefgabcdefg
[root@BS-PUB-CENT7-01 ~]# echo ${test2}
ABCDEFGABCDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${test2,,}
abcdefgabcdefg
[root@BS-PUB-CENT7-01 ~]# echo ${test2,,A}
aBCDEFGaBCDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${test2,,B}
AbCDEFGAbCDEFG

${!文字列*} : 指定された文字列から始まる変数を取得する

[root@BS-PUB-CENT7-01 ~]# set | grep ^TE
TERM=xterm
TEST=ABCD1234ABCD
TEST1=1234567890
TEST2=ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${!TE*}
TERM TEST TEST1 TEST2

 

【参考】

 

UNIXシェルスクリプト マスターピース132 UNIXシェルスクリプト マスターピース132

bashのif文でワイルドカード・正規表現を用いて条件判断をさせる

$
0
0

bashのif文では、変数の中身について真偽を判定する際にワイルドカードや正規表現が利用できる。
ワイルドカードを利用する場合、以下のようにするとよい。

TEST="test1234"
echo $TEST
if [[ $TEST == *"12"* ]]
then
    echo $TEST" is ok"
fi


TEST="test4567"
echo $TEST
if [[ $TEST == *"12"* ]]
then
    echo $TEST" is ok"
fi
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.sh
TEST="test1234"
echo $TEST
if [[ $TEST == *"12"* ]]
then
    echo $TEST" is ok"
fi


TEST="test4567"
echo $TEST
if [[ $TEST == *"12"* ]]
then
    echo $TEST" is ok"
fi
[root@BS-PUB-CENT7-01 ~]# bash /tmp/test.sh
test1234
test1234 is ok
test4567

正規表現で対応する場合は、「==」ではなく「=~」で真偽判定ができる。

TEST="test1234"
echo $TEST
if [[ $TEST =~ .*12.* ]]
then
    echo $TEST" is ok"
fi


TEST="test4567"
echo $TEST
if [[ $TEST =~ .*12.* ]]
then
    echo $TEST" is ok"
fi
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.sh
TEST="test1234"
echo $TEST
if [[ $TEST =~ .*12.* ]]
then
    echo $TEST" is ok"
fi


TEST="test4567"
echo $TEST
if [[ $TEST =~ .*12.* ]]
then
    echo $TEST" is ok"
fi
[root@BS-PUB-CENT7-01 ~]# bash /tmp/test.sh
test1234
test1234 is ok
test4567

 

Windows/Mac/UNIX すべてで20年動くプログラムはどう書くべきか 一度書けばどこでも、ずっと使えるプログラムを待ち望んでいた人々へ贈る[シェルスクリプトレシピ集] Windows/Mac/UNIX すべてで20年動くプログラムはどう書くべきか 一度書けばどこでも、ずっと使えるプログラムを待ち望んでいた人々へ贈る[シェルスクリプトレシピ集]

Ubuntu Server 16.04 LTSに診断したセキュリティインシデントの管理ツール『FIR』をインストールする

$
0
0

Nessusなどで取得したセキュリティスキャンのデータ管理方法について調べていたところ、運用中のセキュリティインシデント情報の管理ツール『FIR』というものを見かけたので、Ubuntu Server 16.04 LTSに入れてみることにする。
動作にはMySQLやNginxといったパッケージが必要になるので、それら含めインストールを行う。また、今回は検証のため一般ユーザ(blacknon)、作業ディレクトリはホームディレクトリ(/home/blacknon/)で行っている。ちゃんと運用するなら、専用のユーザを作成して/opt配下をホームディレクトリにするなどが必要だろう。

インストール手順は、こちらの公式手順を元に進めていく。

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

まず、以下のコマンドで前提となるパッケージの導入をする。
インストール中にMySQLのパスワード設定画面が表示されるので対応する。

sudo apt update && sudo apt upgrade
sudo apt install mysql-server libmysqlclient-dev gettext python-dev python-pip python-lxml git libxml2-dev libxslt1-dev libz-dev nginx libpq-dev

 

MySQLにFIR用のテーブルを作成する。

mysql -uroot -p -e '
   CREATE DATABASE fir;
   CREATE USER "fir"@"localhost" IDENTIFIED BY "P@ssw0rd";
   GRANT USAGE ON *.* TO "fir"@"localhost";
   GRANT ALL PRIVILEGES ON `fir`.* TO "fir"@"localhost";'

 

2.FIRのインストール

次に、FIRのインストールを行う。
まず、以下のコマンドでVirtualEnvとgitでのソースの取得を行う。

sudo pip install virtualenv
virtualenv env-FIR
source env-FIR/bin/activate
git clone https://github.com/certsocietegenerale/FIR.git

 

次に、以下のコマンドで必要になるPythonのパッケージを導入する。

cd FIR
pip install -r requirements.txt
pip install mysql-python

 

Pythonで必要となるパッケージのインストールが完了したら、以下のコマンドで設定ファイルのサンプルをコピーしてくる。
プラグインを有効にする場合は、2行目のコマンドも実行する。

cp fir/config/production.py.sample fir/config/production.py
cp fir/config/installed_apps.txt.sample fir/config/installed_apps.txt # プラグインを有効にする場合

 

設定ファイルのコピーが完了したら、設定ファイル「fir/config/production.py」を編集する。
以下、編集箇所だけ抜粋。

ALLOWED_HOSTS = ['ドメイン名']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'fir',
        'USER': 'fir',
        'PASSWORD': 'パスワード',
        'HOST': '',
        'PORT': '',
    }
}

 

設定ファイル編集後、以下のコマンドでテーブル、スーパーユーザを作成する。

./manage.py migrate --settings fir.config.production
./manage.py createsuperuser --settings fir.config.production

 

以下のコマンドで、初期データのインポートを行う。

./manage.py loaddata incidents/fixtures/seed_data.json --settings fir.config.production
./manage.py collectstatic --settings fir.config.production

ディレクトリの所有者やパーミッションについて変更する。

sudo chown www-data logs/errors.log uploads
sudo chmod 750 logs/errors.log uploads

 

3.uWSGIのインストール・設定

『FIR』ではuWSGIが必要になるため、これのインストール・設定を行う。

sudo pip install uwsgi
sudo chsh www-data -s /bin/sh

 

ソケット用のディレクトリを作成する。

mkdir run
sudo chown www-data run

 

設定ファイル「/etc/init/fir.conf」および「/etc/systemd/system/fir_uwsgi.service」を作成する。

●/etc/init/fir.conf

description "FIR - Django uWSGI"

start on runlevel [2345]
stop on runlevel [!2345]

setuid www-data
setgid www-data

respawn

exec uwsgi --socket /home/ユーザ名/FIR/run/fir.sock --chdir /home/ユーザ名/FIR/ --module fir.wsgi

 

●/etc/systemd/system/fir_uwsgi.service

[Unit]
Description=uWSGI instance for FIR
After=syslog.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/home/ユーザ名/FIR/
ExecStart=/usr/local/bin/uwsgi --socket /home/ユーザ名/FIR/run/fir.sock --chdir /home/ユーザ名/FIR/ --module fir.wsgi
Restart=always
KillSignal=SIGQUIT
Type=Debug
StandardError=syslog
NotifyAccess=All

[Install]
WantedBy=multi-user.target

 

設定ファイルの作成・配置ができたら、サービスを起動する。

sudo service fir_uwsgi start

 

4.Nginxの設定

次に、NginxでuWSGIを利用するための設定を行う。
まずパラメータファイルのダウンロードをする。

wget https://raw.githubusercontent.com/nginx/nginx/master/conf/uwsgi_params -P run

 

Nginxのデフォルトの設定ファイルを削除して、新しく「/etc/nginx/sites-available/fir」というファイルを作成する。

sudo rm /etc/nginx/sites-enabled/default

 

●/etc/nginx/sites-available/fir

upstream fir {
    server unix:///home/ユーザ名/FIR/run/fir.sock;
}

server {
    server_name ドメイン名;

    location / {
        uwsgi_pass fir;
        include /home/ユーザ名/FIR/run/uwsgi_params;
    }

    location /static/ {
        alias /home/ユーザ名/FIR/static/;
    }
}

 

設定ファイル作成後、サービスの再起動をする。

sudo ln -s /etc/nginx/sites-available/fir /etc/nginx/sites-enabled/fir
sudo service nginx reload

 

5.ブラウザから初期設定をする

ここまで終わったら、ブラウザから「http://ドメイン名」へアクセスしてみよう。FIRのログイン画面が表示されるはずだ。
ログインには、「./manage.py createsuperuser –settings fir.config.production 」で作成したユーザでログインできる。
新しくユーザ等を作成する場合は、「http://ドメイン名/admin」にアクセスし、Djangoの管理画面からそれらのデータを作成してやることで、利用できるようになる。

 

 

ログイン後、[New event]から新しいセキュリティインシデントを登録、それを管理してやることでセキュリティインシデントを管理できる。
Redmineで管理するのもいいけど、こういったツールで別途管理してやるのもいいかもしれない。

 

IT管理者のための情報セキュリティガイド (NextPublishing) IT管理者のための情報セキュリティガイド (NextPublishing)

ペネトレーションテストのデータマネジメントツール『Dradis』

$
0
0

ペネトレーションテストのデータ管理を行うツールについて調べてて、『Dradis』というものを見かけたのでUbuntu Server 16.04 LTSにインストールしていくつか診断データをインポートしてみることにした。有償版と無償版があるようだが、今回は無償版。Ruby製のツールらしく、インストールは簡単に行える。

sudo apt install -y ruby ruby-bundler ruby-railties ruby-dev git libsqlite3-dev mysql-server mysql-client libmysqlclient-dev redis-server
git clone https://github.com/dradis/dradis-ce.git
cd dradis-ce/
sudo gem install coffee-script-source -v '1.10.0'
sudo gem install activesupport -v '4.2.7.1'
sudo gem install actionmailer -v '4.2.7.1'
ruby bin/setup

 

エラーが出たら、都度個別に対応してやる。
インストール完了後、以下のコマンドでサーバを起動できる。

bundle exec rails server -b 0.0.0.0

サーバ起動後、ブラウザから「http://IPアドレス:3000」にアクセスする。
最初にadminユーザのパスワード設定画面が表示されるので、任意のパスワードを設定する。

 

ログインIDはadminなので、遷移した画面から先ほどのパスワードでログインする。

 

ログイン直後の画面。

 

適当に、Nessusなどのデータをインポートした状態が以下。

 

Kvasirと比べるとBurpなど対応しているツールが多いのが利点だろうか。

 

Webセキュリティ担当者のための脆弱性診断スタートガイド 上野宣が教える情報漏えいを防ぐ技術 Webセキュリティ担当者のための脆弱性診断スタートガイド 上野宣が教える情報漏えいを防ぐ技術

たまごっちをコンソール上で動くようにした猛者がいたようだ

$
0
0

先日、デジモンが20周年記念ということでプレミアムバンダイから復刻版の販売がされるという発表があった。
ちょうど世代的にドンピシャの商品なので即刻予約をしたのだが、ふと「たまごっちとかデジモンって、Ascii Artとかで表現できそうだよな」と思ったので、なんとなくGoogle検索をしてみたところ、どうもたまごっちを移植して、サーバやコンソール上で動かすようにした人がいるらしい。

Sprites mods – Creating the Tamagotchi Singularity – Building the Tamagotchi Singularity

 

ううむ…動画を見る限り、確かにコンソール上でたまごっちが動いている…
そんなバカな…

で、ソースを公開されているようだったので、試しに動かしてみることにした。

git clone http://git.spritesserver.nl/tamatrix.git/
cd tamatrix/emu
make
./tamaemu -n # AI機能を有効にしてるとうまく動かないらしい。詳細はREADME参照

 

…まごうことなきたまごっちの画面だ(なつかしい…)。
1,2,3キーがそれぞれたまごっちでいうボタンに該当するようで、それぞれのキーを押下した後にEnterで操作できる。
最初に2キーで時間やユーザ名を設定してやる。

 

しばらくするとたまごっちが卵から孵る。
あとは、お決まりの操作(ごはんとかトイレとか)を行ってたまごっちを育てるだけだ。
1キー+Enterを行っていくと、「>>> INFO ATTENTION <<<」とか「>>> FOOD ATTENTION <<<」と表示が切り替わっていくので、2キーで選択していけばいい。

 

よもやコンソールの黒い画面でたまごっち育てる時が来るとは…
小学生のころは夢にも考えていなかったなぁ…

サーバ機能とかもあるようなので、いろいろといじれそうではある。
世の中、凄い人もいるもんだなぁ…

 

Tamagotchi m!x (たまごっちみくす) 20th Anniversary m!x ver. ロイヤルホワイト Tamagotchi m!x (たまごっちみくす) 20th Anniversary m!x ver. ロイヤルホワイト

Linuxでファイルをリカバリツールで復旧させないよう削除するコマンド3個

$
0
0

Linuxを使っていて、複数のユーザがアクセスするようなサーバの場合だと、パスワード等が書かれているファイルを個別に削除したいこともあるだろう。
この場合、rmコマンドだとディスク上のインデックスだけを削除するため、ディスクリカバリツールなどで復旧される可能性がある。それを防ぐためには、対象のファイルがリカバリツールから復旧できないようにファイルのデータを完全に削除する必要がある。
Linuxでは、対象のデータを完全に削除するツールがいくつか存在している。なお、どれもそうだがジャーナリングファイルシステム(ext3/ext4含む)を使用している場合、データジャーナリングが有効になっていると、これらのコマンドを実行してもデータが復旧できてしまうので注意。

1.shred

CentOSやUbuntuであればバンドルでインストールされているコマンド。
基本はこのコマンドを使えばいいだろう。ファイルを指定してコマンドを実行することで、ファイルをランダムな内容で何度も上書き(デフォルトでは3回)して完全に消去する。

shred ファイルPATH
shred -n N ファイルPATH # 上書き回数

 

2.wipe

もともとは磁気メディアからファイルを完全に消去するために開発されたツールらしい。
shredコマンドと同じようにファイルを繰り返し上書きして消去する。

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

sudo apt install wipe # Debian/Ubuntu系
yum install --enablerepo=epel wipe # RHEL系(CentOS 7では非動作)

 

実行方法は簡単で、以下のようにPATHを指定するだけだ。

wipe 対象PATH

3.Secure-Delete(Ubuntuの場合)

Secure-Deleteパッケージを導入すると、srmやsfillなどの4つのコマンドがインストールされる。
(CentOSの場合だと、srmコマンドのみyumからインストールできる)

sudo apt install secure-delete

 

srm以外はおまけのようなものだが、一応記述しておく。

 

3-1.srmコマンド

srmコマンドは、shredコマンドやwipeコマンドと同様に何度もデータを上書きしてファイルを削除するコマンドだ。
CentOS 7ではEpelからインストールできる。

yum install --enablerepo=epel srm

 

以下のように、削除するファイルやディレクトリのPATHを指定してコマンドを実行する。
(再帰的に削除する場合は-rオプションを付与する)

srm 対象PATH

 

3-2.sfill

sfillコマンドは、ディスクの空き領域にあるデータをすべて削除してくれるコマンドだ。
指定したPATHにランダムな内容を書き込んだファイルを作成して書き込みを行うため、ディスクへの書き込みが大量に行われるので注意。

sudo sfill /一時ファイルの書き込み先PATH

 

3-3.sswap

SWAPパーティション上にあるデータを安全に削除するコマンド。
事前に対象のSWAPパーティションのアンマウントが必要なので注意。

sudo sswap /dev/SWAPパーティションのPATH

 

3-4.sdmem

メモリ上に存在するデータを安全に削除するコマンド。

sudo sdmem -f -v

 

まぁ、何やかんや消しきれなかったりすることもあるので、まずHDDからのリカバリを試みられるような状況にしないほうが優先な気がしなくもないけど、ちゃんと消せるものは消しておきたいものですね。

 

改訂新版 情報セキュリティ内部監査の教科書 (NextPublishing) 改訂新版 情報セキュリティ内部監査の教科書 (NextPublishing)
Viewing all 743 articles
Browse latest View live